Contributor: RYAN THOMPSON (* From: RYAN THOMPSON Subj: RE: MATH PARSING *) Function Evaluate(Equation : String) : String; Var Temp, Operand, Front, Rear : String; X, Y, Par1, Par2 : Integer; Value1, Value2, Valtemp : Real; OperOK, BadExp : Boolean; Begin If Equation = Error then begin Evaluate:= Error; Exit; end; While Pos(' ', Equation) > 0 do Delete(Equation, Pos(' ', Equation), 1); repeat X:= 1; Par1:= 0; Par2:= 0; repeat If Equation[X] = '(' then Par1:= X; If Equation[X] = ')' then Par2:= X; Inc(X); until (X = Length(Equation) + 1) or ((Par1 > 0) and (Par2 > 0)); If (Par2 > 0) and (Par2+1 < Length(Equation)) and (Equation[Par2 + 1] = '(') then Insert('x', Equation, Par2 + 1); If (Par2 > Par1) then begin Temp:= Equation; Rear:= Copy(Temp, Par2 + 1, 255); Delete(Temp, Par2, 255); Front:= Copy(Temp, 1, Par1 - 1); Delete(Temp, 1, Par1); Temp:= Evaluate(Temp); Equation:= Front + Temp + Rear; While Pos(' ', Equation) > 0 do Delete(Equation, Pos(' ', Equation), 1); end else if Par2 < Par1 then begin Evaluate:= Error; Exit; end; until Par2 <= Par1; Value1:= 0; repeat If (Length(Equation) > 0) then begin Operand:= ''; X:= 1; While ((Equation[X] < '0') or (Equation[X] > '9')) and (Equation[X] <> '.') and (X < Length(Equation) + 1) do begin Operand:= Operand + Equation[X]; Inc(X); end; Delete(Equation, 1, X - 1); end; If Length(Equation) > 0 then begin Temp:= '0'; X:= 1; while (((Equation[X] <= '9') and (Equation[X] >= '0')) or (Equation[X] = '.')) and (X < Length(Equation) + 1) do begin Temp:= Temp + Equation[X]; Inc(X); end; If (X > 10) and (Pos('.', Equation) > 9) then begin Evaluate:= Error; Exit; end; Delete(Equation, 1, X - 1); Val(Temp, Value2, Y); If Y <> 0 then begin Evaluate:= Error; Exit; end; end; Temp:= ''; If Length(Operand) > 1 then begin Temp:= Operand; Delete(Temp, Pos('+', Temp), 1); If Pos('-', Temp) <> Length(Temp) then Delete(Temp, Pos('-', Temp), 1); Delete(Temp, Pos('x', Temp), 1); Delete(Temp, Pos('/', Temp), 1); Delete(Temp, Pos('^', Temp), 1); If Pos('+', Operand) = 1 then Operand:= '+' else if Pos('-', Operand) = 1 then Operand:= '-' else if Pos('x', Operand) = 1 then Operand:= 'x' else if Pos('/', Operand) = 1 then Operand:= '/' else if Pos('^', Operand) = 1 then Operand:= '^' else Operand:= ''; end; OperOK:= False; If Temp = 'SIN' then begin OperOK:= True; Value2:= Sin(Rad(Value2)); end; If Temp = 'COS' then begin OperOK:= True; Value2:= Cos(Rad(Value2)); end; If Temp = 'TAN' then if Cos(Rad(Value2)) <> 0 then begin OperOK:= True; Value2:= (Sin(Rad(Value2)) / Cos(Rad(Value2))); end else begin Evaluate:= Error; Exit; end; If Temp = 'SQR' then begin OperOK:= True; Value2:= Sqrt(Value2); end; If Temp = 'ASIN' then begin OperOK:= True; Valtemp:= 1 - Sqr(Value2); If Valtemp < 0 then begin Evaluate:= Error; Exit; end else If Sqrt(Valtemp) = 0 then Value2:= 90 else Value2:= Deg(ArcTan(Value2 / Sqrt(Valtemp))); end; If Temp = 'ACOS' then begin OperOK:= True; Valtemp:= 1 - Sqr(Value2); If Valtemp < 0 then begin Evaluate:= Error; Exit; end else If Value2 = 0 then Value2:= 90 else Value2:= Deg(Arctan(Sqrt(Valtemp) / Value2)) end;