diff --git a/base10.c b/base10.c new file mode 100644 --- /dev/null +++ b/base10.c @@ -0,0 +1,69 @@ +/** + * test/demos/base10.c + * Copyright (C) 2008 Markus Broeker + */ + +#include +#include +#include +#include +#include + +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; +}