* 4/22/72 -- 09:00 (7F)
* MODULE NAME: AFCTRL
* NUMBER: 15
* PURPOSE: CREATE AND MAINTAIN AUXILIARY FILES
*
* ENTRY POINTS:
*
         DEF      S15INIT           INITIALIZE AF STATUS TABLE
         DEF      C15READ           READ AUX. FILE INTO MEMORY
         DEF      S15CLEAR          CLEAR ONE OR ALL AUX. FILES
         DEF      S15SINDX          GET NEXT SELECTED INDEX ENTRY
         DEF      S15XINDX          FIND SPECIFIC EXCLUDED INDEX ENTRY
         DEF      S15FNDSC          FIND SPECIAL CHAR ENTRY
*
         REF      S27OCPY,S27CCPY   OPEN,CLOSE COPY FILE
         REF      S27RCPY           READ COPY FILE
         REF      S36M:GCP,S36M:FCP GET,FREE COMMON  PAGES
         REF      S35HEXC           CONVERT EBCDIC TO HEX DIGITS
         REF      S27PRINT,S29STD   PRINT,WRITE STANDARD MESSAGES
         REF      S35CNVRT          CONVERT ENTRY COUNT
         REF      ZRORTNST          RE-INITIALIZE RETURN STACK
         REF      S28DCMPR          DE-COMPRESS TEXT LINES
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVCMDSTA
            INVWSSTA
            INVAFSTA
            INVHDRSTA
*
*
         PAGE
*
*
*
         DEF      15P,15D
*
15P      EQU      %
         DATA     X'15'             MODULE NUMBER
         DATA     X'042272'         DATE
         DATA     X'0900'           TIME
*
*
         TITLE    '** AFCTRL(15) **'
*
* S15INIT -- INITIALIZE AF STATUS TABLE
*
S15INIT  EQU      %
         SAVRTN
*
         LI,X1    SZAFSTA           GET SIZE OF AF STATUS TABLE
         LI,D1    0                 SET ALL ENTRIES TO ZERO
INITLP   EQU      %
         PUT,D1   AF:INIT,X1        STORE IN TABLE ENTRI
         BDR,X1   INITLP            ALL ENTRIES
*
         RETURN
*
*
         PAGE
*
* S15CLEAR -- CLEAR AUXILIARY FILES FROM MEMORY
*
* ENTRY PARAMETER:X1 = 0 FOR ALL
*                      1 FOR 'D' TYPE (SPECIAL CHARS)
*                      2 FOR 'S' TYPE (SELECTED INDEX)
*                      3 FOR 'X' TYPE (EXCLUDED INDEX)
*
S15CLEAR EQU      %
         SAVRTN
         CI,X1    0                 TEST FOR CLEAR ALL
         BNE      CLEARONE              NO, GO CLEAR ONE ONLY
*
CLEARALL EQU      %                     YES, CLEAR ALL
         JEZ,AC1  AF:NUMPG,CLRAFSTA GET NUMBER OF PAGES
         BAL,SRTN S36M:FCP          GO FREE ALL AUX. FILE PAGES
CLRAFSTA EQU      %
         BAL,SRTN S15INIT           CLEAR AF STATUS TABLE
         B        RTNCLEAR          RETURN
*
*
         PAGE
*
*
CLEARONE EQU      %
         JEZ,X2   (AF:FSTPG,X1),RTNCLEAR     TEST FIRST PAGE ADDR
         LI,D1    0                 NON-ZERO, RESET NEXT PAGE ADDR
         PUT,D1   AF:NXTPG,X1
         LI,X3    3                 TEST FOR ALL AUX FILES NOW CLEAR
*
TSTWDLP  EQU      %
         JNEZ,D1  (AF:NXTPG,X3),RESETPGS     TEST NEXT PAGE ADDR
         BDR,X3   TSTWDLP           ZERO, TEST ALL THREE
         B        CLEARALL          ALL ZERO, CLEAR ALL AUX FILES
*
RESETPGS EQU      %                 CANNOT CLEAR ALL
         LW,X3    0,X2              GET FIRST ENTRY ON PAGE
         AI,X2    1                 INCREMENT POINTER TO 2ND WORD
         STW,X2   NXTWRD            SAVE POINTER
         AI,X2    1                 INCREMENT POINTER TO FIRST ENTRY
         STW,X2   *NXTWRD           STORE NEXT ENTRY POINTER IN PAGE
         LW,X2    X3                GET NEXT POINTER
         BGZ      RESETPGS              NON-ZERO, RESET PAGE
*
RTNCLEAR EQU      %                 RETURN
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
*
         PAGE
*
* C15READ -- 'R' COMMAND, READ SPECIFIED AUXILIARY FILE
*
*
C15READ  EQU      %
         SAVRTN
*
         LI,X3    3                 THREE FLAGS TO TEST
GFLGLP   EQU      %
         JNEZ,D1  (#FLAGS,X3),SETFLG TEST FLAG.IF SET,STORE NUMBER
         BDR,X3   GFLGLP                NOT SET, TEST NEXT FLAG
*
SETFLG   EQU      %
         STW,X3   AFTYPE            STORE AF TYPE
         GET,X1   #DOCNM            GET ADDR OF NAME
         GET,AC1  #NCDOCNM          GET SIZE
         LI,X2    INSAFNM           ADDR OF MESSAGE
         STB,AC1  X2                STORE COUNT FOR MBS
         MBS,X1   0                 MOVE NAME TO MESSAGE
         AI,X2    -BA(AFMSG)-1      CALC. SIZE OF MESSAGE
         STB,X2   AFMSG             STORE SIZE
*
         LI,AC1   #IN               OPEN AUX. FILE IN INPUT MODE
         BAL,SRTN S27OCPY
         CI,SR3   0                 TEST FOR NAME OK
         BE       FLEOK                 YES, GO TEST RECORD 0.0
*
         CI,SR3   3                 TEST FOR FILE NOT THERE
         BNE      ADERR                 NO, MUST BE ACCESS DENIED
         LI,AC1   19                'DOCUMENT DOES NOT EXIST' MESSAGE
         B        PRNTMSG           GO PRINT MESSAGE AND RETURN
*
         PAGE
*
*
ADERR    EQU      %
         LI,AC1   20                'ACCESS DENIED' MESSAGE
*
PRNTMSG  EQU      %
         BAL,SRTN S29STD            PRINT ERROR MESSAGE
         LI,AC1   6                 'ACTION CANCELLED' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        RTNREAD           RETURN
*
FLEOK    EQU      %
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER
         LI,AC1   SZWSSTA*4         GET MAX SIZE
         LW,AC2   L(#ZROKEY)        KEY= 0.0 FOR MASTER RECORD
         BAL,SRTN S27RCPY           READ MASTER RECORD
         CI,AC1   0                 TEST FOR NO RECORD
         BE       ADERR                 YES, PRINT ERROR MESSAGE
*
         LW,AC1   STDINBUF+:EO(WS:TXTCODE) GET CODE WORD
         CW,AC1   L(#CODEWRD)       COMPARE WITH TEXT CODE WORD
         BNE      ADERR             NOT TEXT FILE, PRINT ERROR MESSAGE
         LI,AC1   0
         STW,AC1  LNSZ              SET INITIAL LINE SIZE
*
         PAGE
*
*
         BAL,SRTN S15RDNXT          READ FIRST ENTRY IN FILE
         CI,AC1   1                 TEST FOR SIZE = 1
         BNE      ILLFENT               NO, ILLEGAL ENTRY
         LW,X3    AFTYPE                YES, GET AF TYPE
         LB,AC1   TYPEWRD,X3        GET CHAR (D,S,X)
         LI,X4    INSTYPE           GET ADDR OF TYPE MSG
         STB,AC1  0,X4              STORE AF TYPE
         CB,AC1   0,X1              COMPARE TO FIRST ENTRY
         BE       GFSTWD                EQUAL, GET ADDR OF FIRST WORD
         AI,AC1   -X'40'            CONVERT TYPE TO L.C.
         CB,AC1   0,X1              COMPARE AGAIN
         BE       GFSTWD                EQUAL, GET ADDR OF FIRST WORD
*
ILLFENT  EQU      %                 ILLEGAL FIRST ENTRY
         LI,AC1   33                'ILLEGAL FIRST ENTRY' MESSAGE
         B        PRNTMSG           GO PRINT MESSAGE
*
*
TYPEWRD  EQU      %
         DATA,1   0,'D','S','X'
*
*
         PAGE
*
*
GFSTWD   EQU      %
         LI,D1    0                 INITIALIZE ENTRY COUNT
         STW,D1   ENTRYCNT
         BRKCTRL  0                 INITIALIZE BREAK FLAG
         JNEZ,X1  (AF:NXTPG,X3),PGFND   TEST LAST-PAGE ADDR
         JNEZ,X1  (AF:FSTPG,X3),USEFSTPG TEST FIRST-WORD POINTER
*
GNWPG    EQU      %                 GET NEW PAGE FOR AUX. FILE
         BAL,SRTN S15GRPG
         CI,SR3   0                 TEST FOR NO MORE PAGES
         BNE      AFRTNMSG             NO MORE, RETURN
*
SETSTPG  EQU      %
         STW,X2   PGSTART           SAVE START ADDR FOR PAGE
         AI,X2    1                 CALC ADDR OF NEXT ENTRY WORD
         STW,X2   NXTWRD            STORE ADDR
*
         AI,X2    1                 CALC ADDR OF FIRST ENTRY
         STW,X2   *NXTWRD           STORE IN PAGE
         B        STNXTENT          GO STORE IN AF TABLE POINTER
*
USEFSTPG EQU      %
         PUT,X1   AF:NXTPG,X3       USE FIRST-PAGE ADDR
         LI,AC1   0                 SET NEXT-PAGE POINTER TO 0
         STW,AC1  0,X1
         LW,X2    X1                GET ADDR IN X2
         B        SETSTPG           GO SET STARTING PAGE
*
*
         PAGE
*
*
PGFND    EQU      %                 LAST PAGE IN CHAIN
         STW,X1   PGSTART           SAVE STARTING ADDR
         AI,X1    1                 CALC ADDR OF 2ND WORD
         STW,X1   NXTWRD            SAVE 2ND WORD ADDR
         LW,X2    0,X1              GET ADDR OF NEXT ENTRY ON PAGE
*
STNXTENT EQU      %
         STW,X2   NXTENTRY          STORE NEXT ENTRY ADDR FOR AF STATUS
*
GETENTRY EQU      %                 TEST NEXT ENTRY ADDR
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     AFBRK                SET, AF BREAK
         LW,AC1   NXTENTRY          GET ADDR
         SW,AC1   PGSTART           SUBTRACT PAGE START
         CI,AC1   500               TEST FOR MORE THAN 500 WORDS
         BGE      GNWPG                 YES, GET NEW PAGE
*
         BAL,SRTN S15RDNXT          READ NEXT ENTRY IN FILE
         CI,AC1   0                 TEST FOR EOF
         BE       AFRTNMSG              YES, RETURN
         STW,X1   FCSCS             SAVE ADDR OF ENTRY
         STW,AC1  ENTRYSZ           SAVE SIZE OF ENTRY
*
*
         PAGE
*
*
         LW,X2    NXTENTRY          GET WORD ADDR OF NEXT ENTRY
         SLS,X2   2                 CONVERT TO BYTE ADDR
         AI,X2    2                 INCREMENT TO FIRST CHAR OF ENTRY
         LW,AC3   AFTYPE            GET AF TYPE
         CI,AC3   1                 TEST FOR SP. CHAR TYPE
         BG       INDXTYPE              NO, INDEX TYPE
*
SPCHTYPE EQU      %                 SPECIAL CHAR TYPE
         LW,AC2   X3                GET ADDR OF SP. CHAR STRING
         BEZ      GETENTRY          NONE, GET NEXT ENTRY
         AW,AC1   X1                CALC ADDR OF LAST CHAR
         STW,AC1  LSTCHAR           SAVE LAST CHAR ADDR
*
         SW,AC2   X1                CALC SIZE OF STANDARD CHAR STRING
         AI,AC2   -1
         BLEZ     GETENTRY          ZERO, GET NEXT ENTRY
         STB,AC2  X2                STORE SIZE FOR MBS
         MBS,X1   0                 MOVE STANDARD CHAR STRING TO ENTRY
         STW,AC2  NSCS              SAVE NUMBER OF CHARS
*
*
         PAGE
*
*
         LB,AC1   0,X3              GET FIRST CHAR IN REPLACEMENT STRING
         CI,AC1   'X'               TEST FOR 'X'
         BE       TSTSQT            TEST QUOTE
         CI,AC1   LC('X')           ALLOW L.C.
         BNE      GETENTRY              NO, GET NEXT ENTRY
*
TSTSQT   EQU      %
         AI,X3    1                 INCREMENT POINTER
         LB,AC1   0,X3              GET NEXT CHAR
         CI,AC1   X'7D'             TEST FOR SINGLE-QUOTE
         BNE      GETENTRY              NO, GET NEXT ENTRY
*
         LW,X1    LSTCHAR           GET LAST CHAR OF ENTRY
         AI,X1    -1                DECREMENT
         LB,AC1   0,X1              GET CHAR
         CI,AC1   X'7D'             TEST FOR SINGLE QUOTE
         BNE      GETENTRY              NO, GET NEXT ENTRY
         STW,X1   LSTCHAR
*
         SW,X1    X3                CALC NUMBER OF HEX CHARS
         AI,X1    -1
         CI,X1    1                 TEST FOR EVEN NUMBER
         BANZ     ILLENTRY             NO, ILLEGAL ENTRY
*
*
         PAGE
*
*
         LI,AC1   0
         STW,AC1  HEXCNT            INITIALIZE HEX CHAR COUNT
*
GHEXLP   EQU      %
         AI,X3    1                 INCREMENT HEX STRING POINTER
         LB,AC1   0,X3              GET FIRST DIGIT IN AC1
         AI,X3    1                 INCREMENT HEX STRING POINTER
         LB,AC2   0,X3              GET NEXT DIGIT IN AC2
         CW,X3    LSTCHAR           TEST FOR QUOTE-SIGN PASSED
         BGE      STXCNT                YES, GO STORE COUNT
*
         BAL,SRTN S35HEXC           CONVERT EBCDIC TO HEX DIGITS
         CI,AC1   -1                TEST FOR ILLEGAL HEX NUMBER
         BE       ILLENTRY              YES, ILLEGAL ENTRY
         STB,AC1  0,X2              STORE NEW HEX BYTE IN TABLE
         AI,X2    1                 INCREMENT POINTER
         MTW,1    HEXCNT            INCREMENT HEX COUNT
         B        GHEXLP            GET NEXT DIGITS
*
*
         PAGE
*
*
STXCNT   EQU      %
         LW,D1    HEXCNT            GET HEX COUNT
         BEZ      GETENTRY              ZERO, GET NEXT ENTRY
         MTW,1    ENTRYCNT          INCREMENT COUNT
         PUT,D1   *AF:XSPC          STORE HEX COUNT IN CONTROL WORD
         LW,D2    NSCS              GET STANDARD CHAR STRING SIZE
         PUT,D2   *AF:NSTC          STORE IN CONTROL WORD
*
         AW,D1    D2                CALC TOTAL NUMBER OF CHARS
         AI,D1    5
         SLS,D1   -2                CONVERT TO WORDS
         AW,D1    NXTENTRY          ADD TO START OF ENTRY
         STW,D1   NXTENTRY          STORE ADDR OF NEXT ENTRY
         STW,D1   *NXTWRD
         B        GETENTRY          GET NEXT ENTRY
*
ILLENTRY EQU      %                 ILLEGAL ENTRY
         MOVE,X1  *FCSCS,BA(MSGBUF),*ENTRYSZ  MOVE ENTRY TO BUFFER
         LI,AC3   #CR               GET CR CHAR
         STB,AC3  0,X2              STORE IN BUFFER
         LW,AC1   ENTRYSZ           GET ENTRY SIZE
         AI,AC1   1                 INCR FOR CR
         LI,BUF1  BA(MSGBUF)        GET ADDR OF BUFFER
         BAL,SRTN S27PRINT          PRINT ILLEGAL ENTRY
         LI,AC1   34                'ILLEGAL ENTRY' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        GETENTRY          GET NEXT ENTRY
*
         PAGE
*
*
INDXTYPE EQU      %                 INDEX-TYPE AUX FILE
         MTW,1    ENTRYCNT          INCREMENT COUNT
         PUT,AC1  *AF:NSTC          STORE NUMBER OF CHARS IN ENTRY
         AI,X2    -1
         STB,AC1  X2                STORE COUNT FOR MBS
         MBS,X1   0                 MOVE ENTRY
*
         SLS,AC1  -2                CALC NUMBER OF WORDS
         AI,AC1   1
         AW,AC1   NXTENTRY          ADD CURRENT ENTRY ADDR
         STW,AC1  NXTENTRY          STORE IN NEXT ENTRY
         STW,AC1  *NXTWRD           STORE IN 2ND WORD ON PAGE
         B        GETENTRY          GET NEXT ENTRY
*
RTNREAD  EQU      %
         LI,AC1   #SAVE             CLOSE FILE WITH SAVE
         BAL,SRTN S27CCPY
*
TSTPGZRO EQU      %
         LW,AC1   NXTENTRY          GET NEXT ENTRY POINTER
         AI,AC1   -2                DECR. TO TEST PAGE START
         LW,X1    AFTYPE            GET AF TYPE
         GET,D1   AF:FSTPG,X1       GET FIRST PAGE ADDR
         CW,D1    AC1               COMPARE TO NEXT ENTRY
         BE       CLEARONE          EQUAL, GO CLAER
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
*
         PAGE
*
*
AFBRK    EQU      %
         LI,AC1   41                'READ COMMAND INTERRUPTED'
         BAL,SRTN S29STD            PRINT MESSAGE
*
AFRTNMSG EQU      %
         LI,BUF1  BA(AFMSG)+1       GET MESSAGE ADDR
         LB,AC1   AFMSG             GET SIZE
         BAL,SRTN S27PRINT          PRINT NAME MESSAGE
*
         LW,AC1   ENTRYCNT          GET NUMBER OF ENTRIES
         BAL,SRTN S35CNVRT          CONVERT TO EBCDIC
         STW,AC2  ENTRYCNT          SAVE COUNT
         MOVE,X1  BA(ENTRYCNT),INSCOUNT,4  MOVE COUNT TO MSG
         LI,BUF1  BA(ENTRYMSG)+1    GET ADDR OF MESSAGE
         LB,AC1   ENTRYMSG          GET SIZE
         BAL,SRTN S27PRINT          PRINT MESSAGE
         B        RTNREAD           RETURN
*
*
         PAGE
*
* S15SINDX -- FIND NEXT SELECTED INDEX ENTRY
* S15XINDX -- FIND SPECIFIC EXCLUDED INDEX ENTRY
* S15FNDSC -- FIND SPECIAL CHAR ENTRY
*
* ENTRY PARAMETERS:
*        X1= -1 TO FIND FIRST SELECTED INDEX ENTRY
*          =  0 TO FIND NEXT SELECTED INDEX ENTRY
*          =  BYTE ADDR OF WORD TO FIND IN EXCLUDED INDEX
*        AC1= SIZE OF PHRASE TO FIND IN EXCLUDED INDEX
*
* EXIT PARAMETERS:
*        X1=  ADDR OF PHRASE FOUND IN INDEX
*        AC1= SIZE PHRASE FOUND IN INDEX (0 IF NOT FOUND)
*
S15SINDX EQU      %
         SAVRTN
*
         CI,X1    0                 TEST FOR FIRST CALL
         BGE      FNDNXT                NO, GET NEXT ENTRY
         LI,X2    2                     YES, SET AF TYPE
         B        STYPE             GO STORE AF TYPE
*
S15XINDX EQU      %
         SAVRTN
*
         STW,X1   FCSCS             SAVE ADDR OF WORD
         STW,AC1  ENTRYSZ           SAVE SIZE OF WORD
         LI,X2    3                 SET AF TYPE
         B        STYPE             GO STORE AF TYPE
*
*
         PAGE
*
*
S15FNDSC EQU      %
         SAVRTN
*
         STW,X1   FCSCS             SAVE ADDR OF WORD
         STW,AC1  ENTRYSZ           SAVE SIZE
         LI,X2    1                 SET 'D' TYPE
*
STYPE    EQU      %
         JEZ,X1   (AF:FSTPG,X2),NTFND   TEST ADDR OF FIRST PAGE
         AI,X2    -2                SET S-TYPE TO ZERO, X-TYPE TO ONE
         STW,X2   AFTYPE            STORE AF TYPE
*
NXTPG    EQU      %
         STW,X1   PGSTART           SAVE ADDR OF FIRST WORD ON PAGE
         LW,AC1   1,X1              GET POINTER TO LAST ENTRY
         STW,AC1  LSTENTRY          SAVE ADDR OF LAST ENTRY
         AI,X1    2                 INCREMENT TO ADDR OF FIRST ENTRY
         STW,X1   NXTENTRY          SAVE FIRST ENTRY ADDR
*
FNDNXT   EQU      %                 FIND NEXT ENTRY
         LW,X1    NXTENTRY          GET ADDR
         CW,X1    LSTENTRY          COMPARE TO LAST ADDR
         BL       TSTINDX               LESS, TEST INDEX ENTRY
         LW,X1    *PGSTART          LAST ENTRY, GET ADDR OF NEXT PAGE
         BEZ      NTFND                 ZERO, ENTRY NOT FOUND
         B        NXTPG                 NON-ZERO GET NEXT PAGE
*
*
         PAGE
*
*
TSTINDX  EQU      %
         GET,D1   *AF:NSTC          GET ENTRY SIZE
         LW,AC1   D1
         MTW,0    AFTYPE            TEST AF TYPE
         BGEZ     CALCNEXT             INDEX, GO SET NEXT ADDR
         GET,D2   *AF:XSPC          GET SP CHAR SIZE
         AW,D1    D2                ADD TO STD CHAR SIZE
         AI,D1    1                 INCR FOR SP CHAR COUNT
*
CALCNEXT EQU      %
         SLS,D1   -2                CALC NUMBER OF WORDS IN ENTRY
         AI,D1    1
         AWM,D1   NXTENTRY          ADD TO GET NEXT ENTRY ADDR
         SLS,X1   2                 CALC BYTE ADDR OF ENTRY
         AI,X1    1
         MTW,0    AFTYPE            TEST AF TYPE
         BEZ      RTNINDX               'S' TYPE -- ENTRY FOUND
         CW,AC1   ENTRYSZ           COMPARE SIZES
         BNE      FNDNXT               NOT EQUAL, GET NEXT ENTRY
*
*
         PAGE
*
*
         LW,X2    FCSCS             GET ADDR OF PHRASE TO TEST
         STB,AC1  X2                COUNT FOR CBS
         MTW,0    AFTYPE            TEST AF TYPE
         BLZ      SCTYPE                SP CHAR TYPE
         CBS,X1   0                 COMPARE PHRASES
         BNE      FNDNXT                NOT EQUAL, GET NEXT ENTRY
         B        RTNINDX               PHRASE FOUND, RETURN
*
SCTYPE   EQU      %
         AI,X1    1                 INCR POINTER TO ENTRY
         CBS,X1   0                 COMPARE ENTRY TO STRING
         BNE      FNDNXT               NOT EQUAL, GET NEXT
         LW,AC1   D2                   EQUAL, GET HEX STRING SIZE
         B        RTNINDX           RETURN
*
NTFND    EQU      %                 PHRASE OR ENTRY NOT FOUND
         LI,AC1   0                 SET SIZE TO ZERO
*
RTNINDX  EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S15GRPG -- GET NEW PAGE FOR AUXILIARY FILE READ
* EXIT PARAMETER: SR3=0 IF PAGE FOUND
*                     1 IF PAGE NOT FOUND
S15GRPG  EQU      %
         SAVRTN
*
         LI,AC1   1                 SET TO GET ONE PAGE
         BAL,SRTN S36M:GCP          GO GET PAGE
         CI,AC1   0                 TEST FOR PAGE FOUND
         BG       MEMOK                 YES, READ OK
*
         LI,AC1   29                'NOT ENOUGH MEMORY' MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         LI,SR3   1                 SET ERROR INDICATION
         B        RTNGRPG           RETURN
*
MEMOK    EQU      %
         GET,D1   AF:NUMPG          GET NUMBER OF PAGES SO FAR
         AI,D1    1                 INCREMENT
         PUT,D1   AF:NUMPG          SAVE NUMBER OF PAGES
         LW,D1    BUF1              GET PAGE ADDR
         LW,X3    AFTYPE
         JNEZ,D2  (AF:FSTPG,X3),FNDPG    TEST FIRST PAGE FOR THIS TYPE
*
         PUT,D1   AF:FSTPG,X3       STORE ADDR OF FIRST PAGE
         B        SETNWPG           GO SET UP NEW PAGE
*
*
         PAGE
*
*
FNDPG    EQU      %
         GET,X1   AF:NXTPG,X3       GET ADDR OF CURRENT LAST PAGE
         STW,BUF1 0,X1              STORE NEW PAGE ADDR IN FIRST WORD
*
SETNWPG  EQU      %
         PUT,D1   AF:NXTPG,X3       STORE ADDR OF NEW LAST PAGE
         LI,AC1   0                 SET FIRST WORD IN NEW PAGE TO ZERO
         STW,AC1  0,BUF1
         LW,X2    BUF1              GET ADDR OF PAGE IN X2
         LI,SR3   0                 SET ERROR INDICATION TO ZERO
*
RTNGRPG  EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S15RDNXT -- READ NEXT AUXILIARY FILE ENTRY
*
* EXIT PARAMETERS:
*        X1 = BYTE ADDR OF ENTRY
*        X3 = BYTE ADDR OF REPLACEMENT CHAR STRING (0 IF NO SEMICOLON)
*        AC1= SIZE OF ENTRY (0 FOR END OF FILE)
*
S15RDNXT EQU      %
         SAVRTN
*
         LW,AC1   LNSZ              GET REMAINING CHARS IN LINE
         BGZ      SMLN                  >0, GO GET ENTRY
GNWLN    EQU      %                     =0, READ NEW LINE
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     AFBRK                SET, AF BREAK
         LI,BUF2  BA(STDINBUF)      GET ADDR OF INPUT BUFFE
         LI,AC1   #STDBUFSZ         GET SIZE OF BUFFER
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S27RCPY           READ LINE
*
         CI,AC1   0                 TEST FOR EOF
         BE       CPYEOF                YES, SET EOF AND RETURN
         AI,BUF2  1                 INCR PAST ATTN COUNT
         AI,AC1   -1
         BAL,SRTN S28DCMPR          DE-COMPRESS LINE
         STW,BUF2 LNADDR            SAVE POINTER
         STW,AC1  LNSZ              AND SIZE
*
*
         PAGE
*
SMLN     EQU      %
         MTW,0    LNSZ              TEST LINE SIZE
         BLEZ     GNWLN                 ZERO, READ NEXT LINE
         LW,X1    LNADDR            GET ADDR OF LINE
         LI,X3    0                 INITIALIZE REPLACEMENT STRING FLAG
*
GSCLP    EQU      %
         LB,AC1   0,X1              GET NEXT CHAR
         AI,X1    1                 INCREMENT POINTER
         MTW,-1   LNSZ              DECREMENT LINE SIZE
         BLZ      EOENTRY               ZERO, TEST END-OF ENTRY
*
         CI,AC1   ':'               TEST FOR COLON
         BNE      TSTCR                 NO, GO TEST CR
         CI,X3    0                 TEST FOR REPLACEMENT STRING SET
         BG       GSCLP                 ALREADY SET, GET NEXT CHAR
         LW,X3    X1                SET REPLACEMENT STRING ADDR
         B        GSCLP             GET NEXT CHAR
*
TSTCR    EQU      %
         CI,AC1   #CR               TEST FOR CR
         BE       EOENTRY               YES, END-OF-ENTRY FOUND
         CI,AC1   ';'               TEST FOR SEMI-COLON
         BNE      GSCLP                 NO, GET NEXT CHAR
*
EOENTRY  EQU      %
         XW,X1    LNADDR            GET STARTING ADDR
         LW,AC1   LNADDR            GET LAST ADDR IN AC1
         SW,AC1   X1                SUBTRACT STARING ADDR (FOR SIZE)
         AI,AC1   -1                DECREMENT ENTRY SIZE TO REMOVE ;
         BLEZ     SMLN                  ZERO SIZE, GET NEXT ENTRY
         B        RTNRDNXT          RETURN
*
*
         PAGE
*
*
CPYEOF   EQU      %                 END-OF-FILE FOUND
         LI,AC1   #SAVE             CLOSE COPY FILE WITH SAVE
         BAL,SRTN S27CCPY
         LI,AC1   0                 SET ENTRY SIZE TO ZERO
*
RTNRDNXT EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* LOCAL VARIABLES
*
15D      CSECT    0
*
NXTWRD   RES      1                 NEXT AVAILABLE WORD ON PAGE
PGSTART  RES      1                 STARTING ADDR OF PAGE
LSTENTRY RES      1                 LAST ENTRY ON PAGE
*
AFTYPE   RES      1                 AUX FILE TYPE
FCSCS    RES      1                 FIRST CHAR IN STANDARD CHAR STRING
NSCS     RES      1                 NUMBER OF CHARS
*
LNSZ     RES      1                 LINE SIZE IN AUX FILE
LNADDR   RES      1                 ADDR OF LINE
LSTCHAR  RES      1                 LAST CHAR ADDR
ENTRYSZ  RES      1                 ENTRY SIZE
HEXCNT   RES      1                 HEX CHAR COUNT
ENTRYCNT RES      1                 AF ENTRY COUNT
*
AFMSG    MESSAGE  #CR,(INSTYPE,1),'-FILE: ',(INSAFNM,31)
ENTRYMSG MESSAGE  #CR,'ENTRIES:',(INSCOUNT,4),#CR
*
         USECT    #PLOC
         END
