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

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

Жанры

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); /* - Владелец или группа */

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

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Очерки времен и событий из истории российских евреев. 1945 – 1970 гг. Книга 6

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Очерки времен и событий из истории российских евреев. 1945 – 1970 гг. Книга 6

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Сталин

Радзинский Эдвард Станиславович
3. Загадки жизни и смерти
Проза:
историческая проза
7.36
рейтинг книги
Сталин

Изгои

Владимиров Денис
5. Глэрд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Изгои

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Кодекс Охотника. Книга XXVII

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII

Руководство по системной поведенченской психотерапии

Курпатов Андрей Владимирович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Руководство по системной поведенченской психотерапии

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

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

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

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации