getflags.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       getflags.c (1360B)
       ---
            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         quotefmtinstall();
           47         argv0 = argv[0];        /* for sysfatal */
           48         
           49         flags = getenv("flagfmt");
           50         if(flags == nil){
           51                 fprint(2, "$flagfmt not set\n");
           52                 print("exit 'missing flagfmt'");
           53                 exits(0);
           54         }
           55 
           56         fmtfdinit(&fmt, 1, buf, sizeof buf);
           57         for(p=flags; p!=(char*)1; p=strchr(p, ',')+1)
           58                 fmtprint(&fmt, "flag%.1s=()\n", p);
           59         ARGBEGIN{
           60         default:
           61                 if((p = findarg(flags, ARGC())) == nil)
           62                         usage();
           63                 p += runelen(ARGC());
           64                 if(*p == ',' || *p == 0){
           65                         fmtprint(&fmt, "flag%C=1\n", ARGC());
           66                         break;
           67                 }
           68                 n = countargs(p);
           69                 fmtprint(&fmt, "flag%C=(", ARGC());
           70                 for(i=0; i<n; i++)
           71                         fmtprint(&fmt, "%s%q", i ? " " : "", EARGF(usage()));
           72                 fmtprint(&fmt, ")\n");
           73         }ARGEND
           74         
           75         fmtprint(&fmt, "*=(");
           76         for(i=0; i<argc; i++)
           77                 fmtprint(&fmt, "%s%q", i ? " " : "", argv[i]);
           78         fmtprint(&fmt, ")\n");
           79         fmtprint(&fmt, "status=''\n");
           80         fmtfdflush(&fmt);
           81         exits(0);
           82 }