Брайан Керниган - UNIX — универсальная среда программирования

Здесь есть возможность читать онлайн «Брайан Керниган - UNIX — универсальная среда программирования» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 1992, ISBN: 1992, Издательство: Финансы и статистика, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX — универсальная среда программирования: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX — универсальная среда программирования»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
.
Для программистов-пользователей операционной системы UNIX.

UNIX — универсальная среда программирования — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX — универсальная среда программирования», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

idiff output in file idiff.out

$ cat idiff.outВыходной поток направляется в этот файл

This is

not a test of

your skill

and comprehension.

$

Если вместо <или >выдан ответ е, idiffвызывает edс двумя группами уже прочитанных строк. Если вторым был ответ е, буфер редактора выглядел бы следующим образом:

your

skill

and comprehension.

---

our

ability.

Все, что пишется редактором обратно в файл, идет в окончательный выходной поток.

И, наконец, любая команда может быть выполнена внутри idiffс помощью временного выхода посредством !cmd .

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

/* idiff: interactive diff */

#include

#include

char *progname;

#define HUGE 10000 /* large number of lines */

main(argc, argv)

int argc;

char *argv[];

{

FILE *fin, *fout, *f1, *f2, *efopen();

char buf[BUFSIZ], *mktemp();

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

*pto1 = *pfrom1;

*pcmd = *s++;

a2i(*pfrom2);

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

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX — универсальная среда программирования»

Представляем Вашему вниманию похожие книги на «UNIX — универсальная среда программирования» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «UNIX — универсальная среда программирования»

Обсуждение, отзывы о книге «UNIX — универсальная среда программирования» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x