about summary refs log tree commit diff stats
path: root/wrapperhelper/src/cstring.c
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2024-09-07 15:20:17 +0200
committerGitHub <noreply@github.com>2024-09-07 15:20:17 +0200
commitf0d7582845e124ed61b86f43da30a7b3f3f0c3f5 (patch)
tree2ee0c53821805b33ca47e0919fea95ccb920cd52 /wrapperhelper/src/cstring.c
parent75bdb328284b8e5b6827eeb7d5cedef26222e7db (diff)
downloadbox64-f0d7582845e124ed61b86f43da30a7b3f3f0c3f5.tar.gz
box64-f0d7582845e124ed61b86f43da30a7b3f3f0c3f5.zip
Upgraded the wrapper helper (#1803)
* [WRAPPERHELPER] Fixed unsigned comparison in macros, added macro expanding in include commands, added -I option

* [WRAPPERHELPER] Forgot the README
Diffstat (limited to 'wrapperhelper/src/cstring.c')
-rw-r--r--wrapperhelper/src/cstring.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/wrapperhelper/src/cstring.c b/wrapperhelper/src/cstring.c
index b38a43e6..aecfb52e 100644
--- a/wrapperhelper/src/cstring.c
+++ b/wrapperhelper/src/cstring.c
@@ -32,6 +32,22 @@ string_t *string_new_cap(size_t cap) {
 	return ret;
 }
 
+string_t *string_new_cstr(const char *s) {
+	string_t *ret = malloc(sizeof(*ret));
+	if (!ret) return NULL;
+	size_t len = strlen(s);
+	size_t cap = (len < STRING_MIN_CAP) ? STRING_MIN_CAP : len;
+	ret->buf = malloc((cap + 1) * sizeof(char));
+	if (!ret->buf) {
+		free(ret);
+		return NULL;
+	}
+	strcpy(ret->buf, s);
+	ret->scap = cap;
+	ret->ssize = len;
+	return ret;
+}
+
 int string_reserve(string_t *s, size_t cap) {
 	size_t new_cap = (cap < STRING_MIN_CAP) ? STRING_MIN_CAP : cap;
 	if (new_cap <= s->scap) return 1;
@@ -42,6 +58,18 @@ int string_reserve(string_t *s, size_t cap) {
 	s->scap = new_cap;
 	return 1;
 }
+int string_reserve_grow(string_t *s, size_t cap) {
+	cap = (cap < STRING_MIN_CAP) ? STRING_MIN_CAP : cap;
+	if (cap <= s->scap) return 1;
+	size_t new_cap = (s->scap < STRING_MIN_CAP) ? STRING_MIN_CAP : s->scap * 2;
+	while (new_cap < cap) new_cap *= 2;
+	
+	void *new_buf = realloc(s->buf, sizeof(char) * (new_cap + 1));
+	if (!new_buf) return 0;
+	s->buf = new_buf;
+	s->scap = new_cap;
+	return 1;
+}
 
 void string_del(string_t *s) {
 	if (s->buf) free(s->buf);
@@ -55,35 +83,28 @@ char *string_steal(string_t *s) {
 }
 
 int string_add_char(string_t *s, char elem) {
-	if (s->ssize >= s->scap) {
-		size_t new_cap = (s->scap < STRING_MIN_CAP) ? STRING_MIN_CAP : s->scap * 2;
-		char *new_buf = realloc(s->buf, sizeof(char) * (new_cap + 1));
-		if (!new_buf) return 0;
-		s->buf = new_buf;
-		s->scap = new_cap;
-	}
+	if (!string_reserve_grow(s, s->ssize + 1)) return 0;
 	s->buf[s->ssize++] = elem;
 	s->buf[s->ssize] = '\0';
 	return 1;
 }
 
 int string_add_string(string_t *s1, string_t *s2) {
-	if (s1->ssize + s2->ssize > s1->scap) {
-		size_t new_cap = (s1->scap < STRING_MIN_CAP) ? STRING_MIN_CAP : s1->scap * 2;
-		while (s1->ssize + s2->ssize > new_cap) {
-			new_cap = new_cap * 2;
-		}
-		char *new_buf = realloc(s1->buf, sizeof(char) * (new_cap + 1));
-		if (!new_buf) return 0;
-		s1->buf = new_buf;
-		s1->scap = new_cap;
-	}
+	if (!string_reserve_grow(s1, s1->ssize + s2->ssize)) return 0;
 	memcpy(s1->buf + s1->ssize, s2->buf, s2->ssize);
 	s1->ssize += s2->ssize;
 	s1->buf[s1->ssize] = '\0';
 	return 1;
 }
 
+int string_add_cstr(string_t *s1, const char *s2) {
+	size_t len = strlen(s2);
+	if (!string_reserve_grow(s1, s1->ssize + len)) return 0;
+	strcpy(s1->buf + s1->ssize, s2);
+	s1->ssize += len;
+	return 1;
+}
+
 void string_pop(string_t *s) {
 	if (!s->ssize) return;
 	s->buf[--s->ssize] = '\0';