summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dynarr.h27
-rw-r--r--str.h38
2 files changed, 50 insertions, 15 deletions
diff --git a/dynarr.h b/dynarr.h
index 6feea5a..9fe8701 100644
--- a/dynarr.h
+++ b/dynarr.h
@@ -4,7 +4,6 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
-#include <err.h>
#include "stdwrm.h"
@@ -13,28 +12,26 @@ typedef struct { size_t count, capacity; } DynArrHeader;
#define DYNARR(type) type *
#define DA_HEADER(da) ((DynArrHeader*)(da) - 1)
-#define DA_DEFAULT_INIT_SIZE 16
-
-#define DA_INIT_SIZE(da, sz) do {\
- char *stdwrm__da_init_ptr = ((char*)malloc(sizeof(DynArrHeader) + sz * sizeof(*da)));\
- if (!stdwrm__da_init_ptr) err(1, "dynamic array allocation failed");\
- da = (void *)(stdwrm__da_init_ptr + sizeof(DynArrHeader));\
- *DA_HEADER(da) = (DynArrHeader) { 0, sz };\
+#define DA_INIT_CAP 16
+#define DA_INIT_SZ(da, cap) do {\
+ char *da_init_ptr = ((char*)malloc(sizeof(DynArrHeader) + cap * sizeof(*da)));\
+ if (!da_init_ptr) { fprintf(stderr, "dynamic array allocation failed\n"); abort(); }\
+ da = (void *)(da_init_ptr + sizeof(DynArrHeader));\
+ *DA_HEADER(da) = (DynArrHeader) { 0, cap };\
} while(0)
-#define DA_INIT(da) DA_INIT_SIZE(da, DA_DEFAULT_INIT_SIZE)
+#define DA_INIT(da) DA_INIT_SZ(da, DA_INIT_CAP)
#define DA_FREE(da)\
free(DA_HEADER(da))
#define DA_LEN(da) (DA_HEADER(da)->count)
#define DA_FIT(da, count) do {\
- size_t stdwrm__da_fit_count = count;\
- if (stdwrm__da_fit_count >= DA_HEADER(da)->capacity) {\
- while (stdwrm__da_fit_count >= DA_HEADER(da)->capacity) DA_HEADER(da)->capacity <<= 1;\
- char *stdwrm__da_fit_ptr = realloc(DA_HEADER(da), sizeof(DynArrHeader) + DA_HEADER(da)->capacity * sizeof(*da));\
- if (!stdwrm__da_fit_ptr) err(1, "dynamic array reallocation failed");\
- (da) = (void *)(stdwrm__da_fit_ptr + sizeof(DynArrHeader));\
+ if (count >= DA_HEADER(da)->capacity) {\
+ while (count >= DA_HEADER(da)->capacity) DA_HEADER(da)->capacity <<= 1;\
+ char *da_fit_ptr = realloc(DA_HEADER(da), sizeof(DynArrHeader) + DA_HEADER(da)->capacity * sizeof(*da));\
+ if (!da_fit_ptr) { fprintf(stderr, "dynamic array reallocation failed\n"); abort(); }\
+ (da) = (void *)(da_fit_ptr + sizeof(DynArrHeader));\
}\
} while(0)
diff --git a/str.h b/str.h
index 47ff676..bafec19 100644
--- a/str.h
+++ b/str.h
@@ -14,15 +14,21 @@ typedef struct {
} strv_t;
#define strv(s) (strv_t) { s, strlen(s) }
+#define strvs(s) (strv_t) { s, slen(s) }
string snew(void);
size_t slen(const string);
void scats(string *, strv_t);
void scatc(string *, char);
void sfree(string);
+void sreplace(string *str, size_t i, size_t n, strv_t with);
+string sfmt(const char *fmt, ...);
+string sdup(const char *);
#ifdef STDWRM_IMPL_STR
+#include <stdarg.h>
+
string snew(void) {
string s;
DA_INIT(s);
@@ -54,5 +60,37 @@ void sfree(string s) {
DA_FREE(s);
}
+string sfmt(const char *fmt, ...) {
+ va_list count, print;
+ string s;
+ FILE *f = fopen("/dev/null", "w/o");
+ va_start(print, fmt);
+ va_copy(count, print);
+ size_t n = vfprintf(f, fmt, count) + 1;
+ DA_INIT_SZ(s, n);
+ vsprintf(s, fmt, print);
+ va_end(print);
+ fclose(f);
+ return s;
+}
+
+string sdup(const char *s) {
+ string d;
+ size_t n = strlen(s) + 1;
+ DA_INIT_SZ(d, n);
+ memcpy(d, s, n);
+ return d;
+}
+
+void sreplace(string *str, size_t i, size_t n, strv_t with) {
+ string s = *str;
+ size_t new_n = DA_LEN(s) + with.n - n;
+ DA_FIT(s, new_n);
+ memmove(&s[i + with.n], &s[i + n], slen(s) - (i + n));
+ memcpy(&s[i], with.s, with.n);
+ s[new_n - 1] = 0;
+ DA_LEN(s) = new_n;
+}
+
#endif
#endif