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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Когда цикл завершается, либо бит разрешения был найден, в этом случае

pairp
указывает на второй элемент пары, являющийся нужным для вывода символом, либо он не был найден, в этом случае
pairp
указывает на символ по умолчанию. В любом случае, строка 274 выводит символ, на который указывает
pairp
.

Последним стоящим внимания моментом является то, что на С символьные константы (такие как '

x
') имеют тип
int
, а не
char
[75] . Поэтому проблем с помещением
этих констант в массив целых нет; все работает правильно.

75

В C++ это по-другому: там символьные константы действительно имеют тип char. Это различие не влияет на данный конкретный код — Примеч. автора.

277 char* /* char *makename(char *dir, char *file) */

278 makename(dir, file)

279 char *dir, *file;

280 {

281 static char dfile[100];

282 register char *dp, *fp;

283 register int i;

284

285 dp = dfile;

286 fp = dir;

287 while (*fp)

288 *dp++ = *fp++;

289 *dp++ = '/';

290 fp = file;

291 for (i=0; i<DIRSIZ; i++)

292 *dp++ = * fp++;

293 *dp = 0;

294 return(dfile);

295 }

Строки 277–295 определяют функцию

makename
. Ее работа заключается в соединении имени каталога с именем файла, разделенным символом косой черты, с образованием строки. Она осуществляет это в
static
буфере
dfile
. Обратите внимание, что
dfile
всего лишь 100 символов длиной и что проверка ошибок не выполняется.

Сам код прост, он копирует по одному символу за раз.

makename
используется функцией
readdir
.

297 readdir(dir) /* void readdir(char *dir) */

298 char *dir;

299 {

300 static struct direct dentry;

301 register int j;

302 register struct lbuf *ep;

303

304 if ((dirf = fopen(dir, "r")) == NULL) {

305 printf("%s unreadable\n", dir);

306 return;

307 }

308 tblocks = 0;

309 for(;;) {

310 if (fread((char*)&dentry, sizeof(dentry), 1, dirf) != 1)

311 break;

312 if (dentry.d_ino==0

313 || aflg==0 && dentry.d_name[0]=='.' && (dentry.d_name[1]=='\0'

314 || dentry.d_name[1]=='.' && dentry, d_name[2]=='\0'))

315 continue;

316 ep = gstat(makename(dir, dentry.d_name), 0);

317 if (ep==NULL)

318 continue;

319 if (ep->lnum != -1)

320 ep->lnum = dentry.d_ino;

321 for (j =0; j<DIRSIZ; j++)

322 ep->ln.lname[j] = dentry.d_name[j];

323 }

324 fclose(dirf);

325 }

Строки 297–325

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

Строки 304–307 открывают каталог для чтения, завершая функцию, если

fopen
возвращает ошибку. Строка 308 инициализирует глобальную переменную
tblocks
нулем. Ранее (строки 153–154) это использовалось для вывода общего числа блоков, использованных файлами в каталоге.

Строки 309–323 являются циклом, который читает элементы каталога и добавляет их к массиву

flist
. Строки 310–311 читают один элемент, выходя из цикла в конце файла.

Строки 312–315 пропускают неинтересные элементы. Если номер индекса равен нулю, этот слот не используется. В противном случае, если не был указан -а и имя файла является '

.
' или '
..
', оно пропускается.

Строки 316–318 вызывают

gstat
с полным именем файла и вторым аргументом, равным
false
, указывающим, что он не из командной строки.
gstat
обновляет глобальный указатель
lastp
и массив
flist
. Возвращаемое значение
NULL
обозначает какую-нибудь разновидность ошибки.

Строки 319–322 сохраняют номер индекса и имя в

struct lbuf
. Если
ep->lnum
возвращается из
gstat
установленным в -1, это означает, что операция
stat
с файлом завершилась неудачей. Наконец, строка 324 закрывает каталог.

Следующая функция,

gstat
(строки 327–398), является центральной функцией для получения и сохранения сведений о файле.

327 struct lbuf * /* struct lbuf *gstat(char *file, int argfl) */

328 gstat(file, argfl)

329 char *file;

330 {

331 extern char *malloc;

332 struct stat statb;

333 register struct lbuf *rep;

334 static int nomocore;

335

336 if (nomocore) /* Ранее была нехватка памяти */

337 return(NULL);

338 rep = (struct lbuf*)malloc(sizeof(struct lbuf));

339 if (rep==NULL) {

340 fprintf(stderr, "ls: out of memory\n");

341 nomocore = 1;

342 return(NULL);

343 }

344 if (lastp >= &flist[NFILES]) { /* Проверить, не дано ли слишком много файлов */

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

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

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

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

Возвышение Меркурия

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

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

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

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

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

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга