getsubopt(3)

ИМЯ
getsubopt - анализирует подпараметры аргументов строки

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <stdlib.h>

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

    Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

getsubopt():
    _XOPEN_SOURCE >= 500
        || /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

ОПИСАНИЕ
Функция getsubopt() анализирует список подпараметров, указываемых через запятую, заданный в optionp (такой список подпараметров, обычно, создаётся при использовании getopt(3) для разбора командной строки; например, смотрите параметр -o в mount(8)). Каждый подпараметр может содержать связанное с ним значение, которое отделяется от имени подпараметра знаком равно. Вот пример строки, которую можно передать в optionp:

    ro,name=xyz

Аргумент tokens — указатель на массив (завершается NULL) указателей на токены, которые getsubopt() будет просматривать при поиске в optionp. Токены должны быть различающимися строками (завершающимися null), содержащими, как минимум, один символ и не содержащих знаков равно или запятых.

При каждом вызове getsubopt() возвращается информация о следующем необработанном подпараметре в optionp. Первый знак равно в подпараметре (если есть) считается разделителем имени и значения в этом подпараметре. Значение длится до последующей запятой или (для последнего подпараметра) до конца строки. Если имя подпараметра совпадает с известным именем из tokens, и найдено строка-значение, то getsubopt() записывает в *valuep адрес этой строки. Первая запятая в optionp перезаписывается байтом null, поэтому *valuep — точное «строка-значение» этого подпараметра.

Если подпараметр распознан, но значение строки не найдено, то *valuep присваивается NULL.

When getsubopt() returns, optionp points to the next suboption, or to the null byte ('\0') at the end of the string if the last suboption was just processed.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Если в optionp распознан первый подпараметр, то getsubopt() возвращает индекс элемента в tokens найденного подпараметра. В противном случае возвращается -1 и значение *valuep указывает на целую строку name[=value].

Так как *optionp изменяется, первый подпараметр перед вызовом getsubopt() не (не всегда) тот же самый, что и первый подпараметр после getsubopt().

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
getsubopt() | Безвредность в нитях | MT-Safe

СТАНДАРТЫ
POSIX.1-2008.

ИСТОРИЯ
POSIX.1-2001.

ЗАМЕЧАНИЯ
Так как getsubopt() заменяет запятые, найденные в строке *optionp, то строка должна быть доступна на запись; она не может быть строковой константой.

ПРИМЕРЫ
Следующая программа ожидает подпараметры после параметра «-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,
                                    "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);
    }

СМ. ТАКЖЕ
getopt(3)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.