X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbase%2Fstr.cc;h=849bc8afa260084605f39c95cf438335994cc261;hb=97887eb6dc9e548c9b5719727fd4783ef157917c;hp=1e2be95a8819bcc573243e88d0c9c41f2221635a;hpb=26f5a9c2cb6025459027bba1386c6ffb2e935fff;p=gem5.git diff --git a/src/base/str.cc b/src/base/str.cc index 1e2be95a8..849bc8afa 100644 --- a/src/base/str.cc +++ b/src/base/str.cc @@ -28,14 +28,9 @@ * Authors: Nathan Binkert */ -#include -#include -#include -#include #include #include -#include "base/intmath.hh" #include "base/str.hh" using namespace std; @@ -106,270 +101,3 @@ tokenize(vector& v, const string &s, char token, bool ignore) v.push_back(s.substr(first)); } - -/** - * @todo This function will not handle the smallest negative decimal - * value for a signed type - */ - -template -inline bool -__to_number(string value, T &retval) -{ - static const T maxnum = ((T)-1); - static const bool sign = numeric_limits::is_signed; - static const int bits = numeric_limits::digits; - static const T hexmax = maxnum & (((T)1 << (bits - 4)) - 1); - static const T octmax = maxnum & (((T)1 << (bits - 3)) - 1); - static const T signmax = numeric_limits::max(); - static const T decmax = signmax / 10; - -#if 0 - cout << "maxnum = 0x" << hex << (unsigned long long)maxnum << "\n" - << "sign = 0x" << hex << (unsigned long long)sign << "\n" - << "hexmax = 0x" << hex << (unsigned long long)hexmax << "\n" - << "octmax = 0x" << hex << (unsigned long long)octmax << "\n" - << "signmax = 0x" << hex << (unsigned long long)signmax << "\n" - << "decmax = 0x" << hex << (unsigned long long)decmax << "\n"; -#endif - - eat_white(value); - - bool negative = false; - bool hex = false; - bool oct = false; - int last = value.size() - 1; - retval = 0; - int i = 0; - - char c = value[i]; - if (!isDec(c)) { - if (c == '-' && sign) - negative = true; - else - return false; - } - else { - retval += c - '0'; - if (last == 0) return true; - } - - if (c == '0') - oct = true; - - c = value[++i]; - if (oct) { - if (sign && negative) - return false; - - if (!isOct(c)) { - if (c == 'X' || c == 'x') { - hex = true; - oct = false; - } else - return false; - } - else - retval += c - '0'; - } else if (!isDec(c)) - goto multiply; - else { - if (sign && negative && c == '0') - return false; - - retval *= 10; - retval += c - '0'; - if (last == 1) { - if (sign && negative) retval = -retval; - return true; - } - } - - if (hex) { - if (last == 1) - return false; - - for (i = 2; i <= last ; i++) { - c = value[i]; - if (!isHex(c)) - return false; - - if (retval > hexmax) return false; - retval *= 16; - retval += hex2Int(c); - } - return true; - } else if (oct) { - for (i = 2; i <= last ; i++) { - c = value[i]; - if (!isOct(c)) - return false; - - if (retval > octmax) return false; - retval *= 8; - retval += (c - '0'); - } - return true; - } - - for (i = 2; i < last ; i++) { - c = value[i]; - if (!isDec(c)) - goto multiply; - - if (retval > decmax) return false; - bool atmax = retval == decmax; - retval *= 10; - retval += c - '0'; - if (atmax && retval < decmax) return false; - if (sign && (retval & ((T)1 << (sizeof(T) * 8 - 1)))) - return false; - } - - c = value[last]; - if (isDec(c)) { - - if (retval > decmax) return false; - bool atmax = retval == decmax; - retval *= 10; - retval += c - '0'; - if (atmax && retval < decmax) return false; - if (sign && negative) { - if ((retval & ((T)1 << (sizeof(T) * 8 - 1))) && - retval >= (T)-signmax) - return false; - retval = -retval; - } - else - if (sign && (retval & ((T)1 << ((sizeof(T) * 8) - 1)))) - return false; - return true; - } - - multiply: - signed long long mult = 1; - T val; - switch (c) { - case 'k': - case 'K': - if (i != last) return false; - mult = 1024; - val = signmax / mult; - break; - case 'm': - case 'M': - if (i != last) return false; - mult = 1024 * 1024; - val = signmax / mult; - break; - case 'g': - case 'G': - if (i != last) return false; - mult = 1024 * 1024 * 1024; - val = signmax / mult; - break; - case 'e': - case 'E': - if (i >= last) return false; - - mult = 0; - for (i++; i <= last; i++) { - c = value[i]; - if (!isDec(c)) - return false; - - mult *= 10; - mult += c - '0'; - } - - for (i = 0; i < mult; i++) { - if (retval > signmax / 10) - return false; - retval *= 10; - if (sign && (retval & ((T)1 << (sizeof(T) * 8 - 1)))) - return false; - } - if (sign && negative) { - if ((retval & ((T)1 << (sizeof(T) * 8 - 1))) && - retval >= (T)-signmax) - return false; - retval = -retval; - } - else - if (sign && (retval & ((T)1 << ((sizeof(T) * 8) - 1)))) - return false; - - return true; - - default: - return false; - } - - if (sign && negative) - return false; - - if (mult > (unsigned long long)signmax) - return false; - - if (retval > val) - return false; - - retval *= mult; - - return true; -} - -#define STN(type) \ -template<> \ -bool to_number(const string &value, type &retval) \ -{ return __to_number(value, retval); } - -STN(unsigned long long); -STN(signed long long); -STN(unsigned long); -STN(signed long); -STN(unsigned int); -STN(signed int); -STN(unsigned short); -STN(signed short); -STN(unsigned char); -STN(signed char); -STN(char); - -template<> -bool to_number(const string &value, bool &retval) -{ - string lowered = to_lower(value); - - if (value == "0") { - retval = false; - return true; - } - - if (value == "1"){ - retval = true; - return true; - } - - if (lowered == "false") { - retval = false; - return true; - } - - if (lowered == "true"){ - retval = true; - return true; - } - - if (lowered == "no") { - retval = false; - return true; - } - - if (lowered == "yes"){ - retval = true; - return true; - } - - return false; -}