/*
* vfgets.c -- virtual fgets
*
* $Id: vfgets.c,v 1.2 2002/07/02 22:09:14 kenh Exp $
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
#include <h/mh.h>
#define QUOTE '\\'
int
vfgets (FILE *in, char **bp)
{
int toggle;
char *cp, *dp, *ep, *fp;
static int len = 0;
static char *pp = NULL;
if (pp == NULL)
if (!(pp = malloc ((size_t) (len = BUFSIZ))))
adios (NULL, "unable to allocate string storage");
for (ep = (cp = pp) + len - 1;;) {
if (fgets (cp, ep - cp + 1, in) == NULL) {
if (cp != pp) {
*bp = pp;
return 0;
}
return (ferror (in) && !feof (in) ? -1 : 1);
}
if ((dp = cp + strlen (cp) - 2) < cp || *dp != QUOTE) {
wrong_guess:
if (cp > ++dp)
adios (NULL, "vfgets() botch -- you lose big");
if (*dp == '\n') {
*bp = pp;
return 0;
} else {
cp = ++dp;
}
} else {
for (fp = dp - 1, toggle = 0; fp >= cp; fp--) {
if (*fp != QUOTE)
break;
else
toggle = !toggle;
}
if (toggle)
goto wrong_guess;
if (*++dp == '\n') {
*--dp = 0;
cp = dp;
} else {
cp = ++dp;
}
}
if (cp >= ep) {
int curlen = cp - pp;
if (!(dp = realloc (pp, (size_t) (len += BUFSIZ)))) {
adios (NULL, "unable to allocate string storage");
} else {
cp = dp + curlen;
ep = (pp = dp) + len - 1;
}
}
}
}
syntax highlighted by Code2HTML, v. 0.9.1