glenda.party
term% ls -F
term% cat index.txt
ARG(2)                        System Calls Manual                       ARG(2)

NAME
       ARGBEGIN,  ARGEND, ARGC, ARGF, arginit, argopt - process option letters
       from argv

SYNOPSIS
       #include <u.h>
       #include <libc.h>

       ARGBEGIN {
       char *ARGF();
       Rune ARGC();
       } ARGEND

       extern char *argv0;

       /* Alef only */

       Arg  *arginit(int argc, byte **argv);

       Rune argopt(Arg *arg);

       byte *argf(Arg *arg);

DESCRIPTION
       These macros assume the names argc and argv are in scope; see  exec(2).
       ARGBEGIN  and ARGEND surround code for processing program options.  The
       code should be the cases of a C switch on option characters; it is exe‐
       cuted once for each option character.  Options end  after  an  argument
       --, before an argument -, or before an argument that doesn't begin with
       -.

       ARGC() returns the current option character.

       ARGF()  returns  the  current option argument: a pointer to the rest of
       the option string if not empty, or the next argument in argv if any, or
       0.  ARGF must be called just once for each option that takes  an  argu‐
       ment.

       After  ARGBEGIN, argv0 is a copy of argv[0] (conventionally the name of
       the program).

       After ARGEND, argv points at a zero-terminated list  of  the  remaining
       argc arguments.

   Alef
       The  Alef argument processing routines are unrelated.  Instead, an aggr
       called Arg is initialized by a call to arginit.   Successive  calls  to
       argopt  return  successive option characters, or zero at the end of the
       options.  After a call to argopt, argf will return any argument  string
       associated with the option.

EXAMPLES
       This  C program can take option b and option f, which requires an argu‐
       ment.

              #include <u.h>
              #include <libc.h>
              void
              main(int argc, char *argv[])
              {
                      char *f;
                      print("%s", argv[0]);
                      ARGBEGIN {
                      case 'b':
                              print(" -b");
                              break;
                      case 'f':
                              print(" -f(%s)", (f=ARGF())? f: "no arg");
                              break;
                      default:
                              print(" badflag('%c')", ARGC());
                      } ARGEND
                      print(" %d args:", argc);
                      while(*argv)
                              print(" '%s'", *argv++);
                      print("\n");
                      exits(0);
              }

       Here is the output for the run prog -bffile1 -r -f file2 arg1 arg2

              prog -b -f(file1) badflag('r') -f(file2) 2 args: 'arg1' 'arg2'

       This Alef program accepts options b and, with an attached file name, f.

              #include <alef.h>
              void
              main(int argc, byte **argv)
              {
                      int a, ac, bflag;
                      byte *file;
                      Arg *arg;

                      arg = arginit(argc, argv);
                      while(ac = argopt(arg)) switch(ac){
                      case 'b':
                              bflag = 1;
                              break;
                      case 'f':
                              file = argf(arg);
                              break;
                      }
                      for(a=0; a<arg->ac; a++)
                              print("argument %s\n", arg->av[a]);
              }

SOURCE
       /sys/include/libc.h

                                                                        ARG(2)