diff --git a/aegisub/libaegisub/common/util.cpp b/aegisub/libaegisub/common/util.cpp index 3b23a562d..f925e309c 100644 --- a/aegisub/libaegisub/common/util.cpp +++ b/aegisub/libaegisub/common/util.cpp @@ -19,9 +19,15 @@ /// @ingroup libaegisub #ifndef LAGI_PRE +#include +#include + +#include + +#include +#include #endif -#include #include "libaegisub/util.h" @@ -35,5 +41,17 @@ void str_lower(std::string &str) { } } +int strtoi(std::string &str) { + long l = strtol(str.c_str(), NULL, 10); + + if (errno == ERANGE) + throw("Cannot convert to long (invalid range)"); + + if ((l < INT_MIN) || (l > INT_MAX)) + throw("Cannot convert to int (invalid range)"); + + return (int)l; +} + } // namespace util } // namespace agi diff --git a/aegisub/libaegisub/include/libaegisub/util.h b/aegisub/libaegisub/include/libaegisub/util.h index 13ddefe95..fd0600224 100644 --- a/aegisub/libaegisub/include/libaegisub/util.h +++ b/aegisub/libaegisub/include/libaegisub/util.h @@ -38,6 +38,7 @@ namespace agi { void Rename(const std::string& from, const std::string& to); void time_log(agi_timeval &tv); void str_lower(std::string &str); + int strtoi(std::string &str); struct delete_ptr { template diff --git a/aegisub/tests/libaegisub_util.cpp b/aegisub/tests/libaegisub_util.cpp index 8a8ee59cc..49e5feb7e 100644 --- a/aegisub/tests/libaegisub_util.cpp +++ b/aegisub/tests/libaegisub_util.cpp @@ -71,5 +71,33 @@ TEST_F(lagi_util, Utilstr_lower) { EXPECT_STREQ(str.c_str(), "-!abcdefghijklmnopqrstuvwxyz123"); } +TEST_F(lagi_util, UtilstrtoiInvalidRange) { + std::string str("2147483650"); + EXPECT_ANY_THROW(util::strtoi(str)); + + str.assign("-2147483650"); + EXPECT_ANY_THROW(util::strtoi(str)); +} + +TEST_F(lagi_util, UtilstrtoiInvalidString) { + std::string str("bottles of beer on the wall"); + EXPECT_EQ(util::strtoi(str), 0); +} + +TEST_F(lagi_util, UtilstrtoiNumberWithString) { + std::string str("24 bottles of beer on the wall"); + EXPECT_EQ(util::strtoi(str), 24); +} + +TEST_F(lagi_util, UtilstrtoiValidString) { + std::string str("24"); + int i; + + EXPECT_NO_THROW(i = util::strtoi(str)); + EXPECT_EQ(i, 24); +} + + + } // namespace agi