Annotation of 43BSD/contrib/mh/sbr/vfgets.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.