#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 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( str, 10, [](char c) { return isdigit(c); }, [](char c) { return c - '0'; }); } long parse_octal(const char* str) { return string_to_integer_type( str, 8, [](char c) { return isodigit(c); }, [](char c) { return c - '0'; }); }