diff options
author | Dmitry Podgorny <pasis.ua@gmail.com> | 2012-11-18 04:31:32 +0200 |
---|---|---|
committer | Dmitry Podgorny <pasis.ua@gmail.com> | 2012-11-18 04:31:32 +0200 |
commit | 2630c111bedc0fc392fb539a44730c1633d29990 (patch) | |
tree | 16604ce29c61bb408864d6cadf7d2e18c663f62e /src/common.c | |
parent | cf3d50f855a0ce3adf24d05121bc4c4b5c1910dc (diff) | |
download | profani-tty-2630c111bedc0fc392fb539a44730c1633d29990.tar.gz |
use internal implementation of getline
MacOS doesn't have function getline
Diffstat (limited to 'src/common.c')
-rw-r--r-- | src/common.c | 49 |
1 files changed, 49 insertions, 0 deletions
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; +} |