SUBROUTINE ARITH(IBASE,INSTR1,INSTR2,IOP,IOUT,IREM) C.. C.. THIS ROUTINE (WITH OCTAL.FTN) DOES +, -, *, /,^ C.. DOUBLE PRECISION ADD(1),SUB(2),MUL(2),DIV(2),REM(2),EXP(2) BYTE INSTR1(80),INSTR2(80),IOUT(132),IREM(132),IOP BYTE IPLUS,ISUB,IMUL,IDIV,IEXP,BASE(8),POWER(80),POWER2(80) BYTE ONE(2) DATA ONE/'1',0/ DATA ADD,SUB,MUL,DIV,REM,EXP/'ADDED TO','SUBTRACT','ED BY', 1 'MULTIPLI','ED BY','DIVIDED ','BY','REMAINDE','R', 2 'TO THE P','OWER OF'/ DATA IPLUS,ISUB,IMUL,IDIV,IEXP/'+','-','*','/','^'/ C.. C.. GET STRING LENGTHS AND THPE OUT FIRST NUMBER C.. ENCODE(8,8,BASE)IBASE 8 FORMAT(' BASE ',I2) CALL STRLEN(INSTR1,LEN) LEN1=LEN TYPE 1,(INSTR1(I),I=1,LEN),BASE CALL STRLEN(INSTR2,LEN) 1 FORMAT(/1X,132A1) IF(IOP.EQ.IMUL) GO TO 10 IF(IOP.EQ.IDIV) GO TO 20 IF(IOP.EQ.IEXP) GO TO 30 C.. C.. PLUS OR MINUS C.. IF(IOP.NE.IPLUS.AND.IOP.NE.ISUB) GO TO 99 IF(IOP.EQ.IPLUS) TYPE 2,ADD IF(IOP.EQ.ISUB) TYPE 2,SUB 2 FORMAT(/1X,2A8) JBASE=IBASE IF(IOP.EQ.ISUB) JBASE=-JBASE CALL STRADD(JBASE,INSTR1,INSTR2,IOUT) GO TO 80 C.. C.. MULTIPLY C.. 10 TYPE 2,MUL CALL STRMUL(IBASE,INSTR1,INSTR2,IOUT) GO TO 80 C.. C.. DIVIDE C.. 20 TYPE 2,DIV CALL STRDIV(IBASE,INSTR1,INSTR2,IOUT,IREM) GO TO 80 C.. C.. POWER OF C.. 30 TYPE 2,EXP CALL BYTEDO(POWER,POWER(LEN+1),INSTR2) IOUT(1)='1' IOUT(2)=0 C.. C.. SEE IF -, 0, OR + C.. CALL STRM0P(INSTR2,ITYPE) IF(ITYPE)31,32,33 C.. C.. STRING IS NEGATIVE, ERROR C.. 31 TYPE 311,(INSTR2(I),I=1,LEN) 311 FORMAT('0*** ERROR *** EXPONENT IS NEGATIVE :',80A1) C.. C.. STRING IS 0, RETURN WITH 1 C.. 32 RETURN C.. C.. STRING IS POSITIVE C.. 33 CONTINUE JBASE=-IBASE 37 CALL STRLEN(IOUT,LEN2) IF(LEN1+LEN2.LE.80) GO TO 36 TYPE 371 371 FORMAT('0*** ERROR IN ARITH *** OVERFLOW ***') GO TO 80 36 CALL STRADD(JBASE,POWER,ONE,POWER2) CALL BYTEDO(POWER,POWER(LEN+1),POWER2) CALL STRMUL(IBASE,IOUT,INSTR1,IREM) CALL BYTEDO(IOUT,IOUT(132),IREM) C.. C.. CHECK IF -,0,+ C.. CALL STRM0P(POWER,ITYPE) IF(ITYPE)34,35,37 C.. C.. SHOULD NEVER HAPPEN C.. 34 TYPE 341 341 FORMAT('0*** ERROR *** ARITH.341 *** SHOULD NEVER HAPPEN') CALL EXIT C.. C.. 0, FINISHED C.. 35 CONTINUE C.. C.. PRINT ANSWER C.. 80 TYPE 1,(INSTR2(I),I=1,LEN),BASE TYPE 2,'** IS **' CALL STRLEN(IOUT,LEN) TYPE 1,(IOUT(I),I=1,LEN),BASE IF(IOP.NE.IDIV) GO TO 81 TYPE 2,REM CALL STRLEN(IREM,LEN) TYPE 1,(IREM(I),I=1,LEN),BASE 81 TYPE 2 RETURN 99 TYPE 199,IOP 199 FORMAT('0*** ERROR ARITH *** INVALID OPERATOR=',A1) RETURN END