]> mj.ucw.cz Git - libucw.git/blob - ucw/strtonum-test.c
UCW::CGI: Announce supported methods correctly
[libucw.git] / ucw / strtonum-test.c
1 /*
2  *      UCW Library -- Conversions of Strings to Numbers: Testing
3  *
4  *      (c) 2010 Daniel Fiala <danfiala@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #include <ucw/lib.h>
11 #include <ucw/chartype.h>
12 #include <ucw/strtonum.h>
13
14 #include <stdio.h>
15
16 static uns str_to_flags(const char *str)
17 {
18    uns flags = 0;
19    for(const char *p = str; *p; ++p)
20      {
21        switch(*p)
22          {
23            case 'h':
24              flags = (flags & ~STN_DBASES_MASK) | 16;
25              break;
26            case '8':
27              flags = (flags & ~STN_DBASES_MASK) | 8;
28              break;
29            case '2':
30              flags = (flags & ~STN_DBASES_MASK) | 2;
31              break;
32            case '0':
33              flags = (flags & ~STN_DBASES_MASK) | 10;
34              break;
35
36            case 'X':
37              flags |= STN_HEX;
38              break;
39            case 'o':
40              flags |= STN_OCT;
41              break;
42            case 'O':
43              flags |= STN_OCT0;
44              break;
45            case 'B':
46              flags |= STN_BIN;
47              break;
48            case 'D':
49              flags |= STN_DEC;
50              break;
51
52            case '_':
53              flags |= STN_UNDERSCORE;
54              break;
55            case 't':
56              flags |= STN_TRUNC;
57              break;
58            case '+':
59              flags |= STN_PLUS;
60              break;
61            case '-':
62              flags |= STN_MINUS;
63              break;
64            case 's':
65              flags |= STN_SIGNED;
66              break;
67            case 'W':
68              flags |= STN_WHOLE;
69              break;
70          }
71      }
72
73   return flags;
74 }
75
76 static void convert(const char *str_flags, const char *str_num)
77 {
78   const uns flags = str_to_flags(str_flags);
79  
80   const char *next1, *next2;
81   uns ux = 1234567890;
82   uintmax_t um = 1234567890;
83   const char *err1 = str_to_uns(&ux, str_num, &next1, flags);
84   const char *err2 = str_to_uintmax(&um, str_num, &next2, flags);
85
86   if (flags & STN_SIGNED)
87     printf("i%d\nh%x\ne[%s]\nc[%s]\nb%td:0x%x\nI%jd\nH%jx\nE[%s]\nC[%s]\nB%td:0x%x\n", ux, ux, err1, str_num, next1 - str_num, *next1, um, um, err2, str_num, next2 - str_num, *next2);
88   else
89     printf("i%u\nh%x\ne[%s]\nc[%s]\nb%td:0x%x\nI%ju\nH%jx\nE[%s]\nC[%s]\nB%td:0x%x\n", ux, ux, err1, str_num, next1 - str_num, *next1, um, um, err2, str_num, next2 - str_num, *next2);
90 }
91
92 int main(int argc, char *argv[])
93 {
94   if (argc >= 3)
95     convert(argv[1], argv[2]);
96
97   return 0;
98 }