[ros-dev] lib/crt/stdlib/strtoull.c

Mark Junker mjscod at gmx.de
Sun Sep 11 14:01:46 CEST 2005


Hi,

is s/o interested in a working implementation of strtoull? I submitted a 
patch 4 or 5 months ago but it wasn't added yet so I retry my submission.

Regards,
Mark

-------------- next part --------------
Index: crt.xml
===================================================================
--- crt.xml	(revision 17794)
+++ crt.xml	(working copy)
@@ -317,6 +317,7 @@
 		<file>senv.c</file>
 		<file>strtod.c</file>
 		<file>strtoul.c</file>
+		<file>strtoull.c</file>
 		<file>swab.c</file>
 		<file>wcstod.c</file>
 		<file>wcstombs.c</file>
Index: stdlib/strtoull.c
===================================================================
--- stdlib/strtoull.c	(revision 17794)
+++ stdlib/strtoull.c	(working copy)
@@ -1,24 +1,38 @@
 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
 /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
+#include <windows.h>
 #include <limits.h>
 #include <ctype.h>
 #include <errno.h>
 #include <stdlib.h>
-//#include <msvcrt/unconst.h>
+#include <internal/file.h>
+/*#include <msvcrt/unconst.h>*/
 
+#if defined(LONG_LONG_MAX)
+#define ULONGLONG_MAX ULONG_LONG_MAX
+#elif defined(_UI64_MAX)
+#define ULONGLONG_MAX _UI64_MAX
+#elif defined(ULLONG_MAX)
+#define ULONGLONG_MAX ULLONG_MAX
+#else
+/* FIXME: There must be a better way because LONGLONG might be defined as
+ *        double. */
+#define ULONGLONG_MAX ((ULONGLONG) (LONGLONG) -1)
+#endif
+
 /*
  * Convert a string to an unsigned long integer.
  *
  * Ignores `locale' stuff.  Assumes that the upper and lower case
  * alphabets and digits are each contiguous.
  */
-unsigned long
+ULONGLONG
 strtoull(const char *nptr, char **endptr, int base)
 {
   const char *s = nptr;
-  unsigned long acc;
+  ULONGLONG acc;
   int c;
-  unsigned long cutoff;
+  ULONGLONG cutoff;
   int neg = 0, any, cutlim;
 
   /*
@@ -43,8 +57,8 @@
   }
   if (base == 0)
     base = c == '0' ? 8 : 10;
-  cutoff = (unsigned long)ULONG_MAX / base;
-  cutlim = (unsigned long)ULONG_MAX % base;
+  cutoff = ULONGLONG_MAX / base;
+  cutlim = (int) (ULONGLONG_MAX % base);
   for (acc = 0, any = 0;; c = *s++)
   {
     if (isdigit(c))
@@ -65,7 +79,7 @@
   }
   if (any < 0)
   {
-    acc = ULONG_MAX;
+    acc = ULONGLONG_MAX;
     __set_errno ( ERANGE );
   }
   else if (neg)


More information about the Ros-dev mailing list