Mercurial > hg > dmlib
view tests/evaltest.c @ 668:69337f2fc4a4
Add evaltest.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 16 Apr 2013 09:40:03 +0300 |
parents | |
children | 440b77b635a5 |
line wrap: on
line source
#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] '<formula>'"); 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; }