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

на главную

Жанры

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

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

Реванш

СветочкаN
Фантастика:
фэнтези
5.00
рейтинг книги
Реванш

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Снега

Чепурин Юлий Петрович
Поэзия:
драматургия
5.00
рейтинг книги
Снега

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

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

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

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

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

Хроники Тириса. Книга 1

Маханенко Василий Михайлович
1. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
6.00
рейтинг книги
Хроники Тириса. Книга 1

Родословная. Том 4

Ткачев Андрей Юрьевич
4. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 4

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая