toppm.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <memdraw.h>
  5. #include <ctype.h>
  6. #include <bio.h>
  7. #include "imagefile.h"
  8. void
  9. usage(void)
  10. {
  11. fprint(2, "usage: toppm [-c 'comment'] [file]\n");
  12. exits("usage");
  13. }
  14. void
  15. main(int argc, char *argv[])
  16. {
  17. Biobuf bout;
  18. Memimage *i, *ni;
  19. int fd;
  20. char buf[256];
  21. char *err, *comment;
  22. comment = nil;
  23. ARGBEGIN{
  24. case 'c':
  25. comment = ARGF();
  26. if(comment == nil)
  27. usage();
  28. if(strchr(comment, '\n') != nil){
  29. fprint(2, "ppm: comment cannot contain newlines\n");
  30. usage();
  31. }
  32. break;
  33. default:
  34. usage();
  35. }ARGEND
  36. if(argc > 1)
  37. usage();
  38. if(Binit(&bout, 1, OWRITE) < 0)
  39. sysfatal("Binit failed: %r");
  40. memimageinit();
  41. err = nil;
  42. if(argc == 0){
  43. i = readmemimage(0);
  44. if(i == nil)
  45. sysfatal("reading input: %r");
  46. ni = memmultichan(i);
  47. if(ni == nil)
  48. sysfatal("converting image to RGBV: %r");
  49. if(i != ni){
  50. freememimage(i);
  51. i = ni;
  52. }
  53. if(err == nil)
  54. err = memwriteppm(&bout, i, comment);
  55. }else{
  56. fd = open(argv[0], OREAD);
  57. if(fd < 0)
  58. sysfatal("can't open %s: %r", argv[0]);
  59. i = readmemimage(fd);
  60. if(i == nil)
  61. sysfatal("can't readimage %s: %r", argv[0]);
  62. close(fd);
  63. ni = memmultichan(i);
  64. if(ni == nil)
  65. sysfatal("converting image to RGBV: %r");
  66. if(i != ni){
  67. freememimage(i);
  68. i = ni;
  69. }
  70. if(comment)
  71. err = memwriteppm(&bout, i, comment);
  72. else{
  73. snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[0]);
  74. err = memwriteppm(&bout, i, buf);
  75. }
  76. freememimage(i);
  77. }
  78. if(err != nil)
  79. fprint(2, "toppm: %s\n", err);
  80. exits(err);
  81. }