getsubopt()

Разобрать подопции, переданные из командной строки

Прототип:

#include <stdlib.h>
int getsubopt( char **optionp,
char * const *tokens,
char **valuep );

Аргументы:

optionp
Адрес указателя на строку опций, которые требуется анализировать. Функция обновляет данный указатель в процессе прохода по опциям.
tokens
Массив возможных лексем.
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 3
char *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++;
} else
write_size = atoi( value );
break;
case READSIZE : /* process rsize option */
if ( value == NULL )
{
error_no_arg();
errflag++;
} else
read_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

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Во время анализа строки, запятые во входной строке опций преобразуются в нули. Пробельные символы в лексемах или парах лексема-значение должны быть обрамлены кавычками во избежание неверной интерпретации оболочкой.

Тематические ссылки:

getopt()




Предыдущий раздел: Описание API системной библиотеки