platform.c: provide getline implementation
authorTimo Teras <timo.teras@iki.fi>
Wed, 29 Jun 2011 00:19:58 +0000 (02:19 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 29 Jun 2011 00:19:58 +0000 (02:19 +0200)
Signed-off-by: Timo Teras <timo.teras@iki.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/platform.h
libbb/platform.c

index cbe85f4..eafc3fc 100644 (file)
@@ -350,6 +350,7 @@ typedef unsigned smalluint;
 #define HAVE_STRSIGNAL 1
 #define HAVE_STRVERSCMP 1
 #define HAVE_VASPRINTF 1
+#define HAVE_GETLINE 1
 #define HAVE_XTABS 1
 #define HAVE_MNTENT_H 1
 #define HAVE_NET_ETHERNET_H 1
@@ -470,4 +471,8 @@ extern char *strsep(char **stringp, const char *delim) FAST_FUNC;
 extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
 #endif
 
+#ifndef HAVE_GETLINE
+extern ssize_t getline(char **lineptr, size_t *n, FILE *stream) FAST_FUNC;
+#endif
+
 #endif
index 04b8961..2bf34f5 100644 (file)
@@ -145,3 +145,32 @@ char* FAST_FUNC stpcpy(char *p, const char *to_add)
        return p;
 }
 #endif
+
+#ifndef HAVE_GETLINE
+ssize_t FAST_FUNC getline(char **lineptr, size_t *n, FILE *stream)
+{
+       int ch;
+       char *line = *lineptr;
+       size_t alloced = *n;
+       size_t len = 0;
+
+       do {
+               ch = fgetc(stream);
+               if (ch == EOF)
+                       break;
+               if (len + 1 >= alloced) {
+                       alloced += alloced/4 + 64;
+                       line = xrealloc(line, alloced);
+               }
+               line[len++] = ch;
+       } while (ch != '\n');
+
+       if (len == 0)
+               return -1;
+
+       line[len] = '\0';
+       *lineptr = line;
+       *n = alloced;
+       return len;
+}
+#endif