$CPU 8086 ' program works on any CPU $OPTIMIZE SIZE ' make smallest possible executable $COMPILE UNIT ' compile to an EXE '$COMPILE EXE ' compile to an EXE $DEBUG MAP OFF ' turn off map file generation $DEBUG PBDEBUG OFF ' don't include pbdebug support in our executable $COM 0 ' set communications buffer to nothing $STRING 16 ' set largest string size at 16k $STACK 2048 ' let's use a 2k stack $SOUND 1 ' smallest music buffer possible $DIM ARRAY ' force arrays to be pre-dimensioned before they can ' be used $DYNAMIC ' all arrays will be dynamic by default DEFINT A-Z ' default all variables to integers for maximum ' speed and minimum size 'Evaluate - Evaluates a given expression and returns answer '------------------------------------------------------------------------- ' EVAL(STRING$,ERRCODE%) ' Evaluate math formula. ' Returns a double precision number calculated from STRING$. If an ' error occurs, ERRCODE% will be greater than 0. ' EXAMPLE: T# = EVAL("2*(3*3)",E) 18 '------------------------------------------------------------------------- FUNCTION EVAL(BYVAL Expr$,ErrCode AS INTEGER) PUBLIC AS DOUBLE Expr$ = UCASE$(Expr$) 'Tokenize the multi-charactor operators REPLACE "[" WITH "(" IN Expr$ 'parenthesis REPLACE "]" WITH ")" IN Expr$ 'parenthesis REPLACE "{" WITH "(" IN Expr$ 'parenthesis REPLACE "}" WITH ")" IN Expr$ 'parenthesis REPLACE "X" WITH "*" IN Expr$ 'multiplication REPLACE "#" WITH "!" IN Expr$ 'not equal REPLACE "<>" WITH "!" IN Expr$ 'not equal REPLACE ">=" WITH ";" IN Expr$ 'greater than or equal REPLACE "=>" WITH ";" IN Expr$ 'greater than or equal REPLACE "<=" WITH ":" IN Expr$ 'less than or equal REPLACE "=<" WITH ":" IN Expr$ 'less than or equal REPLACE "**" WITH "^" IN Expr$ 'to the power of REPLACE "AND" WITH "&" IN Expr$ 'AND REPLACE "XOR" WITH "$" IN Expr$ 'XOR REPLACE "OR" WITH "|" IN Expr$ 'OR REPLACE "MOD" WITH "%" IN Expr$ 'MOD REPLACE "-+" WITH "-" IN Expr$ 'remove positive sign in subtraction Expr$ = REMOVE$(Expr$, " ") X = TALLY(Expr$,"(") Y = TALLY(Expr$,")") IF X<>Y THEN ErrCode = 1 'non-matching parenthesis EXIT FUNCTION END IF IF TALLY(Expr$,ANY "0123456789.()*/\%+-&|!$^=<>;:HODBACEF")<>LEN(Expr$) THEN ErrCode = 2 'invalid charactors EXIT FUNCTION END IF IF Y > 0 THEN X = INSTR(Expr$, ")") WHILE X > 0 IF INSTR(Expr$, "()") THEN ErrCode = 3 'mismatched parenthesis EXIT FUNCTION END IF FOR I = X TO 1 STEP -1 IF MID$(Expr$, I, 1) = "(" THEN EXIT FOR END IF NEXT I IF I = 0 THEN ErrCode = 3 'mismatched parenthesis EXIT FUNCTION END IF Tmp$ = MID$(Expr$, I+1, X-(I+1)) Ans$ = Answer$(Tmp$, ErrCode) IF ErrCode THEN EXIT FUNCTION END IF REPLACE "("+Tmp$+")" WITH Ans$ IN Expr$ X = INSTR(Expr$, ")") WEND END IF X = TALLY(Expr$, ANY "*/\%+-&|!$^=<>;:XHODBACEF") WHILE X > 0 IF (X = 1) AND (LEFT$(Expr$, 1) = "-") THEN EXIT DO END IF Expr$ = Answer$(Expr$, ErrCode) IF ErrCode THEN EXIT FUNCTION END IF X = TALLY(Expr$, ANY "*/\%+-&|!$^=<>;:XHODBACEF") WEND FUNCTION = VAL(Expr$) END FUNCTION FUNCTION Answer$(BYVAL Expr$, ErrCode AS INTEGER) PRIVATE X = TALLY(Expr$, ANY "*/\%+-&|!$^=<>;:XHODBACEF") WHILE X > 0 Rp$ = "" IF (X = 1) AND (LEFT$(Expr$, 1) = "-") THEN EXIT DO END IF IF INSTR(Expr$, ANY "HODB") THEN T = INSTR(Expr$, ANY "HODB") Tmp$ = MID$(Expr$, T) T$ = EXTRACT$(Tmp$, ANY "*/\%+-()&|!^;:<>=") T = ASCII(T$) IF T = 72 OR T = 79 OR T = 66 THEN Rp$ = LTRIM$( STR$( VAL("&"+T$) ) ) ELSEIF T = 68 THEN Rp$=MID$(T$,2) END IF REPLACE T$ WITH Rp$ IN Expr$ Sign$ = "" ELSEIF INSTR(Expr$,"*") THEN Sign$ = "*" ELSEIF INSTR(Expr$,"/") THEN Sign$ = "/" ELSEIF INSTR(Expr$,"\") THEN Sign$ = "\" ELSEIF INSTR(Expr$,"%") THEN Sign$ = "%" ELSEIF INSTR(Expr$,"^") THEN Sign$ = "^" ELSEIF INSTR(Expr$,"+") THEN Sign$ = "+" ELSEIF INSTR(Expr$,"-")>1 THEN Sign$ = "-" ELSEIF INSTR(Expr$,"&") THEN Sign$ = "&" ELSEIF INSTR(Expr$,"|") THEN Sign$ = "|" ELSEIF INSTR(Expr$,"!") THEN Sign$ = "!" ELSE ErrCode = 4 'Error EXIT FUNCTION END IF IF ErrCode > 0 THEN EXIT FUNCTION END IF IF LEN(Sign$) > 0 THEN Tmp$ = GetValues(Expr$, Sign$, Number1#, Number2#, ErrCode) Rp$ = Result$(Sign$, Number1#, Number2#) REPLACE Tmp$ WITH Rp$ IN Expr$ END IF X = TALLY(Expr$, ANY "*/\%+-&|!$^=<>;:XHODBACEF") WEND Answer$ = Expr$ END FUNCTION FUNCTION GetValues$(BYVAL Expr$, BYVAL Sign$, Number1#, Number2#, ErrCode AS INTEGER) Position = INSTR(Expr$, Sign$) IF Position = 1 THEN IF INSTR("+-", Sign$) = 0 THEN ErrCode = 5 'expression error EXIT FUNCTION END IF Position = INSTR(2, Expr$, Sign$) END IF Tmp1$ = LEFT$(Expr$, Position - 1) Tmp2$ = MID$(Expr$, Position + 1) IF INSTR(Tmp2$, ANY "+-") = 1 THEN Position = 2 ELSE Position = 1 END IF FOR I = LEN(Tmp1$) TO 1 STEP -1 IF INSTR(MID$(Tmp1$, I, 1), ANY"1234567890.") = 0 THEN EXIT FOR END IF NEXT I IF I = LEN(Tmp1$) THEN ErrCode = 5 'expression error EXIT FUNCTION END IF IF I = 1 THEN DECR I ELSEIF I > 1 THEN IF INSTR("+-", MID$(Tmp1$, I))>0 THEN IF INSTR("1234567890.", MID$(Tmp1$, I-1))=0 THEN DECR I END IF END IF END IF Tmp1$ = MID$(Tmp1$, I+1) FOR I = 1 TO LEN(Tmp2$) IF INSTR(MID$(Tmp2$, I, 1), ANY "1234567890.") = 0 THEN EXIT FOR END IF NEXT I IF I = 1 THEN ErrCode = 5 'expression error EXIT FUNCTION END IF Tmp2$ = LEFT$(Tmp2$, I-1) Number1# = VAL(Tmp1$) Number2# = VAL(Tmp2$) GetValues$ = Tmp1$ + Sign$ + Tmp2$ END FUNCTION FUNCTION Result$(BYVAL Operation$, Number1#, Number2#) PRIVATE SELECT CASE Operation$ CASE "+" Temp# = Number1# + Number2# CASE "-" Temp# = Number1# - Number2# CASE "/" Temp# = Number1# / Number2# CASE "\" Temp# = Number1# \ Number2# CASE "*", "X" Temp# = Number1# * Number2# CASE "^" Temp# = Number1# ^ Number2# CASE "%" Temp# = Number1# MOD Number2# CASE "&" Temp# = Number1# AND Number2# CASE "|" Temp# = Number1# OR Number2# CASE "$" Temp# = Number1# XOR Number2# CASE "<" Temp# = ABS(Number1# < Number2#) CASE ">" Temp# = ABS(Number1# > Number2#) CASE "=" Temp# = ABS(Number1# > Number2#) CASE "!" Temp# = ABS(Number1# <> Number2#) CASE ";" Temp# = ABS(Number1# => Number2#) CASE ":" Temp# = ABS(Number1# <= Number2#) CASE ELSE Temp# = 0 END SELECT Result$ = LTRIM$( STR$(Temp#) ) END FUNCTION '/*----------------------------------------------------------------- ' PRINT "Eval 1.0á þ Command Line Expression Evaluator" ' PRINT "Copyright (c) 1994 Dave Navarro, Jr. All Rights Reserved." ' PRINT "" ' ' INPUT EXPR$ ' 'Expr$ = Trim$(UCASE$(COMMAND$)) ' ' IF (LEN(Expr$) = 0) OR (INSTR(Expr$,"?") > 0) THEN ' PRINT "Usage: EVAL expression" ' PRINT "" ' PRINT " Where expression is a valid mathematical equation" ' PRINT " allowing for parenthetical precidence." ' PRINT "" ' PRINT "Example: EVAL 4 + 5 * (4 + 9) / 6" ' PRINT "" ' PRINT "Supports: * / + - Multiplication, Division, Addition," ' PRINT " and subtraction." ' PRINT " \ % Integer Division, Modulus." ' PRINT " ** ^ Raising to the power of." ' PRINT " & | $ Logical AND, OR, and XOR." ' PRINT " =< => <> Less than or Equal to, Greater than" ' PRINT " or Equal to, and Not Equal to." ' PRINT " < > = Less than, Greater than, and Equal" ' PRINT " to." ' END 1 ' END IF ' ' PRINT EXPR$ + " =" ' ' TMP# = EVAL(EXPR$, ERRCODE) ' ' IF ERRCODE = 0 THEN ' PRINT STR$(TMP#) ' ELSE ' PRINT "ERROR "+STR$(ERRCODE)+"!" ' BEEP ' END IF ' INPUT Z ' END ERRCODE '