eS32 readValInstanciation(const eString& s, int start, int end, eU32* parMap, eF32* params, const eF32* prevParams) { int pos = start; int v = 0; if((pos >= end) || (s.at(pos) != '(')) { return pos; } else { pos++; while((pos < end) && (s.at(pos) != ')')) { if(s.at(pos) == ',') { pos++; continue; } pos = calculateTerm(s, pos, end, parMap, prevParams, params[v++]); eASSERT(pos != -1); } } return pos + 1; }
// calculates the expression in the string // returns the position after second number eS32 calculateTerm(const eString& s, int start, int end, const eU32* parMap, const eF32* params, eF32& result) { int pos = start; eF32 tuple[] = {0,0}; eU32 tpos = 0; eU32 op = 0; eU32 c; while((pos < end) && ((c = s.at(pos)) != ',') && (c != ')')) { if(c == '(') { pos = calculateTerm(s, pos + 1, end, parMap, params, tuple[tpos]); eASSERT(pos != -1); pos++; } else { eS32 oldPos = pos; // try to read constant eF32 number = 0; eF32 v = 1.0f; while(pos < end) { int cc = s.at(pos) - '0'; if(cc == '.' - '0') v = 0.1f; else if((eU32)cc <= 9) {// is a number if(v >= 1.0f) number = number * 10.0f + cc; else { number += v * cc; v /= 10.0f; } tuple[tpos] = number; } else break; pos++; } // try to read symbol eASSERT(parMap != eNULL); for(eU32 i = 0; i < LSYS_PAR_MAX; i++) if(parMap[i] == c) { tuple[tpos] = params[i]; pos++; } if(pos == oldPos) { // is an operator pos++; op = c; tpos++; }; } } switch(op) { case '+': result = tuple[0] + tuple[1]; break; case '-': result = tuple[0] - tuple[1]; break; case '*': result = tuple[0] * tuple[1]; break; case '/': result = tuple[0] / tuple[1]; break; case '<': result = (tuple[0] < tuple[1]) ? 1.0f : 0.0f; break; case '=': result = (tuple[0] == tuple[1]) ? 1.0f : 0.0f; break; case '>': result = (tuple[0] > tuple[1]) ? 1.0f : 0.0f; break; case '^': result = ePow(tuple[0], tuple[1]); break; default: result = tuple[0]; // single term } return pos; }