Simple implementations. Need to check which platforms need the
wrapper.

Signed-off-by: Timo Teräs <[email protected]>
---
 include/platform.h |    6 ++++++
 libbb/platform.c   |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/include/platform.h b/include/platform.h
index 429220b..be365d2 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -349,6 +349,7 @@ typedef unsigned smalluint;
 #define HAVE_STRSEP 1
 #define HAVE_STRSIGNAL 1
 #define HAVE_VASPRINTF 1
+#define HAVE_GETDELIM 1
 #define HAVE_XTABS 1
 #define HAVE_MNTENT_H 1
 #define HAVE_NET_ETHERNET_H 1
@@ -455,4 +456,9 @@ 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_GETDELIM
+extern ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream) 
FAST_FUNC;
+extern ssize_t getline(char **lineptr, size_t *n, FILE *stream) FAST_FUNC;
+#endif
+
 #endif
diff --git a/libbb/platform.c b/libbb/platform.c
index 04b8961..6811ba5 100644
--- a/libbb/platform.c
+++ b/libbb/platform.c
@@ -145,3 +145,39 @@ char* FAST_FUNC stpcpy(char *p, const char *to_add)
        return p;
 }
 #endif
+
+#ifndef HAVE_GETDELIM
+ssize_t FAST_FUNC getdelim(char **lineptr, size_t *n, int delim, FILE *stream)
+{
+       char *line = *lineptr;
+       ssize_t len = 0, alloced = *n;
+       int ch;
+
+       do {
+               ch = fgetc(stream);
+               if (ch == EOF) {
+                       if (len)
+                               break;
+                       return -1;
+               }
+               if (len + 1 > alloced) {
+                       alloced = alloced ? alloced * 2 : 120;
+                       line = realloc(line, alloced);
+                       if (line == NULL)
+                               return -1;
+               }
+               line[len++] = ch;
+       } while (ch != delim);
+
+       line[len] = 0;
+       *lineptr = line;
+       *n = alloced;
+       return len;
+}
+
+ssize_t FAST_FUNC getline(char **lineptr, size_t *n, FILE *stream)
+{
+       /* FIXME: could optimize with fgets() */
+       return getdelim(lineptr, n, '\n', stream);
+}
+#endif
-- 
1.7.1

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to