diff options
Diffstat (limited to 'numericx.c')
-rw-r--r-- | numericx.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/numericx.c b/numericx.c new file mode 100644 index 0000000..14f23f3 --- /dev/null +++ b/numericx.c @@ -0,0 +1,165 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> +#include <errno.h> + +#ifdef DEBUG +#define DEBUG true +#else +#define DEBUG false +#endif + +typedef struct NumeralPtr +{ + char const* symbol; + struct NumeralPtr *next; + struct NumeralPtr *previous; +} numeral_ptr; + +char* program_name = NULL; + +/* + * Creates new digit for numeral_ptr + * Return pointer to new numeral_ptr + * Returns NULL in case of no memory + */ +numeral_ptr* +new_digit(numeral_ptr* last_numeral, char const* to_first) +{ + numeral_ptr* starting_point = malloc(sizeof(numeral_ptr)); + if(starting_point == NULL) + { + fprintf(stderr, "error: %s: %s!", program_name, strerror(ENOMEM)); + return NULL; + } + + starting_point->symbol = to_first; + starting_point->previous = last_numeral; + starting_point->next = NULL; + + return starting_point; +} + +void +increment(numeral_ptr* numeral, char* num_first, char* num_last) +{ + bool cycled = false; + + if( numeral->symbol == num_last ) + { + if( numeral->next == NULL ) + numeral->next = new_digit(numeral, num_first); + else + increment(numeral->next, num_first, num_last); + + cycled = true; + } + + if( cycled ) + numeral->symbol = num_first; + else + ++(numeral->symbol); +} + +bool +is_same_size(numeral_ptr* numeral, char* number_string) +{ + for( size_t i = strlen(number_string) ; !(i == 0) ; ++i ) + { + if(numeral == NULL) + return false; + + numeral = numeral->next; + } + + return (numeral == NULL) ? true : false; +} + +bool +is_the_same(numeral_ptr* numeral, char* number_arg) +{ + while( !(numeral == NULL) ) + { + if( *(numeral->symbol) == *(number_arg) ) + { + numeral = numeral->next; + ++(number_arg); + continue; + } + + return false; + } + + return (*number_arg == '\0') ? true : false; +} + +void +print_numeral(numeral_ptr* numeral) +{ + while( !(numeral == NULL) ) + { + printf("%c", *(numeral->symbol)); + numeral = numeral->next; + } + + printf("\n"); +} + +int +main(int argc, char* argv[]) +{ + program_name = argv[0]; + + /* Numeral System variables from MACROS */ + char* from = malloc( (strlen(FROM_NUMERICALS) + 1) * sizeof(char) ); + char* to = malloc( (strlen(TO_NUMERICALS) + 1) * sizeof(char) ); + + strcpy(from, FROM_NUMERICALS); + strcpy(to, TO_NUMERICALS); + + /* Number variables to be converted */ + char* number = argv[1]; + + /* _first and _last variables */ + char* from_first = from; + char* from_last = from + (strlen(from) - 1); + + char* to_first = to; + char* to_last = to + (strlen(to) - 1); + + char* number_first = number; + char* number_last = number + (strlen(number) - 1); + + /* initializing counting and result */ + numeral_ptr* counting = new_digit(NULL, from_first); + numeral_ptr* result = new_digit(NULL, to_first); + + /* increments until it finishes */ + while( !is_the_same(counting, number_first) ) + { + if(DEBUG) + { + puts("----"); + print_numeral(result); + } + increment(result, to_first, to_last); + + if(DEBUG) + print_numeral(counting); + increment(counting, from_first, from_last); + } + if(DEBUG) + puts("----"); + + /* print */ + if(DEBUG) + { + printf("counting: "); + print_numeral(counting); + printf("result: "); + } + print_numeral(result); + + return EXIT_SUCCESS; +} |