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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2942 - (hide 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 schoenebeck 2581 /*
2 schoenebeck 2935 * Copyright (c) 2014 - 2016 Christian Schoenebeck and Andreas Persson
3 schoenebeck 2581 *
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 schoenebeck 2588 #include <assert.h>
15 schoenebeck 2581
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 schoenebeck 2645 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 schoenebeck 2581 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 schoenebeck 2645 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 schoenebeck 2581 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 schoenebeck 2645 EventHandler::EventHandler(StatementsRef statements) {
212     this->statements = statements;
213     usingPolyphonics = statements->isPolyphonic();
214     }
215    
216 schoenebeck 2581 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 schoenebeck 2645 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 schoenebeck 2942 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 schoenebeck 2581 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 schoenebeck 2588 //printf("globalIntVar parserctx=0x%lx memPOS=%d\n", ctx, memPos);
336     assert(ctx);
337 schoenebeck 2581 }
338    
339 schoenebeck 2588 inline static int postfixInc(int& object, int incBy) {
340     const int i = object;
341     object += incBy;
342     return i;
343     }
344    
345 schoenebeck 2581 IntVariable::IntVariable(ParserContext* ctx, bool polyphonic, bool bConst, int size)
346 schoenebeck 2588 : Variable(ctx, !ctx ? 0 : polyphonic ? postfixInc(ctx->polyphonicIntVarCount, size) : postfixInc(ctx->globalIntVarCount, size), bConst),
347 schoenebeck 2581 polyphonic(polyphonic)
348     {
349 schoenebeck 2588 //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 schoenebeck 2581 }
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 schoenebeck 2588 if (polyphonic) {
368     //printf("evalInt() poly memPos=%d execCtx=0x%lx\n", memPos, (uint64_t)context->execContext);
369 schoenebeck 2581 return context->execContext->polyphonicIntMemory[memPos];
370 schoenebeck 2588 }
371 schoenebeck 2581 return (*context->globalIntMemory)[memPos];
372     }
373    
374     void IntVariable::dump(int level) {
375     printIndents(level);
376 schoenebeck 2588 //printf("IntVariable memPos=%d\n", memPos);
377 schoenebeck 2581 }
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 schoenebeck 2594 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 schoenebeck 2581 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 schoenebeck 2594 IntArrayVariable::IntArrayVariable(ParserContext* ctx, bool bConst)
453     : Variable(ctx, 0, bConst)
454     {
455     }
456    
457 schoenebeck 2581 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 schoenebeck 2594 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 schoenebeck 2581 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 schoenebeck 2645 bool If::isPolyphonic() const {
598     if (condition->isPolyphonic() || ifStatements->isPolyphonic())
599     return true;
600     return elseStatements ? elseStatements->isPolyphonic() : false;
601     }
602    
603 schoenebeck 2581 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 schoenebeck 2645 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 schoenebeck 2581 // 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 schoenebeck 2611 if (pLHS->evalInt()) return 1;
788 schoenebeck 2581 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
789 schoenebeck 2611 return (pRHS->evalInt()) ? 1 : 0;
790 schoenebeck 2581 }
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 schoenebeck 2935 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 schoenebeck 2581 int And::evalInt() {
821     IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
822 schoenebeck 2611 if (!pLHS->evalInt()) return 0;
823     IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
824     return (pRHS->evalInt()) ? 1 : 0;
825 schoenebeck 2581 }
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 schoenebeck 2935 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 schoenebeck 2581 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 schoenebeck 2935 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 schoenebeck 2581 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 schoenebeck 2588 ParserContext::~ParserContext() {
897     destroyScanner();
898     if (globalIntMemory) {
899     delete globalIntMemory;
900     globalIntMemory = NULL;
901     }
902     }
903    
904 schoenebeck 2889 void ParserContext::addErr(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
905 schoenebeck 2581 ParserIssue e;
906     e.type = PARSER_ERROR;
907     e.txt = txt;
908 schoenebeck 2889 e.firstLine = firstLine;
909     e.lastLine = lastLine;
910     e.firstColumn = firstColumn;
911     e.lastColumn = lastColumn;
912 schoenebeck 2588 vErrors.push_back(e);
913     vIssues.push_back(e);
914 schoenebeck 2581 }
915    
916 schoenebeck 2889 void ParserContext::addWrn(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
917 schoenebeck 2581 ParserIssue w;
918     w.type = PARSER_WARNING;
919     w.txt = txt;
920 schoenebeck 2889 w.firstLine = firstLine;
921     w.lastLine = lastLine;
922     w.firstColumn = firstColumn;
923     w.lastColumn = lastColumn;
924 schoenebeck 2588 vWarnings.push_back(w);
925     vIssues.push_back(w);
926 schoenebeck 2581 }
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 schoenebeck 2588 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 schoenebeck 2594 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 schoenebeck 2942 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 schoenebeck 2581 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC