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

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

Жанры

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

Троан Эрик В.

Шрифт:

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

argv
, выполняемая вручную. Помочь в проверке синтаксиса параметров могут библиотечные функции
getopt
и
getoptlong
. Функция
getopt
присутствует во многих реализациях Unix, однако она поддерживает только короткие параметры. Функция
getoptlong
доступна в Linux и позволяет автоматически анализировать синтаксис коротких и длинных параметров [181] .

181

Библиотека

glibc
также предлагает библиотеку
argp
,
с помощью которой можно осуществлять альтернативный вариант проверки синтаксиса параметров.

Библиотека

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

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

argv
.

• Она может анализировать синтаксис произвольного массива, состоящего из элементов в стиле

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

• Библиотека может анализировать синтаксис аргументов многих типов, не требуя для этого дополнительного кода в приложении.

• Она предлагает стандартный метод использования псевдонимов параметров. Программы, использующие библиотеку

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

• Благодаря особому механизму библиотеки могут анализировать синтаксис одних параметров в тот момент, когда главное приложение анализирует синтаксис других параметров.

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

• Библиотека может генерировать обычные сообщения об ошибках.

Подобно функции

getoptlong
, библиотека
popt
поддерживает короткие и длинные параметры.

Библиотека

popt
является в высшей степени доступной и может работать на любой POSIX-платформе. Самую последнюю версию библиотеки можно найти по адресу ftp://ftp.rpm.org/pub/rpm. Библиотека
popt
обладает целым рядом функциональных возможностей, не упоминаемых в этой главе; их описание можно найти на man-странице для popt.

Библиотека

popt
может распространяться либо под лицензией General Public License GNU, либо под лицензией Library General Public License GNU.

26.1. Таблица параметров

26.1.1. Определение параметров

Приложения передают библиотеке

popt
информацию о своих параметрах командной строки через массив структур
struct poptOption
.

#include <popt.h>

struct poptOption {

 const char * longName; /* может иметь значение NULL */

 char shortName; /* может иметь значение '\0' */

 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

182

Те, кто знаком с функцией

getopt
, заметят, что
argInfo
является единственным обязательным членом структуры
struct poptOption
, который отличается от члена в таблице аргументов
getoptlong
. Благодаря этому сходству существенно упрощается переход от
getoptlong
к
popt
.

Следующий элемент,

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
, можно легко узнать, какой из этих параметров был определен последним. Если будет задано более одного параметра, то сгенерировать ошибку не удастся.

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

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

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
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