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(®Pattern, pattern, regFlags))) {
163: do_regerror(rc, ®Pattern);
164: return 1;
165: }
166: finalPattern = ®Pattern
167: break;
168:
169: case MODE_FIXED:
170: finalPattern = pattern;
171: break;
172: }
173:
174: if (!*files) {
175: rc = scanFile(stdin, mode, finalPattern, ignoreCase, NULL,
176: &maxCount);
177: } else if (!files[1]) {
178: /* эта часть обрабатывается отдельно, поскольку имя файла
179: выводить не нужно */
180: if (!(f = fopen(*files, "r"))) {
181: perror(*files);
182: rc = 1;
183: } else {
184: rc = scanFile(f, mode, finalPattern, ignoreCase, NULL,
185: &maxCount);
186: fclose(f);
187: }
188: } else {
189: rc = 0;
190:
191: while (*files) {
192: if (!(f = fopen(*files, "r"))) {
193: perror(*files);
194: rc = 1;
195: } else {
196: rc |= scanFile(f, mode, finalPattern, ignoreCase,
197: *files, &maxCount);
198: fclose(f);
199: }
200: files++;
201: if (!maxCount) break;
202: }
203: }
204:
205: return rc;
206: }
С помощью библиотеки S-Lang, написанной Джоном Дэвисом (John Е. Davis), можно осуществлять доступ к терминалам на среднем уровне. Все действия, связанные с управлением терминалами на низком уровне, осуществляются посредством набора подпрограмм, предлагающих прямой доступ к видеотерминалам и автоматически управляющих прокруткой и цветами. Несмотря на незначительную прямую поддержку окон и отсутствие в S-Lang каких-либо элементов управления, для таких задач эта библиотека предлагает удобную основу[167].
Библиотеку S-Lang можно использовать и для работы в DOS, что делает ее привлекательной для создания приложений, которые будут выполняться на платформах Unix и DOS.
Возможности управления терминалами с помощью библиотеки S-Lang можно разделить на две категории. Во-первых, библиотека предлагает набор функций для управляемого считывания нажатий клавиш из терминала. Во-вторых, она содержит набор подпрограмм для полноэкранного вывода на терминал. Многие возможности терминалов будут недоступными для программистов, однако функциональными возможностями каждого терминала можно будет воспользоваться[168]. В этой главе вы узнаете о том, каким образом можно использовать библиотеку S-Lang применительно ко всем этим функциональным возможностям, а в конце главы вам будет предложен пример программы для закрепления материала.
Подсистема управления вводом на терминалах является одной из наименее доступных подсистем в мире Unix.