getsubopt(3)

NUME
getsubopt - analizează argumentele subopțiunii dintr-un șir de caractere

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <stdlib.h>

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

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

getsubopt():
    _XOPEN_SOURCE >= 500
        || /* Începând cu glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

DESCRIERE
getsubopt() analizează lista de subopțiuni separate prin virgule furnizate în optionp. O astfel de listă de subopțiuni este produsă de obicei atunci când getopt(3) este utilizat pentru a analiza o linie de comandă; a se vedea, de exemplu, opțiunea -o din mount(8). Fiecare subopțiune poate include o valoare asociată, care este separată de numele subopțiunii printr-un semn egal. Următorul este un exemplu al tipului de șir de caractere care ar putea fi trecut în optionp:

    ro,nume=xyz

Argumentul tokens este un indicator către o matrice cu terminație NULL de indicatori către token-urile pe care getsubopt() le va căuta în optionp. Token-urile trebuie să fie șiruri distincte, cu terminație nulă, care conțin cel puțin un caracter, fără semne egale sau virgule încorporate.

Fiecare apel la getsubopt() returnează informații despre următoarea subopțiune neprocesată din optionp. Primul semn egal dintr-o subopțiune (dacă există) este interpretat ca un separator între numele și valoarea subopțiunii respective. Valoarea se extinde până la următoarea virgulă sau (pentru ultima subopțiune) până la sfârșitul șirului. Dacă numele subopțiunii corespunde unui nume cunoscut din tokens și a fost găsit un șir de valori, getsubopt() stabilește *valuep la adresa șirului respectiv. Prima virgulă din optionp este suprascrisă cu un octet nul, astfel încât *valuep este exact „șirul de valori” pentru subopțiunea respectivă.

Dacă subopțiunea este recunoscută, dar nu a fost găsit niciun șir de valori, *valuep este stabilită la NULL.

Când getsubopt() returnează, optionp indică următoarea subopțiune sau octetul nul („\0”) de la sfârșitul șirului dacă ultima subopțiune tocmai a fost procesată.

VALOAREA RETURNATĂ
Dacă prima subopțiune din optionp este recunoscută, getsubopt() returnează indexul elementului de subopțiune corespunzător din tokens. În caz contrar, se returnează -1, iar *valuep este întregul șir nume[=valoare].

Deoarece *optionp este modificată, prima subopțiune înainte de apelul la getsubopt() nu este (neapărat) aceeași cu prima subopțiune după getsubopt().

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
getsubopt() | Siguranța firelor | MT-Safe

STANDARDE
POSIX.1-2008.

ISTORIC
POSIX.1-2001.

NOTE
Deoarece getsubopt() suprascrie orice virgulă pe care o găsește în șirul *optionp, acel șir trebuie să poată fi scris; nu poate fi o constantă de șir.

EXEMPLE
Următorul program așteaptă subopțiuni după o opțiune „-o”.

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

    #include <assert.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,
                                    "Lipsește valoarea pentru subopțiunea '%s'\n",
                                    token[NAME_OPT]);
                            errfnd = 1;
                            continue;
                        }

                        name = value;
                        break;

                    default:
                        fprintf(stderr,
                                "Nu s-a găsit nicio potrivire pentru token: /%s/\n", value);
                        errfnd = 1;
                        break;
                    }
                }
                if (readwrite && readonly) {
                    fprintf(stderr,
                            "Doar una dintre '%s' și '%s' poate fi specificată\n",
                            token[RO_OPT], token[RW_OPT]);
                    errfnd = 1;
                }
                break;

            default:
                errfnd = 1;
            }
        }

        if (errfnd || argc == 1) {
            fprintf(stderr, "\nUtilizare: %s -o <șir-subopțiune>\n", argv[0]);
            fprintf(stderr,
                    "subopțiunile sunt 'ro', 'rw', și 'nume=<valoare>'\n");
            exit(EXIT_FAILURE);
        }

        /* Restul programului... */

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
getopt(3)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.