diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-28 20:58:08 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-10-28 20:58:55 +0100 |
commit | 534c573adf534c29fce8a23a46eb82f154885588 (patch) | |
tree | b266cb17cd167c5c039313f6aa31f1f7310f9d39 /lib/util/getline.c | |
parent | 887b67908d0e6a2b2f50e04319c1cf4412a25f89 (diff) |
Add a minimal fallback implementation for getline()
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/util/getline.c')
-rw-r--r-- | lib/util/getline.c | 50 |
1 files changed, 50 insertions, 0 deletions
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 |