]> mj.ucw.cz Git - libucw.git/blob - ucw/strtonum-test.c
Added functions for conversions from string to uns or uintmax_t .
[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 'B':
43              flags |= STN_BIN;
44              break;
45            case 'D':
46              flags |= STN_DEC;
47              break;
48
49            case '_':
50              flags |= STN_UNDERSCORE;
51              break;
52            case 't':
53              flags |= STN_TRUNC;
54              break;
55            case '+':
56              flags |= STN_PLUS;
57              break;
58            case '-':
59              flags |= STN_MINUS;
60              break;
61            case 's':
62              flags |= STN_SIGNED;
63              break;
64            case 'Z':
65              flags |= STN_ZCHAR;
66              break;
67          }
68      }
69
70   return flags;
71 }
72
73 static void convert(const char *str_flags, const char *str_num)
74 {
75   const uns flags = str_to_flags(str_flags);
76  
77   const char *next1, *next2;
78   uns ux = 1234567890;
79   uintmax_t um = 1234567890;
80   const char *err1 = str_to_uns(&ux, str_num, &next1, flags);
81   const char *err2 = str_to_uintmax(&um, str_num, &next2, flags);
82
83   if (flags & STN_SIGNED)
84     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);
85   else
86     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);
87 }
88
89 int main(int argc, char *argv[])
90 {
91   if (argc >= 3)
92     convert(argv[1], argv[2]);
93
94   return 0;
95 }