diff --git a/SLS_C/src/string.c b/SLS_C/src/string.c index cb8d69d..61138ce 100644 --- a/SLS_C/src/string.c +++ b/SLS_C/src/string.c @@ -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;