};
struct poptOption mainArgs[] = {
{ "anoption", 'о', POPT_ARG_NONE, NULL, 'o' },
{ NULL, '\0', POPT_ARG_INCLUDE_TABLE, nestedArgs, 0 },
{ NULL, '\0', POPT_ARG_NONE, NULL, 0 }
};
В этом примере приложение заканчивается тремя параметрами, --option1
, --option2
и --anoption
. Более сложный пример с вложенными таблицами параметров рассматривается далее в главе.
26.2. Использование таблиц параметров
26.2.1. Создание содержимого
popt
может чередовать синтаксический анализ нескольких совокупностей командных строк. Для этого она сохраняет всю информацию о состоянии для определенной совокупности аргументов командных строк в структуре данных poptContext
непрозрачного типа, которую нельзя модифицировать вне библиотеки popt
.
Новое содержимое popt
формируется с помощью функции poptGetContext()
.
#include
poptContext poptGetContext(char * name, int argc, const char ** argv,
struct poptOption * options, int flags);
Первый параметр, name
, используется для работы с псевдонимами и в справочных сообщениях, и должен представлять имя того приложения, параметры которого будут проходить проверку синтаксиса. Следующие два параметра определяют те аргументы командной строки, которые будут проходить проверку синтаксиса. Как правило, они передаются функции poptGetContext()
, точно так, как если бы они передавались функции main()
программы [184] Распространенной ошибкой является определение массива argv как char ** , а не как const char ** , что является правильным вариантом. Благодаря прототипу функции poptGetContext() компилятор генерирует предупреждающее сообщение, если массив argv будет определен неправильно.
. Параметр options
указывает на таблицу параметров командной строки, которая была определена в предыдущем разделе. Последний параметр, flags
, определяет способ синтаксического анализа параметров и включает перечисленные ниже флаги (которые могут быть объединены битовым "ИЛИ").
POPT_CONTEXT_KEEP_FIRST |
Как правило, popt игнорирует значение в argv[0] , которое обычно представляет имя выполняемой программы, а не аргумент командной строки. Если определить этот флаг, то popt будет обрабатывать argv[0] как параметр. |
POPT_CONTEXT_POSIXMEHADER |
Стандарт POSIX гласит, что все параметры должны стоять перед дополнительными параметрами командной строки. Например, в соответствии с POSIX, rm -f file1 file2 приведет к удалению файлов file1 и file2 , тогда как rm file1 file2 -f приведет к обычному удалению трех файлов: file1 , file2 и -f . В большинстве Linux-программы это частное условие игнорируется, поэтому popt не придерживается этого правила по умолчанию. Этот флаг сообщает библиотеке popt о необходимости анализировать синтаксис параметров в соответствии с этим условием. |
Помимо всего прочего, poptContext
следит за тем, какие параметры прошли проверку синтаксиса, а какие нет. Если программе необходимо перезапустить обработку параметров в наборе аргументов, она может восстановить исходное состояние poptContext
, передавая функции poptResetContext()
содержимое в качестве единственного аргумента.
После завершения обработки аргумента процесс должен освободить структуру poptContext
, поскольку в ней содержатся динамически размещаемые компоненты. Функция poptFreeContext()
принимает poptContext
в качестве своего единственного аргумента и освобождает ресурсы, занятые в содержимом.
Ниже представлены прототипы функций poptResetContext()
и poptFreeContext()
.
#include
void poptFreeContext(poptContext con);
void poptResetContext(poptContext con);
26.2.2. Синтаксический анализ командной строки
После того как приложение создаст poptContext
, оно может приступить к синтаксическому анализу аргументов. Функция poptGetNextContext()
выполняет синтаксический анализ аргумента.
#include
int poptGetNextOpt(poptContext con);
Принимая содержимое в качестве своего единственного аргумента, эта функция анализирует синтаксис следующего обнаруженного аргумента командной строки. После того как следующий аргумент будет обнаружен в таблице параметров, функция заполняет объект, на который указывает указатель arg
элемента таблицы параметров, если только он не равен NULL
. Если элемент val
для параметра имеет ненулевое значение, функция возвращает это значение. В противном случае функция poptGetNextOpt()
переходит к следующему аргументу.
Читать дальше