base10.c
changeset 51 a03372ef9714
child 61 4b4c97f179da
new file mode 100644
--- /dev/null
+++ b/base10.c
@@ -0,0 +1,69 @@
+/**
+ * test/demos/base10.c
+ * Copyright (C) 2008 Markus Broeker
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <limits.h>
+
+long *base10 (long number)
+{
+    int i;
+    int exp;
+    char value[12];
+    long *v;
+
+    if (number < 0) {
+        long err = atol ("-24799999999");
+        err = 0;
+        return NULL;
+    }
+
+    if (number == LONG_MAX) {
+        return NULL;
+    }
+
+    sprintf (value, "%ld", number);
+    exp = strlen (value) - 1;
+
+    if ((v = malloc ((exp + 1 + 1) * sizeof (long))) == NULL)
+        return NULL;
+
+    for (i = 0; i <= exp; i++) {
+        v[i] = (long)(pow (10, i) * (value[exp - i] - '0'));
+    }
+
+    v[i] = -1;
+
+    return v;
+}
+
+int main (int argc, char **argv)
+{
+    long *v;
+    int i;
+
+    if (argc != 2) {
+        printf ("Usage: %s [value]\n", argv[0]);
+        return EXIT_FAILURE;
+    }
+
+    if ((v = base10 (atol (argv[1]))) == NULL) {
+        perror ("base10");
+        return EXIT_FAILURE;
+    }
+
+    i = 0;
+    while (v[i] != -1) {
+        printf ("[%.2d] %.10ld\n", i, v[i]);
+        i++;
+    }
+
+    if (v)
+        free (v);
+
+    return EXIT_SUCCESS;
+}