summaryrefslogtreecommitdiff
path: root/ACE/ace/OS_NS_stdlib.cpp
diff options
context:
space:
mode:
authorvzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2008-05-29 16:12:07 +0000
committervzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2008-05-29 16:12:07 +0000
commit2cb9eb27375c5022d2eb0a77fbea78f9650df922 (patch)
treeb7389a0b4746c44e5d1bc5b10aa92022a10debde /ACE/ace/OS_NS_stdlib.cpp
parent66cbf21b7b9ff9efa894b50f9c9de4fd93174b25 (diff)
downloadATCD-2cb9eb27375c5022d2eb0a77fbea78f9650df922.tar.gz
ChangeLogTag: Thu May 29 16:08:01 UTC 2008 Vladimir Zykov <vzykov@prismtech.com>
Diffstat (limited to 'ACE/ace/OS_NS_stdlib.cpp')
-rw-r--r--ACE/ace/OS_NS_stdlib.cpp91
1 files changed, 81 insertions, 10 deletions
diff --git a/ACE/ace/OS_NS_stdlib.cpp b/ACE/ace/OS_NS_stdlib.cpp
index a04086d8a2b..9bc2b2fa4a4 100644
--- a/ACE/ace/OS_NS_stdlib.cpp
+++ b/ACE/ace/OS_NS_stdlib.cpp
@@ -15,6 +15,7 @@ ACE_RCSID (ace,
#include "ace/OS_Memory.h"
#include "ace/OS_NS_unistd.h"
+#include "ace/OS_NS_ctype.h"
#if defined (ACE_LACKS_MKTEMP) \
|| defined (ACE_LACKS_MKSTEMP) \
@@ -532,7 +533,7 @@ ACE_OS::strtol_emulation (const char *nptr, char **endptr, int base)
*/
do {
c = *s++;
- } while (isspace(c));
+ } while (ACE_OS::ace_isspace(c));
if (c == '-') {
neg = 1;
c = *s++;
@@ -568,10 +569,10 @@ ACE_OS::strtol_emulation (const char *nptr, char **endptr, int base)
cutlim = cutoff % (unsigned long)base;
cutoff /= (unsigned long)base;
for (acc = 0, any = 0;; c = *s++) {
- if (isdigit(c))
+ if (ACE_OS::ace_isdigit(c))
c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ else if (ACE_OS::ace_isalpha(c))
+ c -= ACE_OS::ace_isupper(c) ? 'A' - 10 : 'a' - 10;
else
break;
if (c >= base)
@@ -612,7 +613,7 @@ ACE_OS::strtoul_emulation (const char *nptr,
*/
do
c = *s++;
- while (isspace(c));
+ while (ACE_OS::ace_isspace(c));
if (c == '-')
{
neg = 1;
@@ -634,10 +635,10 @@ ACE_OS::strtoul_emulation (const char *nptr,
for (acc = 0, any = 0;; c = *s++)
{
- if (isdigit(c))
+ if (ACE_OS::ace_isdigit(c))
c -= '0';
- else if (isalpha(c))
- c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+ else if (ACE_OS::ace_isalpha(c))
+ c -= ACE_OS::ace_isupper(c) ? 'A' - 10 : 'a' - 10;
else
break;
if (c >= base)
@@ -655,7 +656,8 @@ ACE_OS::strtoul_emulation (const char *nptr,
{
acc = ULONG_MAX;
errno = ERANGE;
- } else if (neg)
+ }
+ else if (neg)
acc = -acc;
if (endptr != 0)
*endptr = any ? (char *) s - 1 : (char *) nptr;
@@ -663,6 +665,75 @@ ACE_OS::strtoul_emulation (const char *nptr,
}
#endif /* ACE_LACKS_STRTOUL */
+#if defined (ACE_LACKS_STRTOULL)
+ACE_UINT64
+ACE_OS::strtoull_emulation (const char *nptr,
+ char **endptr,
+ register int base)
+{
+ register const char *s = nptr;
+ register ACE_UINT64 acc;
+ register int c;
+ register ACE_UINT64 cutoff;
+ register int neg = 0, any, cutlim;
+
+ /*
+ * See strtol for comments as to the logic used.
+ */
+ do
+ c = *s++;
+ while (ACE_OS::ace_isspace(c));
+ if (c == '-')
+ {
+ neg = 1;
+ c = *s++;
+ }
+ else if (c == '+')
+ c = *s++;
+ if ((base == 0 || base == 16) &&
+ c == '0' && (*s == 'x' || *s == 'X'))
+ {
+ c = s[1];
+ s += 2;
+ base = 16;
+ }
+ if (base == 0)
+ base = c == '0' ? 8 : 10;
+
+ cutoff = (ACE_UINT64) ACE_UINT64_MAX / (ACE_UINT64) base;
+ cutlim = (ACE_UINT64) ACE_UINT64_MAX % (ACE_UINT64) base;
+
+ for (acc = 0, any = 0;; c = *s++)
+ {
+ if (ACE_OS::ace_isdigit(c))
+ c -= '0';
+ else if (ACE_OS::ace_isalpha(c))
+ c -= ACE_OS::ace_isupper(c) ? 'A' - 10 : 'a' - 10;
+ else
+ break;
+ if (c >= base)
+ break;
+ if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+ any = -1;
+ else
+ {
+ any = 1;
+ acc *= base;
+ acc += c;
+ }
+ }
+ if (any < 0)
+ {
+ acc = ACE_UINT64_MAX;
+ errno = ERANGE;
+ }
+ else if (neg)
+ acc = -acc;
+ if (endptr != 0)
+ *endptr = any ? (char *) s - 1 : (char *) nptr;
+ return (acc);
+}
+#endif /* ACE_LACKS_STRTOULL */
#if defined (ACE_LACKS_MKSTEMP)
ACE_HANDLE
@@ -788,7 +859,7 @@ ACE_OS::getprogname_emulation ()
#if !defined (ACE_HAS_SETPROGNAME)
void
-ACE_OS::setprogname_emulation (const char* progname)
+ACE_OS::setprogname_emulation (const char* progname)
{
const char *p = ACE_OS::strrchr (progname, '/');
if (p != 0)