getsubopt(3C)




NAME

     getsubopt - parse suboptions from a string


SYNOPSIS

     #include <stdlib.h>

     int getsubopt(char **optionp, char  *  const  *tokens,  char
     **valuep);


DESCRIPTION

     The getsubopt() function parses suboptions in a  flag  argu-
     ment  that  was  initially parsed by  getopt(3C). The subop-
     tions are separated by commas and may consist  of  either  a
     single  token  or  a  token-value pair separated by an equal
     sign.  Since commas delimit suboptions in the option string,
     they  are  not  allowed   to be part of the suboption or the
     value of a suboption; if present in the option input string,
     they  are  changed  to  null characters. White spaces within
     tokens or token-value pairs must be protected from the shell
     by quotes.

     The syntax described above is used in the following  example
     by  the mount(1M), utility, which allows the user to specify
     mount parameters with the -o option as follows:

           mount -o rw,hard,bg,wsize=1024 speed:/usr /usr

     In this example there are four suboptions: rw, hard, bg, and
     wsize, the last of which has an associated value of 1024.

     The getsubopt() function takes the address of a  pointer  to
     the  option  string,  a  vector  of possible tokens, and the
     address of a value string pointer. It returns the  index  of
     the token that matched the suboption in the input string, or
     -1 if there was no match. If the option string pointed to by
     optionp  contains  only  one  subobtion, getsubopt() updates
     optionp to point to the null character at  the  end  of  the
     string; otherwise it isolates the suboption by replacing the
     comma separator with a null character, and  updates  optionp
     to  point  to the start of the next suboption. If the subop-
     tion has an associated value, getsubopt() updates  valuep to
     point  to  the  value's  first character.  Otherwise it sets
     valuep to NULL.

     The token vector is organized as a  series  of  pointers  to
     null  strings.  The end of the token vector is identified by
     a null pointer.

     When  getsubopt() returns, a non-null value for valuep indi-
     cates  that  the  suboption  that  was  processed included a
     value. The calling  program  may  use  this  information  to
     determine  if  the  presence  or absence of a value for this
     subobtion is an error.

     When  getsubopt() fails to  match  the  suboption  with  the
     tokens  in  the   tokens  array,  the calling program should
     decide if this is an error, or if  the  unrecognized  option
     should be passed to another program.


RETURN VALUES

     The getsubopt() function returns -1 when  the  token  it  is
     scanning  is not in the token vector. The variable addressed
     by  valuep contains a pointer to the first character of  the
     token  that  was  not recognized, rather than a pointer to a
     value for that token.

     The variable addressed by optionp points to the next  option
     to  be  parsed,   or  a  null character if there are no more
     options.


EXAMPLES

     Example 1: Example of getsubopt() function.

     The following example demonstrates the processing of options
     to the  mount(1M) utility using  getsubopt().

     #include <stdlib.h>

     char *myopts[] = {
     #define READONLY     0
                 "ro",
     #define READWRITE    1
                 "rw",
     #define WRITESIZE    2
                 "wsize",
     #define READSIZE     3
                 "rsize",
                 NULL};

     main(argc, argv)
         int  argc;
         char **argv;
     {
         int sc, c, errflag;
         char *options, *value;
         extern char *optarg;
         extern int optind;
         .
         .
         .
         while((c = getopt(argc, argv, "abf:o:")) != -1) {
             switch (c) {
             case 'a': /* process a option */
                 break;
             case 'b': /* process b option */
                 break;
             case 'f':
                 ofile = optarg;
                 break;
             case '?':
                 errflag++;
                 break;
             case 'o':
                 options = optarg;
                 while (*options != '\0') {
                     switch(getsubopt(&options,myopts,&value)){
                     case READONLY : /* process ro option */
                         break;
                     case READWRITE : /* process rw option */
                         break;

                                     case WRITESIZE : /* process wsize option */
                         if (value == NULL) {
                             error_no_arg();
                             errflag++;
                         } else
                             write_size = atoi(value);
                         break;
                     case READSIZE : /* process rsize option */
                         if (value == NULL) {
                             error_no_arg();
                             errflag++;
                         } else
                             read_size = atoi(value);
                         break;
                     default :
                         /* process unknown token */
                         error_bad_token(value);
                         errflag++;
                         break;
                        }
                 }
                   break;
             }
         }
         if (errflag) {
             /* print usage instructions etc. */
         }
         for (; optind<argc; optind++) {
             /* process remaining arguments */
         }
         .
         .
         .
     }


ATTRIBUTES

     See attributes(5) for descriptions of the  following  attri-
     butes:

     ____________________________________________________________
    |       ATTRIBUTE TYPE        |       ATTRIBUTE VALUE       |
    |_____________________________|_____________________________|
    | MT-Level                    | MT-Safe                     |
    |_____________________________|_____________________________|


SEE ALSO

     mount(1M), getopt(3C), attributes(5)


Man(1) output converted with man2html