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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

131 }

132 if (argc==0) { /* Если нет аргументов, использовать текущий */

133 argc++;

134 argv = &dotp - 1;

135 }

Строки 119–125 обрабатывают опцию

– f
, выключая
– l
,
– s
,
– t
и
statreq
. Строки 126–131 обрабатывают
– l
, устанавливая для файла чтение сведений о владельце или группе.
Помните, что V7 показывает лишь одно из этих сведений, но не оба.

Если аргументов больше не осталось, строки 132–135 устанавливают

argv
таким образом, что он указывает на строку, представляющую текущий каталог. Назначение '
argr = &dotp - 1
' действительно, хотя и необычно. '
– 1
' компенсирует '
++argv
' в строке 137. Это позволяет избежать в главной части программы специального случая для '
argc == 1
'.

136 for (i=0; i < argc; i++) { /* Получить сведения о каждом файле */

137 if ((ер = gstat(*++argv, 1))==NULL)

138 continue;

139 ep->ln.namep = *argv;

140 ep->lflags |= ISARG;

141 }

142 qsort(firstp, lastp - firstp, sizeof *lastp, compar);

143 slastp = lastp;

144 for (epp=firstp; epp<slastp; epp++) { /* Глав. код, см. текст */

145 ер = *epp;

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

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 */

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

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

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

А. Смолин, ведьмак. Цикл

Васильев Андрей Александрович
А. Смолин, ведьмак
Фантастика:
городское фэнтези
5.00
рейтинг книги
А. Смолин, ведьмак. Цикл

Софт. Тело (Software. Wetware)

Рюкер Руди
Проза:
контркультура
5.00
рейтинг книги
Софт. Тело (Software. Wetware)

Современная болгарская повесть

Коллектив авторов
Проза:
современная проза
5.00
рейтинг книги
Современная болгарская повесть

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

Место под солнцем

Марклунд Лиза
Анника Бенгтзон
Детективы:
криминальные детективы
6.00
рейтинг книги
Место под солнцем

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

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Загадка Либастьяна, или Поиски богов

Фирсанова Юлия Алексеевна
7. Джокеры – Карты Творца
Фантастика:
фэнтези
9.36
рейтинг книги
Загадка Либастьяна, или Поиски богов

История экономических учений: конспект лекций

Васильева Лариса
Научно-образовательная:
история
5.00
рейтинг книги
История экономических учений: конспект лекций

Жизнь и приключения Мартина Чезлвита (главы I-XXVI)

Диккенс Чарльз
Проза:
проза прочее
5.00
рейтинг книги
Жизнь и приключения Мартина Чезлвита (главы I-XXVI)

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Тринадцатый IV

Добыча. Всемирная история борьбы за нефть, деньги и власть

Ергин Дэниел
Документальная литература:
публицистика
5.00
рейтинг книги
Добыча. Всемирная история борьбы за нефть, деньги и власть

Избранные произведения в одном томе

Брындза Роберт
Детективы:
полицейские детективы
5.00
рейтинг книги
Избранные произведения в одном томе

Глория

Александер Робин
7.00
рейтинг книги
Глория