Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 81

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

7.2. Код V7

ls

Π€Π°ΠΉΠ»

/usr/src/cmd/ls.c
Π² дистрибутивС V7 содСрТит ΠΊΠΎΠ΄. Π’Π΅ΡΡŒ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 425 строк.

1Β  /*

2Β Β  * пСрСчисляСт Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ

3Β Β  */

4

5Β  #include <sys/param.h>

6Β  #include <sys/stat.h>

7Β  #include <sys/dir.h>

8Β  #include <stdio.h>

9

10 #define NFILES 1024

11 FILE *pwdf, *dirf;

12 char stdbuf[BUFSIZ];

13

14 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 };

28

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

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