/[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 2611 - (hide 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 schoenebeck 2581 /*
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 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     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 schoenebeck 2588 //printf("globalIntVar parserctx=0x%lx memPOS=%d\n", ctx, memPos);
279     assert(ctx);
280 schoenebeck 2581 }
281    
282 schoenebeck 2588 inline static int postfixInc(int& object, int incBy) {
283     const int i = object;
284     object += incBy;
285     return i;
286     }
287    
288 schoenebeck 2581 IntVariable::IntVariable(ParserContext* ctx, bool polyphonic, bool bConst, int size)
289 schoenebeck 2588 : Variable(ctx, !ctx ? 0 : polyphonic ? postfixInc(ctx->polyphonicIntVarCount, size) : postfixInc(ctx->globalIntVarCount, size), bConst),
290 schoenebeck 2581 polyphonic(polyphonic)
291     {
292 schoenebeck 2588 //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 schoenebeck 2581 }
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 schoenebeck 2588 if (polyphonic) {
311     //printf("evalInt() poly memPos=%d execCtx=0x%lx\n", memPos, (uint64_t)context->execContext);
312 schoenebeck 2581 return context->execContext->polyphonicIntMemory[memPos];
313 schoenebeck 2588 }
314 schoenebeck 2581 return (*context->globalIntMemory)[memPos];
315     }
316    
317     void IntVariable::dump(int level) {
318     printIndents(level);
319 schoenebeck 2588 //printf("IntVariable memPos=%d\n", memPos);
320 schoenebeck 2581 }
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 schoenebeck 2594 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 schoenebeck 2581 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 schoenebeck 2594 IntArrayVariable::IntArrayVariable(ParserContext* ctx, bool bConst)
396     : Variable(ctx, 0, bConst)
397     {
398     }
399    
400 schoenebeck 2581 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 schoenebeck 2594 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 schoenebeck 2581 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 schoenebeck 2611 if (pLHS->evalInt()) return 1;
717 schoenebeck 2581 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
718 schoenebeck 2611 return (pRHS->evalInt()) ? 1 : 0;
719 schoenebeck 2581 }
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 schoenebeck 2611 if (!pLHS->evalInt()) return 0;
735     IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
736     return (pRHS->evalInt()) ? 1 : 0;
737 schoenebeck 2581 }
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 schoenebeck 2588 ParserContext::~ParserContext() {
784     destroyScanner();
785     if (globalIntMemory) {
786     delete globalIntMemory;
787     globalIntMemory = NULL;
788     }
789     }
790    
791 schoenebeck 2581 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 schoenebeck 2588 vErrors.push_back(e);
797     vIssues.push_back(e);
798 schoenebeck 2581 }
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 schoenebeck 2588 vWarnings.push_back(w);
806     vIssues.push_back(w);
807 schoenebeck 2581 }
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 schoenebeck 2588 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 schoenebeck 2594 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 schoenebeck 2581 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC