/[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 2581 - (show annotations) (download)
Fri May 30 12:48:05 2014 UTC (9 years, 10 months ago) by schoenebeck
File size: 20224 byte(s)
* (WIP) Implemented parser and VM for upcoming new real-time instrument
  script support. It needs yet to be integrated into the sampler's
  sampler engines. You can toy around for now with the command line tool
  "ls_instr_script" and i.e. examples showing the core language features
  under src/scriptvm/examples/.
* Bumped version (1.0.0.svn41).

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
15 namespace LinuxSampler {
16
17 bool isNoOperation(StatementRef statement) {
18 NoOperation* noOp = dynamic_cast<NoOperation*>(&*statement);
19 return noOp;
20 }
21
22 Node::Node() {
23 }
24
25 Node::~Node() {
26 }
27
28 void Node::printIndents(int n) {
29 for (int i = 0; i < n; ++i) printf(" ");
30 fflush(stdout);
31 }
32
33 String IntExpr::evalCastToStr() {
34 return ToString(evalInt());
35 }
36
37 int IntLiteral::evalInt() {
38 return value;
39 }
40
41 void IntLiteral::dump(int level) {
42 printIndents(level);
43 printf("IntLiteral %d\n", value);
44 }
45
46 void StringLiteral::dump(int level) {
47 printIndents(level);
48 printf("StringLiteral: '%s'\n", value.c_str());
49 }
50
51 int Add::evalInt() {
52 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
53 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
54 return (pLHS && pRHS) ? pLHS->evalInt() + pRHS->evalInt() : 0;
55 }
56
57 void Add::dump(int level) {
58 printIndents(level);
59 printf("Add(\n");
60 lhs->dump(level+1);
61 printIndents(level);
62 printf(",\n");
63 rhs->dump(level+1);
64 printIndents(level);
65 printf(")\n");
66 }
67
68 int Sub::evalInt() {
69 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
70 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
71 return (pLHS && pRHS) ? pLHS->evalInt() - pRHS->evalInt() : 0;
72 }
73
74 void Sub::dump(int level) {
75 printIndents(level);
76 printf("Sub(\n");
77 lhs->dump(level+1);
78 printIndents(level);
79 printf(",\n");
80 rhs->dump(level+1);
81 printIndents(level);
82 printf(")\n");
83 }
84
85 int Mul::evalInt() {
86 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
87 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
88 return (pLHS && pRHS) ? pLHS->evalInt() * pRHS->evalInt() : 0;
89 }
90
91 void Mul::dump(int level) {
92 printIndents(level);
93 printf("Mul(\n");
94 lhs->dump(level+1);
95 printIndents(level);
96 printf(",\n");
97 rhs->dump(level+1);
98 printIndents(level);
99 printf(")\n");
100 }
101
102 int Div::evalInt() {
103 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
104 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
105 return (pLHS && pRHS) ? pRHS->evalInt() == 0 ? 0 : pLHS->evalInt() / pRHS->evalInt() : 0;
106 }
107
108 void Div::dump(int level) {
109 printIndents(level);
110 printf("Div(\n");
111 lhs->dump(level+1);
112 printIndents(level);
113 printf(",\n");
114 rhs->dump(level+1);
115 printIndents(level);
116 printf(")\n");
117 }
118
119 int Mod::evalInt() {
120 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
121 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
122 return (pLHS && pRHS) ? pLHS->evalInt() % pRHS->evalInt() : 0;
123 }
124
125 void Mod::dump(int level) {
126 printIndents(level);
127 printf("Mod(\n");
128 lhs->dump(level+1);
129 printIndents(level);
130 printf(",\n");
131 rhs->dump(level+1);
132 printIndents(level);
133 printf(")\n");
134 }
135
136 void Args::dump(int level) {
137 printIndents(level);
138 printf("Args(\n");
139 for (std::vector<ExpressionRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
140 (*it)->dump(level+1);
141 }
142 printIndents(level);
143 printf(")\n");
144 }
145
146 EventHandlers::EventHandlers() {
147 //printf("EventHandlers::Constructor 0x%lx\n", (long long)this);
148 }
149
150 EventHandlers::~EventHandlers() {
151 }
152
153 void EventHandlers::add(EventHandlerRef arg) {
154 args.push_back(arg);
155 }
156
157 void EventHandlers::dump(int level) {
158 printIndents(level);
159 printf("EventHandlers {\n");
160 for (std::vector<EventHandlerRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
161 (*it)->dump(level+1);
162 }
163 printIndents(level);
164 printf("}\n");
165 }
166
167 EventHandler* EventHandlers::eventHandlerByName(const String& name) const {
168 for (int i = 0; i < args.size(); ++i)
169 if (args.at(i)->eventHandlerName() == name)
170 return const_cast<EventHandler*>(&*args.at(i));
171 return NULL;
172 }
173
174 EventHandler* EventHandlers::eventHandler(uint index) const {
175 if (index >= args.size()) return NULL;
176 return const_cast<EventHandler*>(&*args.at(index));
177 }
178
179 Assignment::Assignment(VariableRef variable, ExpressionRef value)
180 : variable(variable), value(value)
181 {
182 }
183
184 void Assignment::dump(int level) {
185 printIndents(level);
186 printf("Assignment\n");
187 }
188
189 StmtFlags_t Assignment::exec() {
190 if (!variable)
191 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
192 variable->assign(&*value);
193 return STMT_SUCCESS;
194 }
195
196 void EventHandler::dump(int level) {
197 printIndents(level);
198 printf("EventHandler {\n");
199 statements->dump(level+1);
200 printIndents(level);
201 printf("}\n");
202 }
203
204 void Statements::dump(int level) {
205 printIndents(level);
206 printf("Statements {\n");
207 for (std::vector<StatementRef>::iterator it = args.begin() ; it != args.end() ; ++it) {
208 (*it)->dump(level+1);
209 }
210 printIndents(level);
211 printf("}\n");
212 }
213
214 Statement* Statements::statement(uint i) {
215 if (i >= args.size()) return NULL;
216 return &*args.at(i);
217 }
218
219 void FunctionCall::dump(int level) {
220 printIndents(level);
221 printf("FunctionCall '%s' args={\n", functionName.c_str());
222 args->dump(level+1);
223 printIndents(level);
224 printf("}\n");
225 }
226
227 ExprType_t FunctionCall::exprType() const {
228 if (!fn) return EMPTY_EXPR;
229 return fn->returnType();
230 }
231
232 VMFnResult* FunctionCall::execVMFn() {
233 if (!fn) return NULL;
234 // assuming here that all argument checks (amount and types) have been made
235 // at parse time, to avoid time intensive checks on each function call
236 return fn->exec(dynamic_cast<VMFnArgs*>(&*args));
237 }
238
239 StmtFlags_t FunctionCall::exec() {
240 VMFnResult* result = execVMFn();
241 if (!result)
242 return StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
243 return result->resultFlags();
244 }
245
246 int FunctionCall::evalInt() {
247 VMFnResult* result = execVMFn();
248 if (!result) return 0;
249 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
250 if (!intExpr) return 0;
251 return intExpr->evalInt();
252 }
253
254 String FunctionCall::evalStr() {
255 VMFnResult* result = execVMFn();
256 if (!result) return "";
257 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
258 if (!strExpr) return "";
259 return strExpr->evalStr();
260 }
261
262 String FunctionCall::evalCastToStr() {
263 VMFnResult* result = execVMFn();
264 if (!result) return "";
265 if (result->resultValue()->exprType() == STRING_EXPR) {
266 VMStringExpr* strExpr = dynamic_cast<VMStringExpr*>(result->resultValue());
267 return strExpr ? strExpr->evalStr() : "";
268 } else {
269 VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(result->resultValue());
270 return intExpr ? ToString(intExpr->evalInt()) : "";
271 }
272 }
273
274 IntVariable::IntVariable(ParserContext* ctx)
275 : Variable(ctx, ctx ? ctx->globalIntVarCount++ : 0, false), polyphonic(false)
276 {
277 }
278
279 IntVariable::IntVariable(ParserContext* ctx, bool polyphonic, bool bConst, int size)
280 : Variable(ctx, !ctx ? 0 : polyphonic ? ctx->polyphonicIntVarCount += size : ctx->globalIntVarCount += size, bConst),
281 polyphonic(polyphonic)
282 {
283 }
284
285 void IntVariable::assign(Expression* expr) {
286 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
287 if (intExpr)
288 if (polyphonic)
289 context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt();
290 else
291 (*context->globalIntMemory)[memPos] = intExpr->evalInt();
292 }
293
294 int IntVariable::evalInt() {
295 //printf("IntVariable::eval pos=%d\n", memPos);
296 if (polyphonic)
297 return context->execContext->polyphonicIntMemory[memPos];
298 return (*context->globalIntMemory)[memPos];
299 }
300
301 void IntVariable::dump(int level) {
302 printIndents(level);
303 printf("IntVariable memPos=%d\n", memPos);
304 }
305
306 //ConstIntVariable::ConstIntVariable(ParserContext* ctx, int value)
307 ConstIntVariable::ConstIntVariable(int value)
308 : IntVariable(NULL,false,true), value(value)
309 {
310 }
311
312 void ConstIntVariable::assign(Expression* expr) {
313 // ignore assignment
314 /*
315 printf("ConstIntVariable::assign()\n");
316 IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
317 if (intExpr) {
318 value = intExpr->evalInt();
319 }
320 */
321 }
322
323 int ConstIntVariable::evalInt() {
324 return value;
325 }
326
327 void ConstIntVariable::dump(int level) {
328 printIndents(level);
329 printf("ConstIntVariable val=%d\n", value);
330 }
331
332 PolyphonicIntVariable::PolyphonicIntVariable(ParserContext* ctx)
333 : IntVariable(ctx,true,false)
334 {
335 }
336
337 void PolyphonicIntVariable::dump(int level) {
338 printIndents(level);
339 printf("PolyphonicIntVariable\n");
340 }
341
342 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size)
343 : Variable(ctx, 0, false)
344 {
345 values.resize(size);
346 memset(&values[0], 0, size * sizeof(int));
347 }
348
349 IntArrayVariable::IntArrayVariable(ParserContext* ctx, int size, ArgsRef values)
350 : Variable(ctx, 0, false)
351 {
352 this->values.resize(size);
353 for (int i = 0; i < values->argsCount(); ++i) {
354 VMIntExpr* expr = dynamic_cast<VMIntExpr*>(values->arg(i));
355 if (expr) this->values[i] = expr->evalInt();
356 }
357 }
358
359 int IntArrayVariable::evalIntElement(uint i) {
360 if (i >= values.size()) return 0;
361 return values[i];
362 }
363
364 void IntArrayVariable::assignIntElement(uint i, int value) {
365 if (i >= values.size()) return;
366 values[i] = value;
367 }
368
369 void IntArrayVariable::dump(int level) {
370 printIndents(level);
371 printf("IntArray(");
372 for (int i = 0; i < values.size(); ++i) {
373 if (i % 12 == 0) {
374 printf("\n");
375 printIndents(level+1);
376 }
377 printf("%d, ", values[i]);
378 }
379 printIndents(level);
380 printf(")\n");
381 }
382
383 IntArrayElement::IntArrayElement(IntArrayVariableRef array, IntExprRef arrayIndex)
384 : IntVariable(NULL, false, false, 0), array(array), index(arrayIndex)
385 {
386 }
387
388 void IntArrayElement::assign(Expression* expr) {
389 IntExpr* valueExpr = dynamic_cast<IntExpr*>(expr);
390 if (!valueExpr) return;
391 int value = valueExpr->evalInt();
392
393 if (!index) return;
394 int idx = index->evalInt();
395 if (idx < 0 || idx >= array->arraySize()) return;
396
397 array->assignIntElement(idx, value);
398 }
399
400 int IntArrayElement::evalInt() {
401 if (!index) return 0;
402 int idx = index->evalInt();
403 if (idx < 0 || idx >= array->arraySize()) return 0;
404
405 return array->evalIntElement(idx);
406 }
407
408 void IntArrayElement::dump(int level) {
409 printIndents(level);
410 printf("IntArrayElement\n");
411 }
412
413 StringVariable::StringVariable(ParserContext* ctx)
414 : Variable(ctx,ctx->globalStrVarCount++,false)
415 {
416 }
417
418 StringVariable::StringVariable(ParserContext* ctx, bool bConst)
419 : Variable(ctx,0,bConst)
420 {
421 }
422
423 void StringVariable::assign(Expression* expr) {
424 StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
425 (*context->globalStrMemory)[memPos] = strExpr->evalStr();
426 }
427
428 String StringVariable::evalStr() {
429 //printf("StringVariable::eval pos=%d\n", memPos);
430 return (*context->globalStrMemory)[memPos];
431 }
432
433 void StringVariable::dump(int level) {
434 printIndents(level);
435 printf("StringVariable memPos=%d\n", memPos);
436 }
437
438 ConstStringVariable::ConstStringVariable(ParserContext* ctx, String _value)
439 : StringVariable(ctx,true), value(_value)
440 {
441 }
442
443 void ConstStringVariable::assign(Expression* expr) {
444 // ignore assignment
445 // StringExpr* strExpr = dynamic_cast<StringExpr*>(expr);
446 // if (strExpr) value = strExpr->evalStr();
447 }
448
449 String ConstStringVariable::evalStr() {
450 return value;
451 }
452
453 void ConstStringVariable::dump(int level) {
454 printIndents(level);
455 printf("ConstStringVariable val='%s'\n", value.c_str());
456 }
457
458 void If::dump(int level) {
459 printIndents(level);
460 if (ifStatements && elseStatements)
461 printf("if cond stmts1 else stmts2 end if\n");
462 else if (ifStatements)
463 printf("if cond statements end if\n");
464 else
465 printf("if [INVALID]\n");
466 }
467
468 int If::evalBranch() {
469 if (condition->evalInt()) return 0;
470 if (elseStatements) return 1;
471 return -1;
472 }
473
474 Statements* If::branch(uint i) const {
475 if (i == 0) return (Statements*) &*ifStatements;
476 if (i == 1) return (elseStatements) ? (Statements*) &*elseStatements : NULL;
477 return NULL;
478 }
479
480 void SelectCase::dump(int level) {
481 printIndents(level);
482 if (select)
483 if (select->isConstExpr())
484 printf("Case select %d\n", select->evalInt());
485 else
486 printf("Case select [runtime expr]\n");
487 else
488 printf("Case select NULL\n");
489 for (int i = 0; i < branches.size(); ++i) {
490 printIndents(level+1);
491 CaseBranch& branch = branches[i];
492 if (branch.from && branch.to)
493 if (branch.from->isConstExpr() && branch.to->isConstExpr())
494 printf("case %d to %d\n", branch.from->evalInt(), branch.to->evalInt());
495 else if (branch.from->isConstExpr() && !branch.to->isConstExpr())
496 printf("case %d to [runtime expr]\n", branch.from->evalInt());
497 else if (!branch.from->isConstExpr() && branch.to->isConstExpr())
498 printf("case [runtime expr] to %d\n", branch.to->evalInt());
499 else
500 printf("case [runtime expr] to [runtime expr]\n");
501 else if (branch.from)
502 if (branch.from->isConstExpr())
503 printf("case %d\n", branch.from->evalInt());
504 else
505 printf("case [runtime expr]\n");
506 else
507 printf("case NULL\n");
508 }
509 }
510
511 int SelectCase::evalBranch() {
512 int value = select->evalInt();
513 for (int i = 0; i < branches.size(); ++i) {
514 if (branches.at(i).from && branches.at(i).to) { // i.e. "case 4 to 7" ...
515 if (branches.at(i).from->evalInt() <= value &&
516 branches.at(i).to->evalInt() >= value) return i;
517 } else { // i.e. "case 5" ...
518 if (branches.at(i).from->evalInt() == value) return i;
519 }
520 }
521 return -1;
522 }
523
524 Statements* SelectCase::branch(uint i) const {
525 if (i < branches.size())
526 return const_cast<Statements*>( &*branches[i].statements );
527 return NULL;
528 }
529
530 // void Case::addBranch(IntExprRef condition, StatementsRef statements) {
531 // CaseBranchRef b = new CaseBranchRef;
532 // b->from = condition;
533 // b->statements = statements;
534 // branches.push_back(b);
535 // }
536 //
537 // void Case::addBranch(IntExprRef from, IntExprRef to, StatementsRef statements) {
538 // CaseBranchRef b = new CaseBranchRef;
539 // b->from = from;
540 // b->to = to;
541 // b->statements = statements;
542 // branches.push_back(b);
543 // }
544 //
545 // void Case::addBranch(CaseBranchRef branch) {
546 // branches.push_back(branch);
547 // }
548
549 void While::dump(int level) {
550 printIndents(level);
551 if (m_condition)
552 if (m_condition->isConstExpr())
553 printf("while (%d) {\n", m_condition->evalInt());
554 else
555 printf("while ([runtime expr]) {\n");
556 else
557 printf("while ([INVALID]) {\n");
558 m_statements->dump(level+1);
559 printIndents(level);
560 printf("}\n");
561 }
562
563 Statements* While::statements() const {
564 return (m_statements) ? const_cast<Statements*>( &*m_statements ) : NULL;
565 }
566
567 bool While::evalLoopStartCondition() {
568 if (!m_condition) return false;
569 return m_condition->evalInt();
570 }
571
572 void Neg::dump(int level) {
573 printIndents(level);
574 printf("Negative Expr\n");
575 }
576
577 String ConcatString::evalStr() {
578 return lhs->evalCastToStr() + rhs->evalCastToStr();
579 }
580
581 void ConcatString::dump(int level) {
582 printIndents(level);
583 printf("ConcatString(\n");
584 lhs->dump(level+1);
585 printIndents(level);
586 printf(",\n");
587 rhs->dump(level+1);
588 printIndents(level);
589 printf(")");
590 }
591
592 bool ConcatString::isConstExpr() const {
593 return lhs->isConstExpr() && rhs->isConstExpr();
594 }
595
596 int Relation::evalInt() {
597 switch (type) {
598 case LESS_THAN:
599 return lhs->evalInt() < rhs->evalInt();
600 case GREATER_THAN:
601 return lhs->evalInt() > rhs->evalInt();
602 case LESS_OR_EQUAL:
603 return lhs->evalInt() <= rhs->evalInt();
604 case GREATER_OR_EQUAL:
605 return lhs->evalInt() >= rhs->evalInt();
606 case EQUAL:
607 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
608 return lhs->evalCastToStr() == rhs->evalCastToStr();
609 else
610 return lhs->evalInt() == rhs->evalInt();
611 case NOT_EQUAL:
612 if (lhs->exprType() == STRING_EXPR || rhs->exprType() == STRING_EXPR)
613 return lhs->evalCastToStr() != rhs->evalCastToStr();
614 else
615 return lhs->evalInt() != rhs->evalInt();
616 }
617 return 0;
618 }
619
620 void Relation::dump(int level) {
621 printIndents(level);
622 printf("Relation(\n");
623 lhs->dump(level+1);
624 printIndents(level);
625 switch (type) {
626 case LESS_THAN:
627 printf("LESS_THAN\n");
628 break;
629 case GREATER_THAN:
630 printf("GREATER_THAN\n");
631 break;
632 case LESS_OR_EQUAL:
633 printf("LESS_OR_EQUAL\n");
634 break;
635 case GREATER_OR_EQUAL:
636 printf("GREATER_OR_EQUAL\n");
637 break;
638 case EQUAL:
639 printf("EQUAL\n");
640 break;
641 case NOT_EQUAL:
642 printf("NOT_EQUAL\n");
643 break;
644 }
645 rhs->dump(level+1);
646 printIndents(level);
647 printf(")\n");
648 }
649
650 bool Relation::isConstExpr() const {
651 return lhs->isConstExpr() && rhs->isConstExpr();
652 }
653
654 int Or::evalInt() {
655 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
656 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
657 return pLHS->evalInt() || pRHS->evalInt();
658 }
659
660 void Or::dump(int level) {
661 printIndents(level);
662 printf("Or(\n");
663 lhs->dump(level+1);
664 printIndents(level);
665 printf(",\n");
666 rhs->dump(level+1);
667 printIndents(level);
668 printf(")\n");
669 }
670
671 int And::evalInt() {
672 IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
673 IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;
674 return pLHS->evalInt() && pRHS->evalInt();
675 }
676
677 void And::dump(int level) {
678 printIndents(level);
679 printf("And(\n");
680 lhs->dump(level+1);
681 printIndents(level);
682 printf(",\n");
683 rhs->dump(level+1);
684 printIndents(level);
685 printf(")\n");
686 }
687
688 void Not::dump(int level) {
689 printIndents(level);
690 printf("Not(\n");
691 expr->dump(level+1);
692 printIndents(level);
693 printf(")\n");
694 }
695
696 VariableRef ParserContext::variableByName(const String& name) {
697 if (!vartable.count(name)) {
698 return VariableRef();
699 }
700 return vartable.find(name)->second;
701 }
702
703 VariableRef ParserContext::globalVar(const String& name) {
704 if (!vartable.count(name)) {
705 //printf("No global var '%s'\n", name.c_str());
706 //for (std::map<String,VariableRef>::const_iterator it = vartable.begin(); it != vartable.end(); ++it)
707 // printf("-> var '%s'\n", it->first.c_str());
708 return VariableRef();
709 }
710 return vartable.find(name)->second;
711 }
712
713 IntVariableRef ParserContext::globalIntVar(const String& name) {
714 return globalVar(name);
715 }
716
717 StringVariableRef ParserContext::globalStrVar(const String& name) {
718 return globalVar(name);
719 }
720
721 void ParserContext::addErr(int line, const char* txt) {
722 ParserIssue e;
723 e.type = PARSER_ERROR;
724 e.txt = txt;
725 e.line = line;
726 errors.push_back(e);
727 issues.push_back(e);
728 }
729
730 void ParserContext::addWrn(int line, const char* txt) {
731 ParserIssue w;
732 w.type = PARSER_WARNING;
733 w.txt = txt;
734 w.line = line;
735 warnings.push_back(w);
736 issues.push_back(w);
737 }
738
739 bool ParserContext::setPreprocessorCondition(const char* name) {
740 if (builtinPreprocessorConditions.count(name)) return false;
741 if (userPreprocessorConditions.count(name)) return false;
742 userPreprocessorConditions.insert(name);
743 return true;
744 }
745
746 bool ParserContext::resetPreprocessorCondition(const char* name) {
747 if (builtinPreprocessorConditions.count(name)) return false;
748 if (!userPreprocessorConditions.count(name)) return false;
749 userPreprocessorConditions.erase(name);
750 return true;
751 }
752
753 bool ParserContext::isPreprocessorConditionSet(const char* name) {
754 if (builtinPreprocessorConditions.count(name)) return true;
755 return userPreprocessorConditions.count(name);
756 }
757
758 } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC