Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

       Стандартная библиотека языка C (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  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                    getsubopt(3)