All pastes #995820 Raw Edit

YSI_math.own

public cpp v1 · immutable
#995820 ·published 2008-04-24 14:50 UTC
rendered paste body
enum 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++;	}}