diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-07-10 21:01:57 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2014-07-11 08:06:02 +0100 |
commit | 251bcc32eed37ee10eb14ce2278ecbdcc40a7cde (patch) | |
tree | b176ee9ba996441dc9d8be8a86fc7504ef3c8752 | |
parent | 8587b2fff218537c6ff568ac3ef561f0d39f03ff (diff) | |
download | xorg-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.ac | 3 | ||||
-rw-r--r-- | libobj/getline.c | 51 | ||||
-rw-r--r-- | src/sna/sna.h | 5 |
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 */ |