diff options
author | Michi Henning <michi@zeroc.com> | 2002-07-08 06:11:54 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2002-07-08 06:11:54 +0000 |
commit | f86657da4676ebbc5f539939248f33b7fff57ee4 (patch) | |
tree | 05b5113fc51586714bd97e719f7e1d1532fec1b8 | |
parent | Re-added inpututil.dsp with -kb flag. (diff) | |
download | ice-f86657da4676ebbc5f539939248f33b7fff57ee4.tar.bz2 ice-f86657da4676ebbc5f539939248f33b7fff57ee4.tar.xz ice-f86657da4676ebbc5f539939248f33b7fff57ee4.zip |
Fixed Windows side of things for stringToInt64().
-rw-r--r-- | cpp/all.dsw | 18 | ||||
-rw-r--r-- | cpp/include/IceUtil/InputUtil.h | 6 | ||||
-rw-r--r-- | cpp/src/IceUtil/InputUtil.cpp | 128 | ||||
-rw-r--r-- | cpp/src/IceUtil/iceutil.dsp | 8 | ||||
-rw-r--r-- | cpp/test/IceUtil/inputUtil/Client.cpp | 2 |
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> |