2 * UCW Library -- Conversions of Strings to Numbers
4 * (c) 2010 Daniel Fiala <danfiala@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 /* This is not a normall header file, it is generator of a function for converting strings to integers
11 * of a certain type. This file should be used only by ucw/stronum.c .
14 #define STN_DECLARE(type, suffix) STN_DECLARE_CONVERTOR(type, suffix)
16 #define S_HELPER2(name, suffix) name##suffix
17 #define S_HELPER1(name, suffix) S_HELPER2(name, suffix)
18 #define S(name) S_HELPER1(name, STN_SUFFIX)
20 #define STN_MAX ((STN_TYPE)(-1))
21 static const STN_TYPE S(tops)[STN_DBASES_MASK+1] = { [2] = STN_MAX/2, [8] = STN_MAX/8, [10] = STN_MAX/10, [16] = STN_MAX/16 };
23 STN_DECLARE(STN_TYPE, STN_SUFFIX)
26 const char *err = NULL;
29 err = str_to_num_init(&p, flags, &sign, &base);
30 const char *parse_string(void)
32 const STN_TYPE max = STN_MAX;
33 const STN_TYPE top = S(tops)[base];
36 return err_unknown_base;
39 const STN_TYPE sign_max = ((flags & STN_SIGNED) || sign) ? max/2 + sign : max;
46 const uns c = (byte)*p;
50 if (flags & STN_UNDERSCORE)
56 const uns d = get_digit(c);
64 if ( (overflow = (v > top || (v *= base) > sign_max - d)) )
71 if ((flags & STN_ZCHAR) && *p)
73 return err_invalid_character;
88 if (flags & STN_TRUNC)
92 return err_numeric_overflow;
102 err = parse_string();