47: p->height, p->width, p->fg, p->bg);
48:
49: } else {
50: switch (opt->shortName) {
51: case 'h': p->height = strtol(arg, &chptr, 10); break;
52: case 'w': p->width = strtol(arg, &chptr, 10); break;
53: case 'f' : p->fg = (char *) arg; break;
54: case 'b': p->bg = (char *) arg; break;
55: }
56:
57: if (chptr && *chptr) {
58: fprintf(stderr, "для %s ожидался числовой аргумент\n",
59: opt->longName);
60: exit(1);
61: }
62: }
63: }
64:
Программа, для которой необходимо обеспечить эти аргументы командной строки, должна включать одну дополнительную строку в своей таблице popt
. Обычно этой строкой является макрос, задаваемый в заголовочном файле (подобно тому, как реализуется POPT_AUTOHELP
), но в целях упрощения в данном примере мы просто явным образом покажем эту строку.
1: /* popt-nest.c */
2:
3: #include <popt.h>
4:
5: /* Обычно это объявление осуществляется в заголовочном файле */
6: extern struct poptOption libTable[];
7:
8: int main(int argc, const char * argv[]) {
9: poptContext optCon;
10: int rc;
11: struct poptOption options[] = {
12: { "app1", '\0', POPT_ARG_NONE, NULL, '\0' },
13: { NULL, '\0', POPT_ARG_INCLUDE_TABLE, libTable,
14: '\0', "Nested:", }
15: POPT_AUTOHELP
16: { NULL, '\0', POPT_ARG_NONE, NULL, '\0' }
17: };
18:
19: optCon = poptGetContext("popt-nest", argc, argv, options, 0);
20:
21: if ((rc = poptGetNextOpt (optCon)) < -1) {
22: fprintf(stderr, "%s: %s\n",
23: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
24: poptStrerror(rc));
25: return 1;
26: }
27:
28: return 0;
29: }
26.4. Обработка ошибок
Каждая из функций popt
, которая может возвращать ошибки, возвращает целочисленные значения. В случае возникновения ошибки возвращается отрицательный код. В табл. 26.2 перечислены коды возможных ошибок. После таблицы дается подробное обсуждение каждой ошибки.
Таблица 26.2. Коды ошибок popt
Код ошибки | Описание |
---|---|
POPT_ERROR_NOARG |
Отсутствует аргумент для данного параметра. |
POPT_ERROR_BADOPT |
Невозможно проанализировать синтаксис аргумента параметра. |
POPT_ERROR_OPTSTOODEEP |
Слишком глубокое вложение замещений имени параметра. |
POPT_ERROR_BADQUOTE |
Несоответствие кавычек. |
POPT_ERROR_BADNUMBER |
Невозможно преобразовать параметр в число. |
POPT_ERROR_OVERFLOW |
Данное число слишком большое или слишком маленькое. |
POPT_ERROR_NOARG |
Параметр, для которого требуется аргумент, был определен в командной строке, однако аргумент не был предоставлен. Эта ошибка может быть возвращена только функцией poptGetNextOpt() . |
POPT_ERROR_BADOPT |
Параметр был определен в массиве argv , однако его нет в таблице параметров. Эта ошибка может быть возвращена только функцией poptGetNextOpt() . |
POPT_ERROR_OPTSTOODEEP |
Совокупность замещений имени параметра имеет большую глубину вложений. На данный момент popt отслеживает параметры только до 10 уровня, чтобы избежать возникновения бесконечной рекурсии. Эту ошибку возвращает только функция poptGetNextOpt() . |
POPT_ERROR_BADQUOTE |
В строке, прошедшей синтаксический анализ, было обнаружено несоответствие кавычек (например, была обнаружена только одна одинарная кавычка). Эту ошибку могут возвращать функции poptParseArgvString() , poptReadConfigFile() и poptReadDefaultConfig() . |
POPT_ERROR_BADNUMBER |
Преобразование строки в число (int или long ) не было выполнено вследствие того, что строка содержит нецифровые символы. Эта ошибка возникает в том случае, когда функция poptGetNextOpt() обрабатывает аргумент типа РOРТ_ARG_INT или POPT_ARG_LONG . |
POPT_ERROR_OVERFLOW |
Преобразование из строки в число не было выполнено вследствие того, что число было слишком большим или слишком маленьким. Подобно ошибке POPT_ERROR_BADNUMBER , эта ошибка может возникнуть только в том случае, если функция poptGetNextOpt() обрабатывает аргумент типа РОРТ_ARG_INT или POPT_ARG_LONG . |
POPT_ERROR_ERRNO |
Системный вызов был возвращен вместе с ошибкой, а errno до сих пор содержит ошибку из системного вызова. Эту ошибку могут возвращать функции poptReadConfigFile() и poptReadDefaultConfig() . |
Приложения могут генерировать качественные сообщения об ошибках с помощью следующих двух функций.
const char * poptStrerror(const int error);
Эта функция принимает код ошибки popt
и возвращает строку с описанием ошибки, как и стандартная функция strerror()
.
char * poptBadOption(poptContext con, int flags);
Если во время выполнения функции poptGetNextOpt()
возникла ошибка, эта функция возвращает параметр, вызвавший ошибку. Если аргументу flags
присвоено значение POPT_BADOPTION_NOALIAS
, возвращается самый внешний параметр. В противном случае аргумент flags
должен иметь нулевое значение, а возвращаемый параметр может быть определен посредством псевдонима.