4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the terms and conditions of the BSD License that accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 1997 Christos Zoulas. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. All advertising materials mentioning features or use of this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * must display the following acknowledgement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This product includes software developed by Christos Zoulas.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 4. The name of the author may not be used to endorse or promote products
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * derived from this software without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetBSD: fparseln.c,v 1.5 2004/06/20 22:20:15 jmc Exp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/EfiCdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "namespace.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <assert.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <errno.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdio.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <string.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdlib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __weak_alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__weak_alias(fparseln,_fparseln)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if ! HAVE_FPARSELN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef HAVE_NBTOOL_CONFIG_H
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "reentrant.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "local.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FLOCKFILE(fp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FUNLOCKFILE(fp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(_REENTRANT) && !HAVE_NBTOOL_CONFIG_H
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define __fgetln(f, l) __fgetstr(f, l, '\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define __fgetln(f, l) fgetln(f, l)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int isescaped(const char *, const char *, int);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* isescaped():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Return true if the character in *p that belongs to a string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that starts in *sp, is escaped by the escape character esc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncisescaped(const char *sp, const char *p, int esc)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *cp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t ne;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DIAGASSERT(sp != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DIAGASSERT(p != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* No escape character */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (esc == '\0')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Count the number of escape characters that precede ours */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (ne = 0, cp = p; --cp >= sp && *cp == esc; ne++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Return true if odd number of escape characters */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ne & 1) != 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* fparseln():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Read a line from a file parsing continuations ending in \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * and eliminating trailing newlines, or comments starting with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the comment char.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncchar *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfparseln(FILE *fp, size_t *size, size_t *lineno, const char str[3], int flags)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync static const char dstr[3] = { '\\', '\\', '#' };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t s, len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *ptr, *cp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int cnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char esc, con, nl, com;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _DIAGASSERT(fp != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(fp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync errno = EINVAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buf = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cnt = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (str == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync str = dstr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync esc = str[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync con = str[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync com = str[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * XXX: it would be cool to be able to specify the newline character,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * but unfortunately, fgetln does not let us
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nl = '\n';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FLOCKFILE(fp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (cnt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lineno)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*lineno)++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ptr = __fgetln(fp, &s)) == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (s && com) { /* Check and eliminate comments */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (cp = ptr; cp < ptr + s; cp++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*cp == com && !isescaped(ptr, cp, esc)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s = cp - ptr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cnt = s == 0 && buf == NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (s && nl) { /* Check and eliminate newlines */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cp = &ptr[s - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*cp == nl)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s--; /* forget newline */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (s && con) { /* Check and eliminate continuations */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cp = &ptr[s - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*cp == con && !isescaped(ptr, cp, esc)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s--; /* forget escape */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cnt = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (s == 0 && buf != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((cp = realloc(buf, len + s + 1)) == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FUNLOCKFILE(fp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync free(buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buf = cp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) memcpy(buf + len, ptr, s);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len += s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buf[len] = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FUNLOCKFILE(fp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((flags & FPARSELN_UNESCALL) != 0 && esc && buf != NULL &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strchr(buf, esc) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ptr = cp = buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (cp[0] != '\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int skipesc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (cp[0] != '\0' && cp[0] != esc)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ptr++ = *cp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cp[0] == '\0' || cp[1] == '\0')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync skipesc = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cp[1] == com)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync skipesc += (flags & FPARSELN_UNESCCOMM);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cp[1] == con)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync skipesc += (flags & FPARSELN_UNESCCONT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cp[1] == esc)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync skipesc += (flags & FPARSELN_UNESCESC);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cp[1] != com && cp[1] != con && cp[1] != esc)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync skipesc = (flags & FPARSELN_UNESCREST);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (skipesc)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ptr++ = *cp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ptr++ = *cp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ptr = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len = strlen(buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (size)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *size = len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef TEST
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint main(int, char **);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncmain(int argc, char **argv)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *ptr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t size, line;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync line = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((ptr = fparseln(stdin, &size, &line, NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FPARSELN_UNESCALL)) != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("line %d (%d) |%s|\n", line, size, ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This is a test
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 2 \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 3 # Comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 4 \# Not comment \\\\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# And a comment \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 5 \\\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncline 6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* TEST */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* ! HAVE_FPARSELN */