diff -r cf19b7820ff0 -r 94360453bce4 src/string.c --- a/src/string.c Thu Dec 25 12:07:37 2025 +0100 +++ b/src/string.c Sun Dec 28 14:10:14 2025 +0100 @@ -99,13 +99,15 @@ return size; } -int cx_strcat_a( +cxmutstr cx_strcat_a( const CxAllocator *alloc, - cxmutstr *str, + cxmutstr str, size_t count, ... ) { - if (count == 0) return 0; + if (count == 0) { + return cx_strdup_a(alloc, str); + } va_list ap; va_start(ap, count); va_list ap2; @@ -113,7 +115,7 @@ // compute overall length bool overflow = false; - size_t slen = str->length; + size_t slen = str.length; for (size_t i = 0; i < count; i++) { cxstring s = va_arg(ap, cxstring); if (slen > SIZE_MAX - s.length) overflow = true; @@ -125,31 +127,31 @@ if (overflow) { va_end(ap2); errno = EOVERFLOW; - return -1; + return CX_NULLSTR; } - // reallocate or create new string - if (cxReallocate(alloc, &str->ptr, slen + 1)) { + // reallocate or create a new string + if (cxReallocate(alloc, &str.ptr, slen + 1)) { // LCOV_EXCL_START va_end(ap2); - return -1; + return CX_NULLSTR; // LCOV_EXCL_STOP } // concatenate strings - size_t pos = str->length; - str->length = slen; + size_t pos = str.length; + str.length = slen; for (size_t i = 0; i < count; i++) { cxstring s = va_arg(ap2, cxstring); - memcpy(str->ptr + pos, s.ptr, s.length); + memcpy(str.ptr + pos, s.ptr, s.length); pos += s.length; } va_end(ap2); // terminate string - str->ptr[str->length] = '\0'; + str.ptr[str.length] = '\0'; - return 0; + return str; } cxstring cx_strsubs(