* 03/09/76 -- 13:00
* MODULE NAME: FIND
* NUMBER: 6
* PURPOSE: FIND OR CREATE TAGS
*
* ENTRY POINTS:
*
         DEF      C06TAG,S06TAG     NEW TAG DEFINITION
         DEF      C06STBLK          BLOCK NAME DEFINITION
         DEF      C06FIND           FIND TAG OR PHRASE
*
         REF      S29STD,S27PRINT
         REF      S07RDTAG,S07CHHDR
         REF      S07TGOCC
         REF      S27WHDR
         REF      S27RTXT,S27WTXT,S27DRTXT
         REF      S05LOC,S05INS
         REF      S35LINE
         REF      S01SCAN,S01TXTLN
         REF      S05DLINE
         REF      S05RANGE          GET RANGE OF LINES
         REF      S27WTERM          WRITE TO TERMINAL
         REF      ZRORTNST          RE-INITIALIZE RETURN STACK
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVTAGSTA
            INVHDRSTA
            INVCMDSTA
            INVWSSTA
*
*
         PAGE
*
*
*
         DEF      6P,6D
*
6P       EQU      %
         DATA     X'06'             MODULE NUMBER
         DATA     X'030976'         DATE
         DATA     X'1300'           TIME
*
*
         TITLE    '** FIND(6) **'
*
* C06TAG -- TAG DEFINITION
*
*
C06TAG   EQU      %                 TAG COMMAND
         LI,X1    3                 TEST 'G','I','T' FLAGS
TYPELP   EQU      %
         JNEZ,D1  (#FLAGS,X1),S06TAG    GET FLAG AND GO SET TAG
         BDR,X1   TYPELP            TEST ALL FLAGS
*
C06STBLK EQU      %                 START BLOCK
         LI,D1    X'B'              SET HEADER WORD END CODES
         PUT,D1   HDR:CMDCDE
         LI,X1    4                 TAG TYPE = 4
         GET,D1   #NCNM             GET NAME CHARS
         PUT,D1   #NCCS,:K(2)       STORE IN TAG CHARS
         GET,D1   #NM               GET ADDR OF NAME
         PUT,D1   #CS,:K(2)         STORE IN TAG ADDR
*
*
         PAGE
*
*
S06TAG   EQU      %
         SAVRTN
*
         GET,D1   HDR:NTAGS         GET CURRENT TAG COUNT
         CI,D1    #MXNTAGS          TEST FOR MAX
         BGE      RTNTAG               YES, RETURN
         GET,D1   #CS,:K(2)         GET ADDR OF TAG
         SW,D1    BUF2              SUBTRACT ADDR OF START OF LINE
         STW,D1   TAGDISP           STORE TAG DISP.
         STW,X1   TAGTYPE           SAVE TAG TYPE
         LI,BUF1  WA(STDX2BUF)      GET ADDR OF TAG BUFFER
         STW,BUF1 TAGBUF            SAVE WORD BASE FOR TAG
*
         LWC,X1   #CS,:K(2)         GET TAG SIZE/POINTER
         STW,X1   TAGDEF            SAVE TAG INFO
         LW,D1    TAGTYPE           GET TAG TYPE
         CI,D1    3                 TEST FOR TITLE TAG
         BE       GETLEVEL             YES, GET TITLE LEVEL
         DEPZ,D2  #DS,:K(1)            NO, INITIALIZE TITLE LEVEL
GETLEVEL EQU      %
         GET,D2   #DSHW,:K(1)       GET TITLE LEVEL
         LI,AC2   0                 SET ACTUAL KEY TO ZERO
         BAL,SRTN S07RDTAG          GO READ TAG
*
         CI,AC1   0                 TEST FOR TAG FOUND
         BG       ADDOCC                YES, GO ADD OCCURENCE
*
*
         PAGE
*
* TAG NOT FOUND -- CREATE NEW TAG
*
         CI,AC2   0                 TEST FOR LAST-IN-CHAIN TAG
         BNE      USECHAIN              YES, ADD TO CHAIN
         STW,AC3  NWTAGKEY              NO, USE HASH TOTAL
         B        ADDTAG            GO CREATE NEW TAG
*
USECHAIN EQU      %                 CREATE NEW TAG IN OVERFLOW
         GET,D1   #NXTOVFL          GET NEXT OVERFLOW KEY
         STW,D1   NWTAGKEY          SAVE NEW TAG KEY
         PUT,D1   *TAG:NXTHASH      STORE KEY
         AI,D1    1                 INCREMENT NEXT OVERFLOW KEY
         PUT,D1   #NXTOVFL          SAVE NEXT OVERFLOW KEY
*
         LW,AC1   AC3               GET SIZE OF LAST-IN-CHAIN
         LI,AC3   3                 SET BYTE ZERO TO 3 FOR KEY
         STB,AC3  AC2
         LI,BUF3  BA(STDX2BUF)      GET BA OF TAG BUFFER
         BAL,SRTN S27WHDR           RE-WRITE LAST-IN-CHAIN TAG
         B        ADDTAG            GO ADD NEW TAG
*
*
         PAGE
*
*
ADDTAG   EQU      %
         LW,D1    TAGTYPE           GET TAG TYPE
         PUT,D1   *TAG:TYPE         STORE IN NEW TAG
         GET,D1   #DSHW,:K(1)       GET TITLE LEVEL
         PUT,D1   *TAG:TLEVEL       STORE IN NEW TAG
*
         LI,D1    1                 SET NUMBER OF OCCURENCES TO ONE
         PUT,D1   *TAG:NOCC         STORE IN NEW TAG
         LI,D1    0                 SET NEXT HASH RECORD TO ZERO
         PUT,D1   *TAG:NXTHASH      STORE IN NEW TAG
*
         LB,D2    TAGDEF            GET SIZE OF TAG
         PUT,D2   *TAG:NCTAG        STORE IN NEW TAG
         STB,D1   TAGDEF            SET SIZE TO ZERO
         LI,X2    BA(STDX2BUF)+#TAGDISP  GET ADDR OF NEW TAG
         MOVE,D1  *TAGDEF,*X2,*D2   MOVE TAG INTO NEW TAG
*
*
         PAGE
*
* WRITE NEW TAG RECORD
*
WRNWTAG  EQU      %                 WRITE NEW TAG RECORD
         LW,X2    TAGBUF            GET WORD ADDR OF TAG BUFFER
         SLS,D2   -2                CONVERT TAG SIZE TO WORDS
         AW,X2    D2                ADD TAG SIZE TO ADDR
         AI,X2    :EO(TAG:NCTAG)    ADD CONTROL WORDS
         STW,X2   OCCBASE           STORE NEW OCC. BASE
         GET,D1   #NXTKEY           GET KEY FOR NEW LINE
*
         PUT,D1   *TAG:OCCKEY,:K(1)
         LW,D1    TAGDISP           GET TAG DISP.
         PUT,D1   *TAG:OCCDISP,:K(1)
         BAL,SRTN S06WRTAG          WRITE TAG
         B        HDROCC            NOW ADD TO HDR REC
*
*
         PAGE
*
*
ADDOCC   EQU      %                 ADD OCCURENCE TO EXISTING TAG
         AI,AC3   4                 ADD 4 BYTES TO SIZE
         CI,AC3   #STDBUFSZ         TEST FOR MAX SIZE
         BG       RTNTAG               >, RETURN
         STW,AC2  NWTAGKEY          SAVE TAG KEY
         GET,AC1  #NXTKEY           GET CURRENT LINE KEY
         SLD,AC1  -32               MOVE TO AC2
         LW,AC3   TAGDISP           GET TAG DISP.
         BAL,SRTN S07TGOCC          ADD TAG OCC.
*
HDROCC   EQU      %
         GET,X1   HDR:NTAGS         GET NUMBER OF TAGS IN HEADER RECORD
         AI,X1    1                 INCREMENT
         PUT,X1   HDR:NTAGS         STORE NUMBER OF TAGS
         LW,D1    NWTAGKEY          GET TAG KEY
         PUT,D1   HDR:TAGKEY,X1     STORE IN HEADER RECORD
         LW,D1    TAGDISP           GET TAG DISP.
         PUT,D1   HDR:TAGDISP,X1    STORE IN TAG
*
RTNTAG   EQU      %
         RETURN                     RETURN
*
*
         PAGE
*
*
S06WRTAG EQU      %                 WRITE TAG RECORD
         SAVRTN
*
         GET,AC1  *TAG:NCTAG        GET NUMBER OF CHARS
         SLS,AC1  -2                CONVERT TO WORDS
         AI,AC1   :EO(TAG:NCTAG)+1  RDD CONTROL WORDS
         GET,D1   *TAG:NOCC         GET NUMBER OF OCCS.
         AW,AC1   D1                ADD TO SIZE
         SLS,AC1  2                 NOW CONVERT TO BYTES
*
         LW,AC2   NWTAGKEY          GET TAG KEY
         LI,AC3   3                 SET BYTE ZERO TO 3
         STB,AC3  AC2
         LI,BUF3  BA(STDX2BUF)      ADDR OF TAG BUFFER
         BAL,SRTN S27WHDR           WRITE TAG RECORD
         RETURN
*
*
         PAGE
*
* C06FIND -- FIND COMMAND
*
* ENTRY PARAMETERS:
*        FLG1 - 'G' FIND TAG
*        FLG2 - 'I'      INDEX TAG
*        FLG3 - 'T'      TITLE TAG
*        FLG4 - 'B'      BLOCK NAME
*        FLG5 - 'A' FIND ALL OCCURENCES
*
*        CS3  - OLD PHRASE OR TAG
*        CS2  - NEW PHRASE OR TAG
*
C06FIND  EQU      %
         SAVRTN
*
         LI,D2    0
         STW,D2   RN1               INITIALIZE RANGE TO NONE
         STW,D2   RN2
         JEZ,AC1  #RN1,TSTRNG5      CHECK FOR RANGE
         LW,D1    AC1               GET START OF RANGE
         JEZ,AC1  #RN2,TSTRNG       CHECK FOR END OF RANGE
         LW,D2    AC1               GET END OF RANGE
TSTRNG   RES      0
         BAL,SRTN S05RANGE          GO GET RANGE
         STW,AC1  RN1               SAVE START OF RANGE
         STW,AC2  RN2               SAVE END OF RANGE
TSTRNG5  RES      0
         GET,D1   #CLP              GET CLP
         STW,D1   CLP
         LWC,D1   #CS,:K(3)         GET OLD PHRASE SIZE/ADDR
         BEZ      PRNTCLP              ZERO, PRINT CLP
         STW,D1   OLSZADDR          SAVE OLD PHRASE SIZE/ADDR
*
         GET,D1   #FLAGS,:K(5)      GET 'ALL' FLAG
         STW,D1   ALLFLG
         GET,D1   #FLAGS,:K(7)      GET DISPLAY FLAG
         STW,D1   DFLG              SAVE
         GET,D1   #FLAGS,:K(8)      GET FIRST OCCURRENCE FLAG
         STW,D1   FFLG              SAVE
         JEZ,D1   (#FLAGS,:K(6)),STCHGFLG  TEST 'CHANGE' FLAG
         LI,D1    BA(REPLMSG)       SET CHANGE FLAG
*
STCHGFLG EQU      %
         STW,D1   CHGFLG
         LWC,D1   #CS,:K(2)         GET SIZE/ADDR OF NEW PHRASE
         STW,D1   NWSZADDR
         LI,D1    0                 INITIALIZE FOUND FLAG
         STW,D1   FNDFLG
*
         PAGE
*
*
         LI,X1    4                 FOUR FLAGS TO TEST
TSTFLGLP EQU      %
         JNEZ,D1  (#FLAGS,X1),SETFLGS   GET NEXT FLAG
         BDR,X1   TSTFLGLP
         B        FNDPH             NONE SET, FIND PHRASE
*
SETFLGS  EQU      %
         STW,X1   TAGTYPE           SAVE TAG TYPE
         LI,BUF1  WA(STDX3BUF)      GET ADDR OF TAG BUFFER
         STW,BUF1 TAGBUF            SAVE WA OF TAG BUFFER
         STW,BUF1 SAVTAGB
*
         MTW,0    CHGFLG            TEST 'CHANGE' FLAG
         BEZ      RDTAG                 NOT SET, GO READ TAG
         LI,BUF1  BA(STDX1BUF)      GET ADDR OF EDIT BUFFER
         STW,BUF1 LNBUF             SAVE ADDR OF TEXT LINE BUFFER
*
RDTAG    EQU      %
         LW,X1    OLSZADDR          GET SIZE/ADDR OF TAG
         LW,D1    TAGTYPE           GET TAG TYPE
         LI,D2    -1                TITLE LEVEL=-1 FOR DONT CHECK
         BAL,SRTN S07RDTAG          READ TAG
         CI,AC1   0                 TEST FOR FOUND
         BNE      GETOCCS               YES, GET OCCURENCES
*
         LI,AC1   24                TAG NOT FOUND
         BAL,SRTN S29STD            PRINT MESSAGE
         B        PRNTCLP           NOW FREE BUFFERS AND RETURN
*
*
         PAGE
*
*
GETOCCS  EQU      %
         BRKCTRL  0                 INITIALIZE BREAK FLAG
         LI,D1    BA(TAGMSG)        SET MESSAGE TYPE
         STW,D1   MSGTYPE
         LI,D1    0                 SET BYTE ZERO OF CLP TO 0
         STB,D1   CLP                   FOR COMPARE
         LW,AC1   OCCBASE           SAVE OCCURENCE BASE
         STW,AC1  SAVOCCB
*
         GET,D1   *TAG:NOCC         GET NUMBER OF OCCURENCES
         STW,D1   FNDNOCC           SAVE
         GET,D1   *TAG:NCTAG        GET NUMBER OF TAG CHARS
         STW,D1   FNDNCTAG          SAVE
         LI,X1    1                 INITIALIZE OCCURENCE INDEX
*
INOCCLP  EQU      %                 NOW FIND FIRST OCCURENCE
         GET,D1   *TAG:OCCKEY,X1    GET NEXT OCC. KEY
         CW,D1    CLP               COMPARE WITH CLP
         BG       STFSTOCC              >, FIRST OCC. FOUND
         AI,X1    1                 INCREMENT OCC. INDEX
         CW,X1    FNDNOCC           TEST FOR MAX OCC.
         BLE      INOCCLP               YES, TEST NEXT OCC.
         LI,X1    1                     NO, START WITH FIRST OCC.
*
         PAGE
*
*
STFSTOCC EQU      %
         STW,X1   FSTOCC            SAVE INDEX FOR FIRST OCCURENCE
         B        OCCFND            NOW GET DISPLACEMENT AND KEY
*
NXTOCC   EQU      %                 FIND NEXT OCCURENCE
         LW,X1    LSTOCC            GET INDEX FOR LAST OCCURENCE
         AI,X1    1                 INCREMENT INDEX
         CW,X1    FNDNOCC           TEST FOR MAX OCCURENCE INDEX
         BLE      SETBASE               OK, SET TAG BASE
         LI,X1    1                     >, SET OCCURENCE INDEX TO 1
*
SETBASE  EQU      %
         CW,X1    FSTOCC            TEST FOR FIRST OCCURENCE AGAIN
         BE       PRNTCLP               YES, DONE
         LW,AC1   SAVTAGB               NO, RESTORE TAG BASE
         STW,AC1  TAGBUF
         LW,AC1   SAVOCCB           RESTORE OCCURENCE BASE
         STW,AC1  OCCBASE
*
*
         PAGE
*
*
OCCFND   EQU      %
         STW,X1   LSTOCC            SAVE INDEX FOR LAST OCC.
         GET,D1   *TAG:OCCKEY,X1    GET KEY FOR OCC.
         STW,D1   OCCKEY            SAVE KEY
         LI,D1    3                 SET BYTE 0 TO 3 FOR KEY
         STB,D1   OCCKEY
         GET,D1   *TAG:OCCDISP,X1   GET DISP. FOR THIS OCCURENCE
         STW,D1   OCCDISP           SAVE DISP.
*
         BAL,SRTN S06PRLN           PRINT LINE NUMBER AND SET CLP
         MTW,0    CHGFLG            TEST CHANGE FLAG
         BEZ      TSTAFLG               NOT SET, GO TEST 'ALL' FLAG
         LW,BUF2  LNBUF                 SET, GET ADDR OF BUFFER
         LI,AC1   #STDBUFSZ         MAX SIZE
         LW,AC2   OCCKEY            KEY FOR READ
         BAL,SRTN S27RTXT           READ TEXT FILE LINE
         STW,AC1  LNSZ              SAVE LINE SIZE
*
*
         PAGE
*
*
         LW,X1    LNBUF             GET ADDR OF LINE
         AI,X1    1                 INCREMENT FOR ATTN COUNT
         AW,X1    OCCDISP           ADD DISP. OF TAG
         LW,AC1   LNBUF             CALC REMAINING SIZE
         SW,AC1   X1
         AW,AC1   LNSZ
         LW,AC2   FNDNCTAG          GET NUMBER OF TAG CHARS
         LW,X2    NWSZADDR          GET SIZE/ADDR OF NEW PHRASE
         BNEZ     INSPH                 NON-ZERO, GO INSERT PHRASE
*
         LW,BUF2  LNBUF             GET ADDR OF BUFFER
         LI,AC3   #ATTN             GET ATTN CHAR FOR COMPARE
         LW,X3    X1                GET ADDR OF TAG
         AW,X3    AC2               ADD SIZE OF TAG
         CB,AC3   0,X3              TEST NEXT CHAR FOR ATTN
         BNE      TSTATNLP              NO, TEST FOR LEADING CHARS
         MTB,-1   0,BUF2            DECREMENT ATTN COUNT
         AI,AC2   1                 INCREMENT DELETE SIZE
*
*
         PAGE
*
*
TSTATNLP EQU      %                 NOW DELETE FIIST ATTN
         AI,X1    -1                DECREMENT FIRST CHAR INDEX
         AI,AC1   1                 INCREMENT PHRASE SIZE
         AI,AC2   1                 INCREMENT REMAINING LINE SIZE
         CB,AC3   0,X1              TEST FOR ATTN
         BNE      TSTATNLP              NO, TEST NEXT
         MTB,-1   0,BUF2                YES, DECREMENT ATTN COUNT
*
INSPH    EQU      %
         BAL,SRTN S05INS            INSERT PHRASE OR DELETE OLD PHRASE
         AWM,AC2  LNSZ              CALCULATE NEW LINE SIZE
         BAL,SRTN S06SCAN           NOW SCAN LINE AND RE-WRITE
*
TSTAFLG  EQU      %
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     FTBRK                SET, INTERRUPT FIND
         MTW,0    ALLFLG            TEST 'ALL' FLAG
         BNEZ     NXTOCC                SET, GET NEXT OCCURENCES
*
RTNFIND  EQU      %                 RETURN
         B        PRNTCLP           GO PRINT CLP MESSAGE
*
FTBRK    EQU      %
         LI,AC1   42                'FIND INTERRUPT' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        PRNTCLP           FREE BUFFERS AND RETURN
*
*
         PAGE
*
*
S06PRLN  EQU      %
         SAVRTN
*
         MTW,0    FNDFLG            TEST FOR FIRST FIND
         BNEZ     GETLNKEY             NO, GET LINE NUMBER
         MTW,1    FNDFLG               YES, SET FOUND FLAG
         LW,X1    MSGTYPE           GET MESSAGE TYPE
         LB,AC1   0,X1              GET MESSAGE SIZE
         LI,X2    BA(STDPRBUF)+1    GET MESSAGE BUFFER
         STB,AC1  X2                COUNT FOR MBS
         MBS,X1   1                 MOVE FIND TYPE TO MSG
*
         LW,X1    CHGFLG            GET CHANGE MESSAGE
         BEZ      MVLNSMSG             ZERO, NO CHANGE
         LB,AC2   0,X1              GET MESSAGE SIZE
         STB,AC2  X2                COUNT FOR MBS
         MBS,X1   1                 MOVE 'REPLACE' MSG
         AW,AC1   AC2               ADD MSG SIZE TO COUNT
*
MVLNSMSG EQU      %
         LI,X1    BA(ONLNSMSG)+1    GET ADDR OF MSG
         LB,AC2   ONLNSMSG          MSG SIZE
         STB,AC2  X2                COUNT FOR MBS
         MBS,X1   0                 MOVE 'ON LINES' MSG
         AW,AC1   AC2               ADD TO TOTAL SIZE
*
         LI,AC2   #CR               GET CR CHAR
         STB,AC2  STDPRBUF          STORE IN MSG (1ST CHAR)
         AI,AC1   1                 INCR COUNT FOR CR
         LI,BUF1  BA(STDPRBUF)      GET ADDR OF MSG
         BAL,SRTN S27PRINT          PRINT MSG
*
*
         PAGE
*
*
GETLNKEY EQU      %
         MTW,0    DFLG              CHECK DISPLAY FLAG
         BEZ      WLNNO             OFF
         LW,AC1   LNSZ              GET LINE SIZE
         AI,AC1   -2                DECR FOR ATTN AND CR
         LW,BUF3  LNBUF             GET BUFFER ADDR
         AI,BUF3  1                 INCR PAST ATTN COUNT
         BAL,SRTN S27WTERM          WRITE LINE TO TERMINAL
WLNNO    RES      0
         LW,AC2   OCCKEY            GET OCCURENCE KEY
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 SAVE EBCDIC KEY
         STM,AC1  LNKEY
*
         MOVE,X1  BA(LNKEY),INSFNDLN,8  MOVE LINE KEY
         LI,BUF1  BA(FNDMSG)+1      GE ADDR OF MSG
         LB,AC1   FNDMSG            GET SIZE
         BAL,SRTN S27PRINT          PRINT KEY
*
         LW,D1    OCCKEY            GET KEY
         PUT,D1   #CLP              SET CLP TO OCCURENCE KEY
         RETURN
*
*
         PAGE
*
* S06SCAN -- SCAN LINE AND RE-WRITE
*
S06SCAN  EQU      %
         SAVRTN
*
         LW,AC2   OCCKEY            GET OCCURENCE KEY
         PUT,AC2  #NXTKEY           SET EDIT KEY
         BAL,SRTN S05DLINE          DELETE LINE FROM TEXT&HEADER FILES
         LW,BUF2  LNBUF             GET ADDR OF LINE
         LB,AC2   0,BUF2            GET ATTN COUNT
         AI,BUF2  1                 INCREMENT START OF LINE FOR ATTN CNT
         LW,AC1   LNSZ              GET LINE SIZE
         AI,AC1   -1                DECREMENT SIZE FOR ATTN COUNT
         BAL,SRTN S01SCAN           SCAN LINE FOR EMBEDDED COMMANDS
         CI,SR3   0                 TEST FOR ERROR RETURN
         BNE      RTNSCAN              YES, RETURN
*
         LW,BUF3  LNBUF             GET ADDR OF LINE
         STB,AC2  0,BUF3            STORE ATTN COUNT
         AI,AC1   1                 INCREMENN SIZE FOR ATTN COUNT
         LW,AC2   OCCKEY            GET OCCURENCE KEY
         BAL,SRTN S01TXTLN          WRITE TEXT FILE LINE
         LI,SR3   0                 SET NO ERROR
*
RTNSCAN  EQU      %
         RETURN
*
*
         PAGE
*
*
PRNTCLP  EQU      %                 PRINT CLP
         GET,AC2  #CLP              GET KEY FOR CLP
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 SAVE EBCDIC KEY
         STM,AC1  LNKEY
         MOVE,X1  BA(LNKEY),INSCLP,8  MOVE KEY TO CLP MESSAGE
*
         LI,BUF1  BA(CLPMSG)+1      GET ADDR OF CLP MESSAGE
         LB,AC1   CLPMSG            GET SIZE OF CLP MESSAGE
         BAL,SRTN S27PRINT          PRINT CLP MESSAGE
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
*
         PAGE
*
*
FNDPH    EQU      %
         LI,D1    BA(PHMSG)         SET MSG TYPE
         STW,D1   MSGTYPE
         LI,BUF1  BA(STDX1BUF)      GET EDIT BUFFER
         STW,BUF1 LNBUF             SAVE ADDR OF BUFFER
         MTW,0    CHGFLG            TEST 'CHANGE' FLAG
         BEZ      INITPHR              NOT SET, INITIALIZE
         LI,BUF1  BA(STDX3BUF)      GET ADDR FOR SAVE BUFFER
         STW,BUF1 CHGBUF            STORE BUFFER ADDR
*
INITPHR  EQU      %
         LI,AC1   0
         STW,AC1  FNDFLG            INITIALIZE PHRASE FOUND FLAG
         STW,AC1  LSTFLG            INITIALIZE LAST LINE FLAG
         LW,AC2   RN1               GET START OF RANGE
         BNEZ     INITPHR3          USE IT
         LW,AC2   CLP               GET KEY FOR CLP
INITPHR3 RES      0
         BAL,SRTN S27RTXT           POSITION TEXT FILE AT CLP
         CI,AC2   0                 TEST FOR NO LINES
         BE       NOPHERR              NONE, ERROR
         BRKCTRL  0                 INITIALIZE BREAK FLAG
         MTW,0    RN1               CHECK FOR RANGE
         BEZ      RDNXT             NONE
         LW,D1    RN2               GET END OF RANGE
         BNEZ     INITPHR5
         LW,D1    RN1               NO END, GET START
INITPHR5 RES      0
         STW,D1   CLP               SAVE AS END OF SEARCH RANGE
         B        RDTXTLN
*
*
         PAGE
*
*
RDNXT    EQU      %
         LI,AC2   0                 SET KEY FOR READ NEXT
RDTXTLN  EQU      %
         LW,BUF2  LNBUF             GET ADDR OF BUFFER
         LI,AC1   #STDBUFSZ         GET MAX READ SIZE
         BAL,SRTN S27RTXT           READ TEXT FILE LINE
*
         CI,AC1   0                 TEST FOR END-OF-FILE
         BNE      TSTCLP                NO, TEST FOR CLP
         GET,AC2  #FKEY                 YES, GET KEY FOR FIRST LINE
         B        RDTXTLN           GO READ FIRST LINE
*
TSTCLP   EQU      %
         STW,AC1  LNSZ              SAVE TEXT LINE SIZE
         STW,AC2  OCCKEY            SAVE TEXT LINE KEY
         CW,AC2   CLP               COMPARE KEY TO CLP
         BNE      TSTPHR                NOT EQUAL, GO TEST PHRASE
         MTW,1    LSTFLG                EQUAL, LAST LINE TO SEARCH
*
*
         PAGE
*
*
TSTPHR   EQU      %
         LW,X1    LNBUF             GET ADDR OF LINE
         AI,X1    1                 INCREMENT TO REMOVE ATTN COUNT
         AI,AC1   -1                DECREMENT SIZE
         LW,X2    OLSZADDR          GET SIZE/ADDR OF OLD PHRASE
         BAL,SRTN S05LOC            TEST FOR PHRASE IN LINE
*
         CI,AC2   0                 TEST FOR PHRASE FOUND
         BE       NXTLN                 NO, GET NEXT LINE
*
SETINS   EQU      %
         MTW,0    CHGFLG            TEST 'CHANGE' FLAG
         BEZ      PRNTLN               NOT SET, PRINT LINE NUMBER
         MOVE,D1  BA(STDX1BUF),*CHGBUF,*LNSZ  SET, SAVE LINE
         LW,D1    LNSZ              GET LINE SIZE
         STW,D1   CHGSZ             SAVE LINE SIZE
         LW,AC1   LNBUF             GET ADDR OF LINE START
         SW,AC1   X1                SUBTRACT START-OF-PHRASE ADDR
         AW,AC1   LNSZ              ADD LINE SIZE (CALC SIZE TO END)
         LW,X2    NWSZADDR          GET SIZE/ADDR OF NEW PHRASE
*
*
         PAGE
*
*
INSPHR   EQU      %
         BAL,SRTN S05INS            INSERT NEW PHRASE IN LINE
         AWM,AC2  LNSZ              CALC. NEW LINE SIZE
         MTW,0    ALLFLG            TEST 'ALL' FLAG
         BEZ      SCANNWPH             NOT SET, PRINT DXRRENT LINE
         LW,X1    X2                GET NEW START ADDR
         LW,X2    OLSZADDR          GET SIZE/ADDR OF OLD PHRASE
*
         LW,AC1   LNBUF             GET ADDR OF LINE
         AW,AC1   LNSZ              ADDR OF END
         SW,AC1   X1                SIZE OF REMAINING LINE
         BAL,SRTN S05LOC            SEARCH FOR PHRASE
         CI,AC2   0                 TEST FOR FOUND
         BNE      SETINS               YES, INSERT NEW PHRASE
*
*
         PAGE
*
*
SCANNWPH EQU      %
         BAL,SRTN S06SCAN           SCAN AND SAVE NEW LINE
         CI,SR3   0                 TEST FOR ERROR
         BE       PRNTLN               NO, GO PRINT LINE NUMBER
         MOVE,D1  *CHGBUF,BA(STDX1BUF),*CHGSZ  YES, RESTORE OLD LINE
         LW,AC1   CHGSZ             GET OLD SIZE
         STW,AC1  LNSZ              RESTORE SIZE
*
         LW,AC2   OCCKEY            GET OCC. KEY
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 STORE NUMBER
         STM,AC1  LNKEY
         MOVE,D1  BA(LNKEY),INSLNERR,8  MOVE TO MESSAGE
         LI,BUF1  BA(LNERRMSG)+1    GET ADDR OF ERROR MSG
         LB,AC1   LNERRMSG          GET SIZE
         BAL,SRTN S27PRINT          PRINT MSG
         BAL,SRTN S06SCAN           SCAN AND RESTORE OLD LINE
         B        TSTALLPH          GO TEST 'ALL' FLAG
*
PRNTLN   EQU      %
         BAL,SRTN S06PRLN           PRINT LINE NUMBER OF PHRASE
TSTALLPH EQU      %
         MTW,0    FFLG              FIND FIRST OCCURRENCE ONLY
         BNEZ     NXTLN             YES
         MTW,0    ALLFLG            TEST 'ALL' FLAG
         BEZ      PRNTCLP              NOT SET, RETURN
*
*
         PAGE
*
*
NXTLN    EQU      %
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     FPBRK                SET, INTERRUPT FIND
         MTW,0    LSTFLG            TEST LAST-LINE FLAG
         BEZ      RDNXT                 NOT SET, READ NEXT LINE
*
TSTFFLG  EQU      %
         MTW,0    FNDFLG            TEST FOUND FLAG
         BNEZ     PRNTCLP               SET, FREE BUFFER
*
NOPHERR  EQU      %
         LI,AC1   14                    NOT SET, 'NO SUCH PHRASE' MSG
         BAL,SRTN S29STD            PRINT MESSAGE
         B        PRNTCLP           GO PRINT NEW CLP
*
FPBRK    EQU      %
         LI,AC1   42                'FIND INTERRUPTED' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        PRNTCLP           FREE BUFFER AND RETURN
*
*
         PAGE
*
*
*
TAGMSG   TEXTC    'TAG FOUND '      TAG MESSAGE
PHMSG    TEXTC    'PHRASE FOUND '   PHRASE MESSAGE
REPLMSG  TEXTC    'AND REPLACED '   CHANGE MESSAGE
ONLNSMSG MESSAGE  'ON LINE(S):'
         PAGE
*
* LOCAL VARIABLES
*
6D       CSECT    0                 START OF LOCALS
TAGTYPE  RES      1                 TAG TYPE
TAGDEF   RES      1                 TAG SIZE/ADDR
TAGCHARS RES      1                 TAG RECORD SIZE
TAGKEY   RES      1                 TAG KEY
TLEVEL   RES      1                 TITLE LEVEL
TAGDISP  RES      1                 TAG DISPLACEMENT
*
BUFADDR  RES      1                 BUFFER ADDR
LNBUF    RES      1                 TEXT LINE BUFFER ADDR
LNSZ     RES      1                 TEXT LINE SIZE
LNKEY    RES      2                 TEXT LINE KEY (EBCDIC)
NWTAGKEY RES      1                 NEW TAG KEY
CHGBUF   RES      1                 SAVE OLD LINE BUFFER
CHGSZ    RES      1                 SAVE OLD LINE SIZE
*
ALLFLG   RES      1                 'ALL' FLAG
CHGFLG   RES      1                 'CHANGE' FLAG
DFLG     RES      1                 DISPLY FLAG
FFLG     RES      1                 FIRST OCCURRENCE FLAG
MSGTYPE  RES      1                 MESSAGE TYPE
CLP      RES      1                 CLP
OCCKEY   RES      1                 OCCURENCE KEY
FNDFLG   RES      1                 FOUND FLAG
LSTFLG   RES      1                 LAST FLAG
FNDNOCC  RES      1                 NUMBER OF OCCS. FOR FIND
FSTOCC   RES      1                 FIRST OCC. FOR FIND
LSTOCC   RES      1                 LAST OCC. FOR FIND
OCCDISP  RES      1                 OCC. DISPLACEMENT
FNDNCTAG RES      1                 NUMBER OF CHARS IN FIND TAG
*
OLSZADDR RES      1                 SIZE/ADDR OF OLD PHRASE
NWSZADDR RES      1                 SIZE/ADDR OF NEW PHRASE
SAVTAGB  RES      1                 SAVE TAG ADDR
SAVOCCB  RES      1                 SAVE OCC. BASE
*
RN1      RES      1                 START OF RANGE
RN2      RES      1                 END OF RANGE
         PAGE
*
* CLP MESSAGE
*
CLPMSG   MESSAGE  'CLP AT LINE NUMBER ',(INSCLP,8),#CR
FNDMSG   MESSAGE  '   ',(INSFNDLN,8)
LNERRMSG MESSAGE  'LINE ',(INSLNERR,8),' NOT CHANGED',#CR
*
*
         USECT    #PLOC
         END
