summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dynarr.h3
-rw-r--r--strio.h15
2 files changed, 13 insertions, 5 deletions
diff --git a/dynarr.h b/dynarr.h
index fe3c84b..9fe8701 100644
--- a/dynarr.h
+++ b/dynarr.h
@@ -19,6 +19,7 @@ typedef struct { size_t count, capacity; } DynArrHeader;
da = (void *)(da_init_ptr + sizeof(DynArrHeader));\
*DA_HEADER(da) = (DynArrHeader) { 0, cap };\
} while(0)
+
#define DA_INIT(da) DA_INIT_SZ(da, DA_INIT_CAP)
#define DA_FREE(da)\
@@ -49,6 +50,6 @@ typedef struct { size_t count, capacity; } DynArrHeader;
for (typeof(da) name = (da); name < &(da)[DA_LEN(da)]; name++)
#define DA_FORVAL(da, name)\
- for (volatile typeof(*(da)) *da_iter = (da), name; da_iter < &(da)[DA_LEN(da)] && (name = *da_iter, 1); da_iter++)
+ for (volatile typeof(*(da)) *stdwrm__da_iter = (da), name; stdwrm__da_iter < &(da)[DA_LEN(da)] && (name = *stdwrm__da_iter, 1); stdwrm__da_iter++)
#endif
diff --git a/strio.h b/strio.h
index 20d0ddf..6aaf741 100644
--- a/strio.h
+++ b/strio.h
@@ -5,17 +5,24 @@
#include "str.h"
+#ifndef STRIO_CHUNK_SIZE
+#define STRIO_CHUNK_SIZE 256
+#endif
+
string read_whole_file(FILE *f);
#ifdef STDWRM_IMPL_STR
+#include <stdio.h>
+
string read_whole_file(FILE *f) {
- char chunk[256];
string s;
- DA_INIT(s);
+ DA_INIT_SIZE(s, STRIO_CHUNK_SIZE);
while (!feof(f)) {
- size_t n = fread(chunk, 1, sizeof chunk, f);
- DA_PUSH_MULT(s, chunk, n);
+ char *buf = &s[DA_LEN(s)];
+ size_t n = fread(buf, 1, STRIO_CHUNK_SIZE, f);
+ DA_FIT(s, DA_LEN(s) + n);
+ DA_LEN(s) += n;
}
DA_PUSH(s, 0);
return s;