summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/ltoa.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/ltoa.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/ltoa.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/ltoa.c b/reference/C/CONTRIB/SNIP/ltoa.c
new file mode 100755
index 0000000..a241e7b
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/ltoa.c
@@ -0,0 +1,58 @@
+/*
+** LTOA.C
+**
+** Converts a long integer to a string.
+**
+** Copyright 1988-90 by Robert B. Stout dba MicroFirm
+**
+** Released to public domain, 1991
+**
+** Parameters: 1 - number to be converted
+** 2 - buffer in which to build the converted string
+** 3 - number base to use for conversion
+**
+** Returns: A character pointer to the converted string if
+** successful, a NULL pointer if the number base specified
+** is out of range.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#define BUFSIZE (sizeof(long) * 8 + 1)
+
+char *ltoa(long N, char *str, int base)
+{
+ register int i = 2;
+ long uarg;
+ char *tail, *head = str, buf[BUFSIZE];
+
+ if (36 < base || 2 > base)
+ base = 10; /* can only use 0-9, A-Z */
+ tail = &buf[BUFSIZE - 1]; /* last character position */
+ *tail-- = '\0';
+
+ if (10 == base && N < 0L)
+ {
+ *head++ = '-';
+ uarg = -N;
+ }
+ else uarg = N;
+
+ if (uarg)
+ {
+ for (i = 1; uarg; ++i)
+ {
+ register ldiv_t r;
+
+ r = ldiv(uarg, base);
+ *tail-- = (char)(r.rem + ((9L < r.rem) ?
+ ('A' - 10L) : '0'));
+ uarg = r.quot;
+ }
+ }
+ else *tail-- = '0';
+
+ memcpy(head, ++tail, i);
+ return str;
+}