Kniga-Online.club
» » » » Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

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

Читать бесплатно Майкл Джонсон - Разработка приложений в среде Linux. Второе издание. Жанр: Программное обеспечение издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

 1: /* popt-lib.с */

 2:

 3: #include <popt.h>

 4: #include <stdlib.h>

 5:

 6: struct params {

 7:  int height, width;

 8:  char*fg,*bg;

 9: };

10:

11: static void callback(poptContext con,

12:  enum poptCallbackReason reason,

13:  const struct poptOption * opt,

14:  const char * arg,

15:  const void * data);

16:

17: /* Здесь сохраняются переменные, которые прошли синтаксический анализ. Обычно

18:    глобальные переменные использовать не рекомендуется, зато работать с ними проще.*/

19: struct params ourParam;

20:

21: struct poptOption libTable[] = {

22:  { NULL, '',

23:    POPT_ARG_CALLBACK | POPT_CBFLAG_PRE | POPT_CBFLAG_POST,

24:    callback, '', (void *) &ourParam, NULL },

25:  { "height", 'h', POPT_ARG_STRING, NULL, '', NULL, NULL },

26:  { "width", 'w', POPT_ARG_STRING, NULL, '', NULL, NULL },

27:  { "fg", 'f', POPT_ARG_STRING, NULL, '', NULL, NULL },

28:  { "bg", 'b', POPT_ARG_STRING, NULL, '', NULL, NULL },

29:  { NULL, '', POPT_ARG_NONE, NULL, '', NULL, NULL }

30: };

31:

32: static void callback(poptContext con,

33:  enum poptCallbackReason reason,

34:  const struct poptOption * opt,

35:  const char * arg,

36:  const void * data) {

37:  struct params * p = (void *) data;

38:  char * chptr = NULL;

39:

40:  if (reason == POPT_CALLBACK_REASON_PRE) {

41:   p->height = 640;

42:   p->width = 480;

43:   p->fg = "white";

44:   p->bg = "black";

45:  } else if (reason == POPT_CALLBACK_REASON_POST) {

46:   printf("используется высота %d ширина %d передний план %s фон %sn",

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", '', POPT_ARG_NONE, NULL, '' },

13:   { NULL, '', POPT_ARG_INCLUDE_TABLE, libTable,

14:     '', "Nested:", }

15:     POPT_AUTOHELP

16:   { NULL, '', POPT_ARG_NONE, NULL, '' }

17:  };

18:

19:  optCon = poptGetContext("popt-nest", argc, argv, options, 0);

20:

21:  if ((rc = poptGetNextOpt (optCon)) < -1) {

22:   fprintf(stderr, "%s: %sn",

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

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

fprintf(stderr, "%s: %sn",

 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

 poptStrerror(rc));

26.5. Псевдонимы параметров

Одним из основных преимуществ использования библиотеки popt по сравнению с функцией getopt() является возможность использования псевдонимов параметров. Благодаря ним пользователь может определить параметры, которые popt будет расширять их на другие параметры по мере их определения. Если стандартная программа grep использовала popt, то пользователи могли добавлять параметр --text, который расширялся до -i -n -Е -2, облегчая поиск информации в текстовых файлах.

26.5.1. Определение псевдонимов

Псевдонимы обычно определяются в двух местах: в /etc/popt и в файле .popt, хранящемся в домашнем каталоге пользователя (его можно найти через переменную окружения HOME). Оба файла имеют одинаковую форму в виде произвольного количества строк, форматированных следующим образом:

Перейти на страницу:

Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*