Чтение онлайн

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Член

val
устанавливает значение, возвращаемое функцией проверки синтаксиса
popt
при обнаружении параметра, если только не используется значение
POPT_ARG_VAL
. Если значение будет равно нулю, функция проверки синтаксиса продолжит проверку следующего аргумента командной строки, и не будет возвращать результат.

Два последних члена являются необязательными, и должны иметь значение

NULL
, если они не нужны. Первый из них,
descrip
, представляет строку, описывающую параметр. Он используется библиотекой
popt
во время генерации справочного сообщения, в котором описываются
все доступные параметры. Член
descrip
предлагает эталонный аргумент для параметра, который также используется для отображения справочной информации. Генерация справочных сообщений рассматривается далее в этой главе.

В последней структуре таблицы все значения указателей должны быть равны

NULL
, а все арифметические значения должны быть нулевыми, отмечая конец таблицы.

Давайте посмотрим, как можно было бы определить таблицу параметров для обычного приложения. Ниже показана таблица параметров для простой версии утилиты

grep
[183] .

const char * pattern = NULL;

int mode = MODE_REGEXP;

int ignoreCase = 0;

183

Полный исходный код для данного примера можно найти в главе 23.

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, '\0', POPT_ARG_NONE, NULL, 0, NULL, NULL }

};

Параметр

retry
не принимает аргумента, поэтому
popt
присваивает переменной
retry
единицу, если определен
– -retry
. Параметры
bytes
и
lines
принимают целочисленные аргументы, которые хранятся в переменных с идентичными именами. Последний параметр,
follow
, может быть либо литеральным
name
, либо
descriptor
. Переменная
followType
задается таким образом, чтобы она указывала на каждое значение, которое будет введено в командной строке, и требует проверки на корректность. Если первоначально она будет указывать на
"descriptor"
, то будет предоставлено полезное
значение по умолчанию.

26.1.2. Вложенные таблицы параметров

Некоторые библиотеки предлагают реализацию набора общих параметров командной строки. Например, одно из первых инструментальных средств X Window обрабатывало параметры

– geometry
и
– display
для приложений, предоставляя большинству программ X Window стандартный набор параметров командной строки для управления обычным поведением. К сожалению, сделать это далеко не просто. Если массивы
argc
и
argv
передать функции инициализации в библиотеке, то библиотека сможет обрабатывать соответствующие параметры, однако приложение должно знать, какие параметры необходимо проигнорировать во время синтаксического анализа
argv
.

Чтобы не допустить возникновения этой проблемы, функция

XtAppInitialize
принимала массивы
argc
и
argv
в качестве параметров и возвращала новые значения для каждого из них с параметрами, обработанными удаленной библиотекой. Несмотря на то что такой подход мог работать, с ростом количества библиотек он стал излишне громоздким.

Чтобы выйти из этой ситуации,

popt
позволяет формировать вложенные таблицы параметров. Благодаря этому подходу библиотеки определяют те параметры, которые им нужны для обработки (для этого может потребоваться еще одна вложенная таблица), а главная программа может предоставить эти параметры путем вложения таблиц с параметрами библиотек внутри самих себя.

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

longName
и
shortName
. В поле
argInfo
должна быть назначена переменная
POPT_ARG_INCLUDE_TABLE
, а член
arg
должен указывать на таблицу, представляемую в форме вложенной таблицы. Ниже показан пример таблицы параметров, включающей другую таблицу.

struct poptOption nestedArgs[] = {

 { "option1", 'a', POPT_ARG_NONE, NULL, 'a' },

 { "option2", 'b', POPT_ARG_NONE, NULL, 'b' },

 { NULL, '\0', POPT_ARG_NONE, NULL, 0 }

};

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
.

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6