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

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

Новое содержимое

popt
формируется с помощью функции
poptGetContext
.

#include <popt.h>

poptContext poptGetContext(char * name, int argc, const char ** argv,

 struct poptOption * options, int flags);

Первый параметр,

name
, используется для работы с псевдонимами и в справочных сообщениях, и должен представлять имя того приложения, параметры которого будут проходить проверку синтаксиса. Следующие два параметра определяют те аргументы командной строки, которые будут проходить проверку синтаксиса. Как правило, они передаются функции
poptGetContext
, точно так, как если бы они передавались
функции
main
программы [184] . Параметр
options
указывает на таблицу параметров командной строки, которая была определена в предыдущем разделе. Последний параметр,
flags
, определяет способ синтаксического анализа параметров и включает перечисленные ниже флаги (которые могут быть объединены битовым "ИЛИ").

184

Распространенной ошибкой является определение массива

argv
как
char **
, а не как
const char **
, что является правильным вариантом. Благодаря прототипу функции
poptGetContext
компилятор генерирует предупреждающее сообщение, если массив
argv
будет определен неправильно.

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 <popt.h>

void poptFreeContext(poptContext con);

void poptResetContext(poptContext con);

26.2.2. Синтаксический анализ командной строки

После того как приложение создаст

poptContext
, оно может приступить к синтаксическому анализу аргументов. Функция
poptGetNextContext
выполняет синтаксический анализ аргумента.

#include <popt.h>

int poptGetNextOpt(poptContext con);

Принимая

содержимое в качестве своего единственного аргумента, эта функция анализирует синтаксис следующего обнаруженного аргумента командной строки. После того как следующий аргумент будет обнаружен в таблице параметров, функция заполняет объект, на который указывает указатель
arg
элемента таблицы параметров, если только он не равен
NULL
. Если элемент
val
для параметра имеет ненулевое значение, функция возвращает это значение. В противном случае функция
poptGetNextOpt
переходит к следующему аргументу.

Функция

poptGetNextOpt
возвращает значение
– 1
, если был проанализирован синтаксис последнего аргумента, и другие отрицательные значения в случае возникновения ошибки. Поэтому лучше всего присваивать элементам
val
в таблице параметров значения больше нуля.

Если все параметры командной строки обрабатываются через указатели

arg
, то синтаксический анализ командной строки сокращается до следующей строки кода:

rc = poptGetNextOpt(poptcon);

Тем не менее, для многих приложений требуется более сложный синтаксический анализ командной строки, нежели этот, и применяется показанная ниже структура.

while ((rc = poptGetNextOpt(poptcon)) > 0) {

 switch (rc) {

/* здесь обрабатываются специфические аргументы */

 }

}

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

popt
присваивала переменной значение параметра из элементов arg таблицы параметров. Другой способ предусматривает применение функции
poptGetOptArg
.

#include <popt.h>

char * poptGetOptArg(poptContext con);

Эта функция возвращает аргумент, заданный для последнего параметра, возвращенного функцией

poptGetNextOpt
, или возвращает значение
NULL
, если ни один из аргументов не был определен.

26.2.3. Остаточные аргументы

Многие приложения принимают произвольное количество аргументов командной строки, например, список имен файлов. Когда

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

char * poptGetArg(poptContext con);

Эта функция возвращает следующий остаточный аргумент и помечает его как обработанный.

char * poptPeekArg(poptContext con);

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

char ** poptGetArgs(poptContext con);

Эта функция возвращает все остаточные аргументы в виде

argv
. Последний элемент в возвращаемом массиве указывает на
NULL
, подтверждая конец аргументов.

26.2.4. Автоматические справочные сообщения

Одним из преимуществ использования библиотеки

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

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

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

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

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

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9