SUBROUTINE MAIN LOGICAL*1 NAME(40) INTEGER GETARG, OPEN INTEGER FD, I CALL TBINIT FD = -3 I=1 23000 IF(.NOT.(GETARG(I, NAME, 40) .NE. -1))GOTO 23002 IF(.NOT.(NAME(1) .EQ. 63 .AND. NAME(2) .EQ. 0))GOTO 23003 CALL ERROR (11Husage: dc.) 23003 CONTINUE IF(.NOT.(NAME(1) .EQ. 45 .AND. NAME(2) .EQ. 0))GOTO 23005 FD = 1 GOTO 23006 23005 CONTINUE IF(.NOT.(NAME(1) .NE. 45))GOTO 23007 FD = OPEN(NAME, 1) IF(.NOT.(FD .EQ. -3))GOTO 23009 CALL CANT(NAME) 23009 CONTINUE 23007 CONTINUE 23006 CONTINUE IF(.NOT.(FD .NE. -3))GOTO 23011 CALL DCEXP (FD) IF(.NOT.(FD .NE. 1))GOTO 23013 CALL CLOSE (FD) 23013 CONTINUE 23011 CONTINUE 23001 I=I+1 GOTO 23000 23002 CONTINUE IF(.NOT.(FD .EQ. -3))GOTO 23015 CALL DCEXP (1) 23015 CONTINUE RETURN END SUBROUTINE DCEXP (FD) INTEGER FD, JUNK, I, ANSWER, SAVE INTEGER GETLIN, NUMTOC, EXPTOI, INDEX, STRCMP INTEGER IBASE, OBASE, UBASE, RADEXP, EQLOC LOGICAL*1 LINE(400), NAME(400) LOGICAL*1 ERRMSG(22) LOGICAL*1 TEN(3) LOGICAL*1 IBNAME(6) LOGICAL*1 OBNAME(6) DATA ERRMSG(1)/58/,ERRMSG(2)/32/,ERRMSG(3)/32/,ERRMSG(4)/105/,ERRM *SG(5)/110/,ERRMSG(6)/118/,ERRMSG(7)/97/,ERRMSG(8)/108/,ERRMSG(9)/1 *05/,ERRMSG(10)/100/,ERRMSG(11)/32/,ERRMSG(12)/101/,ERRMSG(13)/120/ *,ERRMSG(14)/112/,ERRMSG(15)/114/,ERRMSG(16)/101/,ERRMSG(17)/115/,E *RRMSG(18)/115/,ERRMSG(19)/105/,ERRMSG(20)/111/,ERRMSG(21)/110/,ERR *MSG(22)/0/ DATA TEN(1)/49/,TEN(2)/48/,TEN(3)/0/ DATA IBNAME(1)/105/,IBNAME(2)/98/,IBNAME(3)/97/,IBNAME(4)/115/,IBN *AME(5)/101/,IBNAME(6)/0/ DATA OBNAME(1)/111/,OBNAME(2)/98/,OBNAME(3)/97/,OBNAME(4)/115/,OBN *AME(5)/101/,OBNAME(6)/0/ IBASE = 10 OBASE = 10 CALL INSTAL(IBNAME,TEN) CALL INSTAL(OBNAME,TEN) 23017 IF(.NOT.(GETLIN(LINE, FD) .NE. -1))GOTO 23018 RADEXP = 0 CALL STRIP(LINE) I = 1 SAVE = INDEX(LINE, 61) IF(.NOT.(SAVE .NE. 0))GOTO 23019 IF(.NOT.(LINE(SAVE+1) .EQ. 61))GOTO 23021 SAVE = 0 GOTO 23022 23021 CONTINUE EQLOC = SAVE I = SAVE + 1 LINE(EQLOC) = 0 CALL SCOPY(LINE, 1, NAME, 1) IF(.NOT.(STRCMP(NAME,IBNAME) .EQ. 0 .OR. STRCMP(NAME,OBNAME) .EQ. *0))GOTO 23023 RADEXP = 1 23023 CONTINUE 23022 CONTINUE GOTO 23020 23019 CONTINUE IF(.NOT.(STRCMP(LINE,IBNAME) .EQ. 0 .OR. STRCMP(LINE,OBNAME) .EQ. *0))GOTO 23025 RADEXP = 1 23025 CONTINUE 23020 CONTINUE UBASE = IBASE IF(.NOT.(RADEXP .EQ. 1))GOTO 23027 UBASE = 10 23027 CONTINUE ANSWER = EXPTOI(LINE, I, UBASE) IF(.NOT.(LINE(I) .NE. 0))GOTO 23029 IF(.NOT.(SAVE .NE. 0))GOTO 23031 LINE(EQLOC) = 61 23031 CONTINUE CALL PUTLIN(LINE, 3) CALL PUTLIN(ERRMSG, 3) CALL PUTCH(10, 3) GOTO 23030 23029 CONTINUE UBASE = OBASE IF(.NOT.(RADEXP .EQ. 1 .OR. SAVE .NE. 0))GOTO 23033 UBASE = 10 23033 CONTINUE JUNK = NUMTOC(ANSWER, LINE, 400, UBASE) IF(.NOT.(SAVE .NE. 0))GOTO 23035 CALL INSTAL(NAME, LINE) IF(.NOT.(STRCMP(IBNAME,NAME) .EQ. 0))GOTO 23037 IBASE = ANSWER 23037 CONTINUE IF(.NOT.(STRCMP(OBNAME,NAME) .EQ. 0))GOTO 23039 OBASE = ANSWER 23039 CONTINUE GOTO 23036 23035 CONTINUE CALL PUTLIN(LINE, 2) CALL PUTCH(10, 2) 23036 CONTINUE 23030 CONTINUE GOTO 23017 23018 CONTINUE RETURN END SUBROUTINE STRIP (LINE) LOGICAL*1 LINE(100) INTEGER I I=1 23041 IF(.NOT.(LINE(I) .NE. 0))GOTO 23043 IF(.NOT.(LINE(I) .EQ. 32 .OR. LINE(I) .EQ. 9 .OR. LINE(I) .EQ. 10) *)GOTO 23044 CALL SCOPY(LINE, I+1, LINE, I) GOTO 23045 23044 CONTINUE I = I + 1 23045 CONTINUE 23042 GOTO 23041 23043 CONTINUE RETURN END INTEGER FUNCTION EXPTOI (EXP, PTR, RADIX) INTEGER EXPTOK, STACKX LOGICAL*1 EXP(100) INTEGER PTR, RADIX INTEGER K, TOK, KIND, PRECED(21) COMMON/CEXP/ TOP, TOKST(200), KINDST(200) INTEGER TOP INTEGER TOKST INTEGER KINDST DATA PRECED(1), PRECED(2), PRECED(3), PRECED(4), PRECED(5), PRECED *(6), PRECED(7), PRECED(8), PRECED(9), PRECED(10), PRECED(11), PREC *ED(12), PRECED(13), PRECED(14), PRECED(15), PRECED(16), PRECED(17) *, PRECED(18), PRECED(19), PRECED(20), PRECED(21) / 0, 0, 1, 1, 2, *2, 3, 4,4,4,4,4,4, 5, 5, 6, 6, 8, 6, 7, 8 / K = PTR TOP = 1 TOKST(TOP) = 2 KINDST(TOP) = 3 23046 IF(.NOT.(EXPTOK(EXP, K, TOK, KIND, RADIX) .EQ. 1))GOTO 23047 IF(.NOT.(KIND .EQ. 2))GOTO 23048 IF(.NOT.(KINDST(TOP) .EQ. 2))GOTO 23050 EXPTOI=(0) RETURN 23050 CONTINUE GOTO 23049 23048 CONTINUE IF(.NOT.(KIND .EQ. 1))GOTO 23052 IF(.NOT.(KINDST(TOP) .EQ. 1))GOTO 23054 EXPTOI=(0) RETURN 23054 CONTINUE IF(.NOT.(KINDST(TOP) .EQ. 3))GOTO 23056 IF(.NOT.(TOK .NE. 14 .AND. TOK .NE. 15 .AND. TOK .NE. 7))GOTO 2305 *8 EXPTOI=(0) RETURN 23058 CONTINUE IF(.NOT.(STACKX(0, 2) .EQ. -3))GOTO 23060 EXPTOI=(0) RETURN 23060 CONTINUE IF(.NOT.(TOK .EQ. 14))GOTO 23062 TOK = 21 GOTO 23063 23062 CONTINUE IF(.NOT.(TOK .EQ. 15))GOTO 23064 TOK = 18 23064 CONTINUE 23063 CONTINUE GOTO 23057 23056 CONTINUE IF(.NOT.(KINDST(TOP-1) .EQ. 1))GOTO 23066 23068 IF(.NOT.(PRECED(TOKST(TOP-1)) .GE. PRECED(TOK)))GOTO 23069 CALL BINOP GOTO 23068 23069 CONTINUE 23066 CONTINUE 23057 CONTINUE 23055 CONTINUE GOTO 23053 23052 CONTINUE IF(.NOT.(TOK .NE. 3))GOTO 23070 IF(.NOT.(KINDST(TOP) .NE. 2))GOTO 23072 EXPTOI=(0) RETURN 23072 CONTINUE 23074 IF(.NOT.(PRECED(TOKST(TOP-1)) .GT. PRECED(TOK)))GOTO 23075 IF(.NOT.(KINDST(TOP-1) .EQ. 1))GOTO 23076 CALL BINOP GOTO 23077 23076 CONTINUE EXPTOI=(0) RETURN 23077 CONTINUE GOTO 23074 23075 CONTINUE IF(.NOT.(PRECED(TOKST(TOP-1)) .EQ. PRECED(TOK)))GOTO 23078 IF(.NOT.(TOK .EQ. 1))GOTO 23080 PTR = K EXPTOI=(TOKST(TOP)) RETURN 23080 CONTINUE TOK = TOKST(TOP) KIND = KINDST(TOP) TOP = TOP -2 23081 CONTINUE GOTO 23079 23078 CONTINUE EXPTOI=(0) RETURN 23079 CONTINUE 23070 CONTINUE 23053 CONTINUE 23049 CONTINUE IF(.NOT.(STACKX(TOK, KIND) .EQ. -3))GOTO 23082 EXPTOI=(0) RETURN 23082 CONTINUE GOTO 23046 23047 CONTINUE EXPTOI=(0) RETURN END SUBROUTINE BINOP INTEGER L, R, RESULT, OP COMMON/CEXP/ TOP, TOKST(200), KINDST(200) INTEGER TOP INTEGER TOKST INTEGER KINDST R = TOKST(TOP) OP = TOKST(TOP-1) L = TOKST(TOP-2) TOP = TOP - 2 I23084=(OP) GOTO 23084 23086 CONTINUE IF(.NOT.(L .NE. 0 .OR. R .NE. 0))GOTO 23087 RESULT = 1 GOTO 23088 23087 CONTINUE RESULT = 0 23088 CONTINUE GOTO 23085 23089 CONTINUE IF(.NOT.(L .NE. 0 .AND. R .NE. 0))GOTO 23090 RESULT = 1 GOTO 23091 23090 CONTINUE RESULT = 0 23091 CONTINUE GOTO 23085 23092 CONTINUE IF(.NOT.(R .EQ. 0))GOTO 23093 RESULT = 1 GOTO 23094 23093 CONTINUE RESULT = 0 23094 CONTINUE GOTO 23085 23095 CONTINUE IF(.NOT.(L .EQ. R))GOTO 23096 RESULT = 1 GOTO 23097 23096 CONTINUE RESULT = 0 23097 CONTINUE GOTO 23085 23098 CONTINUE IF(.NOT.(L .NE. R))GOTO 23099 RESULT = 1 GOTO 23100 23099 CONTINUE RESULT = 0 23100 CONTINUE GOTO 23085 23101 CONTINUE IF(.NOT.(L .GT. R))GOTO 23102 RESULT = 1 GOTO 23103 23102 CONTINUE RESULT = 0 23103 CONTINUE GOTO 23085 23104 CONTINUE IF(.NOT.(L .GE. R))GOTO 23105 RESULT = 1 GOTO 23106 23105 CONTINUE RESULT = 0 23106 CONTINUE GOTO 23085 23107 CONTINUE IF(.NOT.(L .LT. R))GOTO 23108 RESULT = 1 GOTO 23109 23108 CONTINUE RESULT = 0 23109 CONTINUE GOTO 23085 23110 CONTINUE IF(.NOT.(L .LE. R))GOTO 23111 RESULT = 1 GOTO 23112 23111 CONTINUE RESULT = 0 23112 CONTINUE GOTO 23085 23113 CONTINUE RESULT = L + R GOTO 23085 23114 CONTINUE RESULT = L - R GOTO 23085 23115 CONTINUE RESULT = (-R) GOTO 23085 23116 CONTINUE RESULT = L * R GOTO 23085 23117 CONTINUE RESULT = L / R GOTO 23085 23118 CONTINUE RESULT = MOD(L,R) GOTO 23085 23119 CONTINUE RESULT = L**R GOTO 23085 23120 CONTINUE RESULT = (+R) GOTO 23085 23084 CONTINUE I23084=I23084-4 IF(I23084.LT.1.OR.I23084.GT.17)GOTO 23085 GOTO(23086,23089,23092,23095,23098,23101,23104,23107,23110,23113,2 *3114,23116,23117,23115,23118,23119,23120),I23084 23085 CONTINUE TOKST(TOP) = RESULT RETURN END INTEGER FUNCTION EXPTOK(EXP, K, TOK, KIND, RADIX) LOGICAL*1 EXP(100), DEFN(400), NAME(400) INTEGER K INTEGER TOK INTEGER KIND INTEGER RADIX INTEGER CTONUM, LOOKUP LOGICAL*1 TYPE LOGICAL*1 C, CN COMMON/CEXP/ TOP, TOKST(200), KINDST(200) INTEGER TOP INTEGER TOKST INTEGER KINDST LOGICAL*1 DIGITS(23) DATA DIGITS(1)/48/,DIGITS(2)/49/,DIGITS(3)/50/,DIGITS(4)/51/,DIGIT *S(5)/52/,DIGITS(6)/53/,DIGITS(7)/54/,DIGITS(8)/55/,DIGITS(9)/56/,D *IGITS(10)/57/,DIGITS(11)/97/,DIGITS(12)/98/,DIGITS(13)/99/,DIGITS( *14)/100/,DIGITS(15)/101/,DIGITS(16)/102/,DIGITS(17)/65/,DIGITS(18) */66/,DIGITS(19)/67/,DIGITS(20)/68/,DIGITS(21)/69/,DIGITS(22)/70/,D *IGITS(23)/0/ C = TYPE(EXP(K)) IF(.NOT.(RADIX .GT. 10))GOTO 23121 IF(.NOT.(INDEX(DIGITS,EXP(K)) .GT. 0))GOTO 23123 C = 2 23123 CONTINUE 23121 CONTINUE IF(.NOT.(C .EQ. 2))GOTO 23125 TOK = CTONUM(EXP, K, RADIX) KIND = 2 EXPTOK=(1) RETURN 23125 CONTINUE IF(.NOT.(C .EQ. 1))GOTO 23127 CALL MOVNAM(EXP, K, NAME, 1) K = K + LENGTH(NAME) IF(.NOT.(LOOKUP(NAME, DEFN) .EQ. 1))GOTO 23129 I = 1 TOK = CTONUM(DEFN, I, 10) KIND = 2 EXPTOK=(1) RETURN 23129 CONTINUE EXPTOK=(0) RETURN 23130 CONTINUE GOTO 23128 23127 CONTINUE CN = EXP(K+1) KIND = 1 I23131=(C) GOTO 23131 23133 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23134 TOK = 9 K = K + 1 GOTO 23135 23134 CONTINUE TOK = 7 23135 CONTINUE GOTO 23132 23136 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23137 TOK = 9 K = K + 1 GOTO 23138 23137 CONTINUE TOK = 7 23138 CONTINUE GOTO 23132 23139 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23140 TOK = 9 K = K + 1 GOTO 23141 23140 CONTINUE TOK = 7 23141 CONTINUE GOTO 23132 23142 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23143 TOK = 13 K = K + 1 GOTO 23144 23143 CONTINUE TOK = 12 23144 CONTINUE GOTO 23132 23145 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23146 TOK = 11 K = K + 1 GOTO 23147 23146 CONTINUE TOK = 10 23147 CONTINUE GOTO 23132 23148 CONTINUE IF(.NOT.(CN .EQ. 61))GOTO 23149 TOK = 8 K = K + 1 GOTO 23150 23149 CONTINUE TOK = -1 23150 CONTINUE GOTO 23132 23151 CONTINUE TOK = 5 GOTO 23132 23152 CONTINUE TOK = 6 GOTO 23132 23153 CONTINUE TOK = 14 GOTO 23132 23154 CONTINUE TOK = 15 GOTO 23132 23155 CONTINUE IF(.NOT.(CN .EQ. 42))GOTO 23156 TOK = 20 K = K + 1 GOTO 23157 23156 CONTINUE TOK = 16 23157 CONTINUE GOTO 23132 23158 CONTINUE TOK = 17 GOTO 23132 23159 CONTINUE TOK = 19 GOTO 23132 23160 CONTINUE KIND = 3 TOK = 3 GOTO 23132 23161 CONTINUE KIND = 3 TOK = 4 GOTO 23132 23162 CONTINUE KIND = 3 TOK = 1 GOTO 23132 23163 CONTINUE TOK = -1 GOTO 23132 23131 CONTINUE IF(I23131.EQ.0)GOTO 23162 IF(I23131.EQ.33)GOTO 23139 IF(I23131.EQ.37)GOTO 23159 IF(I23131.EQ.38)GOTO 23152 IF(I23131.EQ.40)GOTO 23160 IF(I23131.EQ.41)GOTO 23161 IF(I23131.EQ.42)GOTO 23155 IF(I23131.EQ.43)GOTO 23153 IF(I23131.EQ.45)GOTO 23154 IF(I23131.EQ.47)GOTO 23158 IF(I23131.EQ.60)GOTO 23142 IF(I23131.EQ.61)GOTO 23148 IF(I23131.EQ.62)GOTO 23145 IF(I23131.EQ.94)GOTO 23136 IF(I23131.EQ.124)GOTO 23151 IF(I23131.EQ.126)GOTO 23133 GOTO 23163 23132 CONTINUE IF(.NOT.(TOK .EQ. -1))GOTO 23164 EXPTOK=(0) RETURN 23164 CONTINUE IF(.NOT.(TOK .NE. 1))GOTO 23166 K = K + 1 23166 CONTINUE EXPTOK=(1) RETURN 23128 CONTINUE 23126 CONTINUE END SUBROUTINE MOVNAM (IN, I, OUT, J) LOGICAL*1 IN(100), OUT(100) INTEGER I, J, K1, K2 LOGICAL*1 TYPE LOGICAL*1 C K1 = I K2 = J C=TYPE(IN(K1)) 23168 IF(.NOT.(C .EQ. 1 .OR. C .EQ. 2))GOTO 23170 OUT(K2) = IN(K1) K1 = K1 + 1 K2 = K2 + 1 23169 C=TYPE(IN(K1)) GOTO 23168 23170 CONTINUE OUT(K2) = 0 RETURN END INTEGER FUNCTION CTONUM(BUF,I,DRADIX) LOGICAL*1 BUF(100), TMP(400) INTEGER CTOI INTEGER I, J, C, N, VAL, RADIX, DRADIX, M LOGICAL*1 DIGITS(23) DATA DIGITS(1)/48/,DIGITS(2)/49/,DIGITS(3)/50/,DIGITS(4)/51/,DIGIT *S(5)/52/,DIGITS(6)/53/,DIGITS(7)/54/,DIGITS(8)/55/,DIGITS(9)/56/,D *IGITS(10)/57/,DIGITS(11)/97/,DIGITS(12)/98/,DIGITS(13)/99/,DIGITS( *14)/100/,DIGITS(15)/101/,DIGITS(16)/102/,DIGITS(17)/65/,DIGITS(18) */66/,DIGITS(19)/67/,DIGITS(20)/68/,DIGITS(21)/69/,DIGITS(22)/70/,D *IGITS(23)/0/ IF(.NOT.(BUF(I) .EQ. 45))GOTO 23171 I = I + 1 M = -1 GOTO 23172 23171 CONTINUE M = 1 23172 CONTINUE N=0 23173 CONTINUE C = INDEX(DIGITS,BUF(I)) IF(.NOT.(C.EQ.0))GOTO 23176 GOTO 23175 23176 CONTINUE IF(.NOT.(C .GT. 16))GOTO 23178 C = C-6 23178 CONTINUE N = N+1 TMP(N) = C-1 23174 I=I+1 GOTO 23173 23175 CONTINUE IF(.NOT.(BUF(I) .EQ. 95))GOTO 23180 RADIX = 0 I = I+1 RADIX = CTOI(BUF,I) GOTO 23181 23180 CONTINUE RADIX = DRADIX 23181 CONTINUE VAL = 0 J=1 23182 IF(.NOT.(J.LE.N))GOTO 23184 C = TMP(J) IF(.NOT.(C .GE. RADIX))GOTO 23185 CALL REMARK(12Hnumber error) 23185 CONTINUE VAL = VAL * RADIX + C 23183 J = J+1 GOTO 23182 23184 CONTINUE CTONUM=( M*VAL ) RETURN END INTEGER FUNCTION NUMTOC(INT, STR, SIZE, RADIX) INTEGER MOD INTEGER RADIX INTEGER D, I, INT, INTVAL, J, K, SIZE LOGICAL*1 STR(100) LOGICAL*1 DIGITS(17) DATA DIGITS(1)/48/,DIGITS(2)/49/,DIGITS(3)/50/,DIGITS(4)/51/,DIGIT *S(5)/52/,DIGITS(6)/53/,DIGITS(7)/54/,DIGITS(8)/55/,DIGITS(9)/56/,D *IGITS(10)/57/,DIGITS(11)/65/,DIGITS(12)/66/,DIGITS(13)/67/,DIGITS( *14)/68/,DIGITS(15)/69/,DIGITS(16)/70/,DIGITS(17)/0/ INTVAL = IABS(INT) STR(1) = 0 I = 1 23187 CONTINUE I = I+1 D = MOD(INTVAL,RADIX) STR(I) = DIGITS(D+1) INTVAL = INTVAL / RADIX 23188 IF(.NOT.(INTVAL .EQ. 0 .OR. I .GE. SIZE))GOTO 23187 23189 CONTINUE IF(.NOT.(INT .LT. 0 .AND. I .LT. SIZE))GOTO 23190 I = I+1 STR(I) = 45 23190 CONTINUE NUMTOC = I - 1 J = 1 23192 IF(.NOT.(J .LT. I))GOTO 23194 K = STR(I) STR(I) = STR(J) STR(J) = K I = I-1 23193 J = J+1 GOTO 23192 23194 CONTINUE RETURN END INTEGER FUNCTION STACKX(TOK, KIND) INTEGER TOK, KIND COMMON/CEXP/ TOP, TOKST(200), KINDST(200) INTEGER TOP INTEGER TOKST INTEGER KINDST IF(.NOT.(TOP .GE. 200))GOTO 23195 CALL REMARK (32Harith evaluation stack overflow.) STACKX=(-3) RETURN 23195 CONTINUE TOP = TOP + 1 TOKST(TOP) = TOK KINDST(TOP) = KIND STACKX=(0) RETURN END