summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/InputUtil.cpp
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2014-07-27 18:09:01 -0400
committerBernard Normier <bernard@zeroc.com>2014-07-27 18:09:01 -0400
commitdb5d71b913c4ab9956e26a92ca37689c708b7d07 (patch)
tree782337425b902ef7f196f5e4d3564a7cfcc3d69c /cpp/src/IceUtil/InputUtil.cpp
parentmingw and ruby build fixes (diff)
downloadice-db5d71b913c4ab9956e26a92ca37689c708b7d07.tar.bz2
ice-db5d71b913c4ab9956e26a92ca37689c708b7d07.tar.xz
ice-db5d71b913c4ab9956e26a92ca37689c708b7d07.zip
Fixes for Ruby x64 on Windows + MinGW cleanups
Diffstat (limited to 'cpp/src/IceUtil/InputUtil.cpp')
-rw-r--r--cpp/src/IceUtil/InputUtil.cpp169
1 files changed, 2 insertions, 167 deletions
diff --git a/cpp/src/IceUtil/InputUtil.cpp b/cpp/src/IceUtil/InputUtil.cpp
index 1a83341f6ab..3203294c361 100644
--- a/cpp/src/IceUtil/InputUtil.cpp
+++ b/cpp/src/IceUtil/InputUtil.cpp
@@ -9,15 +9,6 @@
#include <IceUtil/InputUtil.h>
#include <stdlib.h>
-#include <errno.h>
-
-#ifdef __MINGW32__
-#include <limits.h>
-#endif
-
-#if defined(__hpux)
-#include <inttypes.h>
-#endif
using namespace std;
using namespace IceUtil;
@@ -25,169 +16,13 @@ using namespace IceUtil;
namespace IceUtilInternal
{
-
-#ifdef __MINGW32__
-
-//
-// The MINGW runtime does not include _strtoi64, so we provide our own implementation
-//
-
-static const string allDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-//
-// Table to convert ASCII digits/letters into their value (100 for unused slots)
-//
-static const char digitVal[] =
-{
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // '0' - '9'
- 100, 100, 100, 100, 100, 100, 100, // punctuation
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, // 'A' - 'J'
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, // 'K' - 'T'
- 30, 31, 32, 33, 34, 35 // 'U' - 'Z'
-};
-
-static IceUtil::Int64
-strToInt64Impl(const char* s, char** endptr, int base)
-{
- //
- // Assume nothing will be there to convert for now
- //
- if(endptr)
- {
- *endptr = const_cast<char *>(s);
- }
-
- //
- // Skip leading whitespace
- //
- while(*s && isspace(static_cast<unsigned char>(*s)))
- {
- ++s;
- }
-
- //
- // Check for sign
- //
- int sign = 1;
- if(*s == '+')
- {
- ++s;
- }
- else if(*s == '-')
- {
- sign = -1;
- ++s;
- }
-
- //
- // Check that base is valid
- //
- if(base == 0)
- {
- if(*s == '0')
- {
- base = 8;
- ++s;
-
- //
- // We have at least this zero
- //
- if(endptr)
- {
- *endptr = const_cast<char *>(s);
- }
-
- if(*s == 'x' || *s == 'X')
- {
- base = 16;
- ++s;
- }
- }
- else
- {
- base = 10;
- }
- }
- else if(base < 2 || base > 36)
- {
- errno = EINVAL;
- return 0;
- }
-
- //
- // Check that we have something left to parse
- //
- if(*s == '\0')
- {
- //
- // We did not read any new digit so we don't update endptr
- //
- return 0;
- }
-
- Int64 result = 0;
- bool overflow = false;
- bool digitFound = false;
- const string validDigits(allDigits.begin(), allDigits.begin() + base);
- while(*s && validDigits.find_first_of(toupper(static_cast<unsigned char>(*s))) != validDigits.npos)
- {
- digitFound = true;
- if(!overflow)
- {
- int digit = digitVal[toupper(static_cast<unsigned char>(*s)) - '0'];
- assert(digit != 100);
- if(result < _I64_MAX / base)
- {
- result *= base;
- result += digit;
- }
- else if((digit <= _I64_MAX % base) || (sign == -1 && digit == _I64_MAX % base + 1))
- {
- result *= base;
- result += digit;
- }
- else
- {
- overflow = true;
- result = sign == -1 ? _I64_MIN : _I64_MAX;
- }
- }
- ++s;
- }
-
- if(overflow)
- {
- errno = ERANGE;
- }
- else
- {
- result *= sign;
- }
-
- if(digitFound && endptr != 0)
- {
- *endptr = const_cast<char *>(s);
- }
-
- return result;
-}
-
-#endif
-
-
Int64
strToInt64(const char* s, char** endptr, int base)
{
-#if defined(_WIN32)
-# ifdef __MINGW32__
- return strToInt64Impl(s, endptr, base);
-# else
+#if defined(_WIN32) && defined(_MSC_VER)
return _strtoi64(s, endptr, base);
-# endif
-#elif defined(ICE_64)
+#elif defined(ICE_64) && !defined(_WIN32)
return strtol(s, endptr, base);
-#elif defined(__hpux)
- return __strtoll(s, endptr, base);
#else
return strtoll(s, endptr, base);
#endif