Вход/Регистрация
Linux программирование в примерах
вернуться

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

Шрифт:

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 = ".";

41

42 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); */

46

47 #define ISARG 0100000

Программа начинается с включения файлов (строки 5–8) и объявлений переменных.

struct lbuf
(строки 14–27) инкапсулирует части
struct stat
, которые интересны
ls
. Позже мы увидим, как эта структура заполняется.

Переменные

aflg
,
dflg
и т.д. (строки 29 и 30) все указывают на наличие соответствующей опции. Такой стиль именования переменных типичен для кода V7. Переменные
flist
,
lastp
и
firstp
(строки 37–39) представляют файлы, о которых
ls
выводит сведения. Обратите внимание, что flist является массивом фиксированного размера, которая позволяет обрабатывать не более 1024 файлов. Вскоре мы увидим, как используются все эти переменные.

После объявлений переменных идут объявления функций (строки 42–45), а затем определение

ISARG
, которая различает файл, указанный в командной строке, от файла, найденного при чтении каталога.

49 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;

59

60 setbuf(stdout, stdbuf);

61 time(&lb.lmtime); /* Получить текущее время */

62 year = lb.lmtime - 6L*30L*24L*60L*60L; /* 6 месяцев назад */

Функция

main
начинается с объявления переменных и функций (строки 52–58), устанавливая буфер для стандартного вывода, получая время дня (строки 60–61) и вычисляя значение секунд с начала Эпохи для примерно шести месяцев (строка 62). Обратите внимание, что у всех констант есть суффикс
L
, указывающий на использование арифметики
long
.

63 if (--argc > 0 && *argv[1] == '-') {

64 argv++;

65 while (*++*argv) switch(**argv) { /* Разбор опций */

66

67 case 'a': /* Все элементы каталога */

68 aflg++;

69 continue;

70

71 case 's': /* Размер в блоках */

72 sflg++;

73 statreq++;

74 continue;

75

76 case 'd': /* Сведения о каталоге, не содержание */

77 dflg++;

78 continue;

79

80 case 'g': /* Имя группы вместо имени владельца */

81 gflg++;

82 continue;

83

84 case 'l': /* Расширенный листинг */

85 lflg++;

86 statreq++;

87 continue;

88

89 case 'r': /* Обратный порядок сортировки */

90 rflg = -1;

91 continue;

92

93 case 't': /* Сортировка по времени, не по имени */

94 tflg++;

95 statreq++;

96 continue;

97

98 case 'u': /* Время доступа, а не изменения */

99 uflg++;

100 continue;

101

102 case 'c': /* Время изменения индекса, а не файла */

103 cflg++;

104 continue;

105

106 case 'i': /* Включить номер индекса */

107 iflg++;

108 continue;

109

110 case 'f': /* Форсировать чтение каждого arg как каталога */

  • Читать дальше
  • 1
  • ...
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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