/[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 2611 - (show annotations) (download)
Mon Jun 9 19:20:37 2014 UTC (9 years, 10 months ago) by schoenebeck
File size: 23632 byte(s)
* Fixed crash when loading an instrument script.
* Fixed "init" script handler only to be executed once:
  when the script was loaded.
* Fixed aftertouch script event which always had value zero
  and controller number was set to aftertouch value instead.
* gig Engine: Fixed handling of "smartmidi" dimension, which
  was recognized as "unknown" dimension.
* Fixed script function gig_set_dim_zone(): was accessing
  wrong event.
* ls_instr_script command line tool: is now not limited to
  core language scripts, but can now also parse sampler format
  dependent instrument scripts, with the respective specific
  built-in script variables and functions.
* ScriptVM: Fixed runtime behavior of "and" and "or" binary
  script expressions, which also evaluated the right hand side
  of the expression even if the left hand side already failed
  the overall expression semantic to become true.
* Bumped version (1.0.0.svn46).

1 /*
2 * Copyright (c) 2014 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 EventHandlers::EventHandlers() {
148 //printf("EventHandlers::Constructor 0x%lx\n", (long long)this);
149 }
150
151 EventHandlers::~EventHandlers() {
152 }
153
154 void EventHandlers::add(EventHandlerRef arg) {
155 args.push_back(arg);
156 }
157
158 void EventHandlers::dump(int level) {
159 printIndents(level);
160 printf("EventHandlers {\n");
161 for (std::vector<EventHandlerRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
162 (*it)->dump(level+1);
163 }
164 printIndents(level);
165 printf("}\n");
166 }
167
168 EventHandler* EventHandlers::eventHandlerByName(const String& name) const {
169 for (int i = 0; i < args.size(); ++i)
170 if (args.at(i)->eventHandlerName() == name)
171 return const_cast<EventHandler*>(&*args.at(i));
172 return NULL;
173 }
174
175 EventHandler* EventHandlers::eventHandler(uint index) const {
176 if (index >= args.size()) return NULL;
177 return const_cast<EventHandler*>(&*args.at(index));
178 }
179
180 Assignment::Assignment(VariableRef variable, ExpressionRef value)
181 : variable(variable), value(value)
182 {
183 }
184
185 void Assignment::dump(int level) {
186 printIndents(level);
187 printf("Assignment\n");
188 }
189
190 StmtFlags_t Assignment::exec() {
191 if (!variable)
192 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
193 variable->assign(&*value);
194 return STMT_SUCCESS;
195 }
196
197 void EventHandler::dump(int level) {
198 printIndents(level);
199 printf("EventHandler {\n");
200 statements->dump(level+1);
201 printIndents(level);
202 printf("}\n");
203 }
204
205 void Statements::dump(int level) {
206 printIndents(level);
207 printf("Statements {\n");
208 for (std::vector<StatementRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
209 (*it)->dump(level+1);
210 }
211 printIndents(level);
212 printf("}\n");
213 }
214
215 Statement* Statements::statement(uint i) {
216 if (i >= args.size()) return NULL;
217 return &*args.at(i);
218 }
219
220 void FunctionCall::dump(int level) {
221 printIndents(level);
222 printf("FunctionCall '%s' args={\n", functionName.c_str());
223 args->dump(level+1);
224 printIndents(level);
225 printf("}\n");
226 }
227
228 ExprType_t FunctionCall::exprType() const {
229 if (!fn) return EMPTY_EXPR;
230 return fn->returnType();
231 }
232
233 VMFnResult* FunctionCall::execVMFn() {
234 if (!fn) return NULL;
235 // assuming here that all argument checks (amount and types) have been made
236 // at parse time, to avoid time intensive checks on each function call
237 return fn->exec(dynamic_cast<VMFnArgs*>(&*args));
238 }
239
240 StmtFlags_t FunctionCall::exec() {
241 VMFnResult* result = execVMFn();
242 if (!result)
243 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
244 return result->resultFlags();
245 }
246
247 int FunctionCall::evalInt() {
248 VMFnResult* result = execVMFn();
249 if (!result) return 0;
250 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
251 if (!intExpr) return 0;
252 return intExpr->evalInt();
253 }
254
255 String FunctionCall::evalStr() {
256 VMFnResult* result = execVMFn();
257 if (!result) return "";
258 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
259 if (!strExpr) return "";
260 return strExpr->evalStr();
261 }
262
263 String FunctionCall::evalCastToStr() {
264 VMFnResult* result = execVMFn();
265 if (!result) return "";
266 if (result->resultValue()->exprType() == STRING_EXPR) {
267 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
268 return strExpr ? strExpr->evalStr() : "";
269 } else {
270 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
271 return intExpr ? ToString(intExpr->evalInt()) : "";
272 }
273 }
274
275 IntVariable::IntVariable(ParserContext* ctx)
276 : Variable(ctx, ctx ? ctx->globalIntVarCount++ : 0, false), polyphonic(false)
277 {
278 //printf("globalIntVar parserctx=0x%lx memPOS=%d\n", ctx, memPos);
279 assert(ctx);
280 }
281
282 inline static int postfixInc(int& object, int incBy) {
283 const int i = object;
284 object += incBy;
285 return i;
286 }
287
288 IntVariable::IntVariable(ParserContext* ctx, bool polyphonic, bool bConst, int size)
289 : Variable(ctx, !ctx ? 0 : polyphonic ? postfixInc(ctx->polyphonicIntVarCount, size) : postfixInc(ctx->globalIntVarCount, size), bConst),
290 polyphonic(polyphonic)
291 {
292 //printf("InvVar size=%d parserCtx=0x%lx\n", size, (uint64_t)ctx);
293 if (polyphonic) {
294 //printf("polyIntVar memPOS=%d\n", memPos);
295 assert(ctx);
296 }
297 }
298
299 void IntVariable::assign(Expression* expr) {
300 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
301 if (intExpr)
302 if (polyphonic)
303 context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt();
304 else
305 (*context->globalIntMemory)[memPos] = intExpr->evalInt();
306 }
307
308 int IntVariable::evalInt() {
309 //printf("IntVariable::eval pos=%d\n", memPos);
310 if (polyphonic) {
311 //printf("evalInt() poly memPos=%d execCtx=0x%lx\n", memPos, (uint64_t)context->execContext);
312 return context->execContext->polyphonicIntMemory[memPos];
313 }
314 return (*context->globalIntMemory)[memPos];
315 }
316
317 void IntVariable::dump(int level) {
318 printIndents(level);
319 //printf("IntVariable memPos=%d\n", memPos);
320 }
321
322 //ConstIntVariable::ConstIntVariable(ParserContext* ctx, int value)
323 ConstIntVariable::ConstIntVariable(int value)
324 : IntVariable(NULL,false,true), value(value)
325 {
326 }
327
328 void ConstIntVariable::assign(Expression* expr) {
329 // ignore assignment
330 /*
331 printf("ConstIntVariable::assign()\n");
332 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
333 if (intExpr) {
334 value = intExpr->evalInt();
335 }
336 */
337 }
338
339 int ConstIntVariable::evalInt() {
340 return value;
341 }
342
343 void ConstIntVariable::dump(int level) {
344 printIndents(level);
345 printf("ConstIntVariable val=%d\n", value);
346 }
347
348 BuiltInIntVariable::BuiltInIntVariable(const String& name, VMIntRelPtr* ptr)
349 : IntVariable(NULL,false,false), name(name), ptr(ptr)
350 {
351 }
352
353 void BuiltInIntVariable::assign(Expression* expr) {
354 IntExpr* valueExpr = dynamic_cast<IntExpr*>(expr);
355 if (!valueExpr) return;
356 ptr->assign(valueExpr->evalInt());
357 }
358
359 int BuiltInIntVariable::evalInt() {
360 return ptr->evalInt();
361 }
362
363 void BuiltInIntVariable::dump(int level) {
364 printIndents(level);
365 printf("Built-in IntVar '%s'\n", name.c_str());
366 }
367
368 PolyphonicIntVariable::PolyphonicIntVariable(ParserContext* ctx)
369 : IntVariable(ctx,true,false)
370 {
371 }
372
373 void PolyphonicIntVariable::dump(int level) {
374 printIndents(level);
375 printf("PolyphonicIntVariable\n");
376 }
377
378 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size)
379 : Variable(ctx, 0, false)
380 {
381 values.resize(size);
382 memset(&values[0], 0, size * sizeof(int));
383 }
384
385 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size, ArgsRef values)
386 : Variable(ctx, 0, false)
387 {
388 this->values.resize(size);
389 for (int i = 0; i < values->argsCount(); ++i) {
390 VMIntExpr* expr = dynamic_cast<VMIntExpr*>(values->arg(i));
391 if (expr) this->values[i] = expr->evalInt();
392 }
393 }
394
395 IntArrayVariable::IntArrayVariable(ParserContext* ctx, bool bConst)
396 : Variable(ctx, 0, bConst)
397 {
398 }
399
400 int IntArrayVariable::evalIntElement(uint i) {
401 if (i >= values.size()) return 0;
402 return values[i];
403 }
404
405 void IntArrayVariable::assignIntElement(uint i, int value) {
406 if (i >= values.size()) return;
407 values[i] = value;
408 }
409
410 void IntArrayVariable::dump(int level) {
411 printIndents(level);
412 printf("IntArray(");
413 for (int i = 0; i < values.size(); ++i) {
414 if (i % 12 == 0) {
415 printf("\n");
416 printIndents(level+1);
417 }
418 printf("%d, ", values[i]);
419 }
420 printIndents(level);
421 printf(")\n");
422 }
423
424 BuiltInIntArrayVariable::BuiltInIntArrayVariable(const String& name, VMInt8Array* array)
425 : IntArrayVariable(NULL, false), name(name), array(array)
426 {
427 }
428
429 int BuiltInIntArrayVariable::evalIntElement(uint i) {
430 return i >= array->size ? 0 : array->data[i];
431 }
432
433 void BuiltInIntArrayVariable::assignIntElement(uint i, int value) {
434 if (i >= array->size) return;
435 array->data[i] = value;
436 }
437
438 void BuiltInIntArrayVariable::dump(int level) {
439 printIndents(level);
440 printf("Built-In Int Array Variable '%s'\n", name.c_str());
441 }
442
443 IntArrayElement::IntArrayElement(IntArrayVariableRef array, IntExprRef arrayIndex)
444 : IntVariable(NULL, false, false, 0), array(array), index(arrayIndex)
445 {
446 }
447
448 void IntArrayElement::assign(Expression* expr) {
449 IntExpr* valueExpr = dynamic_cast<IntExpr*>(expr);
450 if (!valueExpr) return;
451 int value = valueExpr->evalInt();
452
453 if (!index) return;
454 int idx = index->evalInt();
455 if (idx < 0 || idx >= array->arraySize()) return;
456
457 array->assignIntElement(idx, value);
458 }
459
460 int IntArrayElement::evalInt() {
461 if (!index) return 0;
462 int idx = index->evalInt();
463 if (idx < 0 || idx >= array->arraySize()) return 0;
464
465 return array->evalIntElement(idx);
466 }
467
468 void IntArrayElement::dump(int level) {
469 printIndents(level);
470 printf("IntArrayElement\n");
471 }
472
473 StringVariable::StringVariable(ParserContext* ctx)
474 : Variable(ctx,ctx->globalStrVarCount++,false)
475 {
476 }
477
478 StringVariable::StringVariable(ParserContext* ctx, bool bConst)
479 : Variable(ctx,0,bConst)
480 {
481 }
482
483 void StringVariable::assign(Expression* expr) {
484 StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
485 (*context->globalStrMemory)[memPos] = strExpr->evalStr();
486 }
487
488 String StringVariable::evalStr() {
489 //printf("StringVariable::eval pos=%d\n", memPos);
490 return (*context->globalStrMemory)[memPos];
491 }
492
493 void StringVariable::dump(int level) {
494 printIndents(level);
495 printf("StringVariable memPos=%d\n", memPos);
496 }
497
498 ConstStringVariable::ConstStringVariable(ParserContext* ctx, String _value)
499 : StringVariable(ctx,true), value(_value)
500 {
501 }
502
503 void ConstStringVariable::assign(Expression* expr) {
504 // ignore assignment
505 // StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
506 // if (strExpr) value = strExpr->evalStr();
507 }
508
509 String ConstStringVariable::evalStr() {
510 return value;
511 }
512
513 void ConstStringVariable::dump(int level) {
514 printIndents(level);
515 printf("ConstStringVariable val='%s'\n", value.c_str());
516 }
517
518 void If::dump(int level) {
519 printIndents(level);
520 if (ifStatements && elseStatements)
521 printf("if cond stmts1 else stmts2 end if\n");
522 else if (ifStatements)
523 printf("if cond statements end if\n");
524 else
525 printf("if [INVALID]\n");
526 }
527
528 int If::evalBranch() {
529 if (condition->evalInt()) return 0;
530 if (elseStatements) return 1;
531 return -1;
532 }
533
534 Statements* If::branch(uint i) const {
535 if (i == 0) return (Statements*) &*ifStatements;
536 if (i == 1) return (elseStatements) ? (Statements*) &*elseStatements : NULL;
537 return NULL;
538 }
539
540 void SelectCase::dump(int level) {
541 printIndents(level);
542 if (select)
543 if (select->isConstExpr())
544 printf("Case select %d\n", select->evalInt());
545 else
546 printf("Case select [runtime expr]\n");
547 else
548 printf("Case select NULL\n");
549 for (int i = 0; i < branches.size(); ++i) {
550 printIndents(level+1);
551 CaseBranch& branch = branches[i];
552 if (branch.from && branch.to)
553 if (branch.from->isConstExpr() && branch.to->isConstExpr())
554 printf("case %d to %d\n", branch.from->evalInt(), branch.to->evalInt());
555 else if (branch.from->isConstExpr() && !branch.to->isConstExpr())
556 printf("case %d to [runtime expr]\n", branch.from->evalInt());
557 else if (!branch.from->isConstExpr() && branch.to->isConstExpr())
558 printf("case [runtime expr] to %d\n", branch.to->evalInt());
559 else
560 printf("case [runtime expr] to [runtime expr]\n");
561 else if (branch.from)
562 if (branch.from->isConstExpr())
563 printf("case %d\n", branch.from->evalInt());
564 else
565 printf("case [runtime expr]\n");
566 else
567 printf("case NULL\n");
568 }
569 }
570
571 int SelectCase::evalBranch() {
572 int value = select->evalInt();
573 for (int i = 0; i < branches.size(); ++i) {
574 if (branches.at(i).from && branches.at(i).to) { // i.e. "case 4 to 7" ...
575 if (branches.at(i).from->evalInt() <= value &&
576 branches.at(i).to->evalInt() >= value) return i;
577 } else { // i.e. "case 5" ...
578 if (branches.at(i).from->evalInt() == value) return i;
579 }
580 }
581 return -1;
582 }
583
584 Statements* SelectCase::branch(uint i) const {
585 if (i < branches.size())
586 return const_cast<Statements*>( &*branches[i].statements );
587 return NULL;
588 }
589
590 // void Case::addBranch(IntExprRef condition, StatementsRef statements) {
591 // CaseBranchRef b = new CaseBranchRef;
592 // b->from = condition;
593 // b->statements = statements;
594 // branches.push_back(b);
595 // }
596 //
597 // void Case::addBranch(IntExprRef from, IntExprRef to, StatementsRef statements) {
598 // CaseBranchRef b = new CaseBranchRef;
599 // b->from = from;
600 // b->to = to;
601 // b->statements = statements;
602 // branches.push_back(b);
603 // }
604 //
605 // void Case::addBranch(CaseBranchRef branch) {
606 // branches.push_back(branch);
607 // }
608
609 void While::dump(int level) {
610 printIndents(level);
611 if (m_condition)
612 if (m_condition->isConstExpr())
613 printf("while (%d) {\n", m_condition->evalInt());
614 else
615 printf("while ([runtime expr]) {\n");
616 else
617 printf("while ([INVALID]) {\n");
618 m_statements->dump(level+1);
619 printIndents(level);
620 printf("}\n");
621 }
622
623 Statements* While::statements() const {
624 return (m_statements) ? const_cast<Statements*>( &*m_statements ) : NULL;
625 }
626
627 bool While::evalLoopStartCondition() {
628 if (!m_condition) return false;
629 return m_condition->evalInt();
630 }
631
632 void Neg::dump(int level) {
633 printIndents(level);
634 printf("Negative Expr\n");
635 }
636
637 String ConcatString::evalStr() {
638 return lhs->evalCastToStr() + rhs->evalCastToStr();
639 }
640
641 void ConcatString::dump(int level) {
642 printIndents(level);
643 printf("ConcatString(\n");
644 lhs->dump(level+1);
645 printIndents(level);
646 printf(",\n");
647 rhs->dump(level+1);
648 printIndents(level);
649 printf(")");
650 }
651
652 bool ConcatString::isConstExpr() const {
653 return lhs->isConstExpr() && rhs->isConstExpr();
654 }
655
656 int Relation::evalInt() {
657 switch (type) {
658 case LESS_THAN:
659 return lhs->evalInt() < rhs->evalInt();
660 case GREATER_THAN:
661 return lhs->evalInt() > rhs->evalInt();
662 case LESS_OR_EQUAL:
663 return lhs->evalInt() <= rhs->evalInt();
664 case GREATER_OR_EQUAL:
665 return lhs->evalInt() >= rhs->evalInt();
666 case EQUAL:
667 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
668 return lhs->evalCastToStr() == rhs->evalCastToStr();
669 else
670 return lhs->evalInt() == rhs->evalInt();
671 case NOT_EQUAL:
672 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
673 return lhs->evalCastToStr() != rhs->evalCastToStr();
674 else
675 return lhs->evalInt() != rhs->evalInt();
676 }
677 return 0;
678 }
679
680 void Relation::dump(int level) {
681 printIndents(level);
682 printf("Relation(\n");
683 lhs->dump(level+1);
684 printIndents(level);
685 switch (type) {
686 case LESS_THAN:
687 printf("LESS_THAN\n");
688 break;
689 case GREATER_THAN:
690 printf("GREATER_THAN\n");
691 break;
692 case LESS_OR_EQUAL:
693 printf("LESS_OR_EQUAL\n");
694 break;
695 case GREATER_OR_EQUAL:
696 printf("GREATER_OR_EQUAL\n");
697 break;
698 case EQUAL:
699 printf("EQUAL\n");
700 break;
701 case NOT_EQUAL:
702 printf("NOT_EQUAL\n");
703 break;
704 }
705 rhs->dump(level+1);
706 printIndents(level);
707 printf(")\n");
708 }
709
710 bool Relation::isConstExpr() const {
711 return lhs->isConstExpr() && rhs->isConstExpr();
712 }
713
714 int Or::evalInt() {
715 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
716 if (pLHS->evalInt()) return 1;
717 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
718 return (pRHS->evalInt()) ? 1 : 0;
719 }
720
721 void Or::dump(int level) {
722 printIndents(level);
723 printf("Or(\n");
724 lhs->dump(level+1);
725 printIndents(level);
726 printf(",\n");
727 rhs->dump(level+1);
728 printIndents(level);
729 printf(")\n");
730 }
731
732 int And::evalInt() {
733 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
734 if (!pLHS->evalInt()) return 0;
735 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
736 return (pRHS->evalInt()) ? 1 : 0;
737 }
738
739 void And::dump(int level) {
740 printIndents(level);
741 printf("And(\n");
742 lhs->dump(level+1);
743 printIndents(level);
744 printf(",\n");
745 rhs->dump(level+1);
746 printIndents(level);
747 printf(")\n");
748 }
749
750 void Not::dump(int level) {
751 printIndents(level);
752 printf("Not(\n");
753 expr->dump(level+1);
754 printIndents(level);
755 printf(")\n");
756 }
757
758 VariableRef ParserContext::variableByName(const String& name) {
759 if (!vartable.count(name)) {
760 return VariableRef();
761 }
762 return vartable.find(name)->second;
763 }
764
765 VariableRef ParserContext::globalVar(const String& name) {
766 if (!vartable.count(name)) {
767 //printf("No global var '%s'\n", name.c_str());
768 //for (std::map<String,VariableRef>::const_iterator it = vartable.begin(); it != vartable.end(); ++it)
769 // printf("-> var '%s'\n", it->first.c_str());
770 return VariableRef();
771 }
772 return vartable.find(name)->second;
773 }
774
775 IntVariableRef ParserContext::globalIntVar(const String& name) {
776 return globalVar(name);
777 }
778
779 StringVariableRef ParserContext::globalStrVar(const String& name) {
780 return globalVar(name);
781 }
782
783 ParserContext::~ParserContext() {
784 destroyScanner();
785 if (globalIntMemory) {
786 delete globalIntMemory;
787 globalIntMemory = NULL;
788 }
789 }
790
791 void ParserContext::addErr(int line, const char* txt) {
792 ParserIssue e;
793 e.type = PARSER_ERROR;
794 e.txt = txt;
795 e.line = line;
796 vErrors.push_back(e);
797 vIssues.push_back(e);
798 }
799
800 void ParserContext::addWrn(int line, const char* txt) {
801 ParserIssue w;
802 w.type = PARSER_WARNING;
803 w.txt = txt;
804 w.line = line;
805 vWarnings.push_back(w);
806 vIssues.push_back(w);
807 }
808
809 bool ParserContext::setPreprocessorCondition(const char* name) {
810 if (builtinPreprocessorConditions.count(name)) return false;
811 if (userPreprocessorConditions.count(name)) return false;
812 userPreprocessorConditions.insert(name);
813 return true;
814 }
815
816 bool ParserContext::resetPreprocessorCondition(const char* name) {
817 if (builtinPreprocessorConditions.count(name)) return false;
818 if (!userPreprocessorConditions.count(name)) return false;
819 userPreprocessorConditions.erase(name);
820 return true;
821 }
822
823 bool ParserContext::isPreprocessorConditionSet(const char* name) {
824 if (builtinPreprocessorConditions.count(name)) return true;
825 return userPreprocessorConditions.count(name);
826 }
827
828 std::vector<ParserIssue> ParserContext::issues() const {
829 return vIssues;
830 }
831
832 std::vector<ParserIssue> ParserContext::errors() const {
833 return vErrors;
834 }
835
836 std::vector<ParserIssue> ParserContext::warnings() const {
837 return vWarnings;
838 }
839
840 VMEventHandler* ParserContext::eventHandler(uint index) {
841 if (!handlers) return NULL;
842 return handlers->eventHandler(index);
843 }
844
845 VMEventHandler* ParserContext::eventHandlerByName(const String& name) {
846 if (!handlers) return NULL;
847 return handlers->eventHandlerByName(name);
848 }
849
850 void ParserContext::registerBuiltInConstIntVariables(const std::map<String,int>& vars) {
851 for (std::map<String,int>::const_iterator it = vars.begin();
852 it != vars.end(); ++it)
853 {
854 ConstIntVariableRef ref = new ConstIntVariable(it->second);
855 vartable[it->first] = ref;
856 }
857 }
858
859 void ParserContext::registerBuiltInIntVariables(const std::map<String,VMIntRelPtr*>& vars) {
860 for (std::map<String,VMIntRelPtr*>::const_iterator it = vars.begin();
861 it != vars.end(); ++it)
862 {
863 BuiltInIntVariableRef ref = new BuiltInIntVariable(it->first, it->second);
864 vartable[it->first] = ref;
865 }
866 }
867
868 void ParserContext::registerBuiltInIntArrayVariables(const std::map<String,VMInt8Array*>& vars) {
869 for (std::map<String,VMInt8Array*>::const_iterator it = vars.begin();
870 it != vars.end(); ++it)
871 {
872 BuiltInIntArrayVariableRef ref = new BuiltInIntArrayVariable(it->first, it->second);
873 vartable[it->first] = ref;
874 }
875 }
876
877 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC