/[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 2594 - (show annotations) (download)
Thu Jun 5 00:16:25 2014 UTC (9 years, 10 months ago) by schoenebeck
File size: 23580 byte(s)
* ScriptVM (WIP): started to integrate real-time instrument script
  support into the sampler engine implementations. The code is
  shared among all sampler engines, however currently only the gig
  file format supports storing instrument scripts (as LinuxSampler
  extension to the original GigaStudio 4 file format).
* gig engine: Added support for loading instrument scripts from .gig
  files.
* ScriptVM (WIP): Implemented built-in script variables %CC, $CC_NUM,
  $EVENT_NOTE, $EVENT_VELOCITY, $VCC_MONO_AT, $VCC_PITCH_BEND.
* ScriptVM (WIP): Implemented execution of script event handler "init".
* ScriptVM (WIP): Implemented execution of script event handler
  "controller".
* Bumped version (1.0.0.svn42).

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 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
717 return pLHS->evalInt() || pRHS->evalInt();
718 }
719
720 void Or::dump(int level) {
721 printIndents(level);
722 printf("Or(\n");
723 lhs->dump(level+1);
724 printIndents(level);
725 printf(",\n");
726 rhs->dump(level+1);
727 printIndents(level);
728 printf(")\n");
729 }
730
731 int And::evalInt() {
732 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
733 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
734 return pLHS->evalInt() && pRHS->evalInt();
735 }
736
737 void And::dump(int level) {
738 printIndents(level);
739 printf("And(\n");
740 lhs->dump(level+1);
741 printIndents(level);
742 printf(",\n");
743 rhs->dump(level+1);
744 printIndents(level);
745 printf(")\n");
746 }
747
748 void Not::dump(int level) {
749 printIndents(level);
750 printf("Not(\n");
751 expr->dump(level+1);
752 printIndents(level);
753 printf(")\n");
754 }
755
756 VariableRef ParserContext::variableByName(const String& name) {
757 if (!vartable.count(name)) {
758 return VariableRef();
759 }
760 return vartable.find(name)->second;
761 }
762
763 VariableRef ParserContext::globalVar(const String& name) {
764 if (!vartable.count(name)) {
765 //printf("No global var '%s'\n", name.c_str());
766 //for (std::map<String,VariableRef>::const_iterator it = vartable.begin(); it != vartable.end(); ++it)
767 // printf("-> var '%s'\n", it->first.c_str());
768 return VariableRef();
769 }
770 return vartable.find(name)->second;
771 }
772
773 IntVariableRef ParserContext::globalIntVar(const String& name) {
774 return globalVar(name);
775 }
776
777 StringVariableRef ParserContext::globalStrVar(const String& name) {
778 return globalVar(name);
779 }
780
781 ParserContext::~ParserContext() {
782 destroyScanner();
783 if (globalIntMemory) {
784 delete globalIntMemory;
785 globalIntMemory = NULL;
786 }
787 }
788
789 void ParserContext::addErr(int line, const char* txt) {
790 ParserIssue e;
791 e.type = PARSER_ERROR;
792 e.txt = txt;
793 e.line = line;
794 vErrors.push_back(e);
795 vIssues.push_back(e);
796 }
797
798 void ParserContext::addWrn(int line, const char* txt) {
799 ParserIssue w;
800 w.type = PARSER_WARNING;
801 w.txt = txt;
802 w.line = line;
803 vWarnings.push_back(w);
804 vIssues.push_back(w);
805 }
806
807 bool ParserContext::setPreprocessorCondition(const char* name) {
808 if (builtinPreprocessorConditions.count(name)) return false;
809 if (userPreprocessorConditions.count(name)) return false;
810 userPreprocessorConditions.insert(name);
811 return true;
812 }
813
814 bool ParserContext::resetPreprocessorCondition(const char* name) {
815 if (builtinPreprocessorConditions.count(name)) return false;
816 if (!userPreprocessorConditions.count(name)) return false;
817 userPreprocessorConditions.erase(name);
818 return true;
819 }
820
821 bool ParserContext::isPreprocessorConditionSet(const char* name) {
822 if (builtinPreprocessorConditions.count(name)) return true;
823 return userPreprocessorConditions.count(name);
824 }
825
826 std::vector<ParserIssue> ParserContext::issues() const {
827 return vIssues;
828 }
829
830 std::vector<ParserIssue> ParserContext::errors() const {
831 return vErrors;
832 }
833
834 std::vector<ParserIssue> ParserContext::warnings() const {
835 return vWarnings;
836 }
837
838 VMEventHandler* ParserContext::eventHandler(uint index) {
839 if (!handlers) return NULL;
840 return handlers->eventHandler(index);
841 }
842
843 VMEventHandler* ParserContext::eventHandlerByName(const String& name) {
844 if (!handlers) return NULL;
845 return handlers->eventHandlerByName(name);
846 }
847
848 void ParserContext::registerBuiltInConstIntVariables(const std::map<String,int>& vars) {
849 for (std::map<String,int>::const_iterator it = vars.begin();
850 it != vars.end(); ++it)
851 {
852 ConstIntVariableRef ref = new ConstIntVariable(it->second);
853 vartable[it->first] = ref;
854 }
855 }
856
857 void ParserContext::registerBuiltInIntVariables(const std::map<String,VMIntRelPtr*>& vars) {
858 for (std::map<String,VMIntRelPtr*>::const_iterator it = vars.begin();
859 it != vars.end(); ++it)
860 {
861 BuiltInIntVariableRef ref = new BuiltInIntVariable(it->first, it->second);
862 vartable[it->first] = ref;
863 }
864 }
865
866 void ParserContext::registerBuiltInIntArrayVariables(const std::map<String,VMInt8Array*>& vars) {
867 for (std::map<String,VMInt8Array*>::const_iterator it = vars.begin();
868 it != vars.end(); ++it)
869 {
870 BuiltInIntArrayVariableRef ref = new BuiltInIntArrayVariable(it->first, it->second);
871 vartable[it->first] = ref;
872 }
873 }
874
875 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC