getsubopt(3)

НАИМЕНОВАНИЕ
getsubopt - анализирует подпараметры аргументов строки

БИБЛИОТЕКА
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> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).