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

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

Жанры

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

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

В объятиях страха, или За котом на край Вселенной

Лунёва Мария
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
В объятиях страха, или За котом на край Вселенной

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

Я был адъютантом Гитлера

фон Белов Николаус
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Я был адъютантом Гитлера

СССР

Идиатуллин Шамиль
Фантастика:
социально-философская фантастика
5.50
рейтинг книги
СССР

Операция "Рагнарек"

Сословская Ольга Игоревна
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Операция Рагнарек

Эзотерическое целительство

Бейли Алиса
4. Трактат о семи лучах
Религия и эзотерика:
эзотерика
5.00
рейтинг книги
Эзотерическое целительство

Анатомия террора

Давыдов Юрий Владимирович
Проза:
историческая проза
5.00
рейтинг книги
Анатомия террора

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Аристократ из прошлого тысячелетия

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

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

Солнечное затмение

Попов Андрей Викторович
Фантастика:
боевая фантастика
4.00
рейтинг книги
Солнечное затмение

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Последний герой

Грэйдо Эллениэль и Эстель
2. Последний герой
Фантастика:
фэнтези
юмористическое фэнтези
6.60
рейтинг книги
Последний герой

CCTV. Библия видеонаблюдения. Цифровые и сетевые технологии

Дамьяновски Владо
Научно-образовательная:
технические науки
5.00
рейтинг книги
CCTV. Библия видеонаблюдения. Цифровые и сетевые технологии

Гражданский кодекс Российской Федерации. Части первая, вторая, третья и четвертая. Текст с изменения

коллектив авторов 1
Справочная литература:
путеводители
5.00
рейтинг книги
Гражданский кодекс Российской Федерации. Части первая, вторая, третья и четвертая. Текст с изменения