plan9port

[fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port # fast
git clone https://src.adamsgaard.dk/plan9port.git # slow
Log | Files | Refs | README | LICENSE Back to index

getflags.c (1380B)


      1 #include <u.h>
      2 #include <libc.h>
      3 
      4 void
      5 usage(void)
      6 {
      7 	print("status=usage\n");
      8 	exits(0);
      9 }
     10 
     11 char*
     12 findarg(char *flags, Rune r)
     13 {
     14 	char *p;
     15 	Rune rr;
     16 
     17 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1){
     18 		chartorune(&rr, p);
     19 		if(rr == r)
     20 			return p;
     21 	}
     22 	return nil;
     23 }
     24 
     25 int
     26 countargs(char *p)
     27 {
     28 	int n;
     29 
     30 	n = 1;
     31 	while(*p == ' ')
     32 		p++;
     33 	for(; *p && *p != ','; p++)
     34 		if(*p == ' ' && *(p-1) != ' ')
     35 			n++;
     36 	return n;
     37 }
     38 
     39 void
     40 main(int argc, char *argv[])
     41 {
     42 	char *flags, *p, buf[512];
     43 	int i, n;
     44 	Fmt fmt;
     45 
     46 	doquote = needsrcquote;
     47 	quotefmtinstall();
     48 	argv0 = argv[0];	/* for sysfatal */
     49 
     50 	flags = getenv("flagfmt");
     51 	if(flags == nil){
     52 		fprint(2, "$flagfmt not set\n");
     53 		print("exit 'missing flagfmt'");
     54 		exits(0);
     55 	}
     56 
     57 	fmtfdinit(&fmt, 1, buf, sizeof buf);
     58 	for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
     59 		fmtprint(&fmt, "flag%.1s=()\n", p);
     60 	ARGBEGIN{
     61 	default:
     62 		if((p = findarg(flags, ARGC())) == nil)
     63 			usage();
     64 		p += runelen(ARGC());
     65 		if(*p == ',' || *p == 0){
     66 			fmtprint(&fmt, "flag%C=1\n", ARGC());
     67 			break;
     68 		}
     69 		n = countargs(p);
     70 		fmtprint(&fmt, "flag%C=(", ARGC());
     71 		for(i=0; i<n; i++)
     72 			fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
     73 		fmtprint(&fmt, ")\n");
     74 	}ARGEND
     75 
     76 	fmtprint(&fmt, "*=(");
     77 	for(i=0; i<argc; i++)
     78 		fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
     79 	fmtprint(&fmt, ")\n");
     80 	fmtprint(&fmt, "status=''\n");
     81 	fmtfdflush(&fmt);
     82 	exits(0);
     83 }