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

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.

Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Аргумент сflagsопределяет варианты интерпретации регулярного выражения regex. Он может иметь нулевое значение или быть любой комбинацией перечисленных ниже значений, объединенных битовым "ИЛИ".

REG_EXTENDED Вместо синтаксической структуры BRE будет использоваться структура ERE.
REG_ICASE Не будет учитываться регистр.
REG_NOSUB Не будут выделяться подстроки. Функция regexec()будет игнорировать аргументы nmatchи pmatch.
REG_NEWLINE Если значение REG_NEWLINEне будет задано, то символ новой строки будет обрабатываться точно так же, как и любой другой символ. Символы ^и $соответствуют только началу и концу всей строки, а не соседним символам новой строки. Если значение REG_NEWLINEбудет задано, то результат будет таким же, как и в случае использования grep, sedи других стандартных системных инструментальных средств; символ ^ осуществляет привязку к началу строки и символу, следующему после символа новой строки (фактически он соответствует строке нулевой длины, следующей за символом новой строки); $осуществляет привязку к концу строки и символу, следующему после символа новой строки (фактически, он соответствует строке нулевой длины, предшествующей символу новой строки); символ .не соответствует символу новой строки.

Ниже представлен пример типичного вызова функции.

if ((rerr = regcomp(&p, "(^(.*[^\\])#.*$)|(^[^#]+$)",

REG_EXTENDED|REG_NEWLINE))) {

if (rerr == REG_NOMATCH) {

/* строка просто не совпадает с регулярным выражением */

} else {

/* какая-то другая ошибка, например, неправильно сформированное регулярное выражение */

}

}

Данное расширенное регулярное выражение находит строки в файле, которые не включены в комментарии, или которые, по крайней мере, частично, заключены в комментарии посредством символов #без префикса \. Эту разновидность регулярного выражения удобно использовать в качестве простого анализатора синтаксиса для конфигурационного файла какого-нибудь приложения.

Даже если вы компилируете выражение, которое, по вашему мнению, является нормальным, вам все равно необходимо проверить его на наличие ошибок. Функция regcomp()возвращает нулевое значение при успешном выполнении компиляции и ненулевой код ошибки — в противном случае. Большинство ошибок может быть связано с разного рода ошибками в регулярных выражениях, но не исключено, что ошибка может быть связана с переполнением памяти. Далее в этой главе дается описание функции regerror().

#include

int regexec(const regex_t *preg, const chat *string, size_t nmatch,

regmatch_t pmatch[], int eflags);

Функция regexec()сравнивает строку с предварительно компилированным регулярным выражением. Аргумент eflagsможет иметь нулевое значение или быть любой комбинацией перечисленных ниже значений, объединенных битовым "ИЛИ".

REG_NOTBOL Первый символ строки не будет соответствовать символу ^. Любой символ, следующий за символом новой строки, будет соответствовать при том условии, что в вызове функции regcomp()будет задано значение REG_NEWLINE.
REG_NOTEOL Последний символ строки не будет соответствовать символу $. Любой символ, предшествующий символу новой строки, будет соответствовать символу $при том условии, что в вызове функции regcomp()будет задано значение REG_NEWLINE.

Массив структур regmatch_tиспользуется для представления местоположения подвыражений в регулярном выражении.

#include

typedef struct {

regoff_t rm_so; /* индекс байта в строке в начале сопоставления*/

regoff_t rm_eo; /* индекс байта в строке в конце сопоставления*/

} regmatch_t;

Первый элемент regmatch_tописывает всю совпавшую строку; обратите внимание, что вся эта строка содержит любой символ начала строки, включая хвостовой символ новой строки, независимо от того, задано ли значение REG_NEWLINE.

Следующие элементы массива хранят подвыражения, заключенные в скобки, в том порядке, в котором они присутствуют в регулярном выражении, в порядке расположения открывающих скобок. (В коде на языке С элемент i эквивалентен выражению замены \ i в программах sedили awk.) В несовпадающих подвыражениях член regmatch_t.rm_soимеет значение -1.

В следующем коде производится сопоставление строки с регулярным выражением, содержащим подвыражения. После сопоставления на экран выводятся все совпавшие подвыражения.

1: /* match.с */

2:

3: #include

4: #include

5: #include

6: #include

7: #include

8: #include

9:

10: void do_regerror(int errcode, const regex_t *preg) {

11: char *errbuf;

12: size_t errbuf_size;

13:

14: errbuf_size = regerror(errcode, preg, NULL, 0);

15: errbuf = alloca(errbuf_size);

16: if (!errbuf) {

17: perror("alloca");

18: return;

19: }

20:

21: regerror(errcode, preg, errbuf, errbuf_size);

22: fprintf(stderr, "%s\n", errbuf);

23: }

24:

25: int main() {

26:

27: regex_t p;

28: regmatch_t *pmatch;

29: int rerr;

30: char *regex = "(^(.*[^\\])#.*$)|(^[^#]+$)";

31: char string[BUFSIZ+1];

32: int i;

33:

34: if ((rerr = regcomp(&p, regex, REG_EXTENDED | REG_NEWLINE))) {

35: do_regerror(rerr, &p);

36: }

37:

38: pmatch = alloca(sizeof(regmatch_t) * (p.re_nsub+1));

39: if (!pmatch) {

40: perror("alloca");

41: }

42:

43: printf("Введите строку: ");

44: fgets(string, sizeof(string), stdin);

45:

46: if ((rerr = regexec(&p, string, p.re_nsub+1, pmatch, 0))) {

47: if (rerr == REG_NOMATCH) {

48: /* эту ситуацию может обработать regerror,

49: * но зачастую она обрабатывается особым образом

50: */

51: printf("Строка не совпадает с %s\n", regex);

52: } else {

53: do_regerror(rerr, &p);

54: }

55: } else {

56: /* сопоставление закончено */

57: printf("Строка совпадает с регулярным выражением %s\n", regex);

58: for (i = 0; i <= p.re_nsub; i++) {

59: /* вывод на экран совпавшей части (частей) строки */

60: if (pmatch[i].rm_so != -1) {

61: char *submatch;

62: size_t matchlen = pmatch[i].rm_eo - pmatch[i].rm_so;

63: submatch = malloc(matchlen+1);

64: strncpy(submatch, string+pmatch[i].rm_so,

65: matchlen);

66: submatch[matchlen] = '\0';

67: printf("совпавшее подвыражение %d: %s\n", i,

68: submatch);

69: free(submatch);

70: } else {

71: printf ("нет совпадения с подвыражением %d\n", i);

72: }

73: }

74: }

75: exit(0);

76: }

В примере регулярного выражения из программы match.симеется три подвыражения. Первое из них представляет собой всю строку, содержащую текст, за которым следует символ комментария, вторым является текст в строке, предшествующей символу комментария, а третье представляет всю строку без символа комментария. Для строки, в начале которой содержится комментарий, элементу rm_soво втором и третьем элементе из массива pmatch[]присвоено значение -1. Для строки, в начале которой содержится комментарий, значение -1присваивается первому и второму элементу; для строки, не содержащей символы комментария, второму и третьему элементу присваивается значение -1.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


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

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




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


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x