|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 1565 (0x61d) Types: TextFile Names: »rdr.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Adv/Program/rdr.c«
/* * The line reader. Reads in source lines, skips whitespace (if * any), converts inline $n's to newlines, $t's to tabs, * $[0-9A-Fa-f][0-9A-Fa-f]'s to their hex characters; then return * a pointer to the created line (linebuf). Also, concatenates * lines ending in '$'. */ #include "adv.h" #include <ctype.h> /* * isxdigit is undocumented! */ #ifdef isxdigit #define hex(c) isxdigit(c) #else #define hex(c) ((c)>='0'&&(c)<='9'||(c)>='A'&&(c)<='F'||(c)>='a'&&(c)<='f') #endif char * rdr() { char lbuf[LINELEN+1], c; register char *lb, *bp = linebuf; register int t, q = 0; do { do { lb = lbuf; if (fgets(lbuf, sizeof lbuf, file) == NULL) { Wcleanup(); printf("Premature EOF on input file!\n"); exit(100); } skpwht(lb); t = strlen(lb); } while (t < 2); /* fgets() keeps newline! */ while (--t) { if (t > 1 && *lb == '$') { t--; ++lb; if (*lb == 'n') c = '\n'; else if (*lb == 't') c = '\t'; else if (hex(*lb)) { c = todec(*lb++); if (t && hex(*lb)) { c <<= 4; c += todec(*lb); t--; } } else c = *lb; } else c = *lb; *bp++ = c; lb++; if (++q >= LINELEN && c) { Wcleanup(); printf("Input line too long:\n%s\n", linebuf); exit(100); } } --bp; } while (*--lb == '$'); *++bp = 0; #ifdef DEBUG printf("Line: %s\n", linebuf); #endif return (linebuf); } todec(c) register int c; { if (c <= '9') return (c - '0'); else if (c <= 'F') return (c - ('A' - 10)); else return (c - ('a' - 10)); }