Разобрать подопции, переданные из командной строки
#include <stdlib.h>int getsubopt( char **optionp,char * const *tokens,char **valuep );
libc
Функция getsubopt() анализирует подопции в аргументе флагов, который был изначально анализрован функцией getopt(). Эти подопции разделены запятыми и могут состоять как из единой лексемы, так и из пар лексема-значение, разделенными знаком равно. Поскольку запятые являются разделителями в строке опций, не допускается их использование в подопциях или значениях подопций. Примером команды, использующей такой синтаксис, является mount, которая позволяет пользователю указывать параметры монтирования при помощи опции -o:
mount -o rw,hard,bg,wsize=1024 speed:/usr /usr
В данном примере имеются четыре подопции: rw, hard, bg, и wsize, последняя из которых имеет связанное с ней значение 1024
.
Функция getsubopt() получает на вход адрес указателя на строку опций, массив возможных лексем, и адрес указателя на значение строки. Функция возвращает индекс лексемы, совпавшей с подопцией во входной строке, или -1
, если совпадения не было. Если строка опций optionp содержит только одну подопцию, то optionp будет указывать на нулевой символ в конце строки; в противном случае, функция изолирует подопцию путем замены запятой на нулевой символ, и optionp будет указаывать на начало следующей подопции. Если подопция имеет связанное значение, valuep будет указывать на первый символ значения. В противном случае, функция устанавливает valuep в NULL
.
Массив лексем представлен в виде последовательности указателей на нулевые строки. Конец массива лексем опеределяется по NULL
указателю.
По завершении работы getsubopt(), если valuep не равен NULL
, значит обработанная подопция содержала значение. Вызывающая программа может использовать эту информацию для того, что определить, является ли ошибкой наличие либо отсутствие значения у данной опции.
В дополнение, когда getsubopt() не может сопоставить подопцию с лексемами из массива tokens, вызывающая программа должна определить, является ли это ошибкой, или нераспознанная опция должна быть передана другой программе.
Функция getsubopt() возвращает -1
, если обрабатываемая лексема отсутствует в массиве tokens. Переменная, на которую ссылается valuep содержит указатель на первый символ лексемы, которая не была распознана, а не указатель на значение этой лексемы.
Переменная, на которую указывает optionp указывает на следующую опецию, которая должна быть обработана, или нулевой символ, если больше опций нет.
Следующий фрагмент кода демонстрирует, как обрабатывать опции команды mount(1M) с использованием getsubopt():
#include <stdlib.h>#define READONLY 0#define READWRITE 1#define WRITESIZE 2#define READSIZE 3char *myopts[] = { "ro", "rw", "wsize", "rsize", NULL };int main( int argc, char **argv ){int sc, c, errflag;char *options, *value;extern char *optarg;extern int optind;while ( (c = getopt( argc, argv, "abf:o:" )) != -1 ){switch ( c ){case 'a': /* process a option */break;case 'b': /* process b option */break;case 'f':ofile = optarg;break;case '?':errflag++;break;case 'o':options = optarg;while ( *options != '\0' ){switch ( getsubopt( &options, myopts, &value ) ){case READONLY: /* process ro option */break;case READWRITE: /* process rw option */break;case WRITESIZE: /* process wsize option */if ( value == NULL ){error_no_arg();errflag++;} elsewrite_size = atoi( value );break;case READSIZE : /* process rsize option */if ( value == NULL ){error_no_arg();errflag++;} elseread_size = atoi( value );break;default :/* process unknown token */error_bad_token( value );errflag++;break;}}break;}}if ( errflag ){/* print usage instructions etc. */}for ( ; optind < argc; optind++ ){/* process remaining arguments */}}
POSIX 1003.1 X/Open Systems Interfaces Extension
Во время анализа строки, запятые во входной строке опций преобразуются в нули. Пробельные символы в лексемах или парах лексема-значение должны быть обрамлены кавычками во избежание неверной интерпретации оболочкой.
Предыдущий раздел: Описание API системной библиотеки