diff options
-rw-r--r-- | numericx.c | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/numericx.c b/numericx.c index 56e3438..9b3b8c3 100644 --- a/numericx.c +++ b/numericx.c @@ -447,22 +447,24 @@ numeral_to_string(numeral_ptr* numeral, bool result_with_units_on_the_end) * @param to_first_number_void - does the translate to numerical system start counting on the second number? * @param from_infinite_base - is the translate from numerical system first numeral infinite? For example, if first numeral is 'A', then does 'A' == 'AA' == 'AAA' == 'AAAA' ... ? * @param to_infinite_base - is the translate to numerical system first numeral infinite? For example, if first numeral is 'A', then does 'A' == 'AA' == 'AAA' == 'AAAA' ... ? - * @param number - number of the from numerical system, to be translated into the to numerical system + * @param number - number of the from numerical system, to be translated into the to numerical system. + * @param result_string - string to where to store the result. * - * @return NULL in case of failure - * @return string of translated number, in case of success + * @return EINVAL if argument of result_string is not NULL. + * @return EDOM if number doesn't belong to the from numerical system. + * @return ERANGE if the resulting number cannot be represented, because of a from void number and a lack of void number in to. + * @return EXIT_SUCCESS in case of success. */ -char* -numericx_translate(char* from, bool from_units_on_the_end, bool from_first_number_void, bool from_infinite_base, char* to, bool to_units_on_the_end, bool to_first_number_void, bool to_infinite_base, char* number) +int +numericx_translate(char* from, bool from_units_on_the_end, bool from_first_number_void, bool from_infinite_base, char* to, bool to_units_on_the_end, bool to_first_number_void, bool to_infinite_base, char* number, char** result_string) { + /* result_string has to be NULL */ + if( !(*result_string == NULL) ) + return EINVAL; /* Check if number belongs to it's numerical system */ if( !is_valid_number(from, number) ) - { - fprintf(stderr, "error: %s: %s.\nValid numerals are: \"%s\"\n", - PROG_NAME, strerror(EDOM), from); - return NULL; - } + return EDOM; /* _first and _last variables */ char* from_first = from; @@ -496,9 +498,9 @@ numericx_translate(char* from, bool from_units_on_the_end, bool from_first_numbe { free_numeral(counting); free_numeral(result); - fprintf(stderr, "error: %s: unrepresentable void number\n", PROG_NAME); - return NULL; + return ERANGE; } + decrement_number_string(number, from_first, from_last, from_first); } @@ -524,21 +526,27 @@ numericx_translate(char* from, bool from_units_on_the_end, bool from_first_numbe } /* result to string (result_string) */ - char* result_string = numeral_to_string(result, to_units_on_the_end); + *result_string = numeral_to_string(result, to_units_on_the_end); /* free memory */ free_numeral(counting); free_numeral(result); - return result_string; + return EXIT_SUCCESS; } /* ||MAIN FUNCTION|| */ /** - * @brief Translate number. + * @brief CLI program. + * + * This is a command-line interface program, that uses the 'numericx_*' + * functions. It receives on number and returns the translated number. * - * Main function that does the translation of the number. + * @param argv[] - one number as a string + * + * @return EXIT_SUCCESS in case of a successful number translation + * @return EXIT_FAILURE in case of unsuccessful number translation */ int main(int argc, char* argv[]) @@ -567,28 +575,35 @@ main(int argc, char* argv[]) bool to_infinite_base = TO_INFINITE_BASE; bool from_infinite_base = FROM_INFINITE_BASE; - /* Check if number belongs to it's numerical system */ - if( !is_valid_number(from, number) ) - { - fprintf(stderr, "error: %s: %s.\nValid numerals are: \"%s\"\n", - PROG_NAME, strerror(EDOM), from); - free(from); - free(to); - exit(EDOM); - } - /* Translation */ - char* result = numericx_translate( + char* result = NULL; + int status = numericx_translate( from, from_units_on_the_end, from_first_number_void, from_infinite_base, to, to_units_on_the_end, to_first_number_void, to_infinite_base, - number); + number, &result); /* Test for translation failure */ - if( result == NULL ) + switch( status ) + { + case EINVAL: + fprintf(stderr, "error: %s: %s. Resulting string variable has to be NULL.\n", + PROG_NAME, strerror(EINVAL)); + break; + case EDOM: + fprintf(stderr, "error: %s: %s. Valid numerals are: \"%s\".\n", + PROG_NAME, strerror(EDOM), from); + break; + case ERANGE: + fprintf(stderr, "error: %s: Unrepresentable void number.\n", PROG_NAME); + break; + } + if( !(status == EXIT_SUCCESS) ) { - fprintf(stderr, "error: %s: Invalid translation\n", PROG_NAME); + fprintf(stderr, "error: %s: Incapable of translating.\n", PROG_NAME); free(from); free(to); + numericx_free(result); + return EXIT_FAILURE; } |