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

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

Жанры

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

147 if (argc>1)

148 printf("\n%s:\n", ep->ln.namep);

149 lastp = slastp;

150 readdir(ep->ln.namep);

151 if (fflg==0)

152 qsort(slastp, lastp - slastp, sizeof *lastp, compar);

153 if (lflg || sflg)

154 printf("total %D\n", tblocks);

155 for (ep1=slastp; ep1<lastp; ep1++)

156 pentry(*ep1);

157 } else

158 pentry(ep);

159 }

160 exit(0);

161 } /* Конец main */

Строки 136–141 перебирают аргументы, собирая сведения о каждом. Второй аргумент

gstat
булевый:
true
, если имя является аргументом командной строки, в противном случае
false
. Строка 140 добавляет флаг
ISARG
к полю
lflags
для каждого аргумента командной строки.

Функция

gstat
добавляет каждую новую
struct lbuf
к глобальному массиву
flist
(строка 137). Она также обновляет глобальный указатель
lastp
, чтобы он указывал в этом массиве на текущий последний элемент.

Строки 142–143 сортируют массив, используя

qsort
, и сохраняют текущее значение
lastp
в
slastp
. Строки 144–159 перебирают в цикле каждый элемент массива, выводя соответствующим образом сведения о файле или каталоге.

Код для каталогов заслуживает дальнейшего объяснения:

if (ep->ltype=='d' && dflg==0 || fflg) ...

Строка 146. Если файл является каталогом и

– d
не предусмотрено или было установлено
– f
,
ls
должна прочесть каталог вместо того, чтобы выводить сведения о самом каталоге.

if (argc>1) printf ("\n%s:\n", ep->ln.namep)

Строки 147–148. Выводят имя каталога и двоеточие, если в командной строке было указано несколько файлов.

lastp = slastp;

readdir(ep->ln.namep)

Строки 149–150. Восстанавливают

lastp
из
slastp
. Массив
flist
действует как двухуровневый стек имен файлов. Аргументы командной строки хранятся с
firstp
до
slastp - 1
. Когда
readdir
читает каталог, она помещает структуры
struct lbuf
для содержимого каталога в стек, начиная с
slastp
и до
lastp
. Это показано на рис. 7.1.

Рис. 7.1. Массив

flist
как двухуровневый стек

if (fflg==0) qsort(slastp, lastp - slastp, sizeof *lastp, compar)

Строки 151–152. Сортируют элементы подкаталога, если не действует

– f
.

if (lflg || sflg) printf("total %D\n", tblocks)

Строки 153–154. Выводят для

– l
или
– s
общее число блоков, используемых файлами в каталоге. Эта сумма хранится в переменной
tblocks
, которая сбрасывается для каждого каталога. На современных системах форматирующая строка
%D
для
printf
эквивалентна
%ld
; она означает «вывести длинное целое». (В V7 есть также
%ld
, см. строку 192.)

for (ep1=slastp; ep1<lastp; ep1++) pentry(*ep1)

Строки 155–156. Выводит сведения о каждом файле в подкаталоге. Обратите внимание, что V7

ls
спускается лишь на один уровень в дереве каталогов. У нее отсутствует современная «рекурсивная» опция
– R
.

163 pentry(ap) /* void pentry(struct lbuf *ap) */

164 struct lbuf *ap;

165 {

166 struct { char dminor, dmajor;}; /* He использующийся исторический артефакт из V6 ls */

167 register t;

168 register struct lbuf *p;

169 register char *cp;

170

171 p = ap;

172 if (p->lnum == -1)

173 return;

174 if (iflg)

175 printf("%5u ", p->lnum); /* Номер индекса */

176 if (sflg)

177 printf("%4D nblock(p->lsize)); /* Размер в блоках */

Процедура

pentry
выводит сведения о файле. Строки 172–173 проверяют, установлен ли -1 в поле
lnum
, и если так, функция возвращается. Когда верно '
p->lnum == -1
', структура
struct lbuf
недействительна. В противном случае это поле содержит номер индекса файла.

Строки 174–175 выводят номер индекса, если действует

– i
. Строки 176–177 выводят общее число блоков, если действует
– s
. (Как мы увидим ниже, это число может быть неточным.)

178 if (lflg) { /* Расширенный листинг: */

179 putchar(p->ltype); /* - Тип файла */

180 pmode(p->lflags); /* - Права доступа */

181 printf("%2d ", p->lnl); /* - Число ссылок */

182 t = p->luid;

183 if (gflg)

184 t = p->lgid;

185 if (getname(t, tbuf)==0)

186 printf("%-6.6s", tbuf); /* - Владелец или группа */

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

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

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

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

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

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
6.00
рейтинг книги
Твое сердце будет разбито. Книга 1

Три Меченосца. Книга первая. Желтая сталь алфейнов

Маягин Владимир
Хроники Гэмдровса
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
6.33
рейтинг книги
Три Меченосца. Книга первая. Желтая сталь алфейнов

Новые земли

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

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

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

Крейсер «Очаков»

Мельников Рафаил Михайлович
Боевые корабли мира
Научно-образовательная:
история
военная история
5.00
рейтинг книги
Крейсер «Очаков»

Воронцов. Перезагрузка. Книга 4

Тарасов Ник
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4

Сады Луны

Эриксон Стивен
1. Малазанская Книга Павших
Фантастика:
фэнтези
7.00
рейтинг книги
Сады Луны

Письма императора

Вербинина Валерия
5. Амалия – секретный агент императора
Детективы:
исторические детективы
8.76
рейтинг книги
Письма императора

Статьи из "Арабесок"

Гоголь Николай Васильевич
Другие редакции
Документальная литература:
публицистика
4.75
рейтинг книги
Статьи из Арабесок

Мистика

Гейман Нил
Детективы:
классические детективы
исторические детективы
7.29
рейтинг книги
Мистика

Северянин. Трилогия

Лей Влад
Северянин
Фантастика:
фэнтези
5.75
рейтинг книги
Северянин. Трилогия