SUBROUTINE STRADD(KBASE,INP1,INP2,NEWB) COMMON/STR/IBLK,IDASH,IPLUS,IZERO,IAYE,ISIGN1,ISIGN2 1 ,IBASE,LINA,LINA2,INPA11,INPA21,NEW(132) BYTE INP11,INP21,NEWB(1),INP1(1),INP2(1) BYTE IBLK,IDASH,IPLUS,IZERO,IAYE,ISIGN1,ISIGN2 1 ,IBASE,LINA,LINA2,INPA11,INPA21 C.. C.. THIS ROUTINE ADDS (SUBS) TWO STRINGS TOGETHER C.. C.. CHECK DATA OF INP1 + INP2 C.. NEWB(1)=0 CALL STRCHK(KBASE,INP1,INP2,IERR) IF(IERR.GT.0) GO TO 99 C.. C.. CHANGE GLOBAL VARIABLES TO LOCAL C.. JBASE=IBASE LIN=LINA LIN2=LINA2 INP11=INPA11 INP21=INPA21 I1SIGN=ISIGN1 I2SIGN=ISIGN2 C.. C.. CHECK FOR SUBRTACTION C.. IF(KBASE.LT.0) I2SIGN=-I2SIGN C.. C.. NEW LENGTH = MAX(INP1+INP2)+1 C.. LNEW=LIN IF(LIN2.GT.LIN) LNEW=LIN2 LNEW=LNEW+1 C.. C.. ADD C.. CALL DOBYTE(NEW(1),NEW(LNEW+1),0) DO 20 I=1,LNEW LNEWS=LNEW-I+1 LIN2S=LIN2-I+1 MADDS=0 IF(LIN2S.GT.0) MADDS=INP2(LIN2S) LINS=LIN-I+1 MINS=0 IF(LINS.GT.0) MINS=INP1(LINS) NEW(LNEWS)=I1SIGN*MINS+I2SIGN*MADDS 20 CONTINUE C.. C.. CHECK OUT CARRIES AND/OR MINUSES C.. NEGAT=0 DO 40 I=1,LNEW IF(NEW(I))41,40,42 40 CONTINUE C..ANSWER IS ZERO GO TO 43 C.. C.. ANSWER IS NEGAT C.. 41 NEGAT=1 DO 44 I=1,LNEW NEW(I)=-NEW(I) 44 CONTINUE C.. C.. ANSWER IS PLUS C.. 42 DO 50 I=1,LNEW IF(NEW(I).GE.0) GO TO 50 NEW(I-1)=NEW(I-1)-1 NEW(I)=NEW(I)+JBASE GO TO 42 50 CONTINUE ICARRY=0 C.. C.. CHECK OUT CARRIES C.. DO 45 I=1,LNEW LNEWS=LNEW-I+1 NEW(LNEWS)=NEW(LNEWS)+ICARRY ICARRY=0 IF(NEW(LNEWS).LT.JBASE) GO TO 45 ICARRY=1 NEW(LNEWS)=NEW(LNEWS)-JBASE 45 CONTINUE C.. C.. RESTORE ALL STRINGS TO ALPHA C.. 43 CONTINUE CALL STRRES(NEW,NEWB,LNEW) CALL STRRES(-1,INP1,LIN) CALL STRRES(-1,INP2,LIN2) C.. C.. CHECK NEGAT, SEE IF - C.. IF(NEGAT.EQ.1) NEWB(1)=IDASH C.. C.. GET RID OF LEADING BLANKS C.. CALL STRRD0(NEWB,LNEW) C.. C.. RESET INITIAL STUFF C.. INP1(1)=INP11 INP2(1)=INP21 RETURN 99 NEWB(1)=0 RETURN END