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 */
Поделиться:
Популярные книги
Тринадцатый XI
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Страж Кодекса
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Академия
3. Петр Синельников
Фантастика:
фэнтези
6.20
рейтинг книги
Ботаник 2
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Представитель
6. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Метатель. Книга 2
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Камень. Книга шестая
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Последний реанорец. Том I и Том II
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Девочка из прошлого
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Гримуар темного лорда V
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хроники Тириса. Книга 3
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 4
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Третий. Том 3
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00