Книга: Разработка приложений в среде Linux. Второе издание
26.1.1. Определение параметров
26.1.1. Определение параметров
Приложения передают библиотеке popt
информацию о своих параметрах командной строки через массив структур struct poptOption
.
#include <popt.h>
struct poptOption {
const char * longName; /* может иметь значение NULL */
char shortName; /* может иметь значение '' */
int argInfo;
void * arg; /* зависит от argInfo */
int val; /*0 означает не возвращаться, а просто обновить флаг*/
char * descrip; /* необязательное описание параметра */
char * argDescrip; /* необязательное описание аргумента */
};
Каждый элемент таблицы определяет один параметр, который может быть передан программе. Длинные и короткие параметры рассматриваются как один параметр, который может встречаться в двух различных формах. Первые два элемента, longName
и shortName
, определяют имена параметров; первый соответствует длинному имени, а второй — одиночный символ.
Элемент argInfo
сообщает библиотеке popt
о том, какой тип аргумента ожидается после параметра. Если не ожидается никакого параметра, будет использоваться значение РОPT_ARG_NONE
. Остальные допустимые значения перечислены в табл. 26.1[182].
Таблица 26.1. Типы аргументов popt
Значение | Описание | Тип arg |
---|---|---|
POPT_ARG_NONE |
He ожидается ни одного аргумента. | int |
POPT_ARG_STRING |
Не должна выполняться проверка соответствия типов. | char * |
POPT_ARG_INT |
Ожидается целочисленный аргумент. | int |
POPT_ARG_LONG |
Ожидается длинный целочисленный тип. | long |
POPT_ARG_FLOAT |
Ожидается тип с плавающей точкой. | float |
POPT_ARG_DOUBLE |
Ожидается тип с плавающей точкой двойной точности. | double |
POPT_ARG_VAL |
Не ожидается ни одного аргумента (см. текст). | int |
Следующий элемент, arg
, позволяет библиотеке popt
обновлять переменные в программе автоматически в случае использования параметра. Если arg
имеет значение NULL
, то он будет проигнорирован, и popt
не будет выполнять никаких действий. В противном случае он будет указывать на переменную, тип которой задан в правой колонке табл. 26.1.
Если параметр не принимает аргументов (argInfo
имеет значение POPT_ARG_NONE
), то переменная, на которую указывает arg
, получает единичное значение при использовании параметра. Если параметр принимает аргумент, то значение переменной, на которую указывает arg
, обновляется до значения аргумента. Аргументы POPT_ARG_STRING
могут принимать любую строку, а аргументы POPT_ARG_INT
, POPT_ARG_LONG
, POPT_ARG_FLOAT
и POPT_ARG_DOUBLE
преобразуются в соответствующий тип, при этом, если преобразование не удастся выполнить, будет сгенерирована ошибка.
Если используется значение POPT_ARG_VAL
, то никаких аргументов не ожидается. Вместо этого popt
скопирует целочисленное значение val
в адрес, на который указывает arg
. Это будет полезно в том случае, когда в программе имеется набор взаимно исключающих аргументов, и выбор падает на последний указанный аргумент. Определяя различные значения val
для каждого параметра, когда член arg
каждого параметра будет указывать на одно и то же целочисленное значение, и, определяя для каждого из них значение POPT_ARG_VAL
, можно легко узнать, какой из этих параметров был определен последним. Если будет задано более одного параметра, то сгенерировать ошибку не удастся.
Член val
устанавливает значение, возвращаемое функцией проверки синтаксиса popt
при обнаружении параметра, если только не используется значение POPT_ARG_VAL
. Если значение будет равно нулю, функция проверки синтаксиса продолжит проверку следующего аргумента командной строки, и не будет возвращать результат.
Два последних члена являются необязательными, и должны иметь значение NULL
, если они не нужны. Первый из них, descrip
, представляет строку, описывающую параметр. Он используется библиотекой popt
во время генерации справочного сообщения, в котором описываются все доступные параметры. Член descrip
предлагает эталонный аргумент для параметра, который также используется для отображения справочной информации. Генерация справочных сообщений рассматривается далее в этой главе.
В последней структуре таблицы все значения указателей должны быть равны NULL
, а все арифметические значения должны быть нулевыми, отмечая конец таблицы.
Давайте посмотрим, как можно было бы определить таблицу параметров для обычного приложения. Ниже показана таблица параметров для простой версии утилиты grep
[183].
const char * pattern = NULL;
int mode = MODE_REGEXP;
int ignoreCase = 0;
int maxCount = -1;
struct poptOption optionsTable[] = {
{ "extended-regexp", 'E', POPT_ARG_VAL, &mode, MODE_EXTENDED,
"шаблоном для соответствия является расширенное регулярное выражение",
NULL },
{ "fixed-strings", 'F', POPT_ARG_VAL, &mode, MODE_FIXED,
"шаблоном для соответствия является базовая строка (не "
"регулярное выражение)", NULL } ,
{ "basic-regexp", 'G', POPT_ARG_VAL, &mode, MODE_REGEXP,
"шаблоном для соответствия является базовое регулярное выражение" },
{ "ignore-case", 'i', POPT_ARG_NONE, &ignoreCase, 0,
"выполнять поиск, чувствительный к регистру", NULL },
{ "max-count", 'm', POPT_ARG_INT, &maxCount, 0,
"завершить после получения N совпадений", "N" },
{ "regexp", 'e', POPT_ARG_STRING, &pattern, 0,
"регулярное выражение для поиска", "pattern" },
{ NULL, '', POPT_ARG_NONE, NULL, 0, NULL, NULL }
};
Параметр retry
не принимает аргумента, поэтому popt
присваивает переменной retry
единицу, если определен --retry
. Параметры bytes
и lines
принимают целочисленные аргументы, которые хранятся в переменных с идентичными именами. Последний параметр, follow
, может быть либо литеральным name
, либо descriptor
. Переменная followType
задается таким образом, чтобы она указывала на каждое значение, которое будет введено в командной строке, и требует проверки на корректность. Если первоначально она будет указывать на "descriptor"
, то будет предоставлено полезное значение по умолчанию.
- Определение версии клиента
- Единое имя файла параметров InterBase
- Определение возможных причин отклонений от запланированных параметров
- 5.4.4. Определение типа файла
- Определение имен рабочей станции, пользователя и домена
- Определение параметров вариативности модели и ее реализации
- 12.6.3. Определение параметров касающихся геометрических тел
- Определение параметров объектов Recordset
- Определение параметров членов
- Определение параметров файла