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

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

Жанры

Linux программирование в примерах
Шрифт:

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

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]) { /* Проверить, не дано ли слишком много файлов */

345 static int msg;

346 lastp--;

347 if (msg==0) {

348 fprintf(stderr, "ls: too many files\n");

349 msg++;

350 }

351 }

352 *lastp++ = rep; /* Заполнить сведения */

353 rep->lflags = 0;

354 rep->lnum = 0;

355 rep->ltype = '-'; /* Тип файла по умолчанию */

Статическая переменная

nomocore
[важно] указывает, что
malloc
при предыдущем вызове завершилась неудачей. Поскольку она статическая, она автоматически инициализируется 0 (т.е.
false
). Если на входе она равна
true
,
gstat
просто возвращает
NULL
. В противном случае, если
malloc
завершается неудачей,
ls
выводит сообщение об ошибке, устанавливает в
nomocore
true
и возвращает
NULL
(строки 334–343).

Строки 344–351 гарантируют, что в массиве

flist
все еще остается место. Если нет,
ls
выдает сообщение (но лишь однажды; заметьте использование статической переменной
msg
), а затем повторно использует последний слот
flist
.

Строка 352 заставляет слот

lastp
указывать на новую
struct lbuf
(
rep
). Это также обновляет
lastp
, который используется для сортировки в
main
(строки 142 и 152). Строки 353–355 устанавливают значения по умолчанию для полей флагов, номеров индексов и типов в
struct lbuf
.

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

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Мечников. Избранник бога

Алмазов Игорь
5. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Мечников. Избранник бога

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

На границе империй. Том 10. Часть 9

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9

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

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

Леди Малиновой пустоши

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

Локки 8. Потомок бога

Решетов Евгений Валерьевич
8. Локки
Фантастика:
фэнтези
боевая фантастика
героическая фантастика
попаданцы
5.00
рейтинг книги
Локки 8. Потомок бога

Лекарь

Щепетнов Евгений Владимирович
1. Истринский цикл
Фантастика:
фэнтези
8.24
рейтинг книги
Лекарь

Адвокат Империи 4

Карелин Сергей Витальевич
4. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 4

Запечатанный во тьме. Том 2

NikL
2. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 2

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Настроение – Песец

Видум Инди
7. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Настроение – Песец

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила