configure: Provide a poor man's replacement for getline()
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 10 Jul 2014 20:01:57 +0000 (21:01 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 11 Jul 2014 07:06:02 +0000 (08:06 +0100)
uClibc is one such library that doesn't implement getline()

Reported-by: Ben Widawsky <benjamin.widawsky@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
configure.ac
libobj/getline.c [new file with mode: 0644]
src/sna/sna.h

index 8e4d833..eec9f89 100644 (file)
@@ -818,6 +818,9 @@ if test "x$debug_msg" = "x"; then
        debug_msg=" none"
 fi
 
+AC_CONFIG_LIBOBJ_DIR(libobj)
+AC_REPLACE_FUNCS(getline)
+
 DRIVER_NAME="intel"
 AC_SUBST([DRIVER_NAME])
 AC_SUBST([moduledir])
diff --git a/libobj/getline.c b/libobj/getline.c
new file mode 100644 (file)
index 0000000..5acdf8d
--- /dev/null
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+extern int getline(char **line, size_t *len, FILE *file);
+
+int getline(char **line, size_t *len, FILE *file)
+{
+       char *ptr, *end;
+       int c;
+
+       if (*line == NULL) {
+               errno = EINVAL;
+               if (*len == 0)
+                       *line = malloc(4096);
+               if (*line == NULL)
+                       return -1;
+
+               *len = 4096;
+       }
+
+       ptr = *line;
+       end = *line + *len;
+
+       while ((c = fgetc(file)) != EOF) {
+               if (ptr + 1 >= end) {
+                       char *newline;
+                       int offset;
+
+                       newline = realloc(*line, *len + 4096);
+                       if (newline == NULL)
+                               return -1;
+
+                       offset = ptr - *line;
+
+                       *line = newline;
+                       *len += 4096;
+
+                       ptr = *line + offset;
+                       end = *line + *len;
+               }
+
+               *ptr++ = c;
+               if (c == '\n') {
+                       *ptr = '\0';
+                       return ptr - *line;
+               }
+       }
+       *ptr = '\0';
+       return -1;
+}
index 431fe97..6e70c56 100644 (file)
@@ -1222,4 +1222,9 @@ static inline void sigtrap_put(void)
 #define RR_Rotate_All (RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270)
 #define RR_Reflect_All (RR_Reflect_X | RR_Reflect_Y)
 
+#ifndef HAVE_GETLINE
+#include <stdio.h>
+extern int getline(char **line, size_t *len, FILE *file);
+#endif
+
 #endif /* _SNA_H */