From: frief Date: Mon, 4 Dec 2006 18:42:47 +0000 (+0000) Subject: * support/regression/tests/snprintf.c: some checks X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=b56f90a247a6757d48325172ce79f8a9e696c11b;p=fw%2Fsdcc * support/regression/tests/snprintf.c: some checks * lib/src/printf_large.c: %bc: read char instead of int from stack git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4501 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 94125763..11c0a2fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-12-04 Frieder Ferlemann + + * support/regression/tests/snprintf.c: some checks + * lib/src/printf_large.c: %bc: read char instead of int from stack + 2006-12-03 Maarten Brock * device/include/mcs51/cc2430.h: inserted _XPAGE diff --git a/device/lib/printf_large.c b/device/lib/printf_large.c index 4af055aa..23501510 100644 --- a/device/lib/printf_large.c +++ b/device/lib/printf_large.c @@ -498,7 +498,11 @@ get_conversion_spec: goto get_conversion_spec; case 'C': - OUTPUT_CHAR( va_arg(ap,int), p ); + if( char_argument ) + c = va_arg(ap,char); + else + c = va_arg(ap,int); + OUTPUT_CHAR( c, p ); break; case 'S': diff --git a/support/regression/tests/snprintf.c b/support/regression/tests/snprintf.c new file mode 100644 index 00000000..82272041 --- /dev/null +++ b/support/regression/tests/snprintf.c @@ -0,0 +1,125 @@ +/** tests for snprintf + type: INT, LONG, STRING, FLOAT +*/ +#include +#include +#include + +#define {type} 1 + +#if 0 +# define DEBUG(x) x +#else +# define DEBUG(x) +#endif + +#define CHECK_B 0 + +#if defined(INT) + + struct { + int arg; + char *fmt; + char *result; + } static const cases[]={ + // arg, fmt, result + {0xab, "%04x", "00ab"}, + {0xffff, "0x%02X", "0xFFFF"}, + {0xffffu, "%u", "65535"}, + {1234, "%+6d", " +1234"}, + {12345, "% d", " 12345"}, + {-1234, "%d", "-1234"}, + {32767, "%8d", " 32767"}, + {1, "%%%d", "%1"}, + {1001, "%08i", "00001001"}, + {101, "%-+8d", "+101 "}, + {01234, "%o(oct)", "1234(oct)"}, + + // do we want to check these: + #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B + {0x4142, "%bc %bx", "\x41 42"}, /* non-std: print as bytes! */ + {0xfffe, "0x%02bX%02bx", "0xFFfe"}, /* non-std: print as bytes! */ + #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B + {0x4142, "%bc %bx", "\x42 41"}, /* non-std: print as bytes! */ + {0xfffe, "0x%02bX%02bx", "0xFEff"}, /* non-std: print as bytes! */ + #endif + }; + +#elif defined(LONG) + + struct { + long arg; + char *fmt; + char *result; + } static const cases[]={ + // arg, fmt, result + {0x12345678, "0x%lx", "0x12345678"}, + {0x7fffFFFF, "%10lx", " 7fffffff"}, + {0x789abcde, "0x%-10lX", "0x789ABCDE "}, + {0x1000a, "0x%02lX", "0x1000A"}, + {0x80000000, "%lu", "2147483648"}, + {-2147483648, "%li", "-2147483648"}, + {-1234, "%+6ld", " -1234"}, + {012345670123, "%lo(oct)", "12345670123(oct)"}, + {0xffffFFFF, "%lo(oct)", "37777777777(oct)"}, + + // do we want to check these: + #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B + {0xfedcba98, "0x%bX%bX%bx%bx", "0xFEDCba98"}, /* non-std: print as bytes! */ + #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B + {0xfedcba98, "0x%bX%bX%bx%bx", "0x98BAdcfe"}, /* non-std: print as bytes! */ + #endif + }; + +#elif defined(STRING) + + struct { + char *arg; + char *fmt; + char *result; + } static const cases[]={ + // arg, fmt, result + {"abcd", "%s", "abcd"}, + {"abcd", "%3s", "abcd"}, + {"abcd", "%5s", " abcd"}, + {"abcd", "%-5s", "abcd "}, + {"abcd", "%.2s", "ab"}, + {"XYZ\\", "%s", "XYZ\x5c"}, + {"ab\x1b\x7f", "%s", "ab\x1b\x7f"}, + {"ab\tcd\n","%s", "ab\tcd\n"}, + }; + +#elif defined(FLOAT) + + struct { + float arg; + char *fmt; + char *result; + } static const cases[]={ + // arg, fmt, result + // ... there should be more ... + #if defined(SDCC) && !defined(SDCC_ds390) + {1.0, "%f", ""}, + #else + {1.0, "%f", "1.000000"}, + #endif + }; + +#endif + +void +test_snprintf(void) +{ + unsigned char buf[32]; + unsigned char i; + + memset(buf, 0xfe, sizeof buf); /* cookies all over */ + + for (i=0; i