/* $NetBSD: fparseln.c,v 1.9 1999/09/20 04:48:06 lukem Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Christos Zoulas.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <compat.h>
static int isescaped(const char *, const char *, int);
/*
* isescaped():
* Return true if the character in *p that belongs to a string
* that starts in *sp, is escaped by the escape character esc.
*/
static int
{
const char *cp;
/* No escape character */
if (esc == '\0')
return (1);
/* Count the number of escape characters that precede ours */
continue;
/* Return true if odd number of escape characters */
return ((ne & 1) != 0);
}
/*
* fparseln():
* Read a line from a file parsing continuations ending in \
* and eliminating trailing newlines, or comments starting with
* the comment char.
*/
char *
{
char *buf;
int cnt;
len = 0;
cnt = 1;
/*
* XXX: it would be cool to be able to specify the newline character,
* but unfortunately, fgetln does not let us
*/
nl = '\n';
while (cnt) {
cnt = 0;
if (lineno)
(*lineno)++;
break;
if (s && com) { /* Check and eliminate comments */
break;
}
}
if (s && nl) { /* Check and eliminate newlines */
s--; /* forget newline */
}
if (s && con) { /* Check and eliminate continuations */
s--; /* forget escape */
cnt = 1;
}
}
continue;
return (NULL);
}
len += s;
}
while (cp[0] != '\0') {
int skipesc;
break;
skipesc = 0;
if (skipesc)
cp++;
else
}
*ptr = '\0';
}
if (size) {
}
return (buf);
}
#ifdef TEST
int
{
char *ptr;
line = 0;
FPARSELN_UNESCALL)) != NULL) {
}
return (0);
}
/*
* # This is a test
* line 1
* line 2 \
* line 3 # Comment
* line 4 \# Not comment \\\\
*
* # And a comment \
* line 5 \\\
* line 6
*
*/
#endif /* TEST */