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. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Лэшер
5. Мэйфейрские ведьмы
Фантастика:
ужасы и мистика
8.32
рейтинг книги
Лев Толстой
363. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 36
36. История Телепата
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Герда
Детские:
детская проза
5.00
рейтинг книги
Магия камня
6. Травник
Фантастика:
фэнтези
6.00
рейтинг книги
Ермак. Телохранитель
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Я еще не царь
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Три чашки чая
Проза:
современная проза
7.94
рейтинг книги
Последний Паладин. Том 8
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Пушкарь. Пенталогия
Фантастика:
альтернативная история
8.11
рейтинг книги
Осень 1943 года
15. Летопись Победы. 1443 дня и ночи до нашей Великой Победы во Второй мировой войне
Научно-образовательная:
история
cпецслужбы
военная история
5.00