47Β Β Β ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π² Π±ΡΡΠ΅Ρ. Π£Π²Π΅Π»ΠΈΡΠΈΡΡ Π±ΡΡΠ΅Ρ ΠΈ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΡΠ½ΠΎΠ²Π°. */48 if (p[-1] != '\n')49Β goto more_buffer;5051 /* ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ, ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ. */52 ++nlines;Π‘ΡΡΠΎΠΊΠΈ 43β52 ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ°ΡΡΠΎΠΊ Π±ΡΡΠ΅ΡΠ° Π·Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ. ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ
p[-1]p[0]p[1]*(p-1)ΠΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π΅ Π±ΡΠ» ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ Ρ Π²Π°ΡΠΈΠ»ΠΎ ΠΌΠ΅ΡΡΠ°, ΠΈ ΠΊΠΎΠ΄ Π²ΡΡ ΠΎΠ΄ΠΈΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ
goto54 #if !defined(WINDOWS32) && !defined(__MSDOS__)55 /* ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΡΠΎΠΊΠ° Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ CRLF; Π΅ΡΠ»ΠΈ ΡΠ°ΠΊ,56Β Β Β ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ CR. */57 if ((p - start) > 1 && p[-2] == '\r')58 {59Β --p;60Β p[-1] = '\n';61 }62 #endifΠ‘ΡΡΠΎΠΊΠΈ 54β62 ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΡΡΠΎΠΊΠΈ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ Microsoft ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠΎΠΊ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠ°ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ (CR-LF), Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ (Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Linux/Unix. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ
#ifdef<stdio.h>64Β backslash = 0;65Β for (p2 = p - 2; p2 >= start; --p2)66Β {67Β Β if (*p2 != '\\')68Β Β break;69Β Β backslash = !backslash;70Β }7172Β if (!backslash)73Β {74Β Β p[-1] = '\0';75Β Β break;76Β }7778Β /* ΠΡΠΎ Π±ΡΠ»Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ ΡΠ»Π΅Ρ/Π½ΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°. ΠΡΠ»ΠΈ Π΅ΡΡΡ79Β Β Β ΠΌΠ΅ΡΡΠΎ, ΠΏΡΠΎΡΠ΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ. */80Β if (end - p >= 80)81Β Β continue;8283Β /* Π ΠΊΠΎΠ½ΡΠ΅ Π±ΡΡΠ΅ΡΠ° Π½ΡΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π΅ΡΠ΅.84Β Β Β ΠΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² p. */85 more_buffer:86Β {87Β Β unsigned long off = p - start;88Β Β ebuf->size *= 2;89Β Β start = ebuf->buffer=ebuf->bufstart=(char*)xrealloc(start,90Β Β Β ebuf->size);91Β Β p = start + off;92Β Β end = start + ebuf->size;93Β Β *p = '\0';94Β }95 }ΠΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π² Π±ΡΡΠ΅Ρ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°ΡΡΠΎΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π₯ΠΎΡΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΡΠ° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ»Π΅ΡΠ΅ΠΉ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ. ΠΠΎΠ΄ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΎΠ±ΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΠ°ΠΊΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΠ΅ΡΠ½ΡΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠ΅ΡΠ½ΡΠΌ ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
backslashΠΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΡΠ½ΠΎΠ΅, ΡΡΠ»ΠΎΠ²ΠΈΠ΅ '
!backshlashΠ‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ Π½Π΅ΡΠ΅ΡΠ½ΠΎ, ΡΡΡΠΎΠΊΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ»Π΅ΡΠ΅ΠΉ (ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ \\, ΠΊΠ°ΠΊ Π² Π‘), ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ. [43] Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π² Π±ΡΡΠ΅ΡΠ΅ ΠΎΡΡΠ°Π»ΠΈΡΡ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ 80 ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ Π±Π°ΠΉΡΠΎΠ², ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΈΠΊΠ»Π΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ (ΡΡΡΠΎΠΊΠΈ 78β81). (ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° 80 Π½Π΅ ΠΎΡΠ΅Π½Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ; Π±ΡΠ»ΠΎ Π±Ρ Π»ΡΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΡ.)
ΠΠΎ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊΠΈ 83 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½ΡΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° Π² Π±ΡΡΠ΅ΡΠ΅. ΠΠΌΠ΅Π½Π½ΠΎ Π·Π΄Π΅ΡΡ Π²ΡΡΡΠΏΠ°Π΅Ρ Π² ΠΈΠ³ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΡΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
pΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π·Π΄Π΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ
xrealloc()malloc()realloc()NULLextern const char *myname; /* ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π² main() */void *xrealloc(void *ptr, size_t amount) {Β void *p = realloc(ptr, amount);Β if (p == NULL) {Β Β fprintf(stderr, "%s: out of memory!\n", myname);Β Β exit(1);Β }Β return p;}Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ
xrealloc()ptr = xrealloc(ptr, new_size)