#include "std.h" char* _strcat_malloc(size_t n, cstr str0, ...){ va_list argv; va_start(argv, str0); char* heap_ptr = _vstrcat_malloc(n, str0, argv); va_end(argv); return heap_ptr; } char* _vstrcat_malloc(size_t n, cstr str0, va_list argv){ size_t str0_len = strlen(str0); size_t total_len = str0_len; cstr* const parts = malloc(sizeof(cstr) * n); size_t* const part_lengths = malloc(sizeof(size_t) * n); for(size_t i = 0; i < n; i++){ cstr part = va_arg(argv, cstr); size_t length = strlen(part); parts[i] = part; part_lengths[i] = length; total_len += length; } char* const buf = malloc(total_len + 1); memcpy(buf, str0, str0_len); char* walking_ptr = buf + str0_len; for(size_t i = 0; i < n; i++){ memcpy(walking_ptr, parts[i], part_lengths[i]); walking_ptr += part_lengths[i]; } buf[total_len] = '\0'; free(parts); free(part_lengths); return buf; } char* NULLABLE(sprintf_malloc)(size_t buffer_size, cstr format, ...){ va_list argv; va_start(argv, format); char* NULLABLE(heap_ptr) = vsprintf_malloc(buffer_size, format, argv); va_end(argv); return heap_ptr; } char* NULLABLE(vsprintf_malloc)(size_t buffer_size, cstr format, va_list argv){ char* buf = malloc(buffer_size); int r = vsprintf_s(buf, buffer_size, format, argv); if(r < 0){ free(buf); return NULL; } return buf; }