From 130907d5062b2bec28e671d25a30c66efd53dc57 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Fri, 4 May 2012 03:21:51 +0000 Subject: [PATCH] fileio: add routine for portably yanking lines out of a FILE stream --- Makefile | 2 +- fileio.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pkg.h | 3 +++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 fileio.c diff --git a/Makefile b/Makefile index 097963e..753c3e4 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PROG = pkgconf${PROG_SUFFIX} -SRCS = main.c parse.c pkg.c bsdstubs.c getopt_long.c fragment.c argvsplit.c +SRCS = main.c parse.c pkg.c bsdstubs.c getopt_long.c fragment.c argvsplit.c fileio.c include buildsys.mk diff --git a/fileio.c b/fileio.c new file mode 100644 index 0000000..01af8ff --- /dev/null +++ b/fileio.c @@ -0,0 +1,64 @@ +/* + * fileio.c + * File reading utilities + * + * Copyright (c) 2012 William Pitcock . + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * 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 "pkg.h" +#include "bsdstubs.h" + +char * +pkg_fgetline(char *line, size_t size, FILE *stream) +{ + char *s = line; + char *end = line + size - 1; + int c = '\0', c2; + + if (s == NULL) + return NULL; + + while (s < end && (c = getc(stream)) != EOF) + { + if (c == '\n') + { + *s++ = c; + break; + } + else if (c == '\r') + { + *s++ = '\n'; + + if ((c2 = getc(stream)) == '\n') + break; + + ungetc(c2, stream); + break; + } + else + *s++ = c; + } + + *s = '\0'; + + if (c == EOF && (s == line || ferror(stream))) + return NULL; + + return line; +} diff --git a/pkg.h b/pkg.h index 2cca40c..8eaaf5d 100644 --- a/pkg.h +++ b/pkg.h @@ -140,4 +140,7 @@ pkg_fragment_t *pkg_fragment_copy(pkg_fragment_t *head, pkg_fragment_t *base); void pkg_fragment_delete(pkg_fragment_t *node); bool pkg_fragment_exists(pkg_fragment_t *head, pkg_fragment_t *base); +/* fileio.c */ +char *pkg_fgetline(char *line, size_t size, FILE *stream); + #endif