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

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

Жанры

UNIX — универсальная среда программирования
Шрифт:

 char *diffout = "idiff.XXXXXX";

 progname = argv[0];

 if (argc != 3) {

fprintf(stderr, "Usage: idiff file1 file2\n");

exit(1);

 }

 f1 = efopen(argv[1], "r");

 f2 = efopen(argv[2], "r");

 fout = efopen("idiff.out", "w");

 mktemp(diffout);

 sprintf(buf,"diff %s %s >%s", argv[1], argv[2], diffout);

 system(buf);

 fin = efopen(diffout, "r");

 idiff(f1, f2, fin, fout);

 unlink(diffout);

 printf("%s output in file idiff.out\n", progname);

 exit(0);

}

Функция

mktemp(3)
создает файл, имя которого гарантированно отличается от имени любого существующего файла.
Mktemp
переписывает свой аргумент: шесть символов
X
заменяются идентификатором процесса и буквой. Системный вызов
unlink(2)
удаляет поименованный файл из файловой системы.

Циклическая обработка изменений, о которых сообщает

diff
, выполняется функцией
idiff
. Основная идея достаточно проста: печатать порцию выходного потока
diff
, пропускать нежелательные данные в одном файле, а затем копировать требуемый вариант из другого файла. В программе есть много утомительных подробностей, так что она оказывается несколько больше, чем нам бы хотелось, но по частям ее довольно легко понять.

idiff(f1, f2, fin, fout) /* process diffs */

 FILE *f1, *f2, *fin, *fout;

{

 char *tempfile = "idiff.XXXXXX";

 char buf[BUFSIZ], buf2[BUFSIZ], *mktemp;

 FILE *ft, *efopen;

 int cmd, n, from1, to1, from2, to2, nf1, nf2;

 mktemp(tempfile);

 nf1 = nf2 = 0;

 while (fgets(buf, sizeof buf, fin) != NULL) {

parse(buf, &from1, ftto1, &cmd, &from2, &to2);

n = to1-from1 + to2-from2 + 1; /* #lines from diff */

if (cmd == 'c')

n += 2;

else if (cmd == 'a')

from1++;

else if (cmd == 'd')

from2++;

printf("%s", buf);

while (n-- > 0) {

fgets(buf, sizeof buf, fin);

printf("%s", buf);

}

do {

printf("? ");

fflush(stdout);

fgets(buf, sizeof buf, stdin);

switch (buf[0]) {

case '>':

nskip(f1, to1-nf1);

ncopy(f2, to2-nf2, fout);

break;

case '<':

nskip(f2, to2-nf2);

ncopy(f1, to1-nf1, fout);

break;

case 'e':

ncopy(f1, from1-1-nf1, fout);

nskip(f2, from2-1-nf2);

ft = efopen(tempfile, "w");

ncopy(f1, to1+1-from1, ft);

fprintf (ft, "---\n");

ncopy(f2, to2+1-from2, ft);

fclose(ft);

sprintf(buf2, "ed %s", tempfile);

system(buf2);

ft = efopen(tempfile, "r");

ncopy(ft, HUGE, fout);

fclose(ft);

break;

case '!':

system(buf+1);

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

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

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Вадбольский

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

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Потусторонний. Книга 1

Погуляй Юрий Александрович
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Потусторонний. Книга 1