diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | include/util/compat.h | 6 | ||||
-rw-r--r-- | lib/util/Makemodule.am | 2 | ||||
-rw-r--r-- | lib/util/getline.c | 50 |
4 files changed, 58 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 6093717..d468a2a 100644 --- a/configure.ac +++ b/configure.ac @@ -218,7 +218,7 @@ AX_COMPILE_CHECK_SIZEOF(long long) AC_CHECK_HEADERS([sys/xattr.h], [], []) AC_CHECK_HEADERS([sys/sysinfo.h], [], []) -AC_CHECK_FUNCS([strndup]) +AC_CHECK_FUNCS([strndup getline]) ##### generate output ##### diff --git a/include/util/compat.h b/include/util/compat.h index 8566090..5c9e4fb 100644 --- a/include/util/compat.h +++ b/include/util/compat.h @@ -110,6 +110,12 @@ struct stat { #include <sys/sysmacros.h> #endif +#ifndef HAVE_GETLINE +#include <stdio.h> + +ssize_t getline(char **line, size_t *n, FILE *fp); +#endif + #ifndef HAVE_STRNDUP char *strndup(const char *str, size_t max_len); #endif diff --git a/lib/util/Makemodule.am b/lib/util/Makemodule.am index e624bbd..23e5c4e 100644 --- a/lib/util/Makemodule.am +++ b/lib/util/Makemodule.am @@ -1,7 +1,7 @@ libutil_la_SOURCES = include/util/util.h include/util/compat.h libutil_la_SOURCES += lib/util/str_table.c include/util/str_table.h libutil_la_SOURCES += lib/util/alloc.c lib/util/canonicalize_name.c -libutil_la_SOURCES += lib/util/strndup.c +libutil_la_SOURCES += lib/util/strndup.c lib/util/getline.c libutil_la_CFLAGS = $(AM_CFLAGS) libutil_la_CPPFLAGS = $(AM_CPPFLAGS) libutil_la_LDFLAGS = $(AM_LDFLAGS) diff --git a/lib/util/getline.c b/lib/util/getline.c new file mode 100644 index 0000000..996bef2 --- /dev/null +++ b/lib/util/getline.c @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * getline.c + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#include "config.h" +#include "util/compat.h" + +#include <string.h> +#include <stdlib.h> + +#ifndef HAVE_GETLINE +ssize_t getline(char **line, size_t *n, FILE *fp) +{ + size_t new_cap, len = 0, cap = 0; + char *buffer = NULL, *new; + int c; + + if (feof(fp) || ferror(fp)) + return -1; + + do { + c = fgetc(fp); + + if (ferror(fp)) + return -1; + + if (c == EOF) + c = '\n'; + + if (len == cap) { + new_cap = cap ? cap * 2 : 32; + new = realloc(buffer, new_cap); + + if (new == NULL) + return -1; + + buffer = new; + cap = new_cap; + } + + buffer[len++] = c; + } while (c != '\n'); + + *line = buffer; + *n = len; + return len; +} +#endif |