summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-07-10 21:01:57 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-07-11 08:06:02 +0100
commit251bcc32eed37ee10eb14ce2278ecbdcc40a7cde (patch)
treeb176ee9ba996441dc9d8be8a86fc7504ef3c8752
parent8587b2fff218537c6ff568ac3ef561f0d39f03ff (diff)
downloadxorg-driver-xf86-video-intel-251bcc32eed37ee10eb14ce2278ecbdcc40a7cde.tar.gz
configure: Provide a poor man's replacement for getline()
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>
-rw-r--r--configure.ac3
-rw-r--r--libobj/getline.c51
-rw-r--r--src/sna/sna.h5
3 files changed, 59 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index 8e4d8339..eec9f896 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
index 00000000..5acdf8d1
--- /dev/null
+++ b/libobj/getline.c
@@ -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;
+}
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 431fe979..6e70c56e 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -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 */