about summary refs log tree commit diff stats
path: root/src/common.c
diff options
context:
space:
mode:
authorDmitry Podgorny <pasis.ua@gmail.com>2012-11-18 04:31:32 +0200
committerDmitry Podgorny <pasis.ua@gmail.com>2012-11-18 04:31:32 +0200
commit2630c111bedc0fc392fb539a44730c1633d29990 (patch)
tree16604ce29c61bb408864d6cadf7d2e18c663f62e /src/common.c
parentcf3d50f855a0ce3adf24d05121bc4c4b5c1910dc (diff)
downloadprofani-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.c49
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;
+}