From 5f268351d1de3218ffc0f6437595d11df7db616d Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 21 Apr 2026 21:43:24 +0300 Subject: fix: Do not produce side effects on failed resize --- Array.c | 4 +++- String.c | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Array.c b/Array.c index 60dc82d..6be8c1a 100644 --- a/Array.c +++ b/Array.c @@ -62,7 +62,9 @@ A_push(Array arr, void *value) { if (am->count >= am->length) { if (!B_resizeable(am->b, arr)) return R_OutOfBounds; - RETURN_NOTOK(B_resize(am->b, sizeof(*am) + am->element_size * (am->length <<= 1))); + + RETURN_NOTOK(B_resize(am->b, sizeof(*am) + am->element_size * (am->length << 1))); + am->length <<= 1; } memcpy(arr + am->count++ * am->element_size, value, am->element_size); diff --git a/String.c b/String.c index c0d454d..dd34d34 100644 --- a/String.c +++ b/String.c @@ -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; } -- cgit v1.2.3