From 3f376a092e1c16429fb52f24736e9da98aff4cd5 Mon Sep 17 00:00:00 2001 From: sapier Date: Wed, 5 Feb 2014 01:35:40 +0100 Subject: Fix settings to honor numeric conversion errors Rename try* non exceptioning functions to *NoEx --- src/util/string.h | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) (limited to 'src/util') diff --git a/src/util/string.h b/src/util/string.h index e5a60bc47..a3f84c0ea 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include "exceptions.h" struct FlagDesc { const char *name; @@ -145,17 +146,31 @@ inline std::string trim(const std::string &s) return s.substr(front, back - front); } +inline s32 mystoi(const std::string &s) +{ + char* endptr = NULL; + s32 retval = strtol(s.c_str(),&endptr,10); + + if ((endptr == NULL) || (*endptr != 0) || (endptr == s.c_str())) + throw NumericException("string to convert"); + + return retval; +} + inline bool is_yes(const std::string &s) { std::string s2 = lowercase(trim(s)); - if(s2 == "y" || s2 == "yes" || s2 == "true" || atoi(s2.c_str()) != 0) - return true; + try { + if(s2 == "y" || s2 == "yes" || s2 == "true" || mystoi(s2) != 0) + return true; + } + catch(NumericException&e) {} return false; } inline s32 mystoi(const std::string &s, s32 min, s32 max) { - s32 i = atoi(s.c_str()); + s32 i = mystoi(s); if(i < min) i = min; if(i > max) @@ -173,25 +188,20 @@ inline s64 stoi64(const std::string &s) { // MSVC2010 includes it's own versions of these //#if !defined(_MSC_VER) || _MSC_VER < 1600 -inline s32 mystoi(const std::string &s) -{ - return atoi(s.c_str()); -} - inline s32 mystoi(const std::wstring &s) { - return atoi(wide_to_narrow(s).c_str()); + return mystoi(wide_to_narrow(s).c_str()); } inline float mystof(const std::string &s) { - // This crap causes a segfault in certain cases on MinGW - /*float f; - std::istringstream ss(s); - ss>>f; - return f;*/ - // This works in that case - return atof(s.c_str()); + char* endptr = NULL; + float retval = strtof(s.c_str(),&endptr); + + if ((endptr == NULL) || (*endptr != 0) || (endptr == s.c_str())) + throw NumericException("string to convert"); + + return retval; } //#endif -- cgit v1.2.3