Mercurial > hg > dmlib
view tests/evaltest.c @ 711:4eb5a0d72397
Increase benchmark rounds.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Apr 2013 07:47:21 +0300 |
parents | 6d96d5bf9653 |
children | 8bf67daf4030 |
line wrap: on
line source
#include "dmlib.h" #include "dmeval.h" #include "dmargs.h" BOOL optBenchmark = FALSE, optFloor = 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 }, { 3, 'e', "expression", "Next argument is the expression/formula", OPT_ARGREQ }, { 4, 'f', "floor", "Clamp/floor the result value", OPT_NONE }, }; const int optListN = sizeof(optList) / sizeof(optList[0]); void argShowHelp() { dmPrintBanner(stdout, dmProgName, "[options] [-e] '<formula>'"); dmArgsPrintHelp(stdout, optList, optListN); } BOOL argHandleOpt(const int optN, char *optArg, char *currArg) { switch (optN) { case 0: argShowHelp(); exit(0); break; case 1: dmVerbosity++; break; case 2: optBenchmark = TRUE; break; case 3: optFormula = optArg; break; case 4: optFloor = 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); // Register some variables dm_eval_add_var(ev, "t", &t); dm_eval_add_var(ev, "f", &f); // Parse expression 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(stdout, ev, parsed); if (ret != 0) return -1; // Perform reordering 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(stdout, ev, ordered); if (ret != 0) return -2; // Benchmark or execute if (optBenchmark) { dmMsg(0, "Benchmarking ...\n"); for (t = 0; t < 12500000; t++) ret = dm_eval_exec(ev, ordered, &result); } else { ret = dm_eval_exec(ev, ordered, &result); printf("%1.5f\n", optFloor ? (int) result : result); } dmMsg(1, "eval ret=%d\n", ret); dm_eval_close(ev); dm_eval_free(parsed); dm_eval_free(ordered); return 0; }