diff options
| author | rajdakin <rajdakin@gmail.com> | 2024-09-07 15:20:17 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-07 15:20:17 +0200 |
| commit | f0d7582845e124ed61b86f43da30a7b3f3f0c3f5 (patch) | |
| tree | 2ee0c53821805b33ca47e0919fea95ccb920cd52 /wrapperhelper/src/cstring.c | |
| parent | 75bdb328284b8e5b6827eeb7d5cedef26222e7db (diff) | |
| download | box64-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.c | 55 |
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'; |