Fixes for string.c

This commit is contained in:
Kyler Olsen 2025-11-10 21:29:01 -07:00
parent 2ebe34a9a6
commit 1617f6945a
1 changed files with 21 additions and 11 deletions

View File

@ -27,8 +27,8 @@ size_t strnlen(const char *s, size_t maxlen) {
SlsStr malloc_str(const char *s, size_t maxlen) {
size_t length = strnlen(s, maxlen);
char *new_str = (char *)malloc(sizeof(char) * length);
strncpy(new_str, s, length);
char *new_str = (char *)malloc(sizeof(char) * (length + 1));
strncpy(new_str, s, length + 1);
return (SlsStr){length, new_str, TRUE};
}
@ -92,6 +92,16 @@ typedef struct {
size_t self_length;
} FormatStringItem;
static size_t number_length(int64_t i) {
if (i == 0) return 1;
else return (i < 0 ? 1 : 0) + (int)log10(llabs(i) + 1);
}
static size_t unsigned_number_length(uint64_t i) {
if (i == 0) return 1;
else return (int)log10(i + 1);
}
SlsStr format(const SlsStr s, ...) {
va_list args;
va_start(args, s);
@ -120,7 +130,7 @@ SlsStr format(const SlsStr s, ...) {
FormatStringItem *items = (FormatStringItem *)malloc(sizeof(FormatStringItem) * count);
size_t i = 0;
size_t last_index = 0;
size_t last_index = (size_t)s.str;
current = strchr(s.str, '%');
do {
switch (current[1]) {
@ -177,8 +187,8 @@ SlsStr format(const SlsStr s, ...) {
items[i].boolean = va_arg(args, Boolean);
break;
}
items[i].str_index = (size_t)(current - last_index);
last_index = (size_t)(current + 2);
items[i].str_index = (size_t)current - last_index;
last_index = (size_t)current + 2;
i++;
current = strchr(current + 2, '%');
} while (current);
@ -193,19 +203,19 @@ SlsStr format(const SlsStr s, ...) {
length += items[i].self_length = 1;
break;
case FORMAT_INTEGER_32:
length += items[i].self_length = ceil(log10(items[i].integer_32 + 1));
length += items[i].self_length = number_length(items[i].integer_32);
break;
case FORMAT_INTEGER_64:
length += items[i].self_length = ceil(log10(items[i].integer_64 + 1));
length += items[i].self_length = number_length(items[i].integer_64);
break;
case FORMAT_UNSIGNED_INTEGER_64:
length += items[i].self_length = ceil(log10(items[i].unsigned_integer_64 + 1));
length += items[i].self_length = unsigned_number_length(items[i].unsigned_integer_64);
break;
case FORMAT_SIZE_INTEGER:
length += items[i].self_length = ceil(log10(items[i].size_integer + 1));
length += items[i].self_length = unsigned_number_length(items[i].size_integer);
break;
case FORMAT_FLOAT:
length += items[i].self_length = ceil(log10(items[i].ffloat + 1) + 3);
length += items[i].self_length = number_length(items[i].ffloat) + 3;
break;
case FORMAT_SLS_STR:
length += items[i].self_length = items[i].sls_str.len - 1;
@ -240,7 +250,7 @@ SlsStr format(const SlsStr s, ...) {
target_i += items[item_i].str_index;
source_i += items[item_i].str_index + 2;
switch (items[i].type) {
switch (items[item_i].type) {
case FORMAT_C_STRINGS:
snprintf(temp, items[item_i].self_length + 1, "%s", items[item_i].c_string);
break;