summaryrefslogtreecommitdiffstats
path: root/private/crt32/convert/xtoa.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/convert/xtoa.c')
-rw-r--r--private/crt32/convert/xtoa.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/private/crt32/convert/xtoa.c b/private/crt32/convert/xtoa.c
new file mode 100644
index 000000000..72fcfb265
--- /dev/null
+++ b/private/crt32/convert/xtoa.c
@@ -0,0 +1,127 @@
+/***
+*xtoa.c - convert integers/longs to ASCII string
+*
+* Copyright (c) 1989-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* The module has code to convert integers/longs to ASCII strings. See
+*
+*Revision History:
+* 06-06-89 PHG Module created, based on asm version
+* 03-06-90 GJF Fixed calling type, added #include <cruntime.h> and
+* fixed copyright.
+* 03-23-90 GJF Made xtoa() _CALLTYPE4.
+* 09-27-90 GJF New-style function declarators.
+* 01-21-91 GJF ANSI naming.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <stdlib.h>
+#include <limits.h>
+
+/***
+*char *_itoa, *_ltoa, *_ultoa(val, buf, radix) - convert binary int to ASCII
+* string
+*
+*Purpose:
+* Converts an int to a character string.
+*
+*Entry:
+* val - number to be converted (int, long or unsigned long)
+* int radix - base to convert into
+* char *buf - ptr to buffer to place result
+*
+*Exit:
+* fills in space pointed to by buf with string result
+* returns a pointer to this buffer
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+/* helper routine that does the main job. */
+
+static void _CALLTYPE4 xtoa (
+ unsigned long val,
+ char *buf,
+ unsigned radix,
+ int is_neg
+ )
+{
+ char *p; /* pointer to traverse string */
+ char *firstdig; /* pointer to first digit */
+ char temp; /* temp char */
+ unsigned digval; /* value of digit */
+
+ p = buf;
+
+ if (is_neg) {
+ /* negative, so output '-' and negate */
+ *p++ = '-';
+ val = (unsigned long)(-(long)val);
+ }
+
+ firstdig = p; /* save pointer to first digit */
+
+ do {
+ digval = (unsigned) (val % radix);
+ val /= radix; /* get next digit */
+
+ /* convert to ascii and store */
+ if (digval > 9)
+ *p++ = (char) (digval - 10 + 'a'); /* a letter */
+ else
+ *p++ = (char) (digval + '0'); /* a digit */
+ } while (val > 0);
+
+ /* We now have the digit of the number in the buffer, but in reverse
+ order. Thus we reverse them now. */
+
+ *p-- = '\0'; /* terminate string; p points to last digit */
+
+ do {
+ temp = *p;
+ *p = *firstdig;
+ *firstdig = temp; /* swap *p and *firstdig */
+ --p;
+ ++firstdig; /* advance to next two digits */
+ } while (firstdig < p); /* repeat until halfway */
+}
+
+
+/* Actual functions just call conversion helper with neg flag set correctly,
+ and return pointer to buffer. */
+
+char * _CALLTYPE1 _itoa (
+ int val,
+ char *buf,
+ int radix
+ )
+{
+ if (radix == 10 && val < 0)
+ xtoa((unsigned long)val, buf, radix, 1);
+ else
+ xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
+ return buf;
+}
+
+char * _CALLTYPE1 _ltoa (
+ long val,
+ char *buf,
+ int radix
+ )
+{
+ xtoa((unsigned long)val, buf, radix, (radix == 10 && val < 0));
+ return buf;
+}
+
+char * _CALLTYPE1 _ultoa (
+ unsigned long val,
+ char *buf,
+ int radix
+ )
+{
+ xtoa(val, buf, radix, 0);
+ return buf;
+}