X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fmware%2Fformatwr.c;h=7293c4dc7a0b4f624314b83a2de072f0f02ee97b;hb=e022e861939d2625fe2a6833977a8b924c3cbf31;hp=133a1932852fea9213275ae4003a062cadc31a81;hpb=6ad5c01d9a3d323e34a547283e7a534f7c3b9d15;p=bertos.git diff --git a/bertos/mware/formatwr.c b/bertos/mware/formatwr.c index 133a1932..7293c4dc 100644 --- a/bertos/mware/formatwr.c +++ b/bertos/mware/formatwr.c @@ -46,7 +46,7 @@ * -D CONFIG_PRINTF=PRINTF_FULL Full ANSI printf formatter, with some C99 extensions * -D CONFIG_PRINTF=PRINTF_NOFLOAT Exclude support for floats * -D CONFIG_PRINTF=PRINTF_REDUCED Simplified formatter (see below) - * -D CONFIG_PRINTF=PRINTF_NOMODIFIERS Exclude 'l', 'z' and 'h' modifiers in reduced version + * -D CONFIG_PRINTF=PRINTF_NOMODIFIERS Exclude "l", "z" and "h" modifiers in reduced version * -D CONFIG_PRINTF=PRINTF_DISABLED No formatter at all * \endcode * @@ -106,17 +106,25 @@ /* Maximum precision for floating point values */ typedef long double max_float_t; - /*bernie: save some memory, who cares about floats with lots of decimals? */ - #define FRMWRI_BUFSIZE 134 - #if !(ARCH & ARCH_NIGHTTEST) - #warning 134 is too much, the code must be fixed to have a lower precision limit + #if CONFIG_FRMWRI_BUFSIZE + #define FRMWRI_BUFSIZE CONFIG_FRMWRI_BUFSIZE + #else + /* Conservative estimate. Max float is 3.40282e+038, so %f (but not %e or %g) must have + * space for: sign + all 38 digits + '.' + 6 decimal digits (default) + * Use a high value to avoid unexpected buffer overflows. + */ + #define FRMWRI_BUFSIZE 134 #endif #else - /* - * Conservative estimate. Should be (probably) 12 (which is the size necessary - * to represent (2^32-1) in octal plus the sign bit. - */ - #define FRMWRI_BUFSIZE 16 + #if CONFIG_FRMWRI_BUFSIZE + #define FRMWRI_BUFSIZE CONFIG_FRMWRI_BUFSIZE + #else + /* + * Conservative estimate. Should be (probably) 12 (which is the size necessary + * to represent (2^32-1) in octal plus the sign bit. + */ + #define FRMWRI_BUFSIZE 16 + #endif #endif /* Probably useful for fancy microcontrollers such as the PIC, nobody knows. */ @@ -497,14 +505,21 @@ NEXT_FLAG: { case 'l': case 'L': + #if SIZEOF_SIZE_T == SIZEOF_LONG case 'z': flags.l_L_modifier = true; + #elif SIZEOF_SIZE_T == SIZEOF_INT + flags.l_L_modifier = true; + case 'z': + #endif format++; break; + case 'h': flags.h_modifier = true; format++; break; + } /* @@ -845,10 +860,13 @@ FLOATING_CONVERSION: switch (PGM_READ_CHAR(format)) { case 'l': + #if SIZEOF_SIZE_T == SIZEOF_LONG case 'z': - /* for the 'z' modifier, we make this assumption */ - STATIC_ASSERT(sizeof(size_t) == sizeof(long)); l_modifier = true; + #elif SIZEOF_SIZE_T == SIZEOF_INT + l_modifier = true; + case 'z': + #endif format++; break;