Example #1
0
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;
}
Example #2
0
// 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;
}