Когда цикл завершается, либо бит разрешения был найден, в этом случае pairp
pairp указывает на символ по умолчанию. В любом случае, строка 274 выводит символ, на который указывает pairp.Последним стоящим внимания моментом является то, что на С символьные константы (такие как 'x
int, а не char[75]. Поэтому проблем с помещением этих констант в массив целых нет; все работает правильно.277 char* /* char *makename(char *dir, char *file) */
278 makename(dir, file)
279 char *dir, *file;
280 {
281 static char dfile[100];
282 register char *dp, *fp;
283 register int i;
284
285 dp = dfile;
286 fp = dir;
287 while (*fp)
288 *dp++ = *fp++;
289 *dp++ = '/';
290 fp = file;
291 for (i=0; i
292 *dp++ = * fp++;
293 *dp = 0;
294 return(dfile);
295 }
Строки 277–295 определяют функцию makename()
static буфере dfile. Обратите внимание, что dfile всего лишь 100 символов длиной и что проверка ошибок не выполняется.Сам код прост, он копирует по одному символу за раз. makename()
readdir().297 readdir(dir) /* void readdir(char *dir) */
298 char *dir;
299 {
300 static struct direct dentry;
301 register int j;
302 register struct lbuf *ep;
303
304 if ((dirf = fopen(dir, "r")) == NULL) {
305 printf("%s unreadable\n", dir);
306 return;
307 }
308 tblocks = 0;
309 for(;;) {
310 if (fread((char*)&dentry, sizeof(dentry), 1, dirf) != 1)
311 break;
312 if (dentry.d_ino==0
313 || aflg==0 && dentry.d_name[0]=='.' && (dentry.d_name[1]=='\0'
314 || dentry.d_name[1]=='.' && dentry, d_name[2]=='\0'))
315 continue;
316 ep = gstat(makename(dir, dentry.d_name), 0);
317 if (ep==NULL)
318 continue;
319 if (ep->lnum != -1)
320 ep->lnum = dentry.d_ino;
321 for (j =0; j
322 ep->ln.lname[j] = dentry.d_name[j];
323 }
324 fclose(dirf);
325 }
Строки 297–325 определяют функцию readdir()
Строки 304–307 открывают каталог для чтения, завершая функцию, если fopen()
tblocks нулем. Ранее (строки 153–154) это использовалось для вывода общего числа блоков, использованных файлами в каталоге.Строки 309–323 являются циклом, который читает элементы каталога и добавляет их к массиву flist
Строки 312–315 пропускают неинтересные элементы. Если номер индекса равен нулю, этот слот не используется. В противном случае, если не был указан -а и имя файла является '.
..', оно пропускается.Строки 316–318 вызывают gstat()
false, указывающим, что он не из командной строки. gstat() обновляет глобальный указатель lastp и массив flist. Возвращаемое значение NULL обозначает какую-нибудь разновидность ошибки.Строки 319–322 сохраняют номер индекса и имя в struct lbuf
ep->lnum возвращается из gstat() установленным в -1, это означает, что операция stat() с файлом завершилась неудачей. Наконец, строка 324 закрывает каталог.Следующая функция, gstat()
327 struct lbuf * /* struct lbuf *gstat(char *file, int argfl) */
328 gstat(file, argfl)
329 char *file;
330 {
331 extern char *malloc();
332 struct stat statb;