text: #include <u.h>
  #include <libc.h>
  #include <draw.h>
  #include <memdraw.h>
  #include <ctype.h>
  #include <bio.h>
  #include "imagefile.h"
  
  void
  usage(void)
  {
  	fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
  	exits("usage");
  }
  
  #define	UNSET (-12345678)
  
  void
  main(int argc, char *argv[])
  {
  	Biobuf bout;
  	Memimage *i, *ni;
  	int fd, j, dt, trans, loop;
  	char buf[256];
  	char *err, *comment, *s;
  
  	comment = nil;
  	dt = -1;
  	trans = -1;
  	loop = UNSET;
  	ARGBEGIN{
  	case 'l':
  		s = ARGF();
  		if(s==nil || (!isdigit(s[0]) && s[0]!='-'))
  			usage();
  		loop = atoi(s);
  		break;
  	case 'c':
  		comment = ARGF();
  		if(comment == nil)
  			usage();
  		break;
  	case 'd':
  		s = ARGF();
  		if(s==nil || !isdigit(s[0]))
  			usage();
  		dt = atoi(s);
  		break;
  	case 't':
  		s = ARGF();
  		if(s==nil || !isdigit(s[0]))
  			usage();
  		trans = atoi(s);
  		if(trans > 255)
  			usage();
  		break;
  	default:
  		usage();
  	}ARGEND
  
  	if(Binit(&bout, 1, OWRITE) < 0)
  		sysfatal("Binit failed: %r");
  
  	memimageinit();
  
  	err = nil;
  
  	if(argc == 0){
  		i = readmemimage(0);
  		if(i == nil)
  			sysfatal("reading input: %r");
  		ni = memonechan(i);
  		if(ni == nil)
  			sysfatal("converting image to RGBV: %r");
  		if(i != ni){
  			freememimage(i);
  			i = ni;
  		}
  		err = memstartgif(&bout, i, -1);
  		if(err == nil){
  			if(comment)
  				err = memwritegif(&bout, i, comment, dt, trans);
  			else{
  				snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
  				err = memwritegif(&bout, i, buf, dt, trans);
  			}
  		}
  	}else{
  		if(loop == UNSET){
  			if(argc == 1)
  				loop = -1;	/* no loop for single image */
  			else
  				loop = 0;	/* the default case: 0 means infinite loop */
  		}
  		for(j=0; j<argc; j++){
  			if(argv[j][0] == '-' && argv[j][1]=='d'){
  				/* time change */
  				if(argv[j][2] == '\0'){
  					s = argv[++j];
  					if(j == argc)
  						usage();
  				}else
  					s = &argv[j][2];
  				if(!isdigit(s[0]))
  					usage();
  				dt = atoi(s);
  				if(j == argc-1)	/* last argument must be file */
  					usage();
  				continue;
  			}
  			fd = open(argv[j], OREAD);
  			if(fd < 0)
  				sysfatal("can't open %s: %r", argv[j]);
  			i = readmemimage(fd);
  			if(i == nil)
  				sysfatal("can't readimage %s: %r", argv[j]);
  			close(fd);
  			ni = memonechan(i);
  			if(ni == nil)
  				sysfatal("converting image to RGBV: %r");
  			if(i != ni){
  				freememimage(i);
  				i = ni;
  			}
  			if(j == 0){
  				err = memstartgif(&bout, i, loop);
  				if(err != nil)
  					break;
  			}
  			if(comment)
  				err = memwritegif(&bout, i, comment, dt, trans);
  			else{
  				snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
  				err = memwritegif(&bout, i, buf, dt, trans);
  			}
  			if(err != nil)
  				break;
  			freememimage(i);
  			comment = nil;
  		}
  	}
  	memendgif(&bout);
  
  	if(err != nil)
  		fprint(2, "togif: %s\n", err);
  	exits(err);
  }
  