summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/ltostr.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/ltostr.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/ltostr.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/ltostr.c b/reference/C/CONTRIB/SNIP/ltostr.c
new file mode 100755
index 0000000..583426a
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/ltostr.c
@@ -0,0 +1,57 @@
+/*
+** LTOSTR.C -- routine and example program to convert a long int to
+** the specified numeric base, from 2 to 36.
+**
+** Written by Thad Smith III, Boulder, CO. USA 9/06/91
+** and contributed to the Public Domain.
+*/
+
+#include <stdlib.h>
+
+char * /* addr of terminating null */
+ltostr (
+ char *str, /* output string */
+ long val, /* value to be converted */
+ unsigned base) /* conversion base */
+{
+ ldiv_t r; /* result of val / base */
+
+ if (base > 36) /* no conversion if wrong base */
+ {
+ str = '\0';
+ return str;
+ }
+ if (val < 0) *str++ = '-';
+ r = ldiv (labs(val), base);
+
+ /* output digits of val/base first */
+
+ if (r.quot > 0) str = ltostr (str, r.quot, base);
+
+ /* output last digit */
+
+ *str++ = "0123456789abcdefghijklmnopqrstuvwxyz"[(int)r.rem];
+ *str = '\0';
+ return str;
+}
+
+#include <stdio.h>
+main()
+{
+ char buf[100], line[100], *tail;
+ long v;
+ int inbase, outbase;
+
+ for (;;)
+ {
+ printf ("inbase, value, outbase? ");
+ fgets (line, sizeof line, stdin);
+ sscanf (line, " %d%*[, ]%[^, ]%*[, ]%d", &inbase, buf, &outbase);
+ if (inbase == 0)
+ break; /* exit if first number 0 */
+ v = strtol (buf, &tail, inbase);
+ ltostr (buf, v, outbase);
+ printf ("=%ld (10) = %s (%d).\n", v, buf, outbase);
+ };
+ return 0;
+}