Выбрать главу

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 должен иметь нулевое значение, а возвращаемый параметр может быть определен посредством псевдонима.