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
? Как бы вы ее встроили?
Поделиться:
Популярные книги
Демон-хранитель
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
Черный маг императора 2
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Твое сердце будет разбито. Книга 1
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Камень
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Искатель 2
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Князь Андер Арес 5
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга III
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Последний Герой. Том 2
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Источник
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
Лекарь Империи 15
15. Лекарь Империи
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
6.80
рейтинг книги
Кукловод
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Государь
3. Рюрикова кровь
Фантастика:
мистика
альтернативная история
историческое фэнтези
6.25
рейтинг книги
Курс 1. Октябрь
2. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
1941: Время кровавых псов
1. Всеволод Залесский
Приключения:
исторические приключения
6.36