GETFLAGS(9.2)                                       GETFLAGS(9.2)

          getflags, usage - process flag arguments in argv

          #include <libg.h>

          #include <fb.h>

          int getflags(int argc, char *argv[], char

          int usage(char *tail)

          extern char **flag[], cmdline[], *cmdname, *flagset[];

          Getflags digests an argument vector argv, finding flag argu-
          ments listed in flags. Flags is a string of flag letters.  A
          letter followed by a colon and a number is expected to have
          the given number of parameters.  A flag argument starts with
          `-' and is followed by any number of flag letters.  A flag
          with one or more parameters must be the last flag in an
          argument.  If any characters follow it, they are the flag's
          first parameter.  Otherwise the following argument is the
          first parameter.  Subsequent parameters are taken from sub-
          sequent arguments.

          The global array flag is set to point to an array of parame-
          ters for each flag found.  Thus, if flag -x was seen,
          flag['x'] is non-zero, and flag['x'][i] is the flag's ith
          parameter.  If flag -x has no parameters flag['x']==flagset.
          Flags not found are marked with a zero.  Flags and their
          parameters are deleted from argv. Getflags returns the
          adjusted argument count.

          Getflags stops scanning for flags upon encountering a non-
          flag argument, or the argument --, which is deleted.

          Getflags places a pointer to argv[0] in the external vari-
          able cmdname. It also concatenates the original members of
          argv, separated by spaces, and places the result in the
          external array cmdline.

          Usage constructs a usage message, prints it on the standard
          error file, and exits with status 1.  The command name
          printed is argv[0].  Appropriate flag usage syntax is gener-
          ated from flags. As an aid, explanatory information about
          flag parameters may be included in flags in square brackets
          as in the example.  Tail is printed at the end of the mes-
          sage.  If getflags encountered an error, usage tries to
          indicate the cause.

     Page 1                       Plan 9             (printed 10/1/20)

     GETFLAGS(9.2)                                       GETFLAGS(9.2)

               main(int argc, char *argv[]){
                    if((argc=getflags(argc, argv, "vinclbhse:1[expr]", 1))==-1)
                         usage("[file ...]");
          might print:
               Illegal flag -u
               Usage: grep [-vinclbhs] [-e expr] [file ...]


          Getflags returns -1 on error: a syntax error in flags, set-
          ting a flag more than once, setting a flag not mentioned in
          flags, or running out of argv while collecting a flag's

     Page 2                       Plan 9             (printed 10/1/20)