aboutsummaryrefslogtreecommitdiff
path: root/slurp.c
diff options
context:
space:
mode:
Diffstat (limited to 'slurp.c')
-rw-r--r--slurp.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/slurp.c b/slurp.c
new file mode 100644
index 0000000..1225806
--- /dev/null
+++ b/slurp.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BUFFER_STEP 1024
+
+char *slurp(FILE *f, size_t *size)
+{
+ char *buffer = NULL;
+ size_t nread = 0;
+
+ buffer = malloc(BUFFER_STEP);
+ if (!buffer) {
+ perror("malloc");
+ return NULL;
+ }
+
+ while (!feof(f)) {
+ nread = fread(&buffer[*size], 1, BUFFER_STEP, f);
+ *size += nread;
+ buffer = realloc(buffer, *size);
+ if (!buffer) {
+ perror("realloc");
+ return NULL;
+ }
+ }
+ if (ferror(f)) {
+ perror("slurp/fread");
+ }
+ return buffer;
+}