View Single Post
WildCard65
Veteran Member
Join Date: Aug 2013
Location: Canada
Old 08-13-2015 , 10:00   Re: javascript eval funciton
Reply With Quote #3

Use this:
PHP Code:
#define MAX_COMPLEXITY 2147483647

enum Operators
{
    
Operator_None 0,
    
Operator_Add,
    
Operator_Subtract,
    
Operator_Multiply,
    
Operator_Divide,
    
Operator_Exponental,
};

stock void Operate(ArrayList sumArrayArrayList operatorArrayint bracketfloat value)
{
    
float sum sumArray.Get(bracket);
    switch (
operatorArray.Get(bracket))
    {
        case 
Operator_Add:
            
sum += value;
        case 
Operator_Subtract:
            
sum -= value;
        case 
Operator_Multiply:
            
sum *= value;
        case 
Operator_Divide:
        {
            if (
FloatCompare(value, -0.0000001) == && FloatCompare(value0.0000001) == -1)
                return;
            
sum /= value;
        }
        case 
Operator_Exponental:
            
sum Pow(sumvalue);
        default:
            
sum value;
    }
    
sumArray.Set(bracketsum);
    
operatorArray.Set(bracketOperator_None);
}

stock void OperateString(ArrayList sumArrayArrayList operatorArrayint bracketchar[] valueint size)
{
    if (
StrEqual(value""))
        return;
    
Operate(sumArrayoperatorArraybracketStringToFloat(value));
    
strcopy(valuesize"");
}

stock float eval(const char[] formula)
{
    
int bracket 0size strlen(formula);
    
char buffer[2], strValue[1024];
    
ArrayList sumArray = new ArrayList(.startsize=1), operatorArray = new ArrayList(.startsize=1);
    for (
int i 0<= sizei++)
    {
        
buffer[0] = formula[i];
        switch (
buffer[0])
        {
            case 
' '//Ignore whitespace.
                
continue;
            case 
'\0':
            {
                
OperateString(sumArrayoperatorArraybracketstrValuesizeof(strValue));
                break; 
//As far as I know of, this doesn't break the switch statement and instead targets the for loop.
            
}
            case 
'(':
            {
                if (
bracket == MAX_COMPLEXITY)
                {
                    
LogError("Formula %s is too complex for this stock."formula);
                    return 
0.0;
                }
                
bracket++;
                if (
bracket sumArray.Length)
                {
                    
sumArray.Push(0.0);
                    
operatorArray.Push(Operator_None);
                }
                else
                {
                    
sumArray.Set(bracket0.0);
                    
operatorArray.Set(bracketOperator_None);
                }
            }
            case 
')':
            {
                if (
bracket == 0)
                {
                    
LogError("Formula %s has too many ')'."formula);
                    return 
0.0;
                }
                
OperateString(sumArrayoperatorArraybracketstrValuesizeof(strValue));
                
bracket--;
                
Operate(sumArrayoperatorArraybracketsumArray.Get(bracket+1));
            }
            case 
'+''-''*''/''^':
            {
                
OperateString(sumArrayoperatorArraybracketstrValuesizeof(strValue));
                switch (
buffer[0])
                {
                    case 
'+':
                        
operatorArray.Set(bracketOperator_Add);
                    case 
'-':
                        
operatorArray.Set(bracketOperator_Subtract);
                    case 
'*':
                        
operatorArray.Set(bracketOperator_Multiply);
                    case 
'/':
                        
operatorArray.Set(bracketOperator_Divide);
                    case 
'^':
                        
operatorArray.Set(bracketOperator_Exponental);
                }
            }
            case 
'0''1''2''3''4''5''6''7''8''9''.':
                
StrCat(strValuesizeof(strValue), buffer);
            
//Insert case statements for any custom variables here.
            
default:
            {
                
LogError("Formula %s contains invalid character %c"formulabuffer[0]);
                return 
0.0;
            }
        }
    }
    if (
bracket 0)
    {
        
LogError("Formula %s is invalid, missing some ')'"formula);
        return 
0.0;
    }
    
float ret sumArray.Get(0);
    
delete sumArray;
    
delete operatorArray;
    return 
ret;

__________________
WildCard65 is offline