GETSUBOPT(3)

NOM
getsubopt - Analyser 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);

DESCRIPTION
getsubopt() analyse la liste, séparée par des virgules, des sous-options fournie dans optionp. (Une telle liste de sous-options est typiquement produite par getopt(3) lors de l'analyse d'une ligne de commande ; voir l'exemple de l'option -o de mount(8).) Chaque sous-option peut avoir une valeur associée qui est séparée du nom de la sous-option par le symbole égal. Voici un exemple de ce type de chaîne qui peut être passée à optionp :

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
Si la première sous-option dans optionp est reconnue, getsubopt() renvoie l'index de l'élément de la sous-option correspondante de tokens. Autrement, -1 est renvoyé et *valuep est la chaîne name[=value] en entier. 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É
POSIX.1-2001.

NOTES
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
Le programme suivant attend les sous-options à la suite d'une 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)

TRADUCTION

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 24 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.