From 2630c111bedc0fc392fb539a44730c1633d29990 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 18 Nov 2012 04:31:32 +0200 Subject: use internal implementation of getline MacOS doesn't have function getline --- src/common.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/common.c') diff --git a/src/common.c b/src/common.c index 840a0803..cdfa944c 100644 --- a/src/common.c +++ b/src/common.c @@ -29,6 +29,10 @@ #include "common.h" +// assume malloc stores at most 8 bytes for size of allocated memory +// and page size is at least 4KB +#define READ_BUF_SIZE 4088 + // backwards compatibility for GLib version < 2.28 void p_slist_free_full(GSList *items, GDestroyNotify free_func) @@ -118,3 +122,48 @@ encode_xml(const char * const xml) return coded_msg3; } + +char * +prof_getline(FILE *stream) +{ + char *buf; + size_t buf_size; + char *result; + char *s = NULL; + size_t s_size = 1; + int need_exit = 0; + + buf = (char *)malloc(READ_BUF_SIZE); + + while (TRUE) { + result = fgets(buf, READ_BUF_SIZE, stream); + if (result == NULL) + break; + buf_size = strlen(buf); + if (buf[buf_size - 1] == '\n') { + buf_size--; + buf[buf_size] = '\0'; + need_exit = 1; + } + + result = (char *)realloc(s, s_size + buf_size); + if (result == NULL) { + if (s != NULL) { + free(s); + s = NULL; + } + break; + } + s = result; + + memcpy(s + s_size - 1, buf, buf_size); + s_size += buf_size; + s[s_size - 1] = '\0'; + + if (need_exit != 0 || feof(stream) != 0) + break; + } + + free(buf); + return s; +} -- cgit 1.4.1-2-gfad0