Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
7.2. Код V7
lsФайл
/usr/src/cmd/ls.c1 /*2 * перечисляет файлы или каталоги3 */45 #include <sys/param.h>6 #include <sys/stat.h>7 #include <sys/dir.h>8 #include <stdio.h>910 #define NFILES 102411 FILE *pwdf, *dirf;12 char stdbuf[BUFSIZ];1314 struct lbuf { /* Собирает необходимые сведения */15 union {16 char lname[15];17 char *namep;18 } ln;19 char ltype;20 short lnum;21 short lflags;22 short lnl;23 short luid;24 short lgid;25 long lsize;26 long lmtime;27 };2829 int aflg, dflg, lflg, sflg, tflg, uflg, lflg, fflg, gflg, cflg;30 int rflg = 1;31 long year; /* Глобальные переменные: инициализируются 0 */32 int flags;33 int lastuid = -1;34 char tbuf[16];35 long tblocks;36 int statreq;37 struct lbuf *flist[NFILES];38 struct lbuf **lastp = flist;39 struct lbuf **firstp = flist;40 char *dotp = ".";4142 char *makename(); /* char *makename(char *dir, char *file); */43 struct lbuf *gstat(); /* struct lbuf *gstat(char *file, int argfl); */44 char *ctime(); /* char *ctime(time_t *t); */45 long nblock(); /* long nblock(long size); */4647 #define ISARG 0100000Программа начинается с включения файлов (строки 5–8) и объявлений переменных.
struct lbufstruct statlsПеременные
aflgdflgflistlastpfirstplsПосле объявлений переменных идут объявления функций (строки 42–45), а затем определение
ISARG49 main(argc, argv) /* int main(int argc, char **argv) */50 char *argv[];51 {52 int i;53 register struct lbuf *ep, **ep1; /* Объявления переменных и функций */54 register struct lbuf **slastp;55 struct lbuf **epp;56 struct lbuf lb;57 char *t;58 int compar();5960 setbuf(stdout, stdbuf);61 time(&lb.lmtime); /* Получить текущее время */62 year = lb.lmtime - 6L*30L*24L*60L*60L; /* 6 месяцев назад */Функция
main()Llong63 if (--argc > 0 && *argv[1] == '-') {64 argv++;65 while (*++*argv) switch(**argv) { /* Разбор опций */6667 case 'a': /* Все элементы каталога */68 aflg++;69 continue;7071 case 's': /* Размер в блоках */72 sflg++;73 statreq++;74 continue;7576 case 'd': /* Сведения о каталоге, не содержание */77 dflg++;78 continue;7980 case 'g': /* Имя группы вместо имени владельца */81 gflg++;82 continue;8384 case 'l': /* Расширенный листинг */85 lflg++;