668
|
1 #include "dmlib.h"
|
|
2 #include "dmeval.h"
|
|
3 #include "dmargs.h"
|
|
4
|
|
5
|
|
6 BOOL optBenchmark = FALSE;
|
|
7 char * optFormula = "";
|
|
8
|
|
9
|
|
10 DMOptArg optList[] =
|
|
11 {
|
|
12 { 0, '?', "help", "Show this help", OPT_NONE },
|
|
13 { 1, 'v', "verbose", "Be more verbose", OPT_NONE },
|
|
14 { 2, 'b', "benchmark", "Run in benchmark mode", OPT_NONE },
|
669
|
15 { 3, 'f', "formula", "Next argument is the formula", OPT_ARGREQ },
|
668
|
16 };
|
|
17
|
|
18 const int optListN = sizeof(optList) / sizeof(optList[0]);
|
|
19
|
|
20
|
|
21 void argShowHelp()
|
|
22 {
|
669
|
23 dmPrintBanner(stdout, dmProgName, "[options] [-f] '<formula>'");
|
668
|
24 dmArgsPrintHelp(stdout, optList, optListN);
|
|
25 }
|
|
26
|
|
27
|
|
28 BOOL argHandleOpt(const int optN, char *optArg, char *currArg)
|
|
29 {
|
|
30 switch (optN)
|
|
31 {
|
|
32 case 0:
|
|
33 argShowHelp();
|
|
34 exit(0);
|
|
35 break;
|
|
36
|
|
37 case 1:
|
|
38 dmVerbosity++;
|
|
39 break;
|
|
40
|
|
41 case 2:
|
|
42 optBenchmark = TRUE;
|
|
43 break;
|
669
|
44
|
|
45 case 3:
|
|
46 optFormula = optArg;
|
|
47 break;
|
|
48
|
668
|
49 default:
|
|
50 dmError("Unknown option '%s'.\n", currArg);
|
|
51 return FALSE;
|
|
52 }
|
|
53
|
|
54 return TRUE;
|
|
55 }
|
|
56
|
|
57
|
|
58 BOOL argHandleNonOpt(char *currArg)
|
|
59 {
|
|
60 optFormula = currArg;
|
|
61 return TRUE;
|
|
62 }
|
|
63
|
|
64
|
|
65 int main(int argc, char *argv[])
|
|
66 {
|
|
67 DMEvalContext *ev = dm_eval_new();
|
|
68 DMEvalNode *parsed = NULL, *ordered = NULL;
|
|
69 DMValue result, t, f = 44100.0f;
|
|
70 int ret;
|
|
71
|
|
72 dmInitProg("evaltest", "evaltest", "0.1", NULL, NULL);
|
|
73
|
|
74 // Parse arguments
|
|
75 if (!dmArgsProcess(argc, argv, optList, optListN,
|
|
76 argHandleOpt, argHandleNonOpt, FALSE))
|
|
77 exit(1);
|
|
78
|
|
79
|
|
80 dm_eval_add_var(ev, "t", &t);
|
|
81 dm_eval_add_var(ev, "f", &f);
|
|
82
|
|
83 ret = dm_eval_parse_expr(ev, optFormula, &parsed);
|
|
84 dmMsg(1, "parse ret=%d\n", ret);
|
|
85 if (ev->err)
|
|
86 dmError("%s\n", ev->errStr);
|
|
87
|
|
88 if (dmVerbosity > 0)
|
|
89 dm_print_optree(ev, parsed);
|
|
90
|
|
91 if (ret != 0)
|
|
92 return -1;
|
|
93
|
|
94 dm_eval_clear_err(ev);
|
|
95
|
|
96 ret = dm_eval_reorder(ev, parsed, &ordered);
|
|
97 dmMsg(1, "reorder ret=%d\n", ret);
|
|
98 if (ev->err)
|
|
99 dmError("%s\n", ev->errStr);
|
|
100
|
|
101 if (dmVerbosity > 0)
|
|
102 dm_print_optree(ev, ordered);
|
|
103
|
|
104 if (ret != 0)
|
|
105 return -2;
|
|
106
|
|
107 if (optBenchmark)
|
|
108 {
|
|
109 dmMsg(0, "Benchmarking ...\n");
|
|
110 for (t = 0; t < 2500000; t++)
|
|
111 ret = dm_eval_exec(ev, ordered, &result);
|
|
112 }
|
|
113 else
|
|
114 {
|
|
115 ret = dm_eval_exec(ev, ordered, &result);
|
|
116 printf("%1.5f\n", result);
|
|
117 }
|
|
118
|
|
119 dmMsg(1, "eval ret=%d\n", ret);
|
|
120
|
|
121 dm_eval_close(ev);
|
|
122
|
|
123 return 0;
|
|
124 }
|