C* KPSCHA - CHANGE COMMAND C SUBROUTINE KPSCHA (NERR) C C CHANGE STRINGS IN BDUP C ICP IS NCHARS IN BDUP, BOTH ICP AND BDUP ARE UPDATED TO C REFLECT THE CHANGED STRINGS ON RETURN C C BTEMP - IS THE COMMAND INPUT RECORD WITH THE TWO CHANGE STRINGS C ICP - NO. OF CHARS IN BDUP C BDUP - RECORD TO EFFECT CHANGE IN C NERR - 0 OK, NON-ZERO NOT OK C INCLUDE 'KPSCM.COM/NOLIST' C DIMENSION BDT(134) DIMENSION ISV(5), IEV(5) C C DELIMIT FIRST STRING, MUST HAVE TWO DELIMITERS (.FALSE. PARM) C DO 50 I=1,5 ISV(I) = 0 50 IEV(I) = 0 NERR = 0 LMATCH = .FALSE. LNULL = .FALSE. IS1 = 2 CALL KPSDS (BTEMP, IS1, IE1, .FALSE., NERR) D TYPE *,NERR,IS1,IE1 IF (NERR .NE. 0) GO TO 490 ! ERROR ON 1ST STRING C C DELIMIT 2ND STRING, TRAILING DELIMITER NOT NEEDED C IS2 = IE1 + 1 CALL KPSDS (BTEMP, IS2, IE2, .TRUE., NERR) D TYPE *,NERR,IS2,IE2 IF (NERR .NE. 0) GO TO 490 IF (IS1 .LE. IE1) GO TO 100 IS1 = 1 IE1 = 1 LNULL = .TRUE. GO TO 130 C C FIND STRINGS AND DON'T CARES IN SEARCH STRING C 100 CONTINUE CALL KPSLOC (BTEMP, IS1, IE1, NSTR, ISV, IEV, LLEFT, LRIGHT, NERR) D WRITE (5, 510) NSTR, ISV, IEV, LLEFT, LRIGHT, NERR 510 FORMAT (' ',I3, 10I3, 2L2, I5) IF (NERR .NE. 0) GO TO 490 C C GET TWO OPTIONAL NUMBERS, FIRST FOR NO. OF CHANGES PER LINE C SECOND FOR NO. OF LINES TO CHANGE. C 130 CONTINUE IPOS = IE2 + 1 IF (BTEMP(IS2-1) .EQ. BTEMP(IE2+1)) IPOS = IPOS + 1 CALL KPSGN (IPOS, ISIGN, NL1, NERR) IF (NERR.NE.0 .OR. ISIGN.LE.0) GO TO 490 CALL KPSGN (-IPOS,ISIGN, NL2, NERR) IF (NERR.NE.0 .OR. ISIGN.LE.0) GO TO 490 D TYPE *,'NL1,NL2', NL1,NL2 C C............................................................................. C C START TWO LOOPS ON NO. OF CHANGES/LINE AND NO. OF LINES C DO 380 J2=1, NL2 ISTR = 1 ICPSV = ICP IF (KPTR .EQ. 1) GO TO 360 ! CHANGE AT TOF NOT ALLOWED ! C DO 350 J1=1, NL1 D TYPE *,'ISTR=',ISTR C C CHECK IF ALL ...... C IF (LNULL) GO TO 200 IF (NSTR .LE. 0) GO TO 160 C C DELIMIT STRING IN BDUP FOR CHANGE C DO 150 I=1, NSTR IF (ISTR .GT. ICP) GO TO 360 ISTR = JCCHR (BDUP, ISTR, ICP, BTEMP, ISV(I), IEV(I), 3) IF (ISTR .LE. 0) GO TO 360 IF (I .EQ. 1) IS1 = ISTR ISTR = ISTR + IEV(I) - ISV(I) + 1 150 CONTINUE C IE1 = ISTR ! 1 PAST END OF STRING IN BDUP 160 CONTINUE IF (LLEFT) IS1 = 1 ! I DON'T CARES ON LEFT OR RIGHT IF (LRIGHT) IE1 = ICP + 1 D TYPE *,'READY TO CHANGE', IS1, IE1 C C MERGE OLD AND NEW STRINGS C 200 CONTINUE NP = 1 IL1 = MAX0 (0, IS1-1) IL2 = MAX0 (0, IE2-IS2+1) IL3 = MAX0 (0, ICP-IE1+1) IF (IL1+IL2+IL3 .GT. MXCPR) GO TO 480 D TYPE *,NP,IL1,IL2,IL3 CALL SMCHR (BDUP, 1, BDT, NP, IL1) NP = NP + IL1 D WRITE (5, 500) NP, (BDT(I),I=1,NP-1) CALL SMCHR (BTEMP, IS2, BDT, NP, IL2) NP = NP + IL2 D WRITE (5, 500) NP, (BDT(I),I=1,NP-1) CALL SMCHR (BDUP, IE1, BDT, NP, IL3) NP = NP + IL3 - 1 D WRITE (5, 500) NP, (BDT(I),I=1,NP) 500 FORMAT (' ',I2, 80A1) C CALL SMCHR (BDT, 1, BDUP, 1, NP) ICP = NP ISTR = IL1 + IL2 + 1 ! START NEXT COMPARE LMATCH = .TRUE. IF (LNULL) GO TO 360 ! AVOID INFINITE CHANGE LOOP 350 CONTINUE C C COME HERE WHEN MATCH FAILS C 360 CONTINUE IF (.NOT. LMATCH) GO TO 370 C C IF NEW STRING IS <= IN LENGTH TO OLD, REPLACE IN FILE IN SAME C PLACE. C C IF ((ICPSV+1)/2 .LT. (ICP+1)/2) GO TO 365 C CALL KPSGF (KPTR, KT1, NF) C CALL X1DW (TMPID(1,NF), KT1, (ICP+1)/2+1, ICP) C GO TO 368 C C365 CONTINUE CALL KPSDEL (1, 1, ISTAT) IF (ISTAT .GE. 0) CALL KPSNEX (-1, ISTAT) CALL KPSINS 368 CALL KPSPRI (0) C 370 CONTINUE IF (NL2 .EQ. 1) GO TO 390 IF (J2 .GE. NL2) GO TO 900 LMATCH = .FALSE. CALL KPSNEX (1, ISTAT) IF (ISTAT .LT. 0) GO TO 395 CALL KPSFR 380 CONTINUE GO TO 900 C C BOTTOM OF OUTSIDE LOOP ON NO. OF LINES C WE SHOULD NEVER GET BECAUSE OF CHECK ON LAST LINE, DON'T WANT C TO ADVANCE PAST LAST LINE LOOKED AT. C C.............................................................................. C C ERRORS C 390 CONTINUE IF (.NOT. LMATCH) TYPE 5010 5010 FORMAT (' ','[NO MATCH]') GO TO 900 C C IF EOF THEN PRINT MESSAGE C 395 CONTINUE CALL KPSPRI (-1) GO TO 900 C 480 CONTINUE TYPE 5020 5020 FORMAT (' ','[RECORD TOO LONG]') GO TO 900 C 490 CONTINUE D TYPE *,NERR NERR = -1 GO TO 900 C 900 CONTINUE RETURN END