* support/regression/tests/snprintf.c: some checks
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 4 Dec 2006 18:42:47 +0000 (18:42 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 4 Dec 2006 18:42:47 +0000 (18:42 +0000)
* 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

ChangeLog
device/lib/printf_large.c
support/regression/tests/snprintf.c [new file with mode: 0644]

index 941257639bc6c23fcece58f4da156050043863b2..11c0a2fb164f8b8e6b351c28055905ac459e4049 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-04 Frieder Ferlemann <Frieder.Ferlemann AT web.de>
+
+       * 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 <sourceforge.brock AT dse.nl>
 
        * device/include/mcs51/cc2430.h: inserted _XPAGE
index 4af055aa85275797db095b0e60d7209f07f49322..235015100226bbcbb0bb12f2652f7954da9bf3c7 100644 (file)
@@ -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 (file)
index 0000000..8227204
--- /dev/null
@@ -0,0 +1,125 @@
+/** tests for snprintf\r
+  type: INT, LONG, STRING, FLOAT\r
+*/\r
+#include <testfwk.h>\r
+#include <string.h>\r
+#include <stdio.h>\r
+\r
+#define {type} 1\r
+\r
+#if 0\r
+# define DEBUG(x) x\r
+#else\r
+# define DEBUG(x)\r
+#endif\r
+\r
+#define CHECK_B 0\r
+\r
+#if defined(INT)\r
+\r
+       struct {\r
+               int arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {0xab,  "%04x", "00ab"},\r
+               {0xffff,        "0x%02X", "0xFFFF"},\r
+               {0xffffu,       "%u",   "65535"},\r
+               {1234,  "%+6d", " +1234"},\r
+               {12345, "% d",  " 12345"},\r
+               {-1234, "%d",   "-1234"},\r
+               {32767, "%8d",  "   32767"},\r
+               {1,     "%%%d", "%1"},\r
+               {1001,  "%08i", "00001001"},\r
+               {101,   "%-+8d",        "+101    "},\r
+               {01234, "%o(oct)",      "1234(oct)"},\r
+               \r
+               // do we want to check these:\r
+               #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
+               {0x4142,        "%bc %bx",      "\x41 42"},     /* non-std: print as bytes! */\r
+               {0xfffe,        "0x%02bX%02bx", "0xFFfe"},      /* non-std: print as bytes! */\r
+               #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
+               {0x4142,        "%bc %bx",      "\x42 41"},     /* non-std: print as bytes! */\r
+               {0xfffe,        "0x%02bX%02bx", "0xFEff"},      /* non-std: print as bytes! */\r
+               #endif\r
+       };\r
+\r
+#elif defined(LONG)\r
+\r
+       struct {\r
+               long arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {0x12345678,    "0x%lx",        "0x12345678"},\r
+               {0x7fffFFFF,    "%10lx",        "  7fffffff"},\r
+               {0x789abcde,    "0x%-10lX",     "0x789ABCDE  "},\r
+               {0x1000a,       "0x%02lX",      "0x1000A"},\r
+               {0x80000000,    "%lu",          "2147483648"},\r
+               {-2147483648,   "%li",          "-2147483648"},\r
+               {-1234,         "%+6ld",        " -1234"},\r
+               {012345670123,  "%lo(oct)",     "12345670123(oct)"},\r
+               {0xffffFFFF,    "%lo(oct)",     "37777777777(oct)"},\r
+\r
+               // do we want to check these:\r
+               #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
+               {0xfedcba98,    "0x%bX%bX%bx%bx",       "0xFEDCba98"},  /* non-std: print as bytes! */\r
+               #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
+               {0xfedcba98,    "0x%bX%bX%bx%bx",       "0x98BAdcfe"},  /* non-std: print as bytes! */\r
+               #endif\r
+       };\r
+\r
+#elif defined(STRING)\r
+\r
+       struct {\r
+               char *arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               {"abcd",        "%s",   "abcd"},\r
+               {"abcd",        "%3s",  "abcd"},\r
+               {"abcd",        "%5s",  " abcd"},\r
+               {"abcd",        "%-5s", "abcd "},\r
+               {"abcd",        "%.2s", "ab"},\r
+               {"XYZ\\",       "%s",   "XYZ\x5c"},\r
+               {"ab\x1b\x7f",  "%s",   "ab\x1b\x7f"},\r
+               {"ab\tcd\n","%s",       "ab\tcd\n"},\r
+       };\r
+\r
+#elif defined(FLOAT)\r
+\r
+       struct {\r
+               float arg;\r
+               char *fmt;\r
+               char *result;\r
+       } static const cases[]={\r
+               // arg, fmt,    result\r
+               // ... there should be more ...\r
+               #if defined(SDCC) && !defined(SDCC_ds390)\r
+               {1.0,   "%f",   "<NO FLOAT>"},\r
+               #else\r
+               {1.0,   "%f",   "1.000000"},\r
+               #endif\r
+       };\r
+\r
+#endif\r
+\r
+void\r
+test_snprintf(void)\r
+{\r
+       unsigned char buf[32];\r
+       unsigned char i;\r
+\r
+       memset(buf, 0xfe, sizeof buf); /* cookies all over */\r
+       \r
+       for (i=0; i<sizeof cases / sizeof cases[0]; i++) {\r
+               sprintf(buf,cases[i].fmt,cases[i].arg);\r
+               DEBUG(printf ("Test%d should be: \"%s\" is: \"%s\"\n", i, cases[i].result, buf));\r
+               ASSERT(!strcmp(buf,cases[i].result));\r
+       }\r
+       \r
+       ASSERT(buf[sizeof buf - 10] == 0xfe); /* check for cookie */\r
+}\r