getsubopt   Début   Suivant   Sommaire   Préc.page.lue   Accueil
Section: Manuel du programmeur Linux (3)
Updated: 29 mai 2007
Sommaire  



NOM   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
getsubopt - Analyser les arguments des sous-options depuis une chaîne  



SYNOPSIS   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
#define _XOPEN_SOURCE 500
#include <stdlib.h>

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




DESCRIPTION   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
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   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
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É   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
POSIX.1-2001.  



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
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   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil
getopt(3), feature_test_macros(7)  



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
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
CONFORMITÉ
NOTES
EXEMPLE
VOIR AUSSI
TRADUCTION

Ce document a été créé par man2html suivi de man2html.pl, le 17/10/2008 17:50:19, en utilisant les pages de 'man'.
 

Valid HTML 4.01 Transitional