Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 133

Автор Майкл ДТонсон

 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, '\0',

23:    POPT_ARG_CALLBACK | POPT_CBFLAG_PRE | POPT_CBFLAG_POST,

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

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

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

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

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

29:  { NULL, '\0', POPT_ARG_NONE, NULL, '\0', 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 Ρ„ΠΎΠ½ %s\n",

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 Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ посрСдством псСвдонима.

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок popt. Если ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²ΠΎ врСмя выполнСния Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ выводится сообщСниС ΠΎΠ± ошибкС, Π° функция poptStrerror() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку с описаниСм ошибки. Если ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π²ΠΎ врСмя синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ прСдставлСнному Π½ΠΈΠΆΠ΅, ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС.

fprintf(stderr, "%s: %s\n",

 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). Оба Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства строк, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: