summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2002-07-08 06:11:54 +0000
committerMichi Henning <michi@zeroc.com>2002-07-08 06:11:54 +0000
commitf86657da4676ebbc5f539939248f33b7fff57ee4 (patch)
tree05b5113fc51586714bd97e719f7e1d1532fec1b8
parentRe-added inpututil.dsp with -kb flag. (diff)
downloadice-f86657da4676ebbc5f539939248f33b7fff57ee4.tar.bz2
ice-f86657da4676ebbc5f539939248f33b7fff57ee4.tar.xz
ice-f86657da4676ebbc5f539939248f33b7fff57ee4.zip
Fixed Windows side of things for stringToInt64().
-rw-r--r--cpp/all.dsw18
-rw-r--r--cpp/include/IceUtil/InputUtil.h6
-rw-r--r--cpp/src/IceUtil/InputUtil.cpp128
-rw-r--r--cpp/src/IceUtil/iceutil.dsp8
-rw-r--r--cpp/test/IceUtil/inputUtil/Client.cpp2
5 files changed, 157 insertions, 5 deletions
diff --git a/cpp/all.dsw b/cpp/all.dsw
index 08330dbd937..2b4aaac3040 100644
--- a/cpp/all.dsw
+++ b/cpp/all.dsw
@@ -677,6 +677,9 @@ Package=<4>
Begin Project Dependency
Project_Dep_Name locationS
End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name inpututil
+ End Project Dependency
}}}
###############################################################################
@@ -1320,6 +1323,21 @@ Package=<4>
###############################################################################
+Project: "inpututil"=.\test\IceUtil\inpututil\inpututil.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name IceUtil
+ End Project Dependency
+}}}
+
+###############################################################################
+
Project: "latencyC"=.\demo\Ice\latency\latencyC.dsp - Package Owner=<4>
Package=<5>
diff --git a/cpp/include/IceUtil/InputUtil.h b/cpp/include/IceUtil/InputUtil.h
index b8a3a4757b5..9f9f47a80fb 100644
--- a/cpp/include/IceUtil/InputUtil.h
+++ b/cpp/include/IceUtil/InputUtil.h
@@ -20,6 +20,8 @@ namespace IceUtil
#if defined(_WIN32)
typedef __int64 Int64;
+ const Int64 INT64MIN = -9223372036854775808i64;
+ const Int64 INT64MAX = 9223372036854775807i64;
#elif defined(__linux__) && defined(i386)
typedef long long Int64;
const Int64 INT64MIN = LONGLONG_MIN;
@@ -28,8 +30,8 @@ namespace IceUtil
# error "Unsupported operating system or platform!"
#endif
-Int64 strToInt64(const char*, char**, int);
-bool stringToInt64(const std::string&, Int64&, std::string::size_type&);
+ICE_UTIL_API Int64 strToInt64(const char*, char**, int);
+ICE_UTIL_API bool stringToInt64(const std::string&, Int64&, std::string::size_type&);
}
diff --git a/cpp/src/IceUtil/InputUtil.cpp b/cpp/src/IceUtil/InputUtil.cpp
index 54eaa341889..3070e7e72e8 100644
--- a/cpp/src/IceUtil/InputUtil.cpp
+++ b/cpp/src/IceUtil/InputUtil.cpp
@@ -10,17 +10,141 @@
#include <IceUtil/InputUtil.h>
#include <stdlib.h>
+#include <errno.h>
using namespace std;
namespace IceUtil
{
+//
+// strToInt64 emulates strtoll() for Windows
+//
+
Int64
strToInt64(const char* s, char** endptr, int base)
{
#if defined(_WIN32)
- // TODO: WIN32 implementation is missing
+ //
+ // Assume nothing will be there to convert for now
+ //
+ if(endptr)
+ {
+ *endptr = const_cast<char *>(s);
+ }
+
+ //
+ // Skip leading whitespace
+ //
+ while(*s && isspace(*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;
+ 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')
+ {
+ return 0;
+ }
+
+ static const string allDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const string validDigits(allDigits.begin(), allDigits.begin() + base);
+
+ //
+ // 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'
+ };
+
+ Int64 result = 0;
+ bool overflow = false;
+const __int64 limit = INT64MAX;
+ while(*s && validDigits.find_first_of(toupper(*s)) != validDigits.npos)
+ {
+ if(!overflow)
+ {
+ int digit = digitVal[toupper(*s++) - '0'];
+ assert(digit != 100);
+ if(result < limit / base)
+ {
+ result *= base;
+ result += digit;
+ }
+ else if((digit <= limit % base) || (sign == -1 && digit == limit % base + 1))
+ {
+ result *= base;
+ result += digit;
+ }
+ else
+ {
+ overflow = true;
+ result = sign == -1 ? INT64MIN : INT64MAX;
+ }
+ }
+ }
+
+ if(overflow)
+ {
+ errno = ERANGE;
+ }
+ else
+ {
+ result *= sign;
+ }
+
+ if(endptr)
+ {
+ *endptr = const_cast<char *>(s);
+ }
+
+ return result;
+
#else
return strtoll(s, endptr, base);
#endif
@@ -51,7 +175,7 @@ stringToInt64(const string& stringToParse, Int64& result, string::size_type& pos
errno = 0;
const char* startp = nonWhite.c_str();
char* endp;
- result = strtoll(startp, &endp, 0);
+ result = strToInt64(startp, &endp, 0);
pos = *endp == '\0' ? string::npos : (i - stringToParse.begin()) + (endp - startp);
return startp != endp && errno != ERANGE && errno != EINVAL;
}
diff --git a/cpp/src/IceUtil/iceutil.dsp b/cpp/src/IceUtil/iceutil.dsp
index b4893d0a1ca..598450146d1 100644
--- a/cpp/src/IceUtil/iceutil.dsp
+++ b/cpp/src/IceUtil/iceutil.dsp
@@ -116,6 +116,10 @@ SOURCE=.\Exception.cpp
# End Source File
# Begin Source File
+SOURCE=.\InputUtil.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\OutputUtil.cpp
# End Source File
# Begin Source File
@@ -176,6 +180,10 @@ SOURCE=..\..\include\IceUtil\IceUtil.h
# End Source File
# Begin Source File
+SOURCE=..\..\include\IceUtil\InputUtil.h
+# End Source File
+# Begin Source File
+
SOURCE=..\..\include\IceUtil\Lock.h
# End Source File
# Begin Source File
diff --git a/cpp/test/IceUtil/inputUtil/Client.cpp b/cpp/test/IceUtil/inputUtil/Client.cpp
index 0f88d7d9dca..28bc6534d15 100644
--- a/cpp/test/IceUtil/inputUtil/Client.cpp
+++ b/cpp/test/IceUtil/inputUtil/Client.cpp
@@ -8,7 +8,7 @@
//
// **********************************************************************
-#include <IceUtil/Unicode.h>
+#include <IceUtil/Unicode.h>
#include <IceUtil/InputUtil.h>
#include <TestCommon.h>