* of the GNU Lesser General Public License.
*/
-#include "ucw/lib.h"
-#include "ucw/string.h"
-#include "ucw/chartype.h"
-#include "ucw/strtonum.h"
+#include <ucw/lib.h>
+#include <ucw/string.h>
+#include <ucw/chartype.h>
+#include <ucw/strtonum.h>
-static const char err_numeric_overflow[] = "Numeric overflow";
-static const char err_no_digits[] = "Number contains no digits";
-static const char err_invalid_character[] = "Invalid character";
-static const char err_unknown_base[] = "Unknown base";
-
-static uns detect_base(const char *p, const uns flags)
+static uns detect_base(const char **pp, const uns flags)
{
- if ((flags & STN_BASES) && *p == '0')
+ if ((flags & STN_BASES0) && **pp == '0')
{
- switch (p[1] & 0xDF)
+ switch ( (*pp)[1] )
{
+ case 'x':
case 'X':
if (flags & STN_HEX)
{
+ *pp += 2;
return 16;
}
break;
+ case 'b':
case 'B':
if (flags & STN_BIN)
{
+ *pp += 2;
return 2;
}
break;
+ case 'o':
case 'O':
if (flags & STN_OCT)
{
+ *pp += 2;
+ return 8;
+ }
+ break;
+
+ case '0'...'7':
+ if (flags & STN_OCT0)
+ {
+ (*pp)++;
return 8;
}
break;
const char *err = NULL;
const char *p = *pp;
- // Parse sign
+ // Parse sign
*sign = 0;
if (flags & (STN_SIGNS))
{
p++;
}
- const uns prefix_base = detect_base(p, flags);
- if (prefix_base)
- {
- p += 2;
- *base = prefix_base;
- }
- else
- {
- *base = flags & STN_DBASES_MASK;
- }
+ *base = detect_base(&p, flags) ? : flags & STN_DBASES_MASK;
*pp = p;
return err;
static inline uns get_digit(const uns c)
{
if (c <= '9')
- {
- return c - '0';
- }
+ return c - '0';
else
{
const int a = c & 0xDF;
#define STN_TYPE uns
#define STN_SUFFIX uns
-#include "ucw/strtonum-gen.h"
+#include <ucw/strtonum-gen.h>
#define STN_TYPE uintmax_t
#define STN_SUFFIX uintmax
-#include "ucw/strtonum-gen.h"
+#include <ucw/strtonum-gen.h>