diff --git a/srv/format.c b/srv/format.c index cad9774..11456a1 100644 --- a/srv/format.c +++ b/srv/format.c @@ -21,9 +21,9 @@ uint32_t buffer_write(uint8_t byte, void* arg); uint32_t render_format(FormatCallback callback, void* arg, const char* restrict format, va_list va); uint32_t render_signed(FormatCallback callback, void* arg, - va_list va, uint8_t size, uint8_t base); + int32_t number, uint8_t base); uint32_t render_unsigned(FormatCallback callback, void* arg, - va_list* va, uint8_t size, uint8_t base); + uint32_t number, uint8_t base); //--local variables------------------------------------------------------------- @@ -74,7 +74,6 @@ uint32_t buffer_write(uint8_t byte, void* arg) uint32_t render_format(FormatCallback callback, void* arg, const char* restrict format, va_list va) { - uint8_t size; bool in_format = false; for (const char* c = format; *c != '\0'; ++c) { @@ -84,12 +83,6 @@ uint32_t render_format(FormatCallback callback, void* arg, case '%': callback('%', arg); break; - case 'h': - size = size / 2; - continue; - case 'l': - size = size * 2; - continue; case 'c': callback((uint8_t)va_arg(va, uint32_t), arg); break; @@ -102,13 +95,13 @@ uint32_t render_format(FormatCallback callback, void* arg, } break; case 'i': - //render_signed(callback, arg, va, size, 10); + render_signed(callback, arg, va_arg(va, int32_t), 10); break; case 'u': - render_unsigned(callback, arg, &va, size, 10); + render_unsigned(callback, arg, va_arg(va, uint32_t), 10); break; case 'x': - render_unsigned(callback, arg, &va, size, 16); + render_unsigned(callback, arg, va_arg(va, uint32_t), 16); break; default: //TODO manage error @@ -118,7 +111,6 @@ uint32_t render_format(FormatCallback callback, void* arg, switch (*c) { case '%': in_format = true; - size = 4; continue; default: callback(*c, arg); @@ -132,10 +124,20 @@ uint32_t render_format(FormatCallback callback, void* arg, return 0; } -uint32_t render_unsigned(FormatCallback callback, void* arg, - va_list* va, uint8_t size, uint8_t base) +uint32_t render_signed(FormatCallback callback, void* arg, + int32_t number, uint8_t base) +{ + if (number < 0) { + callback('-', arg); + number = -number; + } + + return render_unsigned(callback, arg, (uint32_t)number, base); +} + +uint32_t render_unsigned(FormatCallback callback, void* arg, + uint32_t number, uint8_t base) { - uint32_t number = va_arg(*va, uint32_t); uint32_t base_power = base; while (base_power <= number) {