Fixes for string.c
This commit is contained in:
parent
2ebe34a9a6
commit
1617f6945a
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue