From 0426bb04acfadf2c528765707e6ab9474f6312c4 Mon Sep 17 00:00:00 2001 From: zbyv Date: Thu, 28 Nov 2024 21:21:30 +0100 Subject: [PATCH] fix parser, add functions --- main.c | 1 - math_functions.c | 14 ++++++++++++++ parser.c | 5 +---- parser.h | 1 - 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 1033fbe..ed60ef7 100644 --- a/main.c +++ b/main.c @@ -16,7 +16,6 @@ int main(int argc, char *argv[]) { return 1; } - parser_init(&parser); node = parser_parse(&parser, argv[1], "x"); if (!node) { diff --git a/math_functions.c b/math_functions.c index 1892000..a2e03ef 100644 --- a/math_functions.c +++ b/math_functions.c @@ -20,6 +20,17 @@ MAKE_FUNCTION_1_ARG(atan) MAKE_FUNCTION_1_ARG(sinh) MAKE_FUNCTION_1_ARG(cosh) MAKE_FUNCTION_1_ARG(tanh) +MAKE_FUNCTION_1_ARG(floor) +MAKE_FUNCTION_1_ARG(ceil) + +static double mf_sgn(const double *args) { + if (args[0] < 0.0) + return -1.0; + else if (args[0] > 0.0) + return 1.0; + else + return 0.0; +} static double mf_min(const double *args) { if (args[0] < args[1]) @@ -57,6 +68,9 @@ const struct math_function *fns_get(void) { { "min", 2, mf_min }, { "max", 2, mf_max }, { "mod", 2, mf_mod }, + { "sgn", 1, mf_sgn }, + { "floor", 1, mf_floor }, + { "ceil", 1, mf_ceil }, { NULL } }; diff --git a/parser.c b/parser.c index 1caa627..79cbaee 100644 --- a/parser.c +++ b/parser.c @@ -300,11 +300,8 @@ int parse_n_expressions(struct parser *parser, struct expr_node **out_nodes, siz return 1; } -void parser_init(struct parser *parser) { - error_buffer_init(&parser->eb); -} - int parser_parse_n(struct parser *parser, const char *str, const char *variable_name, struct expr_node **out_nodes, size_t n) { + error_buffer_init(&parser->eb); lex_init(&parser->lexer, str, variable_name); if (!parse_n_expressions(parser, out_nodes, n)) { diff --git a/parser.h b/parser.h index 0d1d881..e414889 100644 --- a/parser.h +++ b/parser.h @@ -9,7 +9,6 @@ struct parser { struct error_buffer eb; }; -void parser_init(struct parser *parser); int parser_parse_n(struct parser *parser, const char *str, const char *variable_name, struct expr_node **out_nodes, size_t n); struct expr_node *parser_parse(struct parser *parser, const char *str, const char *variable_name);