53 lines
1.4 KiB
C
Executable File
53 lines
1.4 KiB
C
Executable File
#include "tlibc/string/cstr.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(buf, format, argv);
|
|
if(r < 0){
|
|
free(buf);
|
|
return NULL;
|
|
}
|
|
return buf;
|
|
}
|