Троан Эрик В.
Шрифт:
Следующий элемент добавляет параметр
– -text
в команду grep
, как было предложено в начале этого раздела. grep alias --text -i -n -E -2
26.5.2. Разрешение псевдонимов
Приложение должно разрешать разворачивание псевдонимов для
popContext
перед первым вызовом функции poptGetNextOpt
. Псевдонимы для содержимого определяются с помощью трех функций. int poptReadDefaultConfig(poptContext con, int flags);
Эта функция считывает псевдонимы из
/etc/popt
и файла .popt
в домашнем каталоге пользователя. На данный момент flags
должен иметь нулевое значение, поскольку он зарезервирован только для будущего использования. int poptReadConfigFile(poptContext con, char * fn);
Файл, определяемый посредством
fn
, открывается и анализируется как конфигурационный файл popt
. Это позволяет программам использовать конфигурационные файлы конкретных программ. int poptAddAlias(poptContext con, struct poptAlias alias, int flags);
В некоторых случаях в программах необходимо определять псевдонимы, не читая их из конфигурационного файла. Эта функция добавляет новый псевдоним в содержимое. Аргумент
flags
должен иметь нулевое значение, и в настоящий момент он зарезервирован только для будущего использования. Новый псевдоним определяется как struct poptAlias
следующим образом: struct poptAlias {
char * longName; /* может быть NULL */
char shortName; /* может быть '\0' */
int argc;
char ** argv; /*должна быть возможность освобождения с помощью free*/
};
Первые два элемента,
longName
и shortName
, определяют параметр, для которого вводится псевдоним. Два последних аргумента, argc
и argv
, определяют разворачивание, которое будет использовано при обнаружении псевдонима параметра. 26.6. Синтаксический анализ строк аргументов
Хотя библиотека
popt
обычно используется для синтаксического анализа аргументов, уже разделенных на массив вида argv
, в некоторых программах необходимо анализировать синтаксис строк, формат которых идентичен командным строкам. Для этой цели popt
предлагает функцию, которая анализирует синтаксис строки в виде массива строки, руководствуясь правилами, подобными обычному синтаксическому анализу в оболочке. #include <popt.h>
int poptParseArgvString(char * s, int * argcPtr, char *** argvPtr);
Строка
s
разбирается в массив argv
. Целочисленное значение, на которое указывает второй параметр, argcPtr
, содержит количество проанализированных элементов, а указатель, на который ссылается последний параметр, указывает на вновь созданный массив. Размещение массива осуществляется динамически; после того как приложение завершит работу с массивом, необходимо вызвать функцию free
. Массив
argvPtr
, созданный функцией poptParseArgvString
, подходит для прямой передачи функции poptGetContext
[187] . 26.7. Обработка дополнительных аргументов
Некоторые приложения реализуют эквивалент псевдонимов параметров, однако для этого им необходима специальная логика. Функция
poptStuffArgs
позволяет приложению вставлять новые аргументы в текущую структуру poptContext
.187
Часто в подобных случаях удобно использовать
POPT_CONTEXT_KEEP_FIRST
. #include <popt.h>
int poptStuffArgs(poptContext con, char ** argv);
Передаваемый массив
argv
должен иметь указатель NULL
в качестве своего последнего элемента. Когда функция poptGetNextContext
будет вызвана в следующий раз, то анализироваться будут сначала "заполненные" аргументы. Библиотека popt возвращает обычные аргументы после того, как закончатся все "заполненные".