49 lines
1.0 KiB
C++
49 lines
1.0 KiB
C++
#include "utils/StringParsing.h"
|
|
|
|
int isdigit(int c)
|
|
{
|
|
return c >= '0' && c < ':';
|
|
}
|
|
|
|
int isodigit(int c)
|
|
{
|
|
return c >= '0' && c < '8';
|
|
}
|
|
|
|
int isxdigit(int c)
|
|
{
|
|
return isdigit(c) || ((unsigned int)c | 32) - 'a' < 6;
|
|
}
|
|
|
|
template <typename T, typename ValidDigitChecker, typename Converter>
|
|
static T string_to_integer_type(const char* str, int base, ValidDigitChecker checker, Converter converter)
|
|
{
|
|
bool neg = false;
|
|
T val = 0;
|
|
|
|
switch (*str)
|
|
{
|
|
case '-':
|
|
neg = true;
|
|
str++;
|
|
break;
|
|
case '+': str++; break;
|
|
default: break;
|
|
}
|
|
|
|
while (checker(*str)) { val = (base * val) + converter(*str++); }
|
|
|
|
return (neg ? -val : val);
|
|
}
|
|
|
|
long parse_decimal(const char* str)
|
|
{
|
|
return string_to_integer_type<long>(
|
|
str, 10, [](char c) { return isdigit(c); }, [](char c) { return c - '0'; });
|
|
}
|
|
|
|
long parse_octal(const char* str)
|
|
{
|
|
return string_to_integer_type<long>(
|
|
str, 8, [](char c) { return isodigit(c); }, [](char c) { return c - '0'; });
|
|
} |