# HG changeset patch # User Matti Hamalainen # Date 1366094403 -10800 # Node ID 69337f2fc4a4aa062541bf28ba3488af0eb24818 # Parent f9f98a0f4e9a05a4570f9222582951e513eea9fb Add evaltest. diff -r f9f98a0f4e9a -r 69337f2fc4a4 Makefile.gen --- a/Makefile.gen Tue Apr 16 09:36:53 2013 +0300 +++ b/Makefile.gen Tue Apr 16 09:40:03 2013 +0300 @@ -240,7 +240,7 @@ endif ifeq ($(DM_BUILD_TESTS),yes) -TESTS_BINARIES += vecmattest fptest +TESTS_BINARIES += vecmattest fptest evaltest endif FONTCONV_BIN=$(BINPATH)fontconv$(EXEEXT) @@ -408,6 +408,10 @@ @echo " LINK $+" @$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) $(SDL_LDFLAGS) -lSDL_ttf +$(BINPATH)evaltest$(EXEEXT): $(OBJPATH)evaltest.o $(OBJPATH)dmeval.o $(DMLIB_A) + @echo " LINK $+" + @$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) -lm + $(BINPATH)%test$(EXEEXT): $(OBJPATH)%test.o $(DMLIB_A) @echo " LINK $+" @$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) -lm diff -r f9f98a0f4e9a -r 69337f2fc4a4 tests/evaltest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/evaltest.c Tue Apr 16 09:40:03 2013 +0300 @@ -0,0 +1,121 @@ +#include "dmlib.h" +#include "dmeval.h" +#include "dmargs.h" + + +BOOL optBenchmark = FALSE; +char * optFormula = ""; + + +DMOptArg optList[] = +{ + { 0, '?', "help", "Show this help", OPT_NONE }, + { 1, 'v', "verbose", "Be more verbose", OPT_NONE }, + { 2, 'b', "benchmark", "Run in benchmark mode", OPT_NONE }, +}; + +const int optListN = sizeof(optList) / sizeof(optList[0]); + + +void argShowHelp() +{ + dmPrintBanner(stdout, dmProgName, "[options] ''"); + dmArgsPrintHelp(stdout, optList, optListN); +} + + +BOOL argHandleOpt(const int optN, char *optArg, char *currArg) +{ + (void) optArg; + + switch (optN) + { + case 0: + argShowHelp(); + exit(0); + break; + + case 1: + dmVerbosity++; + break; + + case 2: + optBenchmark = TRUE; + break; + + default: + dmError("Unknown option '%s'.\n", currArg); + return FALSE; + } + + return TRUE; +} + + +BOOL argHandleNonOpt(char *currArg) +{ + optFormula = currArg; + return TRUE; +} + + +int main(int argc, char *argv[]) +{ + DMEvalContext *ev = dm_eval_new(); + DMEvalNode *parsed = NULL, *ordered = NULL; + DMValue result, t, f = 44100.0f; + int ret; + + dmInitProg("evaltest", "evaltest", "0.1", NULL, NULL); + + // Parse arguments + if (!dmArgsProcess(argc, argv, optList, optListN, + argHandleOpt, argHandleNonOpt, FALSE)) + exit(1); + + + dm_eval_add_var(ev, "t", &t); + dm_eval_add_var(ev, "f", &f); + + ret = dm_eval_parse_expr(ev, optFormula, &parsed); + dmMsg(1, "parse ret=%d\n", ret); + if (ev->err) + dmError("%s\n", ev->errStr); + + if (dmVerbosity > 0) + dm_print_optree(ev, parsed); + + if (ret != 0) + return -1; + + dm_eval_clear_err(ev); + + ret = dm_eval_reorder(ev, parsed, &ordered); + dmMsg(1, "reorder ret=%d\n", ret); + if (ev->err) + dmError("%s\n", ev->errStr); + + if (dmVerbosity > 0) + dm_print_optree(ev, ordered); + + if (ret != 0) + return -2; + + if (optBenchmark) + { + dmMsg(0, "Benchmarking ...\n"); + for (t = 0; t < 2500000; t++) + ret = dm_eval_exec(ev, ordered, &result); + } + else + { + ret = dm_eval_exec(ev, ordered, &result); + printf("%1.5f\n", result); + } + + dmMsg(1, "eval ret=%d\n", ret); + + dm_eval_close(ev); + + return 0; +}