From 96cd1bdbc532f00c2b258bbe91735bf6ffc03875 Mon Sep 17 00:00:00 2001 From: cancel Date: Tue, 7 Jan 2020 23:38:30 +0900 Subject: [PATCH] Cleanup --- thirdparty/gbstring.c | 39 +++++++++++++++++---------------------- thirdparty/gbstring.h | 30 +++++++++++++++++++----------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/thirdparty/gbstring.c b/thirdparty/gbstring.c index a67b1b7..f8c5a91 100644 --- a/thirdparty/gbstring.c +++ b/thirdparty/gbstring.c @@ -58,10 +58,6 @@ typedef struct gbStringHeader { #define GB_NOINLINE #endif -static void gbs_setlen(gbs str, size_t len) { - GB_STRING_HEADER(str)->len = len; -} - static void gbs_setcap(gbs str, size_t cap) { GB_STRING_HEADER(str)->cap = cap; } @@ -135,7 +131,9 @@ void gbs_free(gbs str) { free((gbStringHeader *)str - 1); } -gbs gbs_dup(gbs const str) { return gbs_newlen(str, gbs_len(str)); } +gbs gbs_dup(gbs const str) { + return gbs_newlen(str, GB_STRING_HEADER(str)->len); +} size_t gbs_len(gbs const str) { return GB_STRING_HEADER(str)->len; } size_t gbs_cap(gbs const str) { return GB_STRING_HEADER(str)->cap; } @@ -148,23 +146,23 @@ size_t gbs_avail(gbs const str) { } void gbs_clear(gbs str) { - gbs_setlen(str, 0); + GB_STRING_HEADER(str)->len = 0; str[0] = '\0'; } gbs gbs_catlen(gbs str, void const *other, size_t other_len) { - size_t curr_len = gbs_len(str); + size_t curr_len = GB_STRING_HEADER(str)->len; str = gbs_makeroomfor(str, other_len); if (str == NULL) return NULL; memcpy(str + curr_len, other, other_len); str[curr_len + other_len] = '\0'; - gbs_setlen(str, curr_len + other_len); + GB_STRING_HEADER(str)->len = curr_len + other_len; return str; } gbs gbs_catgbs(gbs str, gbs const other) { - return gbs_catlen(str, other, gbs_len(other)); + return gbs_catlen(str, other, GB_STRING_HEADER(other)->len); } gbs gbs_cat(gbs str, char const *other) { @@ -173,13 +171,13 @@ gbs gbs_cat(gbs str, char const *other) { gbs gbs_cpylen(gbs str, char const *cstr, size_t len) { if (gbs_cap(str) < len) { - str = gbs_makeroomfor(str, len - gbs_len(str)); + str = gbs_makeroomfor(str, len - GB_STRING_HEADER(str)->len); if (str == NULL) return NULL; } + GB_STRING_HEADER(str)->len = len; memcpy(str, cstr, len); str[len] = '\0'; - gbs_setlen(str, len); return str; } gbs gbs_cpy(gbs str, char const *cstr) { @@ -187,7 +185,7 @@ gbs gbs_cpy(gbs str, char const *cstr) { } gbs gbs_makeroomfor(gbs str, size_t add_len) { - size_t len = gbs_len(str); + size_t len = GB_STRING_HEADER(str)->len; size_t new_len = len + add_len; // TODO overflow check void *ptr, *new_ptr; size_t available, new_size; @@ -207,23 +205,22 @@ gbs gbs_makeroomfor(gbs str, size_t add_len) { return str; } +void gbs_pokelen(gbs str, size_t len) { GB_STRING_HEADER(str)->len = len; } + size_t gbs_totalmemused(gbs const s) { size_t cap = gbs_cap(s); return sizeof(gbStringHeader) + cap; } bool gbs_equal(gbs const lhs, gbs const rhs) { - size_t lhs_len, rhs_len, i; - lhs_len = gbs_len(lhs); - rhs_len = gbs_len(rhs); + size_t lhs_len = GB_STRING_HEADER(lhs)->len; + size_t rhs_len = GB_STRING_HEADER(rhs)->len; if (lhs_len != rhs_len) return false; - - for (i = 0; i < lhs_len; i++) { + for (size_t i = 0; i < lhs_len; i++) { if (lhs[i] != rhs[i]) return false; } - return true; } @@ -232,7 +229,7 @@ gbs gbs_trim(gbs str, char const *cut_set) { size_t len; start_pos = start = str; - end_pos = end = str + gbs_len(str) - 1; + end_pos = end = str + GB_STRING_HEADER(str)->len - 1; while (start_pos <= end && strchr(cut_set, *start_pos)) start_pos++; @@ -241,12 +238,10 @@ gbs gbs_trim(gbs str, char const *cut_set) { len = (start_pos > end_pos) ? 0 : ((size_t)(end_pos - start_pos) + 1); + GB_STRING_HEADER(str)->len = len; if (str != start_pos) memmove(str, start_pos, len); str[len] = '\0'; - - gbs_setlen(str, len); - return str; } diff --git a/thirdparty/gbstring.h b/thirdparty/gbstring.h index 9d34b76..4225d02 100644 --- a/thirdparty/gbstring.h +++ b/thirdparty/gbstring.h @@ -5,9 +5,14 @@ typedef char *gbs; -gbs gbs_newcap(size_t cap); -gbs gbs_newlen(void const *str, size_t len); gbs gbs_new(char const *str); +// ^- Create new with copy of null-terminated cstring +gbs gbs_newlen(void const *str, size_t len); +// ^- Same, but without calling strlen(). +// Resulting new string will be null terminated. +gbs gbs_newcap(size_t cap); +// ^- 'Raw' new with a specific capacity. +// Length will be set to 0, and '\0' written at position 0. gbs gbs_newvprintf(const char *fmt, va_list ap); gbs gbs_newprintf(char const *fmt, ...) #ifdef __GNUC__ @@ -17,15 +22,17 @@ gbs gbs_newprintf(char const *fmt, ...) void gbs_free(gbs str); gbs gbs_dup(gbs const str); +// ^- Same as gbs_newlen(str, gbs_len(str)) +gbs gbs_cpy(gbs str, char const *cstr); +// ^- Set `str` to contain the contents of `cstr` +gbs gbs_cpylen(gbs str, char const *cstr, size_t len); -size_t gbs_len(gbs const str); -size_t gbs_cap(gbs const str); -size_t gbs_avail(gbs const str); - -void gbs_clear(gbs str); +size_t gbs_len(gbs const str); // Bytes used by string (excl. null term) +size_t gbs_cap(gbs const str); // Bytes allocated on heap (excl. null term) +size_t gbs_avail(gbs const str); // cap - len -gbs gbs_catlen(gbs str, void const *other, size_t len); gbs gbs_cat(gbs str, char const *other); +gbs gbs_catlen(gbs str, void const *other, size_t len); gbs gbs_catgbs(gbs str, gbs const other); gbs gbs_catvprintf(gbs str, const char *fmt, va_list ap); gbs gbs_catprintf(gbs str, char const *fmt, ...) @@ -34,10 +41,11 @@ gbs gbs_catprintf(gbs str, char const *fmt, ...) #endif ; -gbs gbs_cpylen(gbs str, char const *cstr, size_t len); -gbs gbs_cpy(gbs str, char const *cstr); - +void gbs_clear(gbs str); // Set len to 0, write '\0' at pos 0 gbs gbs_makeroomfor(gbs str, size_t add_len); +// ^- Makes sure +void gbs_pokelen(gbs str, size_t len); +// ^- Manually update length field. Doesn't do anything else for you. bool gbs_equal(gbs const lhs, gbs const rhs);