annotate src/dmeval.c @ 1102:e06abfde6c39

Cosmetics pass: Remove excess whitespace.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 03 Mar 2015 23:22:36 +0200
parents ff13d79c75e0
children 848a88ce7a57
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 #include "dmeval.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 #include <math.h>
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 #define DM_MAX_BUF 512
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
5
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
6
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
7 /* Operators
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
8 */
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
9 const DMEvalOper dmEvalOpers[OP_NOPERS] =
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
10 {
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
11 { "-" , OT_UNARY , FALSE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
12 { "~" , OT_UNARY , TRUE },
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
13
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
14 { "+" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
15 { "-" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
16 { "*" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
17 { "/" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
18 { "%" , OT_LEFT , TRUE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
19
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
20
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
21 { "<<" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
22 { ">>" , OT_LEFT , TRUE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
23
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
24 { "&" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
25 { "|" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
26 { "^" , OT_LEFT , TRUE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
27
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
28 { ">=" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
29 { "<=" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
30 { ">" , OT_LEFT , TRUE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
31 { "<" , OT_LEFT , TRUE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
32
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
33 { "FUNC" , OT_NONE , FALSE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
34 { "VAR" , OT_NONE , FALSE },
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
35 { "CONST" , OT_NONE , FALSE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
36
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
37 { "SUBEXPR", OT_NONE , FALSE },
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
38 };
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
40
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
41 /* Function definitions
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
42 */
663
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
43 static DMValue func_int_clip(DMValue *v)
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
44 {
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
45 return (*v < -1.0f) ? -1.0f : ((*v > 1.0f) ? 1.0f : *v);
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
46 }
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
47
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
48
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
49 static DMValue func_sin(DMValue *v)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 {
663
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
51 return sin(*v);
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
52 }
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
53
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
54
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
55 static DMValue func_cos(DMValue *v)
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
56 {
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
57 return cos(*v);
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
58 }
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
59
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
60
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
61 static DMValue func_pow(DMValue *v)
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
62 {
05eb24a608f0 Some minor touches to evaluator code.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
63 return pow(v[0], v[1]);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67 /* Some basic functions
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 */
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
69 static const DMEvalSymbol dmEvalBasicFuncs[] =
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 {
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
71 { "sin", SYM_FUNC , 1, func_sin, NULL, 0 },
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
72 { "cos", SYM_FUNC , 1, func_cos, NULL, 0 },
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
73 { "clip", SYM_FUNC , 1, func_int_clip, NULL, 0 },
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
74 { "pow", SYM_FUNC , 2, func_pow, NULL, 0 },
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
75
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
76 { "pi", SYM_CONST, 0, NULL, NULL, DM_PI },
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
77 { "e", SYM_CONST, 0, NULL, NULL, DM_E },
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 };
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
80 static const int ndmEvalBasicFuncs = sizeof(dmEvalBasicFuncs) / sizeof(dmEvalBasicFuncs[0]);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
83 void dmEvalErrorV(DMEvalContext *ev, const char *fmt, va_list ap)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85 char *tmp = dm_strdup_vprintf(fmt, ap);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
86
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87 ev->err = TRUE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
88
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 if (ev->errStr != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
90 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
91 ev->errStr = dm_strdup_printf("%s%s", ev->errStr, tmp);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
92 dmFree(tmp);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
93 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95 ev->errStr = tmp;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
99 void dmEvalError(DMEvalContext *ev, const char *fmt, ...)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
100 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
101 va_list ap;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
102 va_start(ap, fmt);
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
103 dmEvalErrorV(ev, fmt, ap);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104 va_end(ap);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
105 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
106
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
108 DMEvalSymbol *dmEvalContextFindSymbol(DMEvalContext *ev, const char *name)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
110 int i;
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
111 if (ev->symbols == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
113
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
114 for (i = 0; i < ev->nsymbols; i++)
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
115 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
116 if (strcmp(ev->symbols[i].name, name) == 0)
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
117 return &(ev->symbols[i]);
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
118 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
119
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
124 // Add a new symbol to the evaluation context.
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
125 // Return pointer to newly allocated symbol struct if successful.
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
126 // If the symbol already exists or there was a memory allocation
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
127 // error, NULL is returned.
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
128 static DMEvalSymbol * dmEvalContextAddSymbol(DMEvalContext *ev, const char *name, const int type)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
130 DMEvalSymbol *symbol = dmEvalContextFindSymbol(ev, name);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
131 if (symbol != NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
134 ev->symbols = dmRealloc(ev->symbols, sizeof(DMEvalSymbol) * (ev->nsymbols + 1));
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
135 if (ev->symbols == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
137 dmEvalError(ev,
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
138 "Could not reallocate eval symbols array (#%d). Fatal error.\n",
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
139 ev->nsymbols + 1);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
142
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
143 symbol = &(ev->symbols[ev->nsymbols]);
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
144 ev->nsymbols++;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
146 memset(symbol, 0, sizeof(DMEvalSymbol));
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
147 symbol->name = dm_strdup(name);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
148 symbol->type = type;
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
149
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
150 return symbol;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
154 DMEvalSymbol *dmEvalContextAddVar(DMEvalContext *ev, const char *name, DMValue *var)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
156 DMEvalSymbol *symbol = dmEvalContextAddSymbol(ev, name, SYM_VAR);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
157 if (symbol == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158 return NULL;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
159
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
160 symbol->var = var;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
161 return symbol;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
165 DMEvalSymbol *dmEvalContextAddConst(DMEvalContext *ev, const char *name, DMValue value)
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
166 {
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
167 DMEvalSymbol *symbol = dmEvalContextAddSymbol(ev, name, SYM_CONST);
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
168 if (symbol == NULL)
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
169 return NULL;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
170
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
171 symbol->cvalue = value;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
172 return symbol;
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
173 }
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
174
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
175
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
176 DMEvalSymbol *dmEvalContextAddFunc(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *), int nargs)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
178 DMEvalSymbol *symbol = dmEvalContextAddSymbol(ev, name, SYM_VAR);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
179 if (symbol == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180 return NULL;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
181
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
182 symbol->func = func;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
183 symbol->nargs = nargs;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
184
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
185 return DMERR_OK;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
189 DMEvalContext *dmEvalContextNew(void)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191 int i;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 DMEvalContext *ev = dmCalloc(1, sizeof(DMEvalContext));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 if (ev == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
196
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
197 for (i = 0; i < ndmEvalBasicFuncs; i++)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
198 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
199 const DMEvalSymbol *symbol= &dmEvalBasicFuncs[i];
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
200 DMEvalSymbol *nsymbol = dmEvalContextAddSymbol(ev, symbol->name, symbol->type);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
201 if (nsymbol != NULL)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
202 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
203 nsymbol->nargs = symbol->nargs;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
204 nsymbol->func = symbol->func;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
205 nsymbol->var = symbol->var;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
206 nsymbol->cvalue = symbol->cvalue;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
207 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
208 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 return ev;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
213
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
214 void dmEvalTreeFree(DMEvalNode *node)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
216 while (node != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
217 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 DMEvalNode *next = node->next;
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
219 int i;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
220
852
ff13d79c75e0 Rename a const.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
221 for (i = 0; i < DM_EVAL_MAX_ARGS; i++)
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
222 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
223 dmEvalTreeFree(node->args[i]);
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
224 node->args[i] = NULL;
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
225 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
226
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
227 dmEvalTreeFree(node->subexpr);
687
f3d2b19dbbb7 Set node->subexpr to NULL in free, as we are paranoidly cargo-culting a bit.
Matti Hamalainen <ccr@tnsp.org>
parents: 686
diff changeset
228 node->subexpr = NULL;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 dmFree(node);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 node = next;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
235 void dmEvalContextClear(DMEvalContext *ev)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 if (ev == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
238 return;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
239
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 dmFree(ev->errStr);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 ev->err = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242 ev->errStr = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
244
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
245
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
246 void dmEvalContextClose(DMEvalContext *ev)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
247 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248 int i;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 if (ev == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
251 return;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
253 for (i = 0; i < ev->nsymbols; i++)
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
254 dmFree(ev->symbols[i].name);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
256 dmFree(ev->symbols);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
257 dmEvalContextClear(ev);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
258 dmFree(ev);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
259 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
260
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
262 static DMEvalNode *dmEvalInsertNode(DMEvalNode **list, DMEvalNode *node)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 if (*list != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
265 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266 node->prev = (*list)->prev;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 (*list)->prev->next = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 (*list)->prev = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 *list = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273 node->prev = *list;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
276 node->next = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 return node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
278 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
281 static DMEvalNode *dmEvalAddNode(DMEvalNode **list, const int op)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283 DMEvalNode *node = dmCalloc(1, sizeof(DMEvalNode));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 if (node == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
285 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
287 node->op = op;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
288
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
289 return dmEvalInsertNode(list, node);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
291
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293 enum
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294 {
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
295 PARSE_NONE = 0x0000,
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
296 PARSE_START = 0x1000,
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
297 PARSE_END = 0x2000,
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
298 PARSE_ERROR = 0x8000,
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
299
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
300 PARSE_IDENT = 0x0001, // Any identifier (variable, function name)
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
301 PARSE_CONST = 0x0002, // Constant value (n, n.nnn, etc)
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
302 PARSE_OPER = 0x0004, // All operators
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
303 PARSE_OPER_UNARY = 0x0008, // Unary operators ~, -
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
304 PARSE_SUBEXPR_START = 0x0010, // ( ...
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
305 PARSE_SUBEXPR_END = 0x0020, // )
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
306 PARSE_ARGS = 0x0040, // function args: (xxx[, yyy ...])
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
307
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
308 PARSE_NORMAL = PARSE_CONST | PARSE_IDENT | PARSE_SUBEXPR_START | PARSE_OPER_UNARY,
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
309 };
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
310
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
311 #define DM_CHECK(x) { if (mode & PARSE_ ## x ) { if (str[0]) strcat(str, " or "); strcat(str, # x ); } }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
312
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
313 static char *dmEvalGetMode(int mode)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
314 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
315 char str[128] = "";
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
316
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
317 DM_CHECK(START);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
318 DM_CHECK(END);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
319 DM_CHECK(IDENT);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
320 DM_CHECK(CONST);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
321 DM_CHECK(OPER);
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
322 DM_CHECK(OPER_UNARY);
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
323 DM_CHECK(SUBEXPR_START);
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
324 DM_CHECK(SUBEXPR_END);
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
325 DM_CHECK(ARGS);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
326
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
327 return dm_strdup(str);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
330
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
331 static void dmEvalSetMode(DMEvalContext *ev, const int mode)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
332 {
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
333 if (mode != PARSE_ERROR &&
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
334 mode != PARSE_START &&
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
335 ev->expect != PARSE_NONE &&
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
336 (mode & ev->expect) == 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
337 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
338 char *tmp1 = dmEvalGetMode(ev->expect),
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
339 *tmp2 = dmEvalGetMode(mode);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
340
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
341 dmEvalError(ev, "Expected [%s], got %s.\n", tmp1, tmp2);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
342 dmFree(tmp1);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
343 dmFree(tmp2);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
344 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
345
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
346 ev->prev = ev->mode;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
347 ev->mode = mode;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
348 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
349
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
350
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
351 static BOOL dmEvalTokenizeExpr(DMEvalContext *ev, DMEvalNode **list, char **str, int depth)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
352 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
353 char *c = *str;
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
354 char tmpStr[DM_MAX_BUF + 2], *tmp;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
355 int tmpStrLen = 0, argIndex, op;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 DMEvalNode *node = NULL, *func = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
357 BOOL first = FALSE, decimal = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
358
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
359 ev->expect = PARSE_NORMAL;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
360 ev->mode = PARSE_START;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
361
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
362 while (ev->mode != PARSE_ERROR && ev->mode != PARSE_END)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
363 switch (ev->mode)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
364 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
365 case PARSE_START:
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
366 // Start
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
367 if (*c == 0)
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
368 dmEvalSetMode(ev, PARSE_END);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
369
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
370 // Skip whitespace
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
371 else if (isspace(*c))
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
372 c++;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
373
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
374 else if (*c == ')' || *c == ',')
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
375 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
376 if (depth > 0)
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
377 dmEvalSetMode(ev, PARSE_END);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
378 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
379 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
380 dmEvalError(ev, "Invalid nesting near '%s' (depth %d).\n", c, depth);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
381 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
382 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 c++;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
384 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
385
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
386 else if (*c == '(')
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
387 dmEvalSetMode(ev, func != NULL ? PARSE_ARGS : PARSE_SUBEXPR_START);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
388
671
e5e56d16597e And another fix to parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 670
diff changeset
389 else if (*c == '-')
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
390 dmEvalSetMode(ev, (ev->prev == PARSE_START || ev->prev == PARSE_OPER || ev->prev == PARSE_OPER_UNARY) ? PARSE_OPER_UNARY : PARSE_OPER);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
391
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
392 else if (*c == '~')
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
393 dmEvalSetMode(ev, PARSE_OPER_UNARY);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
394
671
e5e56d16597e And another fix to parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 670
diff changeset
395 else if (strchr("+*/<>%&|!^", *c))
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
396 dmEvalSetMode(ev, PARSE_OPER);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
397
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
398 else if (isdigit(*c) || *c == '.')
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
399 dmEvalSetMode(ev, PARSE_CONST);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
400
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
401 else if (isalpha(*c) || *c == '_')
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
402 dmEvalSetMode(ev, PARSE_IDENT);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
403
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
404 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
405 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
406 dmEvalError(ev, "Syntax error near '%s' (depth %d).\n", c, depth);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
407 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
408 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
409
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
410 first = TRUE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
411 break;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
412
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
413 case PARSE_SUBEXPR_START:
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
414 tmp = c + 1;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
415
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
416 ev->expect = PARSE_NORMAL;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
417
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
418 if ((node = dmEvalAddNode(list, OP_SUBEXPR)) == NULL)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
419 dmEvalSetMode(ev, PARSE_ERROR);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
420 else
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
421 if (dmEvalTokenizeExpr(ev, &(node->subexpr), &tmp, depth + 1) != 0)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
422 {
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
423 dmEvalError(ev, "Subexpression starting at '%s' contained errors.\n", c);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
424 dmEvalSetMode(ev, PARSE_ERROR);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
425 }
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
426
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
427 if (ev->mode != PARSE_ERROR)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
428 {
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
429 dmEvalSetMode(ev, PARSE_START);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
430 ev->expect = PARSE_OPER | PARSE_SUBEXPR_END;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
431 c = tmp;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
432 }
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
433 break;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
434
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
435 case PARSE_ARGS:
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
436 tmp = c + 1;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
437
766
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
438 for (argIndex = 0; argIndex < func->symbol->nargs; argIndex++)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
439 {
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
440 if (dmEvalTokenizeExpr(ev, &(func->args[argIndex]), &tmp, depth + 1) != 0)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
441 {
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
442 dmEvalError(ev, "Function argument subexpression starting at '%s' contained errors.\n", c);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
443 dmEvalSetMode(ev, PARSE_ERROR);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
444 }
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
445 }
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
446
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
447 func = NULL;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
448
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
449 if (ev->mode != PARSE_ERROR)
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
450 {
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
451 dmEvalSetMode(ev, PARSE_START);
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
452 ev->expect = PARSE_OPER | PARSE_END;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
453 c = tmp;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
454 }
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
455 break;
11fba703014f Some more work. Still broken.
Matti Hamalainen <ccr@tnsp.org>
parents: 765
diff changeset
456
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
457 case PARSE_CONST:
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
458 if (first)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
459 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
460 first = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
461 decimal = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
462 tmpStrLen = 0;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
463
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
464 if (isdigit(*c) || *c == '-' || *c == '+' || *c == '.')
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
465 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
466 if (*c == '.')
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
467 decimal = TRUE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
468 tmpStr[tmpStrLen++] = *c++;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
469 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
470 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
471 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
472 dmEvalError(ev, "Invalid constant expression near '%s'.\n", c);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
473 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
474 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
475 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
476 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
477 {
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
478 if (isdigit(*c))
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
479 {
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
480 tmpStr[tmpStrLen++] = *c++;
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
481 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
482 else
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
483 if (*c == '.')
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
484 {
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
485 if (!decimal)
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
486 {
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
487 tmpStr[tmpStrLen++] = *c++;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
488 decimal = TRUE;
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
489 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
490 else
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
491 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
492 dmEvalError(ev, "Invalid constant expression near '%s'.\n", c);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
493 dmEvalSetMode(ev, PARSE_ERROR);
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
494 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
495 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
496 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
497 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
498 tmpStr[tmpStrLen] = 0;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
499
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
500 if ((node = dmEvalAddNode(list, OP_VALUE)) == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
501 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
502 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
503 }
697
48321a711bec Work towards plugging memory leaks.
Matti Hamalainen <ccr@tnsp.org>
parents: 696
diff changeset
504 else
48321a711bec Work towards plugging memory leaks.
Matti Hamalainen <ccr@tnsp.org>
parents: 696
diff changeset
505 {
48321a711bec Work towards plugging memory leaks.
Matti Hamalainen <ccr@tnsp.org>
parents: 696
diff changeset
506 node->val = atof(tmpStr);
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
507 dmEvalSetMode(ev, PARSE_START);
697
48321a711bec Work towards plugging memory leaks.
Matti Hamalainen <ccr@tnsp.org>
parents: 696
diff changeset
508 ev->expect = PARSE_OPER | PARSE_END;
48321a711bec Work towards plugging memory leaks.
Matti Hamalainen <ccr@tnsp.org>
parents: 696
diff changeset
509 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
510 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
511 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
512 break;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
513
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
514 case PARSE_OPER_UNARY:
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
515 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
516 int op = OP_INVALID;
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
517
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
518 switch (*c)
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
519 {
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
520 case '-': op = OP_SUB_UNARY; c++; break;
747
faf43d8aa841 Rename some constants.
Matti Hamalainen <ccr@tnsp.org>
parents: 741
diff changeset
521 case '~': op = OP_BIT_COMPLEMENT; c++; break;
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
522 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
523
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
524 if (op != OP_INVALID)
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
525 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
526 if ((node = dmEvalAddNode(list, op)) != NULL)
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
527 {
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
528 ev->expect = PARSE_NORMAL;
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
529 dmEvalSetMode(ev, PARSE_START);
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
530 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
531 else
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
532 dmEvalSetMode(ev, PARSE_ERROR);
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
533 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
534 }
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
535 break;
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
536
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
537 case PARSE_OPER:
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
538 op = OP_INVALID;
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
539
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
540 switch (*c)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
541 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
542 case '+': op = OP_ADD; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
543 case '-': op = OP_SUB; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
544 case '*': op = OP_MUL; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
545 case '/': op = OP_DIV; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
546 case '%': op = OP_MOD; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
547 case '&': op = OP_BIT_AND; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
548 case '^': op = OP_BIT_XOR; c++; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
549 case '|': op = OP_BIT_OR; c++; break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
550
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
551 case '>':
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
552 if (c[1] == '>')
676
030b2a8e04d5 Improve parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 675
diff changeset
553 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
554 c += 2;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
555 op = OP_BIT_RSHIFT;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
556 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
557 else
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
558 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
559 op = (c[1] == '=') ? OP_GT_EQ : OP_GT;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
560 c++;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
561 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
562 break;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
563
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
564 case '<':
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
565 if (c[1] == '<')
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
566 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
567 c += 2;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
568 op = OP_BIT_LSHIFT;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
569 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
570 else
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
571 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
572 op = (c[1] == '=') ? OP_LT_EQ : OP_LT;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
573 c++;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
574 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
575 break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
576
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
577 default:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
578 dmEvalError(ev, "Unknown operator '%c' at %s\n", *c, c);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
579 dmEvalSetMode(ev, PARSE_ERROR);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
580 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
581
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
582 if (op != OP_INVALID)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
583 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
584 if ((node = dmEvalAddNode(list, op)) != NULL)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
585 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
586 ev->expect = PARSE_NORMAL | PARSE_OPER_UNARY;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
587 dmEvalSetMode(ev, PARSE_START);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
588 }
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
589 else
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
590 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
591 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
592 break;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
593
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
594 case PARSE_IDENT:
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
595 if (isalnum(*c) || *c == '_')
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
596 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
597 if (first)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
598 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
599 tmpStrLen = 0;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
600 first = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
601 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
602
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
603 if (tmpStrLen < DM_MAX_BUF)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
604 tmpStr[tmpStrLen++] = *c++;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
605 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
606 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
607 tmpStr[tmpStrLen] = 0;
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
608 dmEvalError(ev, "Identifier too long! ('%s') near %s\n", tmpStr, c);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
609 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
610 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
611 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
612 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
613 tmpStr[tmpStrLen] = 0;
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
614 DMEvalSymbol *symbol = dmEvalContextFindSymbol(ev, tmpStr);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
615 if (symbol != NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
616 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
617 if ((node = dmEvalAddNode(list, symbol->type == SYM_FUNC ? OP_FUNC : OP_VAR)) != NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
618 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
619 node->symbol = symbol;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
620 if (symbol->type == SYM_FUNC)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
621 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
622 func = node;
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
623 ev->expect = PARSE_ARGS;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
624 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
625 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
626 ev->expect = PARSE_END | PARSE_OPER;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
627
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
628 dmEvalSetMode(ev, PARSE_START);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
629 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
630 else
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
631 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
632 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
633 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
634 {
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
635 dmEvalError(ev, "No such identifier '%s'.\n", tmpStr);
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
636 dmEvalSetMode(ev, PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
637 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
638 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
639 break;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
640 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
641
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
642 *str = c;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
643
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
644 return (ev->mode == PARSE_ERROR);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
645 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
646
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
647
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
648 int dmEvalParseExpr(DMEvalContext *ev, char *expr, DMEvalNode **result)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
649 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
650 int ret;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
651
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
652 if (ev == NULL || result == NULL)
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
653 return DMERR_NULLPTR;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
654
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
655 ev->prev = PARSE_START;
761
7be7c7c5deaa Large cleanup, breaking everything. Yay.
Matti Hamalainen <ccr@tnsp.org>
parents: 747
diff changeset
656 ret = dmEvalTokenizeExpr(ev, result, &expr, 0);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
657
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
658 return ret;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
659 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
660
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
661
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
662
740
48c48e94d87f More work on the evaluator. Still broken, of course.
Matti Hamalainen <ccr@tnsp.org>
parents: 725
diff changeset
663
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
664 BOOL dmEvalTreeExecute(DMEvalContext *ev, DMEvalNode *node, DMValue *presult)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
665 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
666 DMValue val1, val2;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
667
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
668 if (node == NULL)
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
669 return FALSE;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
670
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
671 switch (node->op)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
672 {
765
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
673 case OP_VAR:
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
674 switch (node->symbol->type)
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
675 {
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
676 case SYM_CONST: *presult = node->symbol->cvalue; return TRUE;
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
677 case SYM_VAR : *presult = *(node->symbol->var); return TRUE;
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
678 }
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
679 return FALSE;
c68258fd81a1 Moar work.
Matti Hamalainen <ccr@tnsp.org>
parents: 764
diff changeset
680
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
681 case OP_VALUE:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
682 *presult = node->val;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
683 return TRUE;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
684
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
685 case OP_FUNC:
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
686
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
687 return TRUE;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
688
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
689 case OP_SUBEXPR:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
690 return dmEvalTreeExecute(ev, node->subexpr, presult);
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
691
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
692 // Binary operators
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
693 case OP_BIT_LSHIFT:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
694 case OP_BIT_RSHIFT:
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 852
diff changeset
695
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
696 case OP_BIT_AND:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
697 case OP_BIT_XOR:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
698 case OP_BIT_OR:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
699
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
700 case OP_ADD:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
701 case OP_SUB:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
702 case OP_MUL:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
703 case OP_DIV:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
704 case OP_MOD:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
705 if (!dmEvalTreeExecute(ev, node->left, &val1) ||
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
706 !dmEvalTreeExecute(ev, node->right, &val2))
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
707 return FALSE;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
708
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
709 switch (node->op)
670
0d37fe455b86 More work on evaluator.
Matti Hamalainen <ccr@tnsp.org>
parents: 664
diff changeset
710 {
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
711 case OP_DIV:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
712 if (val2 == 0)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
713 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
714 dmEvalError(ev, "Division by zero.\n");
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
715 return FALSE;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
716 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
717 *presult = val1 / val2;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
718 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
719
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
720
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
721 case OP_MOD:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
722 if (val2 == 0)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
723 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
724 dmEvalError(ev, "Division by zero.\n");
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
725 return FALSE;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
726 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
727 *presult = DMCONVTYPE val1 % DMCONVTYPE val2;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
728 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
729
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
730 case OP_BIT_LSHIFT:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
731 if (val2 > 31)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
732 dmEvalError(ev, "Left shift count >= width of type (%d << %d)\n", val1, val2);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
733 *presult = DMCONVTYPE val1 << DMCONVTYPE val2; break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
734
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
735 case OP_BIT_RSHIFT:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
736 if (val2 > 31)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
737 dmEvalError(ev, "Right shift count >= width of type (%d >> %d)\n", val1, val2);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
738 *presult = DMCONVTYPE val1 >> DMCONVTYPE val2; break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
739
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
740 case OP_MUL : *presult = val1 * val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
741 case OP_ADD : *presult = val1 + val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
742 case OP_SUB : *presult = val1 - val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
743 case OP_BIT_AND : *presult = DMCONVTYPE val1 & DMCONVTYPE val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
744 case OP_BIT_OR : *presult = DMCONVTYPE val1 | DMCONVTYPE val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
745 case OP_BIT_XOR : *presult = DMCONVTYPE val1 ^ DMCONVTYPE val2; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
746 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
747 return TRUE;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
748
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
749 // Unary operators
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
750 case OP_SUB_UNARY:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
751 case OP_BIT_COMPLEMENT:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
752 /*
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
753 switch (node->op)
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
754 {
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
755 case OP_SUB_UNARY: *presult -= tmp; break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
756 case OP_BIT_COMPLEMENT: *presult = DMCONVTYPE ~(DMCONVTYPE tmp); break;
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
757 }
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
758 */
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
759 return TRUE;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
760
764
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
761 default:
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
762 dmEvalError(ev, "Invalid opcode %d in node %p.\n", node->op, node);
181d659bba39 More work.
Matti Hamalainen <ccr@tnsp.org>
parents: 761
diff changeset
763 return FALSE;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
764 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
765 }