Luna/kernel/src/utils/StringParsing.cpp

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'; });
}