plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

toppm.c (1571B)


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