std::pair<TweakableState, char> TweakableParser<char>::parse(Containers::ArrayView<const char> value) { if(value.size() < 3 || value.front() != '\'' || value.back() != '\'') { Warning{} << "Utility::TweakableParser:" << std::string{value, value.size()} << "is not a character literal"; return {TweakableState::Recompile, {}}; } if(value[1] == '\\') { Error{} << "Utility::TweakableParser: escape sequences in char literals are not implemented, sorry"; return {TweakableState::Error, {}}; } return {TweakableState::Success, value[1]}; }
std::pair<TweakableState, long double> TweakableParser<long double>::parse(Containers::ArrayView<const char> value) { char* end; const long double result = std::strtold(value, &end); if(end == value.begin() || std::find(value.begin(), value.end(), '.') == value.end()) { Warning{} << "Utility::TweakableParser:" << std::string{value, value.size()} << "is not a floating-point literal"; return {TweakableState::Recompile, {}}; } /* If value would be empty, the above catches that */ if(value.back() != 'l' && value.back() != 'L') { Warning{} << "Utility::TweakableParser:" << std::string{value, value.size()} << "has an unexpected suffix, expected l"; return {TweakableState::Recompile, {}}; } if(end != value.end() - 1) { Warning{} << "Utility::TweakableParser: unexpected characters" << std::string{const_cast<const char*>(end), value.end()} << "after a floating-point literal"; return {TweakableState::Recompile, {}}; } return {TweakableState::Success, result}; }
std::pair<TweakableState, long> TweakableParser<long>::parse(Containers::ArrayView<const char> value) { const std::pair<const char*, int> valueBase = integerBase(value); char* end; const long result = std::strtol(valueBase.first, &end, valueBase.second); if(end == value.begin()) { Warning{} << "Utility::TweakableParser:" << std::string{value, value.size()} << "is not an integer literal"; return {TweakableState::Recompile, {}}; } /* If value would be empty, the above catches that */ if(value.back() != 'l' && value.back() != 'L') { Warning{} << "Utility::TweakableParser:" << std::string{value, value.size()} << "has an unexpected suffix, expected l"; return {TweakableState::Recompile, {}}; } if(end != value.end() - 1) { Warning{} << "Utility::TweakableParser: unexpected characters" << std::string{const_cast<const char*>(end), value.end()} << "after an integer literal"; return {TweakableState::Recompile, {}}; } return {TweakableState::Success, result}; }