From 522d90613ae7dc728a98d3ce3b939b4ad9b30f25 Mon Sep 17 00:00:00 2001 From: Georgi Chorbadzhiyski Date: Fri, 16 Mar 2012 06:42:08 -0500 Subject: Implement Apple and Android versions of getline(), getdelim(), and clearenv(). --- lib/portability.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 lib/portability.c (limited to 'lib/portability.c') diff --git a/lib/portability.c b/lib/portability.c new file mode 100644 index 00000000..b1c448c8 --- /dev/null +++ b/lib/portability.c @@ -0,0 +1,75 @@ +/* vi: set sw=4 ts=4 :*/ +/* portability.c - code to workaround the deficiencies of various platforms. + * + * Copyright 2012 Rob Landley + * Copyright 2012 Georgi Chorbadzhiyski + */ + +#include "toys.h" + +#if defined(__APPLE__) || defined(__ANDROID__) +ssize_t getdelim(char **linep, size_t *np, int delim, FILE *stream) +{ + int ch; + size_t new_len; + ssize_t i = 0; + char *line, *new_line; + + // Invalid input + if (!linep || !np) { + errno = EINVAL; + return -1; + } + + if (*linep == NULL || *np == 0) { + *np = 1024; + *linep = calloc(1, *np); + if (*linep == NULL) + return -1; + } + line = *linep; + + while ((ch = getc(stream)) != EOF) { + if (i > *np) { + // Need more space + new_len = *np + 1024; + new_line = realloc(*linep, new_len); + if (!new_line) + return -1; + *np = new_len; + *linep = new_line; + } + + line[i] = ch; + if (ch == delim) + break; + i += 1; + } + + if (i > *np) { + // Need more space + new_len = i + 2; + new_line = realloc(*linep, new_len); + if (!new_line) + return -1; + *np = new_len; + *linep = new_line; + } + line[i + 1] = '\0'; + + return i > 0 ? i : -1; +} + +ssize_t getline(char **linep, size_t *np, FILE *stream) { + return getdelim(linep, np, '\n', stream); +} +#endif + +#if defined(__APPLE__) +extern char **environ; + +int clearenv(void) { + *environ = NULL; + return 0; +} +#endif -- cgit v1.2.3