getsubopt | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
int getsubopt(char **optionp, char * const *tokens, char **valuep);
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ro,name=xyz
L'argument tokens est un pointeur sur une liste, terminée par le caractère NULL, de jetons que getsubopt() recherche dans optionp. Les jetons doivent être des chaînes de caractères distinctes, terminées par le caractère NULL, contenant au moins un caractère et sans symbole égal ni virgule.
Chaque appel à getsubopt() renvoie une information sur la prochaine sous-option contenue dans optionp qui n'a pas encore été traitée. Le premier symbole égal d'une sous-option, s'il existe, est interprété comme un séparateur entre le nom et la valeur de cette 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 de la sous-option correspond à un nom connu de tokens, et si une chaîne de valeur a été trouvée, getsubopt() définit *valuep avec l'adresse de cette chaîne. La première virgule dans optionp est écrasée avec un octet nul, ainsi *valuep est précisément la « chaîne de valeur » pour cette sous-option.
Si la sous-option est reconnue mais qu'aucune chaîne de valeur ne soit trouvée, *valuep est définie à NULL.
Lorsque getsubopt() revient, optionp pointe sur la prochaine sous-option ou sur le caractère nul de la fin de la chaîne si la dernière sous-option vient d'être traitée.
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Puisque *optionp est modifié, la première sous-option avant l'appel à getsubopt() n'est pas (nécessairement) la même qu'après l'appel à getsubopt().
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Puisque getsubopt() écrase toutes les virgules trouvées dans la chaîne *optionp, celle-ci doit être modifiable ; il ne peut s'agir d'une chaîne constante.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#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 | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 7 novembre 2007 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 getsubopt ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |