Loading

NOM

       getsubopt - Parcourir les arguments des sous-options depuis une chaîne

SYNOPSIS

       #define _XOPEN_SOURCE 500
       #include <stdlib.h>

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

       getsubopt()  parcourt  la  liste  des  sous-options  séparées  par  des
       virgules  fournie  dans  optionp  (une  liste   de   sous-options   est
       typiquement  créée  lorsque  getopt(3)  est utilisée pour parcourir une
       ligne de commande ; consultez par exemple  l’option  -o  de  mount(8)).
       Chaque  sous-option  peut être associée à une valeur qui est séparée de
       son nom par un signe égal. La suite est un exemple de ce type de chaîne
       qui peut être passé à optionp :

           ro,name=xyz

       L’argument  tokens  est un pointeur vers une liste de marqueur terminée
       par NULL que getsubopt() recherche dans optionp. Les marqueurs  doivent
       être  distincts,  contenant  des chaînes terminées par un caractère nul
       d’au moins un caractère, sans signe égal ou virgule.

       Chaque appel à getsubopt() renvoie une  information  sur  la  prochaine
       sous-option  contenue  dans optionp qui n’a pas été traitée. Le premier
       signal égal (s’il existe) est interprété comme un séparateur  entre  un
       nom  et  une valeur de sous-option. La valeur se termine à la prochaine
       virgule ou (pour la dernière sous-option) à la fin de la chaîne. Si  le
       nom d’une sous-option correspond à un nom de tokens et qu’une chaîne de
       valeur est trouvée, getsubopt() définit *valuep à  l’adresse  de  cette
       chaîne.  La première virgule in optionp est surpassée par un octet nul,
       ainsi  *valuep  est  exactement  « la  chaîne  de  valeur »  de   cette
       sous-option.

       Si  la  sous-option  est  reconnue,  mais  qu’aucune  chaîne  de valeur
       n’existe, *valuep est définit à NULL.

       Lorsque  getsubopt()  renvoie,  optionp  pointe   vers   la   prochaine
       sous-option,  ou  vers le caractère nul de fin de chaîne si la dernière
       sous-option vient juste d’être traitée.

VALEUR RENVOYÉE

       Si la première sous-option de optionp est reconnue, getsubopt() renvoie
       l’index  de  l’élément de tokens correspondant à la sous-option. Sinon,
       -1 est renvoyé et *valuep correspond à la chaîne nom[=valeur].

       Puisque *optionp est modifié, la première sous-option avant  l’appel  à
       getsubopt() n’est pas nécessairement la même qu’après.

CONFORMITÉ

       POSIX.1-2001.

NOTES

       Puisque  getsubopt()  ré-écrit  toutes  les  virgules  trouvées dans la
       chaîne *optionp, cette chaîne doit être accessible en écriture, elle ne
       peut pas être une chaîne constante.

EXEMPLE

       Le programme suivant attend des sous-options après l’option « -o ».

       #define _XOPEN_SOURCE 500
       #include <stdlib.h>
       #include <assert.h>
       #include <stdio.h>

       int main(int argc, char **argv)
       {
           enum {
               RO_OPT = 0,
               RW_OPT,
               NAME_OPT
           };
           char *const token[] = {
               [RO_OPT]   = "ro",
               [RW_OPT]   = "rw",
               [NAME_OPT] = "name",
               NULL
           };
           char *subopts;
           char *value;
           int opt;

           int readonly = 0;
           int readwrite = 0;
           char *name = NULL;
           int errfnd = 0;

           while ((opt = getopt(argc, argv, "o:")) != -1) {
               switch (opt) {
               case 'o':
                   subopts = optarg;
                   while (*subopts != '\0' && !errfnd) {

                   switch (getsubopt(&subopts, token, &value)) {
                   case RO_OPT:
                       readonly = 1;
                       break;

                   case RW_OPT:
                       readwrite = 1;
                       break;

                   case NAME_OPT:
                       if (value == NULL) {
                           fprintf(stderr, "Missing value for "
                                   "suboption '%s'\n", token[NAME_OPT]);
                           errfnd = 1;
                           continue;
                       }

                       name = value;
                       break;

                   default:
                       fprintf(stderr, "No match found "
                               "for token: /%s/\n", value);
                       errfnd = 1;
                       break;
                   }
               }
               if (readwrite && readonly) {
                   fprintf(stderr, "Only one of '%s' and '%s' can be "
                           "specified\n", token[RO_OPT], token[RW_OPT]);
                   errfnd = 1;
               }
               break;

               default:
                   errfnd = 1;
               }
           }

           if (errfnd || argc == 1) {
               fprintf(stderr, "\nUsage: %s -o <suboptstring>\n", argv[0]);
               fprintf(stderr, "suboptions are 'ro', 'rw', "
                       "and 'name=<value>'\n");
               exit(EXIT_FAILURE);
           }

           /* Remainder of program... */

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       getopt(3), feature_test_macros(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite  et  est  maintenue  par  Florentin
       Duneau <fduneau AT gmail DOT com> et l’équipe francophone de traduction
       de Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de  ce  document
       en utilisant la commande « man -L C <section> <page_de_man> ».