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

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

Жанры

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

break;

}

}

 close(fd);

 return d;

Если имя каталога, данное

mindist
, пустое, отыскивается
'.'
. Функция
mindist
читает одну строку каталога за один раз. Отметим, что буфер для
read
представляет собой структуру, а не массив символов. Мы используем
sizeof
, чтобы вычислить число байтов и привести адрес к символьному указателю.

Если

строка каталога в данный момент не используется (поскольку файл удален), то поле индекса в ней равно нулю и она пропускается. Проверка расстояния осуществляется как

if (nd <= d...)

а не как

if (nd < d...)

поэтому любой одиночный символ дает лучшее совпадение, чем имя

'.'
, которое всегда является первой строкой в каталоге.

/* spdist: return distance between two names */ /*

 * very rough spelling metric:

 * 0 if the strings are identical

 * 1 if two chars are transposed

 * 2 if one char wrong, added or deleted

 * 3 otherwise

 */

#define EQ(s,t) (strcmp(s,t) == 0)

spdist(s, t)

 char *s, *t;

{

 while (*s++ == *t)

if (*t++ == '\0')

return 0; /* exact match */

 if (*--s) {

if (*t) {

if (s[1] && t[1] && *s == t[1] && *t == s[1] && EQ(s+2, t+2))

return 1; /* transposition */

if (EQ(s+1, t+1))

return 2; /* 1 char mismatch */

}

if (EQ(s+1, t))

return 2; /* extra character */

 }

 if (*t && EQ(s, t+1))

return 2; /* missing character */

 return 3;

}

Поскольку у нас есть

spname
, несложно вставить функции по коррекции написания в
p
:

/* p: print input in chunks (version 4) */

#include <stdio.h>

#define PAGESIZE 22

char *progname; /* program name for error message */

main(argc, argv)

 int argc;

 char *argv[];

{

 FILE *fp, *efopen;

 int i, pagesize = PAGESIZE;

 char *p, *getenv, buf[BUFSIZ];

 progname = argv[0];

 if ((p=getenv("PAGESIZE")) != NULL)

pagesize = atoi(p);

 if (argc > 1 && argv[1][0] == '-') {

pagesize = atoi(&argv[1][1]);

argc--;

argv++;

 }

 if (argc == 1)

print(stdin, pagesize);

 else

for (i = 1; i < argc; i++)

switch (spname(argv[i], buf)) {

case -1: /* no match possible */

fp = efopen(argv[i], "r");

break;

case 1: /* corrected */

fprintf(stderr, "\"%s\"? ", buf);

if (ttyin == 'n')

break;

argv[i] = buf; /* fall through... */

case 0: /* exact match */

fp = efopen(argv[i], "r");

print(fp, pagesize);

fclose(fp);

}

 exit(0);

}

Функции

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

Упражнение 7.5

Насколько вы можете улучшить эвристику для выявления наилучшего совпадения в

spname
? Например, неразумно рассматривать регулярный файл так, как если бы он был каталогом; текущая версия это допускает.

Упражнение: 7.6

Имя

tx
совпадает с каким-либо именем
tc
, которое оказывается последним в каталоге для любого одиночного символа
с
. Можете ли вы придумать лучшую меру расстояния? Реализуйте ее и посмотрите, насколько хорошо эта конструкция работает с реальными пользователями.

Упражнение 7.7

Работает ли

p
ощутимо быстрее, если чтение каталога выполняется большими порциями?

Упражнение 7.8

Модифицируйте

spname
, чтобы возвращать имя, которое является префиксом желаемого имени, если нельзя найти более точного совпадения. Как следует разрешить ситуацию, если несколько имен совпадают с префиксом?

Упражнение 7.9

Какую пользу могли бы извлечь другие программы из

spname
? Сконструируйте отдельную программу, которая корректировала бы другие аргументы прежде, чем передать их другой программе, как в

$ fix prog filenames...

Можете написать версию

cd
, которая использует
spname
? Как бы вы ее встроили?

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

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

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

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

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

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник