/[svn]/linuxsampler/trunk/src/scriptvm/tree.cpp
ViewVC logotype

Contents of /linuxsampler/trunk/src/scriptvm/tree.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2942 - (show annotations) (download)
Wed Jul 13 15:51:06 2016 UTC (7 years, 9 months ago) by schoenebeck
File size: 27161 byte(s)
* NKSP: Implemented built-in script variable "$KSP_TIMER".
* NKSP: Implemented built-in script variable "$NKSP_REAL_TIMER".
* NKSP: Implemented built-in script variable "$NKSP_PERF_TIMER".
* NKSP: Implemented built-in script variable "$ENGINE_UPTIME".
* Bumped version (2.0.0.svn14).

1 /*
2 * Copyright (c) 2014 - 2016 Christian Schoenebeck and Andreas Persson
3 *
4 * http://www.linuxsampler.org
5 *
6 * This file is part of LinuxSampler and released under the same terms.
7 * See README file for details.
8 */
9
10 #include <cstdio>
11 #include <string.h>
12 #include "tree.h"
13 #include "../common/global_private.h"
14 #include <assert.h>
15
16 namespace LinuxSampler {
17
18 bool isNoOperation(StatementRef statement) {
19 NoOperation* noOp = dynamic_cast<NoOperation*>(&*statement);
20 return noOp;
21 }
22
23 Node::Node() {
24 }
25
26 Node::~Node() {
27 }
28
29 void Node::printIndents(int n) {
30 for (int i = 0; i < n; ++i) printf(" ");
31 fflush(stdout);
32 }
33
34 String IntExpr::evalCastToStr() {
35 return ToString(evalInt());
36 }
37
38 int IntLiteral::evalInt() {
39 return value;
40 }
41
42 void IntLiteral::dump(int level) {
43 printIndents(level);
44 printf("IntLiteral %d\n", value);
45 }
46
47 void StringLiteral::dump(int level) {
48 printIndents(level);
49 printf("StringLiteral: '%s'\n", value.c_str());
50 }
51
52 int Add::evalInt() {
53 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
54 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
55 return (pLHS && pRHS) ? pLHS->evalInt() + pRHS->evalInt() : 0;
56 }
57
58 void Add::dump(int level) {
59 printIndents(level);
60 printf("Add(\n");
61 lhs->dump(level+1);
62 printIndents(level);
63 printf(",\n");
64 rhs->dump(level+1);
65 printIndents(level);
66 printf(")\n");
67 }
68
69 int Sub::evalInt() {
70 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
71 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
72 return (pLHS && pRHS) ? pLHS->evalInt() - pRHS->evalInt() : 0;
73 }
74
75 void Sub::dump(int level) {
76 printIndents(level);
77 printf("Sub(\n");
78 lhs->dump(level+1);
79 printIndents(level);
80 printf(",\n");
81 rhs->dump(level+1);
82 printIndents(level);
83 printf(")\n");
84 }
85
86 int Mul::evalInt() {
87 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
88 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
89 return (pLHS && pRHS) ? pLHS->evalInt() * pRHS->evalInt() : 0;
90 }
91
92 void Mul::dump(int level) {
93 printIndents(level);
94 printf("Mul(\n");
95 lhs->dump(level+1);
96 printIndents(level);
97 printf(",\n");
98 rhs->dump(level+1);
99 printIndents(level);
100 printf(")\n");
101 }
102
103 int Div::evalInt() {
104 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
105 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
106 return (pLHS && pRHS) ? pRHS->evalInt() == 0 ? 0 : pLHS->evalInt() / pRHS->evalInt() : 0;
107 }
108
109 void Div::dump(int level) {
110 printIndents(level);
111 printf("Div(\n");
112 lhs->dump(level+1);
113 printIndents(level);
114 printf(",\n");
115 rhs->dump(level+1);
116 printIndents(level);
117 printf(")\n");
118 }
119
120 int Mod::evalInt() {
121 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
122 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
123 return (pLHS && pRHS) ? pLHS->evalInt() % pRHS->evalInt() : 0;
124 }
125
126 void Mod::dump(int level) {
127 printIndents(level);
128 printf("Mod(\n");
129 lhs->dump(level+1);
130 printIndents(level);
131 printf(",\n");
132 rhs->dump(level+1);
133 printIndents(level);
134 printf(")\n");
135 }
136
137 void Args::dump(int level) {
138 printIndents(level);
139 printf("Args(\n");
140 for (std::vector<ExpressionRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
141 (*it)->dump(level+1);
142 }
143 printIndents(level);
144 printf(")\n");
145 }
146
147 bool Args::isPolyphonic() const {
148 for (int i = 0; i < args.size(); ++i)
149 if (args[i]->isPolyphonic())
150 return true;
151 return false;
152 }
153
154 EventHandlers::EventHandlers() {
155 //printf("EventHandlers::Constructor 0x%lx\n", (long long)this);
156 }
157
158 EventHandlers::~EventHandlers() {
159 }
160
161 void EventHandlers::add(EventHandlerRef arg) {
162 args.push_back(arg);
163 }
164
165 void EventHandlers::dump(int level) {
166 printIndents(level);
167 printf("EventHandlers {\n");
168 for (std::vector<EventHandlerRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
169 (*it)->dump(level+1);
170 }
171 printIndents(level);
172 printf("}\n");
173 }
174
175 EventHandler* EventHandlers::eventHandlerByName(const String& name) const {
176 for (int i = 0; i < args.size(); ++i)
177 if (args.at(i)->eventHandlerName() == name)
178 return const_cast<EventHandler*>(&*args.at(i));
179 return NULL;
180 }
181
182 EventHandler* EventHandlers::eventHandler(uint index) const {
183 if (index >= args.size()) return NULL;
184 return const_cast<EventHandler*>(&*args.at(index));
185 }
186
187 bool EventHandlers::isPolyphonic() const {
188 for (int i = 0; i < args.size(); ++i)
189 if (args[i]->isPolyphonic())
190 return true;
191 return false;
192 }
193
194 Assignment::Assignment(VariableRef variable, ExpressionRef value)
195 : variable(variable), value(value)
196 {
197 }
198
199 void Assignment::dump(int level) {
200 printIndents(level);
201 printf("Assignment\n");
202 }
203
204 StmtFlags_t Assignment::exec() {
205 if (!variable)
206 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
207 variable->assign(&*value);
208 return STMT_SUCCESS;
209 }
210
211 EventHandler::EventHandler(StatementsRef statements) {
212 this->statements = statements;
213 usingPolyphonics = statements->isPolyphonic();
214 }
215
216 void EventHandler::dump(int level) {
217 printIndents(level);
218 printf("EventHandler {\n");
219 statements->dump(level+1);
220 printIndents(level);
221 printf("}\n");
222 }
223
224 void Statements::dump(int level) {
225 printIndents(level);
226 printf("Statements {\n");
227 for (std::vector<StatementRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
228 (*it)->dump(level+1);
229 }
230 printIndents(level);
231 printf("}\n");
232 }
233
234 Statement* Statements::statement(uint i) {
235 if (i >= args.size()) return NULL;
236 return &*args.at(i);
237 }
238
239 bool Statements::isPolyphonic() const {
240 for (int i = 0; i < args.size(); ++i)
241 if (args[i]->isPolyphonic())
242 return true;
243 return false;
244 }
245
246 DynamicVariableCall::DynamicVariableCall(const String& name, ParserContext* ctx, VMDynVar* v)
247 : Variable(ctx, 0, false), dynVar(v), varName(name)
248 {
249 }
250
251 int DynamicVariableCall::evalInt() {
252 VMIntExpr* expr = dynamic_cast<VMIntExpr*>(dynVar);
253 if (!expr) return 0;
254 return expr->evalInt();
255 }
256
257 String DynamicVariableCall::evalStr() {
258 VMStringExpr* expr = dynamic_cast<VMStringExpr*>(dynVar);
259 if (!expr) return "";
260 return expr->evalStr();
261 }
262
263 String DynamicVariableCall::evalCastToStr() {
264 if (dynVar->exprType() == STRING_EXPR) {
265 return evalStr();
266 } else {
267 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(dynVar);
268 return intExpr ? ToString(intExpr->evalInt()) : "";
269 }
270 }
271
272 void DynamicVariableCall::dump(int level) {
273 printIndents(level);
274 printf("Dynamic Variable '%s'\n", varName.c_str());
275 }
276
277 void FunctionCall::dump(int level) {
278 printIndents(level);
279 printf("FunctionCall '%s' args={\n", functionName.c_str());
280 args->dump(level+1);
281 printIndents(level);
282 printf("}\n");
283 }
284
285 ExprType_t FunctionCall::exprType() const {
286 if (!fn) return EMPTY_EXPR;
287 return fn->returnType();
288 }
289
290 VMFnResult* FunctionCall::execVMFn() {
291 if (!fn) return NULL;
292 // assuming here that all argument checks (amount and types) have been made
293 // at parse time, to avoid time intensive checks on each function call
294 return fn->exec(dynamic_cast<VMFnArgs*>(&*args));
295 }
296
297 StmtFlags_t FunctionCall::exec() {
298 VMFnResult* result = execVMFn();
299 if (!result)
300 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
301 return result->resultFlags();
302 }
303
304 int FunctionCall::evalInt() {
305 VMFnResult* result = execVMFn();
306 if (!result) return 0;
307 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
308 if (!intExpr) return 0;
309 return intExpr->evalInt();
310 }
311
312 String FunctionCall::evalStr() {
313 VMFnResult* result = execVMFn();
314 if (!result) return "";
315 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
316 if (!strExpr) return "";
317 return strExpr->evalStr();
318 }
319
320 String FunctionCall::evalCastToStr() {
321 VMFnResult* result = execVMFn();
322 if (!result) return "";
323 if (result->resultValue()->exprType() == STRING_EXPR) {
324 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
325 return strExpr ? strExpr->evalStr() : "";
326 } else {
327 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
328 return intExpr ? ToString(intExpr->evalInt()) : "";
329 }
330 }
331
332 IntVariable::IntVariable(ParserContext* ctx)
333 : Variable(ctx, ctx ? ctx->globalIntVarCount++ : 0, false), polyphonic(false)
334 {
335 //printf("globalIntVar parserctx=0x%lx memPOS=%d\n", ctx, memPos);
336 assert(ctx);
337 }
338
339 inline static int postfixInc(int& object, int incBy) {
340 const int i = object;
341 object += incBy;
342 return i;
343 }
344
345 IntVariable::IntVariable(ParserContext* ctx, bool polyphonic, bool bConst, int size)
346 : Variable(ctx, !ctx ? 0 : polyphonic ? postfixInc(ctx->polyphonicIntVarCount, size) : postfixInc(ctx->globalIntVarCount, size), bConst),
347 polyphonic(polyphonic)
348 {
349 //printf("InvVar size=%d parserCtx=0x%lx\n", size, (uint64_t)ctx);
350 if (polyphonic) {
351 //printf("polyIntVar memPOS=%d\n", memPos);
352 assert(ctx);
353 }
354 }
355
356 void IntVariable::assign(Expression* expr) {
357 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
358 if (intExpr)
359 if (polyphonic)
360 context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt();
361 else
362 (*context->globalIntMemory)[memPos] = intExpr->evalInt();
363 }
364
365 int IntVariable::evalInt() {
366 //printf("IntVariable::eval pos=%d\n", memPos);
367 if (polyphonic) {
368 //printf("evalInt() poly memPos=%d execCtx=0x%lx\n", memPos, (uint64_t)context->execContext);
369 return context->execContext->polyphonicIntMemory[memPos];
370 }
371 return (*context->globalIntMemory)[memPos];
372 }
373
374 void IntVariable::dump(int level) {
375 printIndents(level);
376 //printf("IntVariable memPos=%d\n", memPos);
377 }
378
379 //ConstIntVariable::ConstIntVariable(ParserContext* ctx, int value)
380 ConstIntVariable::ConstIntVariable(int value)
381 : IntVariable(NULL,false,true), value(value)
382 {
383 }
384
385 void ConstIntVariable::assign(Expression* expr) {
386 // ignore assignment
387 /*
388 printf("ConstIntVariable::assign()\n");
389 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
390 if (intExpr) {
391 value = intExpr->evalInt();
392 }
393 */
394 }
395
396 int ConstIntVariable::evalInt() {
397 return value;
398 }
399
400 void ConstIntVariable::dump(int level) {
401 printIndents(level);
402 printf("ConstIntVariable val=%d\n", value);
403 }
404
405 BuiltInIntVariable::BuiltInIntVariable(const String& name, VMIntRelPtr* ptr)
406 : IntVariable(NULL,false,false), name(name), ptr(ptr)
407 {
408 }
409
410 void BuiltInIntVariable::assign(Expression* expr) {
411 IntExpr* valueExpr = dynamic_cast<IntExpr*>(expr);
412 if (!valueExpr) return;
413 ptr->assign(valueExpr->evalInt());
414 }
415
416 int BuiltInIntVariable::evalInt() {
417 return ptr->evalInt();
418 }
419
420 void BuiltInIntVariable::dump(int level) {
421 printIndents(level);
422 printf("Built-in IntVar '%s'\n", name.c_str());
423 }
424
425 PolyphonicIntVariable::PolyphonicIntVariable(ParserContext* ctx)
426 : IntVariable(ctx,true,false)
427 {
428 }
429
430 void PolyphonicIntVariable::dump(int level) {
431 printIndents(level);
432 printf("PolyphonicIntVariable\n");
433 }
434
435 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size)
436 : Variable(ctx, 0, false)
437 {
438 values.resize(size);
439 memset(&values[0], 0, size * sizeof(int));
440 }
441
442 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size, ArgsRef values)
443 : Variable(ctx, 0, false)
444 {
445 this->values.resize(size);
446 for (int i = 0; i < values->argsCount(); ++i) {
447 VMIntExpr* expr = dynamic_cast<VMIntExpr*>(values->arg(i));
448 if (expr) this->values[i] = expr->evalInt();
449 }
450 }
451
452 IntArrayVariable::IntArrayVariable(ParserContext* ctx, bool bConst)
453 : Variable(ctx, 0, bConst)
454 {
455 }
456
457 int IntArrayVariable::evalIntElement(uint i) {
458 if (i >= values.size()) return 0;
459 return values[i];
460 }
461
462 void IntArrayVariable::assignIntElement(uint i, int value) {
463 if (i >= values.size()) return;
464 values[i] = value;
465 }
466
467 void IntArrayVariable::dump(int level) {
468 printIndents(level);
469 printf("IntArray(");
470 for (int i = 0; i < values.size(); ++i) {
471 if (i % 12 == 0) {
472 printf("\n");
473 printIndents(level+1);
474 }
475 printf("%d, ", values[i]);
476 }
477 printIndents(level);
478 printf(")\n");
479 }
480
481 BuiltInIntArrayVariable::BuiltInIntArrayVariable(const String& name, VMInt8Array* array)
482 : IntArrayVariable(NULL, false), name(name), array(array)
483 {
484 }
485
486 int BuiltInIntArrayVariable::evalIntElement(uint i) {
487 return i >= array->size ? 0 : array->data[i];
488 }
489
490 void BuiltInIntArrayVariable::assignIntElement(uint i, int value) {
491 if (i >= array->size) return;
492 array->data[i] = value;
493 }
494
495 void BuiltInIntArrayVariable::dump(int level) {
496 printIndents(level);
497 printf("Built-In Int Array Variable '%s'\n", name.c_str());
498 }
499
500 IntArrayElement::IntArrayElement(IntArrayVariableRef array, IntExprRef arrayIndex)
501 : IntVariable(NULL, false, false, 0), array(array), index(arrayIndex)
502 {
503 }
504
505 void IntArrayElement::assign(Expression* expr) {
506 IntExpr* valueExpr = dynamic_cast<IntExpr*>(expr);
507 if (!valueExpr) return;
508 int value = valueExpr->evalInt();
509
510 if (!index) return;
511 int idx = index->evalInt();
512 if (idx < 0 || idx >= array->arraySize()) return;
513
514 array->assignIntElement(idx, value);
515 }
516
517 int IntArrayElement::evalInt() {
518 if (!index) return 0;
519 int idx = index->evalInt();
520 if (idx < 0 || idx >= array->arraySize()) return 0;
521
522 return array->evalIntElement(idx);
523 }
524
525 void IntArrayElement::dump(int level) {
526 printIndents(level);
527 printf("IntArrayElement\n");
528 }
529
530 StringVariable::StringVariable(ParserContext* ctx)
531 : Variable(ctx,ctx->globalStrVarCount++,false)
532 {
533 }
534
535 StringVariable::StringVariable(ParserContext* ctx, bool bConst)
536 : Variable(ctx,0,bConst)
537 {
538 }
539
540 void StringVariable::assign(Expression* expr) {
541 StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
542 (*context->globalStrMemory)[memPos] = strExpr->evalStr();
543 }
544
545 String StringVariable::evalStr() {
546 //printf("StringVariable::eval pos=%d\n", memPos);
547 return (*context->globalStrMemory)[memPos];
548 }
549
550 void StringVariable::dump(int level) {
551 printIndents(level);
552 printf("StringVariable memPos=%d\n", memPos);
553 }
554
555 ConstStringVariable::ConstStringVariable(ParserContext* ctx, String _value)
556 : StringVariable(ctx,true), value(_value)
557 {
558 }
559
560 void ConstStringVariable::assign(Expression* expr) {
561 // ignore assignment
562 // StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
563 // if (strExpr) value = strExpr->evalStr();
564 }
565
566 String ConstStringVariable::evalStr() {
567 return value;
568 }
569
570 void ConstStringVariable::dump(int level) {
571 printIndents(level);
572 printf("ConstStringVariable val='%s'\n", value.c_str());
573 }
574
575 void If::dump(int level) {
576 printIndents(level);
577 if (ifStatements && elseStatements)
578 printf("if cond stmts1 else stmts2 end if\n");
579 else if (ifStatements)
580 printf("if cond statements end if\n");
581 else
582 printf("if [INVALID]\n");
583 }
584
585 int If::evalBranch() {
586 if (condition->evalInt()) return 0;
587 if (elseStatements) return 1;
588 return -1;
589 }
590
591 Statements* If::branch(uint i) const {
592 if (i == 0) return (Statements*) &*ifStatements;
593 if (i == 1) return (elseStatements) ? (Statements*) &*elseStatements : NULL;
594 return NULL;
595 }
596
597 bool If::isPolyphonic() const {
598 if (condition->isPolyphonic() || ifStatements->isPolyphonic())
599 return true;
600 return elseStatements ? elseStatements->isPolyphonic() : false;
601 }
602
603 void SelectCase::dump(int level) {
604 printIndents(level);
605 if (select)
606 if (select->isConstExpr())
607 printf("Case select %d\n", select->evalInt());
608 else
609 printf("Case select [runtime expr]\n");
610 else
611 printf("Case select NULL\n");
612 for (int i = 0; i < branches.size(); ++i) {
613 printIndents(level+1);
614 CaseBranch& branch = branches[i];
615 if (branch.from && branch.to)
616 if (branch.from->isConstExpr() && branch.to->isConstExpr())
617 printf("case %d to %d\n", branch.from->evalInt(), branch.to->evalInt());
618 else if (branch.from->isConstExpr() && !branch.to->isConstExpr())
619 printf("case %d to [runtime expr]\n", branch.from->evalInt());
620 else if (!branch.from->isConstExpr() && branch.to->isConstExpr())
621 printf("case [runtime expr] to %d\n", branch.to->evalInt());
622 else
623 printf("case [runtime expr] to [runtime expr]\n");
624 else if (branch.from)
625 if (branch.from->isConstExpr())
626 printf("case %d\n", branch.from->evalInt());
627 else
628 printf("case [runtime expr]\n");
629 else
630 printf("case NULL\n");
631 }
632 }
633
634 int SelectCase::evalBranch() {
635 int value = select->evalInt();
636 for (int i = 0; i < branches.size(); ++i) {
637 if (branches.at(i).from && branches.at(i).to) { // i.e. "case 4 to 7" ...
638 if (branches.at(i).from->evalInt() <= value &&
639 branches.at(i).to->evalInt() >= value) return i;
640 } else { // i.e. "case 5" ...
641 if (branches.at(i).from->evalInt() == value) return i;
642 }
643 }
644 return -1;
645 }
646
647 Statements* SelectCase::branch(uint i) const {
648 if (i < branches.size())
649 return const_cast<Statements*>( &*branches[i].statements );
650 return NULL;
651 }
652
653 bool SelectCase::isPolyphonic() const {
654 if (select->isPolyphonic()) return true;
655 for (int i = 0; i < branches.size(); ++i)
656 if (branches[i].statements->isPolyphonic())
657 return true;
658 return false;
659 }
660
661 // void Case::addBranch(IntExprRef condition, StatementsRef statements) {
662 // CaseBranchRef b = new CaseBranchRef;
663 // b->from = condition;
664 // b->statements = statements;
665 // branches.push_back(b);
666 // }
667 //
668 // void Case::addBranch(IntExprRef from, IntExprRef to, StatementsRef statements) {
669 // CaseBranchRef b = new CaseBranchRef;
670 // b->from = from;
671 // b->to = to;
672 // b->statements = statements;
673 // branches.push_back(b);
674 // }
675 //
676 // void Case::addBranch(CaseBranchRef branch) {
677 // branches.push_back(branch);
678 // }
679
680 void While::dump(int level) {
681 printIndents(level);
682 if (m_condition)
683 if (m_condition->isConstExpr())
684 printf("while (%d) {\n", m_condition->evalInt());
685 else
686 printf("while ([runtime expr]) {\n");
687 else
688 printf("while ([INVALID]) {\n");
689 m_statements->dump(level+1);
690 printIndents(level);
691 printf("}\n");
692 }
693
694 Statements* While::statements() const {
695 return (m_statements) ? const_cast<Statements*>( &*m_statements ) : NULL;
696 }
697
698 bool While::evalLoopStartCondition() {
699 if (!m_condition) return false;
700 return m_condition->evalInt();
701 }
702
703 void Neg::dump(int level) {
704 printIndents(level);
705 printf("Negative Expr\n");
706 }
707
708 String ConcatString::evalStr() {
709 return lhs->evalCastToStr() + rhs->evalCastToStr();
710 }
711
712 void ConcatString::dump(int level) {
713 printIndents(level);
714 printf("ConcatString(\n");
715 lhs->dump(level+1);
716 printIndents(level);
717 printf(",\n");
718 rhs->dump(level+1);
719 printIndents(level);
720 printf(")");
721 }
722
723 bool ConcatString::isConstExpr() const {
724 return lhs->isConstExpr() && rhs->isConstExpr();
725 }
726
727 int Relation::evalInt() {
728 switch (type) {
729 case LESS_THAN:
730 return lhs->evalInt() < rhs->evalInt();
731 case GREATER_THAN:
732 return lhs->evalInt() > rhs->evalInt();
733 case LESS_OR_EQUAL:
734 return lhs->evalInt() <= rhs->evalInt();
735 case GREATER_OR_EQUAL:
736 return lhs->evalInt() >= rhs->evalInt();
737 case EQUAL:
738 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
739 return lhs->evalCastToStr() == rhs->evalCastToStr();
740 else
741 return lhs->evalInt() == rhs->evalInt();
742 case NOT_EQUAL:
743 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
744 return lhs->evalCastToStr() != rhs->evalCastToStr();
745 else
746 return lhs->evalInt() != rhs->evalInt();
747 }
748 return 0;
749 }
750
751 void Relation::dump(int level) {
752 printIndents(level);
753 printf("Relation(\n");
754 lhs->dump(level+1);
755 printIndents(level);
756 switch (type) {
757 case LESS_THAN:
758 printf("LESS_THAN\n");
759 break;
760 case GREATER_THAN:
761 printf("GREATER_THAN\n");
762 break;
763 case LESS_OR_EQUAL:
764 printf("LESS_OR_EQUAL\n");
765 break;
766 case GREATER_OR_EQUAL:
767 printf("GREATER_OR_EQUAL\n");
768 break;
769 case EQUAL:
770 printf("EQUAL\n");
771 break;
772 case NOT_EQUAL:
773 printf("NOT_EQUAL\n");
774 break;
775 }
776 rhs->dump(level+1);
777 printIndents(level);
778 printf(")\n");
779 }
780
781 bool Relation::isConstExpr() const {
782 return lhs->isConstExpr() && rhs->isConstExpr();
783 }
784
785 int Or::evalInt() {
786 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
787 if (pLHS->evalInt()) return 1;
788 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
789 return (pRHS->evalInt()) ? 1 : 0;
790 }
791
792 void Or::dump(int level) {
793 printIndents(level);
794 printf("Or(\n");
795 lhs->dump(level+1);
796 printIndents(level);
797 printf(",\n");
798 rhs->dump(level+1);
799 printIndents(level);
800 printf(")\n");
801 }
802
803 int BitwiseOr::evalInt() {
804 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
805 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
806 return pLHS->evalInt() | pRHS->evalInt();
807 }
808
809 void BitwiseOr::dump(int level) {
810 printIndents(level);
811 printf("BitwiseOr(\n");
812 lhs->dump(level+1);
813 printIndents(level);
814 printf(",\n");
815 rhs->dump(level+1);
816 printIndents(level);
817 printf(")\n");
818 }
819
820 int And::evalInt() {
821 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
822 if (!pLHS->evalInt()) return 0;
823 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
824 return (pRHS->evalInt()) ? 1 : 0;
825 }
826
827 void And::dump(int level) {
828 printIndents(level);
829 printf("And(\n");
830 lhs->dump(level+1);
831 printIndents(level);
832 printf(",\n");
833 rhs->dump(level+1);
834 printIndents(level);
835 printf(")\n");
836 }
837
838 int BitwiseAnd::evalInt() {
839 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
840 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
841 return pLHS->evalInt() & pRHS->evalInt();
842 }
843
844 void BitwiseAnd::dump(int level) {
845 printIndents(level);
846 printf("BitwiseAnd(\n");
847 lhs->dump(level+1);
848 printIndents(level);
849 printf(",\n");
850 rhs->dump(level+1);
851 printIndents(level);
852 printf(")\n");
853 }
854
855 void Not::dump(int level) {
856 printIndents(level);
857 printf("Not(\n");
858 expr->dump(level+1);
859 printIndents(level);
860 printf(")\n");
861 }
862
863 void BitwiseNot::dump(int level) {
864 printIndents(level);
865 printf("BitwiseNot(\n");
866 expr->dump(level+1);
867 printIndents(level);
868 printf(")\n");
869 }
870
871 VariableRef ParserContext::variableByName(const String& name) {
872 if (!vartable.count(name)) {
873 return VariableRef();
874 }
875 return vartable.find(name)->second;
876 }
877
878 VariableRef ParserContext::globalVar(const String& name) {
879 if (!vartable.count(name)) {
880 //printf("No global var '%s'\n", name.c_str());
881 //for (std::map<String,VariableRef>::const_iterator it = vartable.begin(); it != vartable.end(); ++it)
882 // printf("-> var '%s'\n", it->first.c_str());
883 return VariableRef();
884 }
885 return vartable.find(name)->second;
886 }
887
888 IntVariableRef ParserContext::globalIntVar(const String& name) {
889 return globalVar(name);
890 }
891
892 StringVariableRef ParserContext::globalStrVar(const String& name) {
893 return globalVar(name);
894 }
895
896 ParserContext::~ParserContext() {
897 destroyScanner();
898 if (globalIntMemory) {
899 delete globalIntMemory;
900 globalIntMemory = NULL;
901 }
902 }
903
904 void ParserContext::addErr(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
905 ParserIssue e;
906 e.type = PARSER_ERROR;
907 e.txt = txt;
908 e.firstLine = firstLine;
909 e.lastLine = lastLine;
910 e.firstColumn = firstColumn;
911 e.lastColumn = lastColumn;
912 vErrors.push_back(e);
913 vIssues.push_back(e);
914 }
915
916 void ParserContext::addWrn(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
917 ParserIssue w;
918 w.type = PARSER_WARNING;
919 w.txt = txt;
920 w.firstLine = firstLine;
921 w.lastLine = lastLine;
922 w.firstColumn = firstColumn;
923 w.lastColumn = lastColumn;
924 vWarnings.push_back(w);
925 vIssues.push_back(w);
926 }
927
928 bool ParserContext::setPreprocessorCondition(const char* name) {
929 if (builtinPreprocessorConditions.count(name)) return false;
930 if (userPreprocessorConditions.count(name)) return false;
931 userPreprocessorConditions.insert(name);
932 return true;
933 }
934
935 bool ParserContext::resetPreprocessorCondition(const char* name) {
936 if (builtinPreprocessorConditions.count(name)) return false;
937 if (!userPreprocessorConditions.count(name)) return false;
938 userPreprocessorConditions.erase(name);
939 return true;
940 }
941
942 bool ParserContext::isPreprocessorConditionSet(const char* name) {
943 if (builtinPreprocessorConditions.count(name)) return true;
944 return userPreprocessorConditions.count(name);
945 }
946
947 std::vector<ParserIssue> ParserContext::issues() const {
948 return vIssues;
949 }
950
951 std::vector<ParserIssue> ParserContext::errors() const {
952 return vErrors;
953 }
954
955 std::vector<ParserIssue> ParserContext::warnings() const {
956 return vWarnings;
957 }
958
959 VMEventHandler* ParserContext::eventHandler(uint index) {
960 if (!handlers) return NULL;
961 return handlers->eventHandler(index);
962 }
963
964 VMEventHandler* ParserContext::eventHandlerByName(const String& name) {
965 if (!handlers) return NULL;
966 return handlers->eventHandlerByName(name);
967 }
968
969 void ParserContext::registerBuiltInConstIntVariables(const std::map<String,int>& vars) {
970 for (std::map<String,int>::const_iterator it = vars.begin();
971 it != vars.end(); ++it)
972 {
973 ConstIntVariableRef ref = new ConstIntVariable(it->second);
974 vartable[it->first] = ref;
975 }
976 }
977
978 void ParserContext::registerBuiltInIntVariables(const std::map<String,VMIntRelPtr*>& vars) {
979 for (std::map<String,VMIntRelPtr*>::const_iterator it = vars.begin();
980 it != vars.end(); ++it)
981 {
982 BuiltInIntVariableRef ref = new BuiltInIntVariable(it->first, it->second);
983 vartable[it->first] = ref;
984 }
985 }
986
987 void ParserContext::registerBuiltInIntArrayVariables(const std::map<String,VMInt8Array*>& vars) {
988 for (std::map<String,VMInt8Array*>::const_iterator it = vars.begin();
989 it != vars.end(); ++it)
990 {
991 BuiltInIntArrayVariableRef ref = new BuiltInIntArrayVariable(it->first, it->second);
992 vartable[it->first] = ref;
993 }
994 }
995
996 void ParserContext::registerBuiltInDynVariables(const std::map<String,VMDynVar*>& vars) {
997 for (std::map<String,VMDynVar*>::const_iterator it = vars.begin();
998 it != vars.end(); ++it)
999 {
1000 DynamicVariableCallRef ref = new DynamicVariableCall(it->first, this, it->second);
1001 vartable[it->first] = ref;
1002 }
1003 }
1004
1005 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC