|
|
1.1 ! root 1: /* vfgets.c - virtual fgets */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: ! 6: ! 7: #define QUOTE '\\' ! 8: ! 9: ! 10: int vfgets (in, bp) ! 11: register FILE *in; ! 12: register char **bp; ! 13: { ! 14: register int toggle; ! 15: register char *cp, ! 16: *dp, ! 17: *ep, ! 18: *fp; ! 19: static int len = 0; ! 20: static char *pp = NULL; ! 21: ! 22: if (pp == NULL) ! 23: if ((pp = malloc ((unsigned) (len = BUFSIZ))) == NULL) ! 24: adios (NULLCP, "unable to allocate string storage"); ! 25: ! 26: for (ep = (cp = pp) + len - 1;;) { ! 27: if (fgets (cp, ep - cp + 1, in) == NULL) { ! 28: if (cp != pp) { ! 29: *bp = pp; ! 30: return OK; ! 31: } ! 32: return (ferror (in) ? NOTOK : DONE); ! 33: } ! 34: ! 35: if ((dp = cp + strlen (cp) - 2) < cp || *dp != QUOTE) { ! 36: wrong_guess: ; ! 37: if (cp > ++dp) ! 38: adios (NULLCP, "vfgets() botch -- you lose big"); ! 39: if (*dp == '\n') { ! 40: *bp = pp; ! 41: return OK; ! 42: } ! 43: else ! 44: cp = ++dp; ! 45: } ! 46: else { ! 47: for (fp = dp - 1, toggle = 0; fp >= cp; fp--) ! 48: if (*fp != QUOTE) ! 49: break; ! 50: else ! 51: toggle = !toggle; ! 52: if (toggle) ! 53: goto wrong_guess; ! 54: if (*++dp == '\n') ! 55: *--dp = NULL, cp = dp; ! 56: else ! 57: cp = ++dp; ! 58: } ! 59: ! 60: if (cp >= ep) { ! 61: register int curlen = cp - pp; ! 62: ! 63: if ((dp = realloc (pp, (unsigned) (len += BUFSIZ))) == NULL) ! 64: adios (NULLCP, "unable to allocate string storage"); ! 65: else ! 66: cp = dp + curlen, ep = (pp = dp) + len - 1; ! 67: } ! 68: } ! 69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.