diff --git a/include/asm/format.h b/include/asm/format.h index b9042844..15b2fb48 100644 --- a/include/asm/format.h +++ b/include/asm/format.h @@ -28,9 +28,9 @@ struct FormatSpec { bool prefix; bool alignLeft; bool padZero; - size_t width; + uint8_t width; bool hasFrac; - size_t fracWidth; + uint8_t fracWidth; int type; bool valid; }; diff --git a/src/asm/format.c b/src/asm/format.c index 31572c94..456cfc25 100644 --- a/src/asm/format.c +++ b/src/asm/format.c @@ -147,25 +147,21 @@ void fmt_PrintString(char *buf, size_t bufLen, struct FormatSpec const *fmt, cha size_t len = strlen(value); size_t totalLen = fmt->width > len ? fmt->width : len; + + if (totalLen + 1 > bufLen) /* bufLen includes terminator */ + error("Formatted string value too long\n"); + size_t padLen = fmt->width > len ? fmt->width - len : 0; - if (totalLen + 1 > bufLen) { /* bufLen includes terminator */ - error("Formatted string value too long\n"); - totalLen = bufLen - 1; - if (len > totalLen) - len = totalLen; - padLen = totalLen - len; - } - if (fmt->alignLeft) { - memcpy(buf, value, len < bufLen ? len : bufLen); + strncpy(buf, value, len < bufLen ? len : bufLen); for (size_t i = 0; i < totalLen && len + i < bufLen; i++) buf[len + i] = ' '; } else { for (size_t i = 0; i < padLen && i < bufLen; i++) buf[i] = ' '; if (bufLen > padLen) - memcpy(buf + padLen, value, bufLen - padLen - 1); + strncpy(buf + padLen, value, bufLen - padLen - 1); } buf[totalLen] = '\0'; @@ -225,18 +221,12 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin /* Special case for fixed-point */ /* Default fractional width (C's is 6 for "%f"; here 5 is enough) */ - size_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5; + uint8_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5; if (fracWidth) { - if (fracWidth > 255) { - error("Fractional width %zu too long, limiting to 255\n", - fracWidth); - fracWidth = 255; - } - char spec[16]; /* Max "%" + 5-char PRIu32 + ".%0255.f" + terminator */ - snprintf(spec, sizeof(spec), "%%" PRIu32 ".%%0%zu.f", fracWidth); + snprintf(spec, sizeof(spec), "%%" PRIu32 ".%%0%d.f", fracWidth); snprintf(valueBuf, sizeof(valueBuf), spec, value >> 16, (value % 65536) / 65536.0 * pow(10, fracWidth) + 0.5); } else { @@ -262,17 +252,11 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin numLen++; size_t totalLen = fmt->width > numLen ? fmt->width : numLen; - size_t padLen = fmt->width > numLen ? fmt->width - numLen : 0; - if (totalLen + 1 > bufLen) { /* bufLen includes terminator */ + if (totalLen + 1 > bufLen) /* bufLen includes terminator */ error("Formatted numeric value too long\n"); - totalLen = bufLen - 1; - if (numLen > totalLen) { - len = totalLen - (numLen - len); - numLen = totalLen; - } - padLen = totalLen - numLen; - } + + size_t padLen = fmt->width > numLen ? fmt->width - numLen : 0; if (fmt->alignLeft) { size_t pos = 0; diff --git a/src/asm/rgbasm.5 b/src/asm/rgbasm.5 index 2371e62f..10e92028 100644 --- a/src/asm/rgbasm.5 +++ b/src/asm/rgbasm.5 @@ -337,7 +337,7 @@ followed by one or more \[en] .Ql 9 . If specified, prints this many digits of a fixed-point fraction. -Defaults to 5 digits, maximum 255 digits. +Defaults to 5 digits. .It Ql Ta Specifies the type of value. .El .Pp diff --git a/test/asm/format-truncation.asm b/test/asm/format-truncation.asm deleted file mode 100644 index cc7cff9a..00000000 --- a/test/asm/format-truncation.asm +++ /dev/null @@ -1,15 +0,0 @@ -num equ 42 -fix equ 123.456 -str equs "hello" - -println "{#0260x:num}" -println "{#-260x:num}" -println "{0280.260f:fix}" -println "{260s:str}" -println "{-260s:str}" - -println "<{#0260x:num}>" -println "<{#-260x:num}>" -println "<{0280.260f:fix}>" -println "<{260s:str}>" -println "<{-260s:str}>" diff --git a/test/asm/format-truncation.err b/test/asm/format-truncation.err deleted file mode 100644 index 01ee8689..00000000 --- a/test/asm/format-truncation.err +++ /dev/null @@ -1,35 +0,0 @@ -ERROR: format-truncation.asm(5): - Formatted numeric value too long -ERROR: format-truncation.asm(6): - Formatted numeric value too long -ERROR: format-truncation.asm(7): - Fractional width 260 too long, limiting to 255 -ERROR: format-truncation.asm(7): - Formatted numeric value too long -ERROR: format-truncation.asm(8): - Formatted string value too long -ERROR: format-truncation.asm(9): - Formatted string value too long -ERROR: format-truncation.asm(11): - Formatted numeric value too long -warning: format-truncation.asm(11): [-Wlong-string] - String constant too long -ERROR: format-truncation.asm(12): - Formatted numeric value too long -warning: format-truncation.asm(12): [-Wlong-string] - String constant too long -ERROR: format-truncation.asm(13): - Fractional width 260 too long, limiting to 255 -ERROR: format-truncation.asm(13): - Formatted numeric value too long -warning: format-truncation.asm(13): [-Wlong-string] - String constant too long -ERROR: format-truncation.asm(14): - Formatted string value too long -warning: format-truncation.asm(14): [-Wlong-string] - String constant too long -ERROR: format-truncation.asm(15): - Formatted string value too long -warning: format-truncation.asm(15): [-Wlong-string] - String constant too long -error: Assembly aborted (12 errors)! diff --git a/test/asm/format-truncation.out b/test/asm/format-truncation.out deleted file mode 100644 index 5713af55..00000000 --- a/test/asm/format-truncation.out +++ /dev/null @@ -1,10 +0,0 @@ -$0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a -$2a -123.45599365234375001369732334415661667551799560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - hello -hello -<$0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 -<$2a -<123.4559936523437500136973233441566166755179956000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -< hell -