diff options
author | pfg <pfg@FreeBSD.org> | 2014-08-16 00:54:56 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2014-08-16 00:54:56 +0000 |
commit | cc4d94d41f4dc42906a0f06a9c4beb8f612e0526 (patch) | |
tree | d813214a944b79cb450a1698ad3ee9833e970a13 /lib | |
parent | 5b8c39f44b953ecbb0160f46a7b3e4ed1e5453e0 (diff) | |
download | FreeBSD-src-cc4d94d41f4dc42906a0f06a9c4beb8f612e0526.zip FreeBSD-src-cc4d94d41f4dc42906a0f06a9c4beb8f612e0526.tar.gz |
MFC r269015:
fparseln(3): Update from NetBSD sources.
-fix a condition so that fparseln() doesn't report spurious empty lines
eg after 2 comment lines, or on EOF after a single comment line
-no escape character means no escaped characters
modify the previous fix so that no pointless realloc()s are done in
the case of multiple empty continuation lines, and comment the code
to make the logics obvious.
fparseln is now part of libc in NetBSD so this changes the previous
revision numbering.
Obtained from: NetBSD (CVS Rev. 1.6-1.7)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libutil/fparseln.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/libutil/fparseln.c b/lib/libutil/fparseln.c index 0624f0e..d03357e 100644 --- a/lib/libutil/fparseln.c +++ b/lib/libutil/fparseln.c @@ -1,4 +1,4 @@ -/* $NetBSD: fparseln.c,v 1.9 1999/09/20 04:48:06 lukem Exp $ */ +/* $NetBSD: fparseln.c,v 1.7 2007/03/08 19:57:53 drochner Exp $ */ /* * Copyright (c) 1997 Christos Zoulas. All rights reserved. @@ -59,7 +59,7 @@ isescaped(const char *sp, const char *p, int esc) /* No escape character */ if (esc == '\0') - return 1; + return 0; /* Count the number of escape characters that precede ours */ for (ne = 0, cp = p; --cp >= sp && *cp == esc; ne++) @@ -135,13 +135,19 @@ fparseln(FILE *fp, size_t *size, size_t *lineno, const char str[3], int flags) cp = &ptr[s - 1]; if (*cp == con && !isescaped(ptr, cp, esc)) { - s--; /* forget escape */ + s--; /* forget continuation char */ cnt = 1; } } - if (s == 0 && buf != NULL) - continue; + if (s == 0) { + /* + * nothing to add, skip realloc except in case + * we need a minimal buf to return an empty line + */ + if (cnt || buf != NULL) + continue; + } if ((cp = realloc(buf, len + s + 1)) == NULL) { free(buf); |