summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--str.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/str.h b/str.h
new file mode 100644
index 0000000..c0fc626
--- /dev/null
+++ b/str.h
@@ -0,0 +1,56 @@
+#ifndef STR_H
+#define STR_H
+
+#include <string.h>
+#include "dynarr.h"
+
+typedef DYNARR(char) string;
+
+typedef struct {
+	const char *s;
+	size_t n;
+} strv_t;
+
+#define strv(s) (strv_t) { s, strlen(s) }
+
+string snew(void);
+size_t slen(const string *);
+void scats(string *, strv_t);
+void scatc(string *, char);
+void sfree(string *);
+
+#ifdef STDWRM_STR_IMPL
+
+string snew(void) {
+	string s;
+	DA_INIT(s);
+	DA_PUSH(s, '\0');
+	return s;
+}
+
+size_t slen(const string *s) {
+	return DA_LEN(*s) - 1;
+}
+
+void scatc(string *s, char c) {
+	size_t n = DA_LEN(*s) + 1;
+	DA_FIT(*s, n);
+	*s[n-2] = c;
+	*s[n-1] = '\0';
+	DA_LEN(*s) = n;
+}
+
+void scats(string *s, strv_t sv) {
+	size_t n = DA_LEN(*s) + sv.n;
+	DA_FIT(*s, n);
+	memcpy(&(*s)[slen(s)], sv.s, sv.n);
+	(*s)[n-1] = '\0';
+	DA_LEN(*s) = n;
+}
+
+void sfree(string *s) {
+	DA_FREE(*s);
+}
+
+#endif
+#endif