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

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

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

#define INDATAΒ Β  3 /* Π² Ρ‚Π΅Π»Π΅ записи (всС) */

#define INTERMΒ Β  4 /* Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€ сканирования (RS = RS = regexp) */

int state;

...

state = NOSTATE;

...

state = INLEADER;

...

if (state != INTERM) ...

На ΡƒΡ€ΠΎΠ²Π½Π΅ исходного ΠΊΠΎΠ΄Π° это выглядит Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Но ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ, Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· GDB:

(gdb) <b>print state</b>

$1 = 2

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 2. Какова ΠΆΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°?

РСкомСндация: Для опрСдСлСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ вмСсто макросов пСрСчислСния (enum). ИспользованиС исходного ΠΊΠΎΠ΄Π° Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, Π° значСния enum ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠΆΠ΅ ΠΈΠ·

io.c
Π²
gawk
:

typedef enum scanstate {

Β NOSTATE, Β /* сканированиС Π΅Ρ‰Π΅ Π½Π΅ Π½Π°Ρ‡Π°Ρ‚ΠΎ (всС) */

Β INLEADER, /* пропуск Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (RS = &quot;&quot;) */

Β INDATA,Β  Β /* Π² Ρ‚Π΅Π»Π΅ записи (всС) */

Β INTERM,Β  Β /* Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€ сканирования (RS = &quot;&quot;, RS = regexp) */

} SCANSTATE;

SCANSTATE state;

/* ... ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ! ... */

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ просмотрС state ΠΈΠ· GDB ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅:

(gdb) <b>print state</b>

$1 = NOSTATE

15.4.1.3. ΠŸΡ€ΠΈ нСобходимости пСрСставляйтС ΠΊΠΎΠ΄

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто условиС Π²

if
ΠΈΠ»ΠΈ
while
состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ…
&amp;&amp;
ΠΈΠ»ΠΈ
||
. Если эти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠΌΠΈ), Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ пошаговоС ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ части условия. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ GDB
step
ΠΈ
next
Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° основС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (statements), Π° Π½Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (expressions). (РазнСсСниС ΠΈΡ… ΠΏΠΎ нСскольким строкам всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚).

РСкомСндация: ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ исходный ΠΊΠΎΠ΄, явно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ значСния ΠΈΠ»ΠΈ условныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сохранСн Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ (ΠΈΠ»ΠΈ программист послС вас) ΠΌΠΎΠ³Π»ΠΈ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит.

Π’ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: функция

do_input()
ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
io.c gawk
:

1Β  /* do_input --- Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π²ΠΎΠ΄Π° */

2

3Β  void

4Β  do_input()

5Β  {

6Β Β  IOBUF *iop;

7Β Β  extern int exiting;

8Β Β  int rval1, rval2, rval3;

9

10Β  (void)setjmp(filebuf); /* for 'nextfile' */

11

12Β  while ((iop = nextfile(FALSE)) != NULL) {

13Β  Β /*

14Β Β Β  * Π—Π΄Π΅ΡΡŒ Π±Ρ‹Π»ΠΎ:

15Β Β Β  if (inrec(iop) == 0)

16Β Β Β Β  while (interpret(expression_value) &amp;&amp; inrec(iop) == 0)

17Β Β Β Β Β  continue;

18Β Β Β  * Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎ для простоты ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

19Β Β Β  */

20Β Β  rvall = inrec(iop);

21Β Β  if (rvall == 0) {

22Β Β Β  for (;;) {

23Β Β Β Β  rval2 = rval3 = -1; /* для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ */

24Β Β Β Β  rval2 = interpret(expression_value);

25Β Β Β Β  if (rval2 != 0)

26Β Β Β Β Β  rval3 = inrec(iop);

27Β Β Β Β  if (rval2 == 0 || rval3 != 0)

28Β Β Β Β Β  break;

29Β Β Β  }

30Β Β  }

31Β Β  if (exiting)

32Β Β Β  break;

33Β  }

34 }

(НомСра строк ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π° этой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π° Π½Π΅ Ρ„Π°ΠΉΠ»Π°.) Π­Ρ‚Π° функция являСтся основой Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

gawk
. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» (строки 12 ΠΈ 33) ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π² строках 13–19 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ запись ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅

inrec()
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π² порядкС, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
interpret()
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π² порядкС. Когда ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· этот Ρ†ΠΈΠΊΠ», провСряя процСсс чтСния записСй, Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 20–30 ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ пСрСписанный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, сохраняя Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² строкС 23 этим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ извСстныС, ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ значСния: Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свои значСния ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π°. Π‘Ρ‚Ρ€ΠΎΠΊΠ° 27 являСтся тСстом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ΄ измСнился, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ Π² бСсконСчный Ρ†ΠΈΠΊΠ» (сравнитС строку 22 со строкой 16), тСст Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π° являСтся ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ.

Π’ качСствС отступлСния, ΠΌΡ‹ признаСмся, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΅Π΅ сдСлали, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствуСт ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ; ΠΎΠ½Π° соотвСтствовала. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ каТСтся, Ρ‡Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²ΠΎΡ‚ эта вСрсия Ρ†ΠΈΠΊΠ»Π° Π±Ρ‹Π»Π° Π±Ρ‹ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρƒ:

/* ВозмоТная Π·Π°ΠΌΠ΅Π½Π° для строк 22 - 29 */

do {

Β rval2 = rval3 = -1; /* для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ */

Β rval2 = interpret(expression_value);

Β if (rval2 != 0)

Β  rval3 = inrec(iop);

} while (rval2 != 0 &amp;&amp; rval3 == 0);