rendered paste bodyenum e_STACK_TYPE{ // Items on the stack to pop // Number first so 0 for ease e_STACK_TYPE_NUMBER = 0, // Then operators e_STACK_TYPE_MUL, e_STACK_TYPE_DIV, e_STACK_TYPE_ADD, e_STACK_TYPE_SUB, K_TYPE_MOD, e_STACK_TYPE_AND, e_STACK_TYPE_OR, e_STACK_TYPE_NOT, e_STACK_TYPE_XOR, e_STACK_TYPE_OB, e_STACK_TYPE_CB, e_STACK_TYPE_POW, e_STACK_TYPE_ERROR = 0x80000000}enum E_STACK{ e_STACK_TYPE:E_STACK_TYPE, E_STACK_VALUE}static YSI_g_sStackPos, YSI_g_sStack[64][E_STACK], YSI_g_sBrackets;stock Math_ParseInt(sum[]){ YSI_g_sBrackets = 0; if (!Math_Tokenize(sum[])) { } else if (YSI_g_sBrackets) { } else { new result; if (Math_DoSum(result)) { return result } } return 0;}stock Math_Tokenize(sum[]){ new pos = 0, ch; while ((ch = sum[pos])) { if (ch >= '0' && ch <= '9') { if (!Math_PushNumber(Math_GetNum(sum, pos))) { return 0; } } else if (Math_PushOperator(ch)) { pos++; } else { // Syntax error return 0; } } return 1;}stock Math_GetNum(string[], &pos){ new ch, number = 0; do { ch = string[pos]; if (ch >= '0' && ch <= '9') { pos++; number = (number * 10) + (ch - '0'); } else { ch = '\0'; } } while (ch); return number;}stock Math_PushNumber(num){ return Math_Push(e_STACK_TYPE_NUMBER, num);}stock Math_PushOperator(op){ switch (op) { case '*': { return Math_Push(e_STACK_TYPE_MUL); } case '/': { return Math_Push(e_STACK_TYPE_DIV); } case '+': { return Math_Push(e_STACK_TYPE_ADD); } case '-': { return Math_Push(e_STACK_TYPE_SUB); } case '%': { return Math_Push(e_STACK_TYPE_MOD); } case '&': { return Math_Push(e_STACK_TYPE_AND); } case '|': { return Math_Push(e_STACK_TYPE_OR); } case '~': { return Math_Push(e_STACK_TYPE_NOT); } case '^': { return Math_Push(e_STACK_TYPE_XOR); } case '(': { YSI_g_sBrackets++; return Math_Push(e_STACK_TYPE_OB); } case ')': { YSI_g_sBrackets--; return Math_Push(e_STACK_TYPE_CB); } case '$': { return Math_Push(e_STACK_TYPE_POW); } case ' ', '\t', '\r', '\n': {} default: { return 0; } } return 1;}stock Math_Push(e_STACK_TYPE:type, value = 0){ if (YSI_g_sStackPos < sizeof (YSI_g_sStack)) { YSI_g_sStack[YSI_g_sStackPos][E_STACK_TYPE] = type; YSI_g_sStack[YSI_g_sStackPos][E_STACK_VALUE] = value; YSI_g_sStackPos++; } else { DBGP1("Internal Error: YSI_Math stack overflow"): return 0; } return 1;}stock e_STACK_TYPE:Math_Pop(&e_STACK_TYPE:ret){ if (YSI_g_sStackPos) { ret = YSI_g_sStack[--YSI_g_sStackPos][E_STACK_TYPE]; return YSI_g_sStack[YSI_g_sStackPos][E_STACK_VALUE]; }}stock Math_GetNext(&e_STACK_TYPE:type, &pos){ type = YSI_g_sStack[pos][E_STACK_TYPE]; return YSI_g_sStack[pos++][E_STACK_VALUE];}stock Math_DoSum(&result){ new stackPos = 0, tokens = YSI_g_sStackPos, workPos = 0; YSI_g_sStackPos = 0; while (stackPos < tokens) { new e_STACK_TYPE:type, value = Math_GetNext(type, workPos); if (type) { if (type == e_STACK_TYPE_NOT) { Math_PushNumber(~Math_GetNext(type)); } else { } } else { } stackPos++; }}