diff options
| author | Syndamia <kamen@syndamia.com> | 2026-04-21 21:43:24 +0300 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2026-04-21 21:43:24 +0300 |
| commit | 5f268351d1de3218ffc0f6437595d11df7db616d (patch) | |
| tree | ed03f74ec71c3ed6e5b6a1458bab722fc5052577 /String.c | |
| parent | f29be3f9e3fc2da6488beadb059b1eee6db60603 (diff) | |
| download | foollib-5f268351d1de3218ffc0f6437595d11df7db616d.tar foollib-5f268351d1de3218ffc0f6437595d11df7db616d.tar.gz foollib-5f268351d1de3218ffc0f6437595d11df7db616d.zip | |
fix: Do not produce side effects on failed resize
Diffstat (limited to 'String.c')
| -rw-r--r-- | String.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -95,9 +95,11 @@ S_append(String s, const char* str) { if (!B_resizeable(sm->b, s)) return R_OutOfBounds; - RETURN_NOTOK(B_resize(sm->b, sizeof(*sm) + (sm->length += strlen(str)) + 1)); + usize strlength = strlen(str); + RETURN_NOTOK(B_resize(sm->b, sizeof(*sm) + (sm->length + strlength) + 1)); strcat(s, str); + sm->length += strlength; return R_Ok; } @@ -109,18 +111,19 @@ S_prepend(String s, const char* str) { struct StringMeta* sm = S_metadata(s); - usize strlength = strlen(str); if (!B_resizeable(sm->b, s)) return R_OutOfBounds; - usize orig_len = sm->length; - RETURN_NOTOK(B_resize(sm->b, sizeof(*sm) + (sm->length += strlength) + 1)); + usize strlength = strlen(str); + RETURN_NOTOK(B_resize(sm->b, sizeof(*sm) + (sm->length + strlength) + 1)); - for (usize i = orig_len; i > 0; --i) + for (usize i = sm->length; i > 0; --i) s[i - 1 + strlength] = s[i - 1]; for (usize i = 0; i < strlength; ++i) s[i] = str[i]; + sm->length += strlength; + return R_Ok; } |
