printf("!\n");
break;
default:
printf("< or > or e or !\n");
break;
}
} while (buf[0]!='<' && buf[0]!='>' && buf[0]!='e');
nf1 = to1;
nf2 = to2;
ncopy(f1, HUGE, fout); /* can fail on very long files */
unlink(tempfile);
}
Функция parse
выполняет рутинную, но тонкую работу по разбору строк, выдаваемых diff
, извлекая четыре номера строки и команду (одну из а
, с
или d
). При этом parse
немного усложняется, так как diff
может выдать либо один номер строки, либо два с той или другой стороны буквы команды:
parse(s, pfrom1, pto1, pcmd, pfrom2, pto2)
char *s;
int *pcmd, *pfrom1, *pto1, *pfrom2, *pto2;
{
#define a2i(p) while (isdigit(*s)) p = 10*(p) + *s++ - '0'
*pfrom1 = *pto1 = *pfrom2 = *pto2 = 0;
a2i(*pfrom1);
if (*s == ',') {
s++;
a2i(*pto1);
} else
*pto1 = *pfrom1;
*pcmd = *s++;
a2i(*pfrom2);
if (*s == ',') {
s++;
a2i(*pto2);
} else
*pto2 = *pfrom2;
}
Макрокоманда a2i
выполняет специальное преобразование из ASCII в целое в тех четырех местах, где она встречается.
Функции nskip
и ncopy
пропускают или копируют указанное число строк из файла:
nskip(fin, n) /* skip n lines of file fin */
FILE *fin;
{
char buf[BUFSIZ];
while (n-- > 0)
fgets(buf, sizeof buf, fin);
}
ncopy(fin, n, fout) /* copy n lines from fin to fout */
FILE *fin, *fout;
{
char buf[BUFSIZ];
while (n-- > 0) {
if (fgets(buf, sizeof buf, fin) == NULL)
return;
fputs(buf, fout);
}
}
Программа idiff
, если ее прервать, оставляет несколько файлов, хранящихся в /tmp
. В следующей главе мы покажем, как перехватывать прерывания, чтобы убрать временные файлы, подобные использованным здесь.
Если критически подойти к zap
и idiff
, то оказывается, что самая трудная работа была уже кем-то сделана ранее. Эти программы только обеспечивают удобное взаимодействие с другой программой, которая обрабатывает нужную информацию. Всегда имеет смысл воспользоваться плодами чужих трудов это позволяет повысить эффективность своей работы.
Добавьте команду idiff
: ответ '<'
; '>'
.
Модифицируйте idiff
так, чтобы некоторые аргументы idiff
передавались к diff
; -b
и -h
вероятные кандидаты. Выполните еще одну модификацию idiff
, позволяющую определять другой редактор, как в команде
$ idiff -е другой редактор file1 file2
Как взаимодействуют эти две модификации?
Измените idiff
, чтобы использовать popen
и pclose
вместо временного файла для выходного потока diff
. Как это скажется на сложности и скорости выполнения программы?
Если один из аргументов diff
-каталог, то в этом каталоге идет поиск файла с именем, заданным другим аргументом. Но если вы попробуете сделать то же самое с idiff
, то она почему-то собьётся. Объясните, что в данном случае происходит, и исправьте дефект.
6.9 Доступ к среде
Из Си-программы легко "добраться" до переменных в среде shell
, что можно использовать для упрощения адаптации программы к окружению. Допустим, например, что размер экрана вашего терминала больше обычного (24-строкового). Чего вы сможете добиться, применив p и воспользовавшись преимуществами своего терминала? Необходимость определять размер экрана всякий раз, когда вы вводите p
, надоедает:
$ p -36...
Вы могли бы всегда вставлять файл shell
в свой bin
:
$ cat /usr/you/bin/p
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии