Чтение онлайн

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

 60: }

 61: }

 62: match = (strstr(line, pattern) != NULL);

 63: } else {

 64: match = 0;

 65: rc = regexec (pattern, line, 0, NULL, 0);

 66: if (!rc)

 67: match = 1;

 68: else if (rc != REG_NOMATCH)

 69: do_regerror(match, pattern);

 70: }

 71:

 72: if (match) {

 73: printf("%s%s", prefix, line);

 74: if (*maxCountPtr > 0)

 75: (*maxCountPtr)--;

 76: }

 77: }

 78:

 79: return 0;

 80: }

 81:

 82: int main(int argc, const char ** argv) {

 83: const char * pattern = NULL;

 84: regex_t regPattern;

 85: const void * finalPattern;

 86: int mode = MODE_REGEXP;

 87: int ignoreCase = 0;

 88: int maxCount = -1;

 89: int rc;

 90: int regFlags;

 91: const char ** files;

 92: poptContext optCon;

 93: FILE * f;

 94: char * chptr;

 95: struct poptOption optionsTable[] = {

 96: { "extended-regexp", 'E', POPT_ARG_VAL,

 97: &mode, MODE_EXTENDED,

 98: "шаблоном
для соответствия является расширенное регулярное "

 99: "выражение"},

100: { "fixed-strings", 'F', POPT_ARG_VAL,

101: &mode, MODE_FIXED,

102: "шаблоном для соответствия является базовая строка (не "

103: "регулярное выражение)", NULL },

104: { "basic-regexp", 'G', POPT_ARG_VAL,

105: &mode, MODE_REGEXP,

106: "шаблоном для соответствия является базовое регулярное выражение" },

107: { "ignore-case", 'i', POPT_ARG_NONE, &ignoreCase, 0,

108: "выполнять поиск, чувствительный к регистру", NULL },

109: { "max-count", 'm', POPT_ARG_INT, &maxCount, 0,

110: "завершить после получения N. совпадений", "N" },

111: { "regexp", 'e', POPT_ARG_STRING, &pattern, 0,

112: "регулярное выражение для поиска", "pattern" },

113: POPT_AUTOHELP

114: { NULL, '\0', POPT_ARG_NONE, NULL, 0, NULL, NULL }

115: };

116:

117: optCon = poptGetContext("grep", argc, argv, optionsTable, 0);

118: poptSetOtherOptionHelp(optCon, "<шаблон> <список
файлов>");

119:

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

121: /* во время обработки параметра возникла ошибка */

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

123: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

124: poptStrerror(rc));

125: return 1;

126: }

127:

128: files = poptGetArgs(optCon);

129: /* если мы не получили шаблон, то он должен быть первым

130: из оставшихся */

131: if (!files && !pattern) {

132: poptPrintUsage(optCon, stdout, 0);

133: return 1;

134: }

135:

136: if (!pattern) {

137: pattern = files[0];

138: files++;

139: }

140:

141: regFlags = REG_NEWLINE | REG_NOSUB;

142: if (ignoreCase) {

143: regFlags |= REG_ICASE;

144: /* преобразование шаблона в нижний регистр; этого можно не делать,

145: если мы игнорируем регистр в регулярном выражении, однако позволяет

146: функции strstr правильно обработать -i */

147: chptr = alloca(strlen(pattern) + 1);

148: strcpy(chptr, pattern);

149: pattern = chptr;

150:

151: while (*chptr) {

152: if (isalpha(*chptr)) *chptr = tolower(*chptr);

153: chptr++;

154: }

155: }

156:

157:

158: switch (mode) {

159: case MODE_EXTENDED:

160: regFlags |= REG_EXTENDED;

161: case MODE_REGEXP:

162: if ((rc = regcomp(&regPattern, pattern, regFlags))) {

163: do_regerror(rc, &regPattern);

Поделиться:
Популярные книги

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10

Сделай это со мной снова

Рам Янка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сделай это со мной снова

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Небо для Беса

Рам Янка
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Небо для Беса

Надуй щеки! Том 4

Вишневский Сергей Викторович
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Надуй щеки! Том 4