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;
}