aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/StringUtil.cc28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/FbTk/StringUtil.cc b/src/FbTk/StringUtil.cc
index 4678f03..691b600 100644
--- a/src/FbTk/StringUtil.cc
+++ b/src/FbTk/StringUtil.cc
@@ -63,13 +63,14 @@ using std::transform;
63 63
64namespace { 64namespace {
65 65
66int extractLongNumber(const char* in, long long int& out) { 66template <typename T>
67int extractBigNumber(const char* in, T (*extractFunc)(const char*, char**, int), T& out) {
67 68
68 errno = 0; 69 errno = 0;
69 70
70 int ret = 0; 71 int ret = 0;
71 char* end = 0; 72 char* end = 0;
72 long long int result = strtoll(in, &end, 0); 73 T result = extractFunc(in, &end, 0);
73 74
74 if (errno == 0 && end != in) { 75 if (errno == 0 && end != in) {
75 out = result; 76 out = result;
@@ -80,11 +81,11 @@ int extractLongNumber(const char* in, long long int& out) {
80} 81}
81 82
82template<typename T> 83template<typename T>
83int extractNumber(const std::string& in, T& out) { 84int extractSignedNumber(const std::string& in, T& out) {
84 85
85 long long int result = 0; 86 long long int result = 0;
86 87
87 if (::extractLongNumber(in.c_str(), result) && out >= 0) { 88 if (::extractBigNumber(in.c_str(), strtoll, result)) {
88 out = static_cast<T>(result); 89 out = static_cast<T>(result);
89 return 1; 90 return 1;
90 } 91 }
@@ -92,6 +93,21 @@ int extractNumber(const std::string& in, T& out) {
92 return 0; 93 return 0;
93} 94}
94 95
96template<typename T>
97int extractUnsignedNumber(const std::string& in, T& out) {
98
99 unsigned long long int result = 0;
100
101 if (::extractBigNumber(in.c_str(), strtoull, result) && result >= 0) {
102 out = static_cast<T>(result);
103 return 1;
104 }
105
106 return 0;
107}
108
109
110
95} 111}
96 112
97 113
@@ -100,11 +116,11 @@ namespace FbTk {
100namespace StringUtil { 116namespace StringUtil {
101 117
102int extractNumber(const std::string& in, int& out) { 118int extractNumber(const std::string& in, int& out) {
103 return ::extractNumber<int>(in, out); 119 return ::extractSignedNumber<int>(in, out);
104} 120}
105 121
106int extractNumber(const std::string& in, unsigned int& out) { 122int extractNumber(const std::string& in, unsigned int& out) {
107 return ::extractNumber<unsigned int>(in, out); 123 return ::extractUnsignedNumber<unsigned int>(in, out);
108} 124}
109 125
110std::string number2String(int num) { 126std::string number2String(int num) {