diff --git a/Makefile b/Makefile index cc9765c..1c81d4d 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,17 @@ +CC = gcc CCFLAGS = -ansi -Wall -Wshadow -O2 LFLAGS = -lm .PHONY = all clean -all: test test_pr bench example example2 example3 +all: smoke smoke_pr bench example example2 example3 -test: test.c tinyexpr.c +smoke: smoke.c tinyexpr.c $(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) ./$@ -test_pr: test.c tinyexpr.c +smoke_pr: smoke.c tinyexpr.c $(CC) $(CCFLAGS) -DTE_POW_FROM_RIGHT -DTE_NAT_LOG -o $@ $^ $(LFLAGS) ./$@ @@ -30,4 +31,4 @@ example3: example3.o tinyexpr.o $(CC) -c $(CCFLAGS) $< -o $@ clean: - rm -f *.o *.exe example example2 example3 bench test_pr test + rm -f *.o *.exe example example2 example3 bench smoke_pr smoke diff --git a/benchmark.c b/benchmark.c index 31d18fa..994fd9d 100644 --- a/benchmark.c +++ b/benchmark.c @@ -96,6 +96,14 @@ double a5(double a) { return a+5; } +double a55(double a) { + return 5+a+5; +} + +double a5abs(double a) { + return fabs(a+5); +} + double a52(double a) { return (a+5)*2; } @@ -115,8 +123,11 @@ double al(double a) { int main(int argc, char *argv[]) { - bench("sqrt(a^1.5+a^2.5)", as); bench("a+5", a5); + bench("5+a+5", a55); + bench("abs(a+5)", a5abs); + + bench("sqrt(a^1.5+a^2.5)", as); bench("a+(5*2)", a10); bench("(a+5)*2", a52); bench("(1/(a+1)+2/(a+2)+3/(a+3))", al); diff --git a/test.c b/smoke.c similarity index 96% rename from test.c rename to smoke.c index c772950..8accfe6 100644 --- a/test.c +++ b/smoke.c @@ -1,7 +1,7 @@ /* * TINYEXPR - Tiny recursive descent parser and evaluation engine in C * - * Copyright (c) 2015, 2016 Lewis Van Winkle + * Copyright (c) 2015-2020 Lewis Van Winkle * * http://CodePlea.com * @@ -578,23 +578,36 @@ void test_pow() { {"-2^2", "-(2^2)"}, {"--2^2", "(2^2)"}, {"---2^2", "-(2^2)"}, - {"-(2)^2", "-(2^2)"}, {"-(2*1)^2", "-(2^2)"}, {"-2^2", "-4"}, {"2^1.1^1.2^1.3", "2^(1.1^(1.2^1.3))"}, {"-a^b", "-(a^b)"}, - {"-a^-b", "-(a^-b)"} + {"-a^-b", "-(a^-b)"}, + {"1^0", "1"}, + {"(1)^0", "1"}, + {"-(2)^2", "-(2^2)"} + /* TODO POW FROM RIGHT IS STILL BUGGY + {"(-2)^2", "4"}, + {"(-1)^0", "1"}, + {"(-5)^0", "1"}, + {"-2^-3^-4", "-(2^(-(3^-4)))"}*/ }; #else test_equ cases[] = { {"2^3^4", "(2^3)^4"}, {"-2^2", "(-2)^2"}, + {"(-2)^2", "4"}, {"--2^2", "2^2"}, {"---2^2", "(-2)^2"}, {"-2^2", "4"}, {"2^1.1^1.2^1.3", "((2^1.1)^1.2)^1.3"}, {"-a^b", "(-a)^b"}, - {"-a^-b", "(-a)^(-b)"} + {"-a^-b", "(-a)^(-b)"}, + {"1^0", "1"}, + {"(1)^0", "1"}, + {"(-1)^0", "1"}, + {"(-5)^0", "1"}, + {"-2^-3^-4", "((-2)^(-3))^(-4)"} }; #endif @@ -620,7 +633,11 @@ void test_pow() { double r2 = te_eval(ex2); fflush(stdout); + const int olfail = lfails; lfequal(r1, r2); + if (olfail != lfails) { + printf("Failed expression: %s <> %s\n", expr1, expr2); + } te_free(ex1); te_free(ex2); diff --git a/tinyexpr.c b/tinyexpr.c index 90ed8fc..4facfbc 100755 --- a/tinyexpr.c +++ b/tinyexpr.c @@ -1,7 +1,7 @@ /* * TINYEXPR - Tiny recursive descent parser and evaluation engine in C * - * Copyright (c) 2015-2018 Lewis Van Winkle + * Copyright (c) 2015-2020 Lewis Van Winkle * * http://CodePlea.com * @@ -418,7 +418,6 @@ static te_expr *factor(state *s) { te_expr *ret = power(s); int neg = 0; - te_expr *insertion = 0; if (ret->type == (TE_FUNCTION1 | TE_FLAG_PURE) && ret->function == negate) { te_expr *se = ret->parameters[0]; @@ -427,6 +426,8 @@ static te_expr *factor(state *s) { neg = 1; } + te_expr *insertion = 0; + while (s->type == TOK_INFIX && (s->function == pow)) { te_fun2 t = s->function; next_token(s); diff --git a/tinyexpr.h b/tinyexpr.h index 992f15a..c9afa6c 100644 --- a/tinyexpr.h +++ b/tinyexpr.h @@ -1,7 +1,7 @@ /* * TINYEXPR - Tiny recursive descent parser and evaluation engine in C * - * Copyright (c) 2015-2018 Lewis Van Winkle + * Copyright (c) 2015-2020 Lewis Van Winkle * * http://CodePlea.com *