#ifndef COMPUTORV1_H #define COMPUTORV1_H #include "libft.h" #include // tmp for printf, for float debug #include // for va_list #include #include // for errno #include // for strerror #include // tmp /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN.C */ typedef enum { MODE_ARGV, // MODE_STDIN, // MODE_LOOP, // } e_program_mode; /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * COMPUTORV1.C */ void launch_computorv1(char *input); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LEXER.C */ typedef enum { TOKEN_VARIABLE, // x, y, etc. TOKEN_NUMBER_INT, // int TOKEN_NUMBER_DOUBLE, // double TOKEN_NUMBER_INT_SUPER, // superscript int, like '²' TOKEN_POWER, // ^ or ** TOKEN_SIGN_PLUS, // + TOKEN_SIGN_MINUS, // - TOKEN_FACTOR_MULT, // * TOKEN_FACTOR_DIV, // / or : TOKEN_EQUAL, // = TOKEN_END // null (end of input) } e_token_type; typedef enum { TOKEN_NO_TAG, TOKEN_NUMBER, TOKEN_SIGN, TOKEN_FACTOR, } e_token_tag; typedef struct { e_token_type type; e_token_tag tag; union { char value_char; int value_int; double value_double; }; } s_token; void lexerize(const char *input, s_token *tokens); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PARSER.C */ typedef enum { TERM_LEFT, // a in "a = b" TERM_RIGHT, // b in "a = b" TERM_POS_END, // last term } e_term_position; typedef enum { TERM_PLUS = '+', // + TERM_MINUS = '-', // - TERM_SIGN_END, // last term } e_term_sign; typedef struct { e_term_position position; e_term_sign sign; double coefficient; int exponent; } s_term; void parse(s_token *tokens, s_term *terms, int terms_count_max); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * REDUCE.C */ typedef struct { e_term_sign sign; double coefficient; int exponent; } s_polynom; int reduce(s_term *terms, s_polynom *polynom, int max_exponent); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SOLVE.C */ typedef enum { DELTA_PLUS = 1, DELTA_MINUS = -1, DELTA_ZERO = 0, } e_delta_sign; typedef struct { int solution_gcd; // gcd(b, a) int solution_numerator; // -b / gcd int solution_denominator; // a / gcd double solution; // double (-b / a) } s_solution_degree_1; typedef struct { e_delta_sign delta_sign; // DELTA_PLUS or DELTA_MINUS or DELTA_ZERO double delta_absolute; // |Δ| == |b² - 4ac| int first_term_gcd; // gcd(b, 2a) int first_term_numerator; // -b / gcd int first_term_denominator; // 2a / gcd double first_term; // double (-b / 2a) int second_term_gcd; // gcd(√|Δ|, 2a) int second_term_numerator; // √|Δ| / gcd int second_term_denominator; // 2a / gcd double second_term; // double (√|Δ| / 2a) double solution1; // first_term + second_term double solution2; // first_term - second_term (not if DELTA_ZERO) } s_solution_degree_2; typedef struct { int degree; union { s_solution_degree_1 solution_degree_1; s_solution_degree_2 solution_degree_2; }; } s_solution; void solve(const s_polynom *polynom, s_solution *solution); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * UTILS/ERRORS.C */ void print_state(); void stop_errors(const char *format, ...); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * UTILS/PRINT_ENUMS.C */ const char *token_type_to_str(e_token_type type); const char *token_tag_to_str(e_token_tag tag); const char *term_position_to_str(e_term_position pos); const char *term_sign_to_str(e_term_sign sign); const char *delta_sign_to_str(e_delta_sign sign); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * UTILS/PRINTER.C */ void print_debug(const char *description, ...); void print_reduced_form(s_polynom *polynom); void print_degree(s_polynom *polynom, int max_exponent); /** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * GLOBALS */ extern char *input_g_err; extern s_token *tokens_g_err; extern s_term *terms_g_err; extern s_polynom *polynom_g_err; extern s_solution *solution_g_err; extern bool flag_debug_mode; extern bool flag_loop_mode; extern bool flag_beautify_mode; #endif