Knigi-for.me

Linux программирование в примерах - Роббинс Арнольд

Тут можно читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Интернет издательство , год . Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте knigi-for.me (knigi for me) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.

Для демонстрации регулярных выражений

ch12-grep.c
предусматривает базовую реализацию стандартной программы
grep
, которая отыскивает соответствие шаблону. Наша версия использует по умолчанию базовые регулярные выражения. Для использования вместо этого расширенных регулярных выражений она принимает опцию
-E
, а для игнорирования регистра символов опцию
-i
. Как и настоящая
grep
, если в командной строке не указаны файлы, наша
grep
читает со стандартного ввода, а для обозначения стандартного ввода, как и в настоящей
grep
, может быть использовано имя файла '
-
'. (Эта методика полезна для поиска в стандартном вводе наряду с другими файлами.) Вот программа:

1  /* ch12-grep.c - Простая версия grep, использующая функции POSIX */

2

3  #define _GNU_SOURCE 1 /* для getline)) */

4  #include <stdio.h>

5  #include <errno.h>

6  #include <regex.h>

7  #include <unistd.h>

8  #include <sys/types.h>

9

10 char *myname; /* для сообщений об ошибках */

11 int ignore_case = 0; /* опция -i: игнорировать регистр */

12 int extended = 0; /* опция -E: использовать расширенные регулярные выражения */

13 int errors = 0; /* число ошибок */

14

15 regex_t pattern; /* шаблон для поиска */

16

17 void compile_pattern(const char *pat);

18 void process(const char *name, FILE *fp);

19 void usage(void);

Строки 10–15 объявляют глобальные переменные программы. Первый набор (строки 10–13) для опций и сообщений об ошибках. Строка 15 объявляет

pattern
, в которой хранится откомпилированный шаблон. Строки 17–19 объявляют другие функции программы.

21 /* main --- обработка опций, открывание файлов */

22

23 int main(int argc, char **argv)

24 {

25  int с;

26  int i;

27  FILE *fp;

28

29  myname = argv[0];

30  while ((c = getopt(argc, argv, ":iE")) != -1) {

31   switch (c) {

32   case 'i':

33    ignore_case = 1;

34    break;

35   case 'E':

36    extended = 1;

37    break;

38   case '?':

39    usage();

40    break;

41   }

42  }

43

44  if (optind == argc) /* проверка исправности */

45   usage();

46

47  compile_pattern(argv[optind]); /* компилировать шаблон */

48  if (errors) /* ошибка компиляции */

49   return 1;

50  else

51   optind++;

В строке 29 устанавливается значение

myname
, а строки 30–45 анализируют опции. Строки 47–51 компилируют регулярное выражение, помещая результаты в
pattern
,
compilе_раttern()
увеличивает значение
errors
, если была проблема. (Соединение функций посредством глобальной переменной, как здесь, обычно считается плохой манерой. Для небольших программ, подобным этой, это сойдет, но для более крупных программ такое сопряжение может стать проблемой.) Если не было ошибок, строка 51 увеличивает значение
optind
так, что оставшиеся аргументы представляют файлы для обработки.

53  if (optind == argc) /* файлов нет, по умолчанию stdin */

54   process("standard input", stdin);

55  else {

56   /* цикл с файлами */

57   for (i = optind; i < argc; i++) {

58    if (strcmp(argv[i], "-") == 0)

59    process("standard input", stdin);

60    else if ((fp = fopen(argv[i], "r")) != NULL) {

61     process(argv[i], fp);

62     fclose(fp);

63    } else {

64     fprintf(stderr, "%s: %s: could not open: %s\n",

65      argv[0], argv[i], strerror(errno));

66     errors++;

67    }

68   }

69  }

70

71  regfree(&pattern);

72  return errors != 0;

73 }

Строки 53–69 обрабатывают файлы, отыскивая соответствующие шаблону строки. Строки 53–54 обрабатывают случай, когда файлы не указаны: программа читает со стандартного ввода. В противном случае, строки 57–68 обрабатывают в цикле файлы. Строка 58 обрабатывает особый случай '

-
', обозначающий стандартный ввод, строки 60–62 обрабатывают обычные файлы, а строки 63–67 обрабатывают ошибки.

75 /* compile_pattern --- компиляция шаблона */

76

77 void compile_pattern(const char *pat)


Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-for.me.

Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту knigi.for.me@yandex.ru или заполнить форму обратной связи.