- err = str_to_num_init(&p, flags, &sign, &base);
- const char *parse_string(void)
- {
- const STN_TYPE max = STN_MAX;
- const STN_TYPE top = S(tops)[base];
- if (!top)
- {
- return err_unknown_base;
- }
-
- const STN_TYPE sign_max = ((flags & STN_SIGNED) || sign) ? max/2 + sign : max;
-
- STN_TYPE val = 0;
- uns digits = 0;
- int overflow = 0;
- for (;; p++)
- {
- const uns c = (byte)*p;
-
- if (c == '_')
- {
- if (flags & STN_UNDERSCORE)
- continue;
- else
- break;
- }
-
- const uns d = get_digit(c);
- if (d >= base)
- break;
- digits++;
- if (overflow)
- continue;
-
- STN_TYPE v = val;
- if ( (overflow = (v > top || (v *= base) > sign_max - d)) )
- continue;
- val = v + d;
- }
-
- if (!overflow)
- {
- if ((flags & STN_ZCHAR) && *p)
- {
- return err_invalid_character;
- }
-
- if (!digits)
- {
- return err_no_digits;
- }
-
- if (sign)
- {
- val = -val;
- }
- }
- else
- {
- if (flags & STN_TRUNC)
- val = sign_max;
- else
- {
- return err_numeric_overflow;
- }
- }
-
- if (num)
- *num = val;
-
- return NULL;
- }
+ err = str_to_num_init(&str, flags, &sign, &base);
+