* device/lib/printf_large.c (output_float): removed recursion,
[fw/sdcc] / support / regression / tests / snprintf.c
1 /** tests for snprintf\r
2   type: INT, LONG, STRING, FLOAT\r
3 */\r
4 #include <testfwk.h>\r
5 #include <string.h>\r
6 #include <stdio.h>\r
7 \r
8 #define {type} 1\r
9 \r
10 #if 0\r
11 # define DEBUG(x) x\r
12 #else\r
13 # define DEBUG(x)\r
14 #endif\r
15 \r
16 #define CHECK_B 0\r
17 \r
18 #if defined(INT)\r
19 \r
20         struct {\r
21                 int arg;\r
22                 char *fmt;\r
23                 char *result;\r
24         } static const cases[]={\r
25                 // arg, fmt,    result\r
26                 {0xab,  "%04x", "00ab"},\r
27                 {0xffff,        "0x%02X", "0xFFFF"},\r
28                 {0xffffu,       "%u",   "65535"},\r
29                 {1234,  "%+6d", " +1234"},\r
30                 {12345, "% d",  " 12345"},\r
31                 {-1234, "%d",   "-1234"},\r
32                 {32767, "%8d",  "   32767"},\r
33                 {1,     "%%%d", "%1"},\r
34                 {1001,  "%08i", "00001001"},\r
35                 {101,   "%-+8d",        "+101    "},\r
36                 {01234, "%o(oct)",      "1234(oct)"},\r
37                 \r
38                 // do we want to check these:\r
39                 #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
40                 {0x4142,        "%bc %bx",      "\x41 42"},     /* non-std: print as bytes! */\r
41                 {0xfffe,        "0x%02bX%02bx", "0xFFfe"},      /* non-std: print as bytes! */\r
42                 #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
43                 {0x4142,        "%bc %bx",      "\x42 41"},     /* non-std: print as bytes! */\r
44                 {0xfffe,        "0x%02bX%02bx", "0xFEff"},      /* non-std: print as bytes! */\r
45                 #endif\r
46         };\r
47 \r
48 #elif defined(LONG)\r
49 \r
50         struct {\r
51                 long arg;\r
52                 char *fmt;\r
53                 char *result;\r
54         } static const cases[]={\r
55                 // arg, fmt,    result\r
56                 {0x12345678,    "0x%lx",        "0x12345678"},\r
57                 {0x7fffFFFF,    "%10lx",        "  7fffffff"},\r
58                 {0x789abcde,    "0x%-10lX",     "0x789ABCDE  "},\r
59                 {0x1000a,       "0x%02lX",      "0x1000A"},\r
60                 {0x80000000,    "%lu",          "2147483648"},\r
61                 {-2147483648,   "%li",          "-2147483648"},\r
62                 {-1234,         "%+6ld",        " -1234"},\r
63                 {012345670123,  "%lo(oct)",     "12345670123(oct)"},\r
64                 {0xffffFFFF,    "%lo(oct)",     "37777777777(oct)"},\r
65 \r
66                 // do we want to check these:\r
67                 #if defined(SDCC) && !defined(SDCC_z80) && CHECK_B\r
68                 {0xfedcba98,    "0x%bX%bX%bx%bx",       "0xFEDCba98"},  /* non-std: print as bytes! */\r
69                 #elif defined(SDCC) && defined(SDCC_z80) && CHECK_B\r
70                 {0xfedcba98,    "0x%bX%bX%bx%bx",       "0x98BAdcfe"},  /* non-std: print as bytes! */\r
71                 #endif\r
72         };\r
73 \r
74 #elif defined(STRING)\r
75 \r
76         struct {\r
77                 char *arg;\r
78                 char *fmt;\r
79                 char *result;\r
80         } static const cases[]={\r
81                 // arg, fmt,    result\r
82                 {"abcd",        "%s",   "abcd"},\r
83                 {"abcd",        "%3s",  "abcd"},\r
84                 {"abcd",        "%5s",  " abcd"},\r
85                 {"abcd",        "%-5s", "abcd "},\r
86                 {"abcd",        "%.2s", "ab"},\r
87                 {"XYZ\\",       "%s",   "XYZ\x5c"},\r
88                 {"ab\x1b\x7f",  "%s",   "ab\x1b\x7f"},\r
89                 {"ab\tcd\n","%s",       "ab\tcd\n"},\r
90         };\r
91 \r
92 #elif defined(FLOAT)\r
93 \r
94         struct {\r
95                 float arg;\r
96                 char *fmt;\r
97                 char *result;\r
98         } static const cases[]={\r
99                 // arg, fmt,    result\r
100                 // ... there should be more ...\r
101                 #if defined(SDCC) && !defined(SDCC_ds390)\r
102                 {1.0,   "%f",   "<NO FLOAT>"},\r
103                 #else\r
104                 {1.0,   "%f",   "1.000000"},\r
105                 {1.96,  "%3.1f",        "2.0"},\r
106                 #endif\r
107         };\r
108 \r
109 #endif\r
110 \r
111 void\r
112 test_snprintf(void)\r
113 {\r
114         unsigned char buf[32];\r
115         unsigned char i;\r
116 \r
117         memset(buf, 0xfe, sizeof buf); /* cookies all over */\r
118         \r
119         for (i=0; i<sizeof cases / sizeof cases[0]; i++) {\r
120                 sprintf(buf,cases[i].fmt,cases[i].arg);\r
121                 DEBUG(printf ("Test%d should be: \"%s\" is: \"%s\"\n", i, cases[i].result, buf));\r
122                 ASSERT(!strcmp(buf,cases[i].result));\r
123         }\r
124         \r
125         ASSERT(buf[sizeof buf - 10] == 0xfe); /* check for cookie */\r
126 }\r