* 03/02/76 -- 13:00
* MODULE NAME: NMADDR
* NUMBER: 45
* PURPOSE: PROVIDE NAME/ADDRESS FILE SERVICES
* ENTRY POINTS:
*
         DEF      C45FORM           SET FORM-LETTER MODE
         DEF      C45TSTOP
         DEF      E45NWPRN          START OF NEW FORM
         DEF      E45TSTOP
         DEF      NAFLG             NAME/ADDRESS FLAG
         DEF      S45XNAMD          CLEAN UP N/A MODE FOR EXIT
*
         REF      F:NA              NAME/ADDRESS FILE DCB
         REF      CFLNTBL           CHANGE FIELD LINE NUMBER TABLE
         REF      CFLNSZ            CHANGE FIELD LINE NUMBER SIZE
         REF      CNDTNTBL          SELECT CONDITION TABLE
         REF      CNDTNSZ           SELECT CONDITION TABLE SIZE
         REF      PNMTBL            PREFIX NAME TABLE
         REF      POFFTBL           PREFIX OFFSET TABLE
         REF      POFFTBLSZ         PREFIX OFFSET TABLE SIZE
         REF      SFIDTBL           SELECT FIELD ID TABLE
         REF      SFIDSZ            SELECT FIELD ID SIZE
         REF      SNMTBL            SUFFIX NAME TABLE
         REF      SOFFTBL           SUFFIX OFFSET TABLE
         REF      SOFFTBLSZ         SUFFIX OFFSET TABLE SIZE
         REF      S05RDYCR          READ Y-CR RESPONSES
         REF      S27CLOSE          CLOSE FILE
         REF      S27ONA            OPEN NAME/ADDRESS FILE
         REF      S27OPEN           OPEN FILE
         REF      S27PRINT          WRITE TO TERMINAL
         REF      S27RNA            READ NAME/ADDRESS FILE
         REF      S27RTNL           READ INPUT LINE
         REF      S28DCMPR          DE-COMPRESS TEXT LINE
         REF      S29STD            PRINT ERROR MESSAGES
         REF      S36M:FP           FREE MEMORY PAGE
         REF      S36M:GP           GET MEMORY PAGE
         REF      S38INS1           INSERT LAST LINE OF GROUP
         REF      S38INS2           INSERT NON-LAST LINE OF GROUP
         REF      S02BCHK           BATCH MODE CHECK
         REF      STDWKBUF          STANDARD WORK BUFFER
         REF      ZRORTNST          INITIALIZE RETURN STACK
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVCMDSTA
         INVWSSTA
         INVHDRSTA
         INVPRSTA
         INVLNSTA
         PAGE
*
*
*
         DEF      45P,45D
*
45P      EQU      %
         DATA     X'45'             MODULE NUMBER
         DATA     X'030276'         DATE
         DATA     X'1300'           TIME
*
*
         TITLE    '** NMADDR(45) **'
*
* BLNKRB -- BLANK OUT RETURN BUFFER
*
BLNKRB   RES      0
         LI,X1    RTNBUFSZ          GET SIZE OF RETURN BUFFER
         SLS,X1   -1                CONVERT TO DOUBLE WORD SIZE
         AI,X1    -1
         LD,AC1   DBLBLNK           GET TWO WORDS OF BLANKS
         STD,AC1  *NARTNBUF,X1      STORE BLANKS IN BUFFER
         BDR,X1   %-1
         STD,AC1  *NARTNBUF
         B        *SRTN             RETURN
         PAGE
*
*
* C45FORM -- SET FORM-LETTER MODE
*
*
C45FORM  RES      0
         SAVRTN
         LI,D1    1                 SET FORM-LETTER FLAG
         PUT,D1   WS:FORM
         JNEZ,D1  (#FLAGS,:K(2)),FORM3  NAME/ADDRESS FILE REQUESTED
         BAL,SRTN S02BCHK           CHECK FOR BATCH
* FORM WITHOUT NAME/ADDR NOT LEGAL IN BATCH
*
         RETURN                     NO
*
* NAME/ADDRESS FILE REQUESTED
FORM3    RES      0
         MTW,1    NAFLG             SET NAME/ADDRESS FLAG
         GET,D1   #FLAGS,:K(1)      GET 'X' OPTION FLAG
         STW,D1   XFLG              SAVE
         LI,AC1   #IN               OPEN FILE IN INPUT MODE
         BAL,SRTN S27ONA
         CI,SR3   0                 WAS OPEN SUCCESSFUL
         BNE      OPENERR           NO
         LI,AC1   2                 YES, GET 2 MEMORY PAGES
         BAL,SRTN S36M:GP
         CI,AC1   2                 WAS PAGE AVAILABLE
         BNE      M:GPERR           NO, ERROR
         STW,BUF1 DSADDR            YES, SAVE ADDR OF PAGE
         AI,BUF1  512               CALCULATE ADDR OF 2ND PAGE
         STW,BUF1 FLDPTR            START OF FIELD POINTER TABLE
         STW,BUF1 FLDPTRTBL
         AI,BUF1  FLDPTRSZ
         STW,BUF1 LINEPTR           START OF LINE POINTER TABLE
         STW,BUF1 LINEPTRTBL
         AI,BUF1  LINEPTRSZ
         STW,BUF1 NARTNBUF          START OF RETURN BUFFER
         AI,BUF1  RTNBUFSZ
         STW,BUF1 SELECTTBL         START OF SELECT CRITERIA
         STW,BUF1 SELECT
         LI,AC1   0                 SET READ SIZE TO 0
         LW,AC2   L(#ZROKEY)        SET KEY TO 0.0
         BAL,SRTN S27RNA            READ KEY 0,0
         LI,AC1   1                 INITIALIZE NAME LINE TO 1
         STW,AC1  NMLINE
         LI,AC1   2                 INITIALIZE COMPANY LINE TO 2
         STW,AC1  CMPLINE
         LI,AC1   -1                INITIALIZE CITY-STATE LINE TO LAST
         STW,AC1  CSLINE
         LI,AC1   0
         STW,AC1  SELECTFLG         INITIALIZE SELECT FLAG TO OFF
         STW,AC1  STARTFLG          INITIALIZE START FLAG TO NONE
*
* FIELD CHANGE CRITERIA
FORM100  RES      0
         LI,AC1   51                SET UP 'CHANGE LINE NO' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S05RDYCR          GET 'Y' -CR RESPONSE
         CI,SR3   0                 TEST RESPONSE
         BE       FORM200           RESPONSE = 'NO'
         LI,AC1   52                SET UP 'ENTER LINE CHANGE' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
FORM105  RES      0
         LI,BUF1  BA(STDINBUF)      GET INPUT BUFFER ADDR
         BAL,SRTN S27RTNL           READ FIELD CHANGE CRITERIA
         LI,X3    BA(STDINBUF)      SET UP POINTER TO START OF LINE
FORM110  RES      0
         BAL,SRTN GETFID            GET FIELD IDENTIFIER
         B        FORM190           ERROR
         CI,AC3   #CR               WAS FIELD TERMINATOR A CR
         BE       FORM190           YES, ERROR
         LI,X2    CFLNSZ            GET SIZE OF CHANGE FIELD LINE NO TBL
FORM120  RES      0
         CD,AC1   CFLNTBL-2,X2      SEARCH FOR FIELD IDENTIFIER
         BE       FORM125           FOUND
         BDR,X2   FORM120           CONTINUE SEARCH
         B        FORM190           NOT FOUND, ERROR
FORM125  RES      0
         AI,X2    -1                CONVERT TO FIELD CODE
         SLS,X2   -1
         STW,X2   X1
         BAL,SRTN GETDN             GET LINE NUMBER
         B        FORM190           ERROR IN LINE NUMBER
         EXU      FORM180,X1        CHANGE FIELD LINE NUMBER
         CI,AC3   ';'               ANY MORE CHANGES
         BE       FORM110           YES
         B        FORM200           NO
FORM180  RES      0
         STW,X2   CSLINE            CHANGE CITY-STATE LINE
         STW,X2   CMPLINE           CHANGE COMPANY LINE
         STW,X2   NMLINE            CHANGE NAME LINE
         STW,X2   CSLINE            CHANGE CITY-STATE LINE
FORM190  RES      0
         LI,AC1   47                SET FOR BAD FIELD CHANGE MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        FORM105           GO TRY AGAIN
FORM200  RES      0
*
*  START-AT-ENTRY CRITERIA
         LI,AC1   70                SET UP 'START CRITERIA' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S05RDYCR          GET 'Y' -CR RESPONSE
         CI,SR3   0                 TEST RESPONSE
         BE       FORM300           RESPONSE = NO
         LI,AC1   71                SET UP 'ENTER START CRITERIA' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S45SELTB          GO PROCESS SELECT CRITERIA
         MTW,0    SELECTFLG         ANY SELECT CRITERIA
         BEZ      FORM300           NO
         BAL,SRTN E45NWPRN          YES, FIND 1ST ENTRY
         CI,SR3   3                 WAS EOF ENCOUNTERED
         BE       SKPERR            YES, NO VALID ENTRIES
         LI,AC1   0
         STW,AC1  SELECTFLG         RESET SELECT FLAG
         MTW,1    STARTFLG          SET START ENTRY FLAG
*
* SELECT CRITERIA
FORM300  RES      0
         LI,AC1   48                SET UP 'SELECT CRITERIA' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S05RDYCR          GET 'Y' -CR RESPONSE
         CI,SR3   0                 TEST RESPONSE
         BE       FORM400           RESPONSE = NO
         LI,AC1   49                SET UP 'ENTER SELECT CRITERIA' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S45SELTB          GO PROCESS SELECT CRITERIA
*
*
FORM400  RES      0
         MTW,0    STARTFLG          WAS START ENTRY GIVEN
         BNEZ     FORM900           YES
         BAL,SRTN E45NWPRN          READ FIRST NAME/ADDR ENTRY
         CI,SR3   3                 WAS EOF ENCOUNTERED
         BE       SKPERR            YES
FORM900  RES      0
         RETURN
OPENERR  RES      0
         CI,SR3   3                 TEST FOR NON-EXISTENCE
         BNE      OPENERR3          NO, MUST BE ACCESS DENIED
         LI,AC1   19                SET FOR NON-EXISTENCE MESSAGE
         B        OPENERR6
OPENERR3 RES      0
         LI,AC1   20                SET FOR ACCESS DENIED MESSAGE
OPENERR6 BAL,SRTN S29STD            GO PRINT MESSAGE
OPENERR8 RES      0
         LI,AC1   6                 SET FOR ACTION CANCELLED MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         BAL,SRTN S45XNAMD          CLEAN UP N/A MODE FOR EXIT
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
M:GPERR  RES      0
         LI,AC1   29                SET FOR NOT ENOUGH MEMORY MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        OPENERR8
SKPERR   RES      0
         LI,AC1   55                SET UP NO ENTRIES MESSAGE
         B        OPENERR6
         PAGE
*
* C45TSTOP -- VALIDATE TSTOP COMMAND
*
*
C45TSTOP RES      0
         SAVRTN
         JEZ,D1   (#FLAGS,:K(4)),CSTOP500  LINE OPTION NOT SPECIFIED
         JNEZ,D1  (#FLAGS,:K(12)),CSTOP500  DIGIT STRING SPECIFIED
         LI,AC1   6                 SET FOR ACTION CANCELLED MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
CSTOP500 RES      0
         RETURN
         PAGE
*
* DLTAST -- DELETE ASTERISK SUBROUTINE
*           THIS ROUTINE REPLACES ANY ASTERISKS IN THE SPECIFIED
*           STRING WITH BLANKS.
*
* ENTRY PARAMETERS:
*         BUF1 = BYTE ADDRESS OF STRING
*         AC1  = SIZE OF STRING
*
DLTAST   RES      0
         LI,AC2   ' '               SET UP A BLANK
DLTAST5  RES      0
         LB,D1    0,BUF1            GET A CHAR
         CI,D1    '*'               IS CHAR = '*'
         BNE      %+2               NO
         STB,AC2  0,BUF1            YES, REPLACE WITH BLANK
         AI,BUF1  1                 INCR POINTER
         BDR,AC1  DLTAST5           CONTINUE
         B        *SRTN             RETURN
         PAGE
*
* E45NWPRN -- INITIALIZE FORM-LETTER FOR NEW PRINT
*
*
E45NWPRN RES      0
         SAVRTN
ENWPR10  RES      0
         MTW,0    NAEOFFLG          WAS EOF ENCOUNTERED
         BNEZ     ENWPR700          YES
         LI,AC1   0
         LI,X1    BASIZE
         STW,AC1  BASTART-1,X1      ZERO OUT BYTE ADDR WORDS
         BDR,X1   %-1
         STW,AC1  LINECNT           ZERO OUT LINE COUNT
         LI,X1    511               SIZE OF A PAGE-1
         LW,AC1   L('    ')         GET A WORD OF BLANKS
         STW,AC1  *DSADDR,X1        BLANK OUT ENTRY PAGE
         BDR,X1   %-1               CONTINUE
         STW,AC1  *DSADDR           BLANK OUT FIRST WORD OF PAGE
         LW,AC1   DSADDR            INITIALIZE MOVE POINTER
         SLS,AC1  2
         STW,AC1  NAMVPTR
         LW,AC1   LINEPTRTBL        INITIALIZE LINE POINTER TABLE
         AI,AC1   1
         STW,AC1  LINEPTR
RDNXTREC RES      0
         LI,BUF2  BA(STDWKBUF)      GET INPUT BUFFER ADDR
         LI,AC1   #STDBUFSZ         GET BUFFER SIZE
         LI,AC2   0                 SET FOR READ NEXT RECORD
         BAL,SRTN S27RNA            GO READ NAME/ADDRESS RECORD
         CI,SR3   3                 WAS EOF ENCOUNTERED
         BE       NAEOF             YES
         MTW,0    XFLG              NO,IS FILE EDIT COMPATIBLE
         BNEZ     TSTCRSZ           YES
         AI,BUF2  1                 NO, SKIP ATTN COUNT
         AI,AC1   -1
         BAL,SRTN S28DCMPR          DE-COMPRESS LINE
TSTCRSZ  RES      0
         CI,AC1   #MXLNSZ
         BLE      STCR
         LI,AC1   #MXLNSZ
STCR     RES      0
         LW,X1    BUF2              GET ADDR OF LINE
         LB,AC3   0,X1              GET FIRST CHAR OF LINE
         CI,AC3   '/'               IS CHAR = / (GHOST LINE)
         BE       RDNXTREC          YES, IGNORE GHOST LINE
         AW,X1    AC1
         AI,X1    -1
         LB,AC3   0,X1              GET LAST CHAR
         CI,AC3   #CR               IS IT A CR
         BE       ENDTEST           YES
         CI,AC3   #LF               NO, IS IT A LF
         BE       ADDCR             YES
         AI,X1    1                 NO, INCREMENT LINE SIZE
         AI,AC1   1
ADDCR    RES      0
         LI,AC3   #CR
         STB,AC3  0,X1              STORE CR AT END OF LINE
ENDTEST  RES      0
         CI,AC1   1                 IS THIS THE END OF AN ENTRY
         BE       ENDNTRY           YES
MOVELN   RES      0
         LW,X1    NAMVPTR           BUILD LINE CONTROL WORD
         STB,AC1  X1
         STW,X1   *LINEPTR          STORE IN LINE POINTER TABLE
         MTW,1    LINEPTR
         MOVE,X1  *BUF2,*NAMVPTR,*AC1   MOVE LINE
         AI,AC1   3                 MOVE TO WORD BOUNDARY
         SLS,AC1  -2
         SLS,AC1  2
         AWM,AC1  NAMVPTR           INCREMENT LINE POINTER BY LINE SIZE
         MTW,1    LINECNT           BUMP LINE COUNT
         B        RDNXTREC
NAEOF    RES      0
         MTW,1    NAEOFFLG          SET EOF FLAG
ENDNTRY  RES      0
         LW,X4    LINECNT           GET LINE COUNT
         STW,X4   *LINEPTRTBL       SAVE LINE COUNT
         BAL,SRTN BLNKRB            BLANK OUT RETURN BUFFER
         LW,X1    NMLINE
         CW,X1    X4                IS THERE A NAME LINE
         BG       ENWPR100          NO
         LW,X3    *LINEPTRTBL,X1    GET BA OF NAME LINE
         STW,X3   BANAME            STORE NAME LINE CONTROL WORD
         MTB,-1   BANAME            SUBTRACT 1 FOR CR CHAR
         BAL,SRTN PRSLN             PARSE NAME LINE
         LW,AC1   FLDPTRTBL
         STW,AC1  FLDPTR            SET UP PTR TO FIELD PTR TABLE
*
* SEARCH FOR PREFIX
*
         LI,AC1   1
         STW,AC1  NXTFLD            SET NEXT FIELD TO 1
         LI,X1    1                 SET FOR FIELD 1
         BAL,SRTN SETFLD            GET FIELD 1 CONTROL WORD
         B        ENWPR65           NONE
         LB,AC1   0,X3              GET 1ST CHAR OF LINE
         CI,AC1   '*'               IS 1ST CHAR = '*'
         BNE      ENWPR40           NO
         AI,X3    1                 SKIP LEADING ASTERISK
         MTB,-1   X3                REDUCE CHAR COUNT BY 1
         STW,X3   BAPREFIX          STORE A PREFIX CONTROL WORD
         MTW,1    BANAME            ADJUST NAME CONTROL WORD FOR '*'
         MTB,-1   BANAME
         LW,X1    NMLINE            GET LINE CONTROL WORD
         LW,D1    *LINEPTRTBL,X1    ADJUST FOR ASTERISK
         MTW,1    D1
         MTB,-1   D1
         STW,D1   *LINEPTRTBL,X1
         MTW,1    NXTFLD            BUMP NEXT FIELD TO 2
         B        ENWPR65
ENWPR40  RES      0
         LI,X1    2                 SET UP FOR 2ND FIELD
         BAL,SRTN SETFLD            GET POINTER TO 2ND FIELD
         B        ENWPR50           FIELD DOES NOT EXIST
         LB,AC3   0,X3              GET 1ST CHAR
         CI,AC3   '&'               IS CHAR = '&'
         BNE      ENWPR50           NO
         LB,AC3   X3                YES, GET SIZE OF FIELD
         CI,AC3   1                 IS SIZE = 1
         BNE      ENWPR50           NO
         LI,X1    3
         CW,X1    *FLDPTR           ARE THERE AT LEAST 3 FIELDS
         BG       ENWPR50           NO
         LI,X2    1                 YES
         LW,X3    *FLDPTR,X2        SET UP FIELD 1 FOR MOVE
         BAL,SRTN MOVFLD            MOVE FIELD 1
         LI,X2    2
         LW,X3    *FLDPTR,X2        SET UP FIELD 2 FOR MOVE
         BAL,SRTN MOVFLD1           MOVE FIELD 2
         LI,X2    3
         LW,X3    *FLDPTR,X2        SET UP FIELD 3 FOR MOVE
         BAL,SRTN MOVFLD1           MOVE FIELD 3
ENWPR47  BAL,SRTN PBINSRCH          SEARCH FOR STANDARD PREFIX
         B        ENWPR50           NOT FOUND, SEARCH FOR 1 FIELD PREFIX
         B        ENWPR55           FOUND
ENWPR50  RES      0
         LI,X1    1
         BAL,SRTN SETFLD            SET UP FIELD 1 FOR MOVE
         B        ENWPR65
         BAL,SRTN MOVFLD            MOVE FIELD 1
         BAL,SRTN PBINSRCH          SEARCH FOR 1 FIELD PREFIX
         B        ENWPR65
         B        ENWPR56
ENWPR55  RES      0
         MTW,2    NXTFLD            BUMP NEXT FIELD BY 2
ENWPR56  RES      0
         MTW,1    NXTFLD            BUMP NEXT FIELD BY 1
         LI,X1    1
         LW,AC1   *FLDPTR,X1        GET ADDR OF START OF PREFIX
         LW,X1    NARTNBUFSZ        GET SIZE OF PREFIX
         STB,X1   AC1               STORE AS BYTE 0
         STW,AC1  BAPREFIX          STORE PREFIX CONTROL WORD
*
* SEARCH FOR FIRST NAME
*
ENWPR65  RES      0
         LW,X1    NXTFLD
         BAL,SRTN SETFLD            GET NEXT FIELD CONTROL WORD
         B        ENWPR100
         STW,X3   BAFNAME           STORE AS FIRST NAME CONTROL WORD
*
* SEARCH FOR SUFFIX
*
ENWPR75  RES      0
         BAL,SRTN BLNKRB            BLANK OUT RETURN BUFFER
         LW,X1    *FLDPTR           GET FIELD COUNT
         STW,X1   NXTFLD            SAVE AS LAST NAME FIELD
         AI,X1    -1                BACKUP 1 FIELD
         BLEZ     ENWPR100
         LW,X3    *FLDPTR,X1        GET FIELD CONTROL WORD OF NEXT
         LB,X1    X3                  TO LAST FIELD
         AW,X3    X1
         LB,AC1   0,X3              GET FIELD TERMINATOR
         CI,AC1   ','               IS TERMINATOR = ','
         BNE      ENWPR85           NO
ENWPR80  RES      0
         LW,X1    *FLDPTR           YES, NON-STANDARD SUFFIX
         LW,X3    *FLDPTR,X1        GET LAST FIELD CONTROL WORD
         STW,X3   BASUFFIX          STORE AS SUFFIX CONTROL WORD
         MTW,-1   NXTFLD            BACKUP 1 FIELD FOR LAST NAME
         B        ENWPR90
ENWPR85  RES      0
         LW,X1    *FLDPTR
         LW,X3    *FLDPTR,X1        GET LAST FIELD CONTROL WORD
         BAL,SRTN MOVFLD            MOVE LAST FIELD
         BAL,SRTN SBINSRCH          SEARCH FOR STANDARD SUFFIX
         B        ENWPR90           NOT FOUND
         B        ENWPR80           FOUND
*
* SEARCH FOR LAST NAME
*
ENWPR90  RES      0
         LW,X1    NXTFLD
         LW,X3    *FLDPTR,X1        GET NEXT FIELD CONTROL WORD
         STW,X3   BALNAME           STORE AS LAST NAME CONTROL WORD
*
         LW,X1    NMLINE            GET LINE CONTROL WORD
         LW,BUF1  *LINEPTRTBL,X1    GET BYTE ADDR
         LB,AC1   BUF1              GET SIZE
         BAL,SRTN DLTAST            DELETE ASTERISKS IN LINE
*
* SET UP CITY-STATE LINE
*
ENWPR100 RES      0
         LW,X1    CSLINE            GET CITY-STATE LINE NUMBER
         BGEZ     ENWPR105
         LW,X1    *LINEPTRTBL       USE LAST LINE
ENWPR105 RES      0
         CW,X1    *LINEPTRTBL       IS THERE A CITY-STATE LINE
         BG       ENWPR200          NO
         LW,X3    *LINEPTRTBL,X1    YES, GET LINE CONTROL WORD
         BAL,SRTN PRSLN             PARSE CITY-STATE LINE
         LW,AC1   FLDPTRTBL
         STW,AC1  FLDPTR            SET UP POINTER TO FIELD POINTER TBL
*
* SEARCH FOR ZIP CODE
*
         LW,X1    *FLDPTR
         LW,X3    *FLDPTR,X1        GET LAST FIELD CONTROL WORD
         LB,X1    X3                GET CHAR COUNT
         CI,X1    5                 IS COUNT = 5
         BNE      ENWPR120          NO
ENWPR110 RES      0
         LB,AC1   0,X3              GET A CHAR
         CLM,AC1  NUMLIM            IS IT NUMERIC
         BCS,9    ENWPR120          NO
         AI,X3    1
         BDR,X1   ENWPR110
         AI,X3    -5                GET BYTE ADDR OF ZIP
         STW,X3   BAZIP             STORE ZIP CONTROL WORD
*
*  SEARCH FOR CITY
*
ENWPR120 RES      0
         LW,X1    *FLDPTR           GET FIELD COUNT
         MTW,0    BAZIP             WAS THERE A ZIP
         BEZ      ENWPR123          NO
         AI,X1    -1                YES, DECR FIELD COUNT BY 1
         BLEZ     ENWPR200          NO MORE FIELDS
ENWPR123 RES      0
         STW,X1   NXTFLD            SAVE FIELD COUNT
         LI,X1    1
         LW,X3    *FLDPTR,X1        GET 1ST FIELD CONTROL WORD
         AND,X3   L(X'FFFFFF')      CLEAN BYTE ADDR
         STW,X3   TEMP              SAVE BYTE ADDR
ENWPR125 RES      0
         LW,X3    *FLDPTR,X1        GET NEXT FIELD CONTROL WORD
         LB,AC1   X3                GET FIELD SIZE
         AW,X3    AC1
         LB,AC1   0,X3              GET FIELD TERMINATOR
         CI,AC1   ','               WAS IT A COMMA
         BE       ENWPR130          YES
         AI,X1    1                 NO, MOVE TO NEXT FIELD
         CW,X1    NXTFLD            DOES FIELD EXIST
         BG       ENWPR200          NO
         B        ENWPR125          YES
ENWPR130 RES      0
         AND,X3   L(X'FFFFFF')      CLEAN BYTE ADDR
         SW,X3    TEMP              CALCULATE LENGTH OF CITY
         LW,AC1   TEMP              BUILD CITY CONTROL WORD
         STB,X3   AC1
         STW,AC1  BACITY            STORE CITY CONTROL WORD
*
* SEARCH FOR STATE
*
ENWPR140 RES      0
         AI,X1    1                 MOVE TO NEXT FIELD
         CW,X1    NXTFLD            DOES FIELD EXIST
         BG       ENWPR200          NO
         BL       ENWPR150          MORE THAN 1 FIELD LEFT
         LW,X3    *FLDPTR,X1        GET FIELD CONTROL WORD
         STW,X3   BASTATE           STORE AS STATE CONTROL WORD
         B        ENWPR200
ENWPR150 RES      0
         LW,X3    *FLDPTR,X1        GET FIRST FIELD CONTROL WORD
         AND,X3   L(X'FFFFFF')      CLEAN BYTE ADDR
         STW,X3   BASTATE           SAVE
         LW,X1    NXTFLD            GET LAST FIELD NUMBER
         LW,X3    *FLDPTR,X1        GET LAST FIELD CONTROL WORD
         LB,AC1   X3                GET LENGTH OF LAST FIELD
         AND,X3   L(X'FFFFFF')
         SW,X3    BASTATE           CALCULATE TOTAL LENGTH
         AW,X3    AC1
         STB,X3   BASTATE           SAVE
ENWPR200 RES      0
         MTW,0    SELECTFLG         WAS SELECT FUNCTION REQUESTED
         BEZ      ENWPR450          NO
         BAL,SRTN S45SEL            GO TEST FOR SELECTION
         MTW,0    SR3               WAS ENTRY SELECTED
         BEZ      ENWPR10           NO
ENWPR450 RES      0
         LI,SR3   0                 RESET ERROR FLAG
ENWPR500 RES      0
         RETURN
*
* NO MORE ENTRIES
ENWPR700 RES      0
         LI,SR3   3                 SET EOF FOUND INDICATOR
         B        ENWPR500
         PAGE
*
* E45TSTOP -- INSERT NAME/ADDRESS INFORMATION OR STOP CODE
*
*
E45TSTOP RES      0
         SAVRTN
         LI,X1    0                 INITIALIZE SEARCH FLAG LOOP
ESTOP10  RES      0
         AI,X1    1                 BUMP INDEX TO FLAG
         CI,X1    TSTOPNO           ANY MORE
         BG       ESTOP500          NO, MUST BE STOP CODE COMMAND
         JNEZ,D1  (#FLAGS,X1),ESTOP20   FOUND FLAG SET,  X1=NUMBER
         B        ESTOP10
ESTOP20  RES      0
         MTW,0    NAFLG             WAS NAME/ADDR FILE SPECIFIED
         BNEZ     ESTOP25           YES
         LI,AC1   54                SET FOR NO N/A FILE MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        ESTOP500
ESTOP25  RES      0
         GET,D1   #DS,:K(1)         GET LINE NO (FOR FLD = 'LINE')
         STB,D1   X1
         BAL,SRTN S45GFLD           GET FIELD AND MOVE TO RETURN BUFFER
         BAL,SRTN S38INS1           INSERT LAST LINE IN PRINTLINE
ESTOP500 RES      0
         RETURN
         PAGE
*
* GET -- GET DECIMAL NUMBER
*
* INPUT  X3 = BYTE POINTER TO INPUT STREAM
* OUTPUT X2 = DECIMAL NUMBER CONVERTED TO BINARY
* RETURNS TO CALLING LINE+1 IF AN ERROR IS DETECTED
* RETURNS TO CALLING LINE+2 FOR NORMAL RETURN
*
GETDN    RES      0
         STW,SRTN GETDNRL           SAVE RETURN LINK
         LI,X2    0
GETDN10  RES      0
         BAL,SRTN GNC               GET NEXT CHARACTER
         B        GETDN20           CHAR = CR
         B        GETDN20           CHAR = ';'
         CLM,AC3  NUMLIM            IS IT NUMERIC
         BCS,9    GETDN30           NO, ERROR
         MI,X2    10                YES, CONVERT DIGIT
         BOV      GETDN30           OVERFLOW
         AND,AC3  L(X'F')
         AW,X2    AC3
         BOV      GETDN30           OVERFLOW
         B        GETDN10           CONTINUE CONVERT TO BINARY
GETDN20  RES      0                 NORMAL RETURN
         MTW,1    GETDNRL
GETDN30  RES      0                 ERROR RETURN
         B        *GETDNRL
         PAGE
*
* GETFID -- GET FIELD IDENTIFIER
*
* INPUT  X3 = BYTE POINTER TO INPUT STREAM
* OUTPUT AC1,AC2 = FIELD IDENTIFIER
*        X2 = LINE NUMBER IF FID = 'LINE'
* RETURNS TO CALLING LINE+1 IF AN ERROR IS DETECTED
* RETURNS TO CALLING LINE+2 FOR NORMAL RETURN
*
GETFID   RES      0
         STW,SRTN GETFIDRL          SAVE RETURN LINK
         LI,X2    0                 SET UP STORE INDEX
         LD,AC1   DBLBLNK           BLANK OUT FIELD ID ACCUMULATOR
GETFID10 RES      0
         BAL,SRTN GNC               GET NEXT CHAR
         B        GETFID30          CHAR = CR, GO TO NORMAL RETURN
         B        GETFID30          CHAR = ';', GO TO NORMAL RETURN
         CLM,AC3  NUMLIM            IS IT NUMERIC
         BCS,9    %+2               NO
         B        GETFID50          YES, GO CONVERT NUM TO BINARY
         STB,AC3  AC1,X2            BUILD FIELD ID
         AI,X2    1                 INCR STORE INDEX
         CI,X2    8                 NUMBER OF CHAR > 8
         BL       GETFID10          NO, CONTINUE
GETFID20 B        *GETFIDRL         ERROR RETURN
GETFID30 RES      0
         MTW,1    GETFIDRL          NORMAL RETURN
         B        *GETFIDRL
GETFID50 RES      0
         CD,AC1   LINEFID1          IS FIELD ID = 'LINE'
         BE       GETFID55          YES
         CD,AC1   LINEFID2
         BNE      GETFID20          NO
GETFID55 RES      0
         AI,X3    -1                BACKUP INPUT POINTER 1 CHAR
         BAL,SRTN GETDN             GET LINE NUMBER
         B        GETFID20          ERROR RETURN
         B        GETFID30          NORMAL RETURN
         PAGE
*
* S45GFLD -- GET FIELD
*
* INPUT  X1 = FIELD NUMBER
* OUTPUT NARTNBUF = CONTENTS OF FIELD
*        AC1 = SIZE OF FIELD
*        BUF1 = BYTE ADDR OF START OF FIELD
*
S45GFLD  RES      0
         SAVRTN
         LI,AC1   0
         STW,AC1  NARTNBUFSZ        INITIALIZE RETURN SIZE TO 0
         B        %,X1              GO TO ROUTINE BASED ON FOUND FLAG
         B        ESCITY            CITY
         B        ESENTRY           ENTIRE ENTRY
         B        ESFNAME           FIRST NAME
         B        ESLINE            LINE N OF ENTRY
         B        ESLNAME           LAST NAME
         B        ESNAME            ENTIRE NAME LINE
         B        ESLNAMEP          LAST NAME AND PREFIX
         B        ESPREFIX          NAME PREFIX
         B        ESSTATE           STATE
         B        ESSUFFIX          NAME SUFFIX
         B        ESZIP             ZIP CODE
ESCITY   RES      0
         LW,X3    BACITY            GET BYTE ADDR OF CITY
ESCITY5  RES      0
         BAL,SRTN MOVFLD            MOVE TO RETURN BUFFER
ESCITY10 RES      0
         MTW,0    NARTNBUFSZ        IS RETURN SIZE 0
         BEZ      ESERR             YES, ERROR
         LW,X1    NARTNBUFSZ        GET SIZE OF RETURN BUFFER
         LI,AC1   #CR               GET A CR CHAR
         STB,AC1  *NARTNBUF,X1      STORE CR AS LAST CHAR
         MTW,1    NARTNBUFSZ        INCR SIZE FOR CR
         LW,AC1   NARTNBUFSZ        GET SIZE OF THIS RETURN
         LW,BUF1  NARTNBUF          GET BYTE ADDR OF START OF LINE
         SLS,BUF1 2
ESCITY15 RES      0
         RETURN                     RETURN
ESENTRY  RES      0
         BAL,SRTN BLNKRB            BLANK OUT RETURN BUFFER
         GET,D1   LN:CPSTN          GET STARTING CARRIER POSITION
         STW,D1   TEMP4             SAVE
         LI,X1    1                 INIT LINE NUMBER TO 1
ESENT20  RES      0
         LW,BUF1  *LINEPTRTBL,X1    GET BYTE ADDR OF LINE
         LB,AC1   BUF1              GET SIZE OF LINE
         AND,BUF1 L(X'FFFFFF')      CLEAN BYTE ADDR
         AI,X1    1                 INCR LINE NUMBER
         CW,X1    *LINEPTRTBL       DOES LINE EXIST
         BG       ESCITY15          NO
         STW,X1   TEMP3             SAVE LINE COUNT
         BAL,SRTN S38INS2           INSERT LINE IN PRINT LINE
         LW,X1    TEMP3             RESTORE LINE COUNT
         JGZ,D1   PR:FMTFLG,ESENT20 UNFORMATTED MODE
         LW,AC1   TEMP4             YES, GET ORIGINAL CARRIER POSITION
         BEZ      ESENT20           START OF LINE, DONT INSERT BLANKS
         LW,BUF1  NARTNBUF          GET BYTE ADDR OF BLANK STRING
         SLS,BUF1 2
         BAL,SRTN S38INS2           INSERT BLANKS TO POSITION LINE
         LW,X1    TEMP3             RESTORE LINE COUNT
         B        ESENT20
ESFNAME  RES      0
         LW,X3    BAFNAME           GET BYTE ADDR OF FIRST NAME
         B        ESCITY5
ESLINE   RES      0
         LB,X1    X1                GET LINE NUMBER
         CW,X1    *LINEPTRTBL       DOES LINE EXIST
         BG       ESERR             NO
         LW,BUF1  *LINEPTRTBL,X1    GET BYTE ADDR OF LINE
         LB,AC1   BUF1              GET SIZE OF LINE
         AND,BUF1 L(X'FFFFFF')      CLEAN BYTE ADDR
         B        ESCITY15
ESLNAME  RES      0
         LW,X3    BALNAME           GET BYTE ADDR OF LAST NAME
         B        ESCITY5
ESLNAMEP RES      0
         LW,X3    BAPREFIX          GET BYTE ADDR OF PREFIX
         BAL,SRTN MOVFLD            MOVE TO RETURN BUFFER
         LW,X3    BALNAME           GET BYTE ADDR OF LAST NAME
         BAL,SRTN MOVFLD1           MOVE TO RETURN BUFFER
         B        ESCITY10
ESNAME   RES      0
         LW,X3    BANAME            GET BYTE ADDR OF NAME LINE
         B        ESCITY5
ESPREFIX RES      0
         LW,X3    BAPREFIX          GET BYTE ADDR OF PREFIX
         B        ESCITY5
ESSTATE  RES      0
         LW,X3    BASTATE           GET BYTE ADDR OF STATE
         B        ESCITY5
ESSUFFIX RES      0
         LW,X3    BASUFFIX          GET BYTE ADDR OF SUFFIX
         B        ESCITY5
ESZIP    RES      0
         LW,X3    BAZIP             GET BYTE ADDR OF ZIP
         B        ESCITY5
ESERR    RES      0
         LI,AC1   8                 SET UP SIZE OF 8
         LI,BUF1  BA(ESERRBUF)      SET UP BYTE ADDR OF ERROR BUF
         B        ESCITY15
         PAGE
*
* GNC -- GET NEXT CHARACTER
*
GNC      RES      0
         LB,AC3   0,X3              GET NEXT CHAR
         AI,X3    1                 BUMP INPUT INDEX
         CI,AC3   #CR               DOES CHAR = CR
         BE       GNC20             YES
         CI,AC3   ';'               DOES CHAR = ';'
         BE       GNC10             YES
         AI,SRTN  1
GNC10    RES      0
         AI,SRTN  1
GNC20    RES      0
         B        *SRTN             RETURN
         PAGE
*
* MOVFLD -- MOVES A FIELD TO THE NAME/ADDRESS RETURN BUFFER
*
* INPUT:   BYTE 0 OF X3 = NUMBER OF CHARS TO BE MOVED
*          BYTES 1-3 OF X3 = SOURCE BYTE ADDRESS
* OUTPUT:  NARTNBUFSZ = TOTAL OUTPUT SIZE
*          CHAR STRING IS MOVED TO *NARTNBUF
*
MOVFLD   RES      0
         LI,X1    0                 SET DESTINATION ADDR TO START OF BUF
MOVFLD1  RES      0
         SAVRTN
         MTW,0    X3                DOES SOURCE FIELD EXIST
         BEZ      MOVFLD90          NO
         LB,AC2   X3                GET FIELD CHAR COUNT
MOVFLD5  RES      0
         LB,AC1   0,X3              MOVE A CHAR
         STB,AC1  *NARTNBUF,X1
         AI,X3    1
         AI,X1    1
         BDR,AC2  MOVFLD5           CONTINUE
         LI,AC1   ' '               FINISHED
         STB,AC1  *NARTNBUF,X1      STORE BLANK AS LAST CHAR
         STW,X1   NARTNBUFSZ        SAVE SIZE OF RETURN BUFFER
         AI,X1    1
MOVFLD90 RES      0
         RETURN
         PAGE
PBINSRCH RES      0                 PREFIX BINARY SEARCH
         LI,AC1   POFFTBL           ADDR OF PREFIX OFFSET TABLE
         LI,AC2   PNMTBL            ADDR OF PREFIX NAME TABLE
         LI,X1    POFFTBLSZ         SIZE OF PREFIX OFFSET TABLE
         B        BINSCH10
SBINSRCH RES      0                 SUFFIX BINARY SEARCH
         LI,AC1   SOFFTBL           ADDR OF SUFFIX OFFSET TABLE
         LI,AC2   SNMTBL            ADDR OF SUFFIX NAME TABLE
         LI,X1    SOFFTBLSZ         SIZE OF SUFFIX OFFSET TABLE
BINSCH10 RES      0
         STW,AC1  OFFADDR           SET UP ADDR OF OFFSET TABLE
         STW,AC2  NMADDR            SET UP ADDR OF NAME TABLE
         STW,X1   TBLHI             SET UP HIGH TABLE VALUE
         LI,AC1   -1
         STW,AC1  TBLLOW            SET UP LOW TABLE VALUE
BINSCH15 RES      0
         LD,AC1   DBLBLNK
         STD,AC1  TEMP              BLANK OUT TEMP AREA
         STD,AC1  TEMP+2
         LW,X1    TBLHI             CALCULATE NEXT SEARCH ADDR
         AW,X1    TBLLOW
         SAS,X1   -1
         CW,X1    TBLLOW            DONE
         BLE      *SRTN             YES, RETURN (NOT FOUND)
         LI,X4    0                 SET UP DESTINATION INDEX
         LH,X2    *OFFADDR,X1       SET UP SOURCE INDEX
         LB,AC1   *NMADDR,X2        GET SIZE OF ITEM
BINSCH20 RES      0
         AI,X2    1                 MOVE ITEM TO TEMP AREA
         LB,AC2   *NMADDR,X2
         STB,AC2  TEMP,X4
         AI,X4    1
         BDR,AC1  BINSCH20
         LD,AC1   TEMP
         CD,AC1   *NARTNBUF         COMPARE 1ST 8 CHAR
         BG       BINSCH30
         BL       BINSCH35
         LD,AC1   TEMP+2
         LI,X4    1
         CD,AC1   *NARTNBUF,X4      COMPARE 2ND 8 CHAR
         BG       BINSCH30
         BL       BINSCH35
BINSCH25 RES      0
         AI,SRTN  1                 FOUND
         B        *SRTN             RETURN
BINSCH30 RES      0
         STW,X1   TBLHI
         B        BINSCH15
BINSCH35 RES      0
         STW,X1   TBLLOW
         B        BINSCH15
         PAGE
*
* PRSLN -- PARSE LINE SUBROUTINE
*
* THIS SUBROUTINE BUILDS THE FIELD POINTER TABLE.  THE
*   FIELD POINTER TABLE CONTAINS POINTERS TO THE START
*   OF EACH WORD IN THE CURRENT LINE PLUS THE SIZE OF THE WORD
*
* INPUT   X3 = BA OF INPUT STRING
*
PRSLN    RES      0
         SAVRTN
         LW,AC3   FLDPTRTBL
         AI,AC3   1
         STW,AC3  FLDPTR            SET PTR TO WORD 1 OF TABLE
         LI,X4    0                 SET FIELD COUNT TO ZERO
PRSLN5   RES      0
         LI,AC1   0                 SET CHAR COUNT TO ZERO
         B        PRSLN12
PRSLN10  RES      0
         AI,X3    1                 SEARCH FOR LEADING BLANKS
PRSLN12  RES      0
         LB,AC3   0,X3
         CI,AC3    ' '
         BE       PRSLN10
         CI,AC3   ','
         BE       PRSLN10
         LW,AC2   X3                GET BA OF START OF FIELD
PRSLN15  RES      0
         CI,AC3   ' '               IS CHAR = ' '
         BE       PRSLN20           YES
         CI,AC3   ','               NO, IS CHAR = ','
         BE       PRSLN20           YES
         CI,AC3   #CR               NO, IS CHAR = CR
         BE       PRSLN20           YES
         AI,AC1   1                 NO, BUMP CHAR COUNT
         AI,X3    1                 BUMP BYTE POINTER
         LB,AC3   0,X3              GET NEXT CHAR
         B        PRSLN15
PRSLN20  RES      0
         CI,AC1   0                 IS FIELD A SINGLE CR
         BE       PRSLN25           YES
         STB,AC1  AC2               ADD SIZE OF FIELD TO BA
         STW,AC2  *FLDPTR           STORE FIELD CONTROL WD IN TABLE
         MTW,1    FLDPTR            BUMP POINTER
         AI,X4    1                 BUMP FIELD COUNT
         CI,AC3   #CR               WAS FIELD TERMINATOR A CR
         BNE      PRSLN5            NO
PRSLN25  RES      0
         STW,X4   *FLDPTRTBL        YES, STORE FIELD COUNT
         RETURN
         PAGE
*
*
* S45SEL -- DETERMINE IF CURRENT ENTRY SHOULD BE SELECTED
*
S45SEL   RES      0
         SAVRTN
         LW,AC1   SELECTTBL
         STW,AC1  SELECT            INITIALIZE SELECT CRITERIA ADDR
         LI,AC1   0
         STW,AC1  SELRSLT           INITIALIZE RESULT TO FALSE
SEL10    RES      0
         LW,AC1   *SELECT           GET CONTROL WORD
         BLZ      SEL500            FINISHED IF NEGATIVE
         MTW,1    SELECT            MOVE POINTER TO STRING
*
         LI,X1    3
SEL20    RES      0
         LB,AC2   AC1,X1            GET CONTROL BYTE
         STW,AC2  SELSTA,X1         SAVE
         BDR,X1   SEL20             CONTINUE
         LB,X1    AC1               GET FIELD CODE
         STW,X1   SEL:FCD           SAVE
         LW,AC1   SEL:LNO           GET LINE NO (FOR FIELD = 'LINE')
         STB,AC1  X1
         BAL,SRTN S45GFLD           GET FIELD
*
* CHOOSE SMALLER LENGTH FOR COMPARE LOOP
         AI,AC1   -1                SUBTRACT 1 FOR CR
         STW,AC1  SELLGTH           SAVE LENGTH
         LI,AC2   #BLANK            GET A BLANK
         LW,X1    BUF1              FIND ADDRESS OF CR CHAR
         AW,X1    AC1
         STW,X1   TEMP4             SAVE BA OF CR
         STB,AC2  0,X1              REPLACE CR WITH BLANK
         CW,AC1   SEL:LGTH          COMPARE LENGTHS
         BLE      SEL30             ALREADY HAVE SMALLER ONE
         LW,AC1   SEL:LGTH          GET SMALLER LENGTH
SEL30    RES      0
         AI,AC1   -1                CONVERT TO WORD COUNT
         SLS,AC1  -2
         AI,AC1   1
*
         SLS,BUF1 -2                CONVERT N/A FIELD POINTER TO WA
         STW,BUF1 SELADDR           SAVE
         LI,DX1   -1                GET COMPARE MASK
         LI,X1    -1                SET UP INDEX
         LW,X3    SEL:OP            GET SELECT OPERATOR
*
* COMPARE LOOP
SEL50    RES      0
         AI,X1    1                 INCR INDEX
         LW,D1    *SELADDR,X1
         CS,D1    *SELECT,X1        COMPARE N/A SELECT TO SELECT STRING
         BNE      SEL80             NOT EQUAL
         BDR,AC1  SEL50
*
* STRINGS COMPARE BUT SIZE MAY BE DIFFERENT
         LW,D1    SELLGTH
         CW,D1    SEL:LGTH          COMPARE LENGTHS
SEL80    RES      0
         B        SELOPTBL,X3       GO PROCESS OPERATOR
*
SEL300   RES      0
         LW,AC1   SEL:LGTH          GET CHARACTER COUNT
         AI,AC1   -1                CONVERT TO WORD COUNT
         SLS,AC1  -2
         AI,AC1   1
         AWM,AC1  SELECT            MOVE SELECT POINTER TO NEXT CMP
         LW,X1    TEMP4             RESTORE CR CHAR TO END OF LINE
         LI,AC1   #CR
         STB,AC1  0,X1
         B        SEL10
*
SEL500   RES      0
         LW,X1    TEMP4             RESTORE CR CHAR TO END OF LINE
         LI,AC1   #CR
         STB,AC1  0,X1
         LW,SR3   SELRSLT           GET RESULT
         RETURN
*
*
SELOPTBL RES      0
         B        SELEQ             EQUAL
         B        SELNE             NOT EQUAL
         B        SELLT             LESS THAN
         B        SELGT             GREATER THAN
         B        SELLE             LESS THAN OR EQUAL TO
         B        SELGE             GREATER THAN OR EQUAL TO
*
*
SELEQ    RES      0
         BE       SELTRUE
         B        SELFALSE
*
SELNE    RES      0
         BNE      SELTRUE
         B        SELFALSE
*
SELLT    RES      0
         BL       SELTRUE
         B        SELFALSE
*
SELGT    RES      0
         BG       SELTRUE
         B        SELFALSE
*
SELLE    RES      0
         BLE      SELTRUE
         B        SELFALSE
*
SELGE    RES      0
         BGE      SELTRUE
         B        SELFALSE
*
*
SELTRUE  RES      0
         MTW,1    SELRSLT           SET RESULT TO TRUE
         B        SEL500            FINISHED SINCE ONLY 1 TRUE REQUIRED
*
SELFALSE RES      0
         B        SEL300            CONTINUE COMPARISON
         PAGE
*
*
* S45SELTB -- SET UP SELECT TABLE
*
S45SELTB RES      0
         SAVRTN
SELTB5   RES      0
         LW,AC1   SELECTTBL
         STW,AC1  SELECT            INITIALIZE SELECT CRITERIA ADDR
         LI,BUF1  BA(STDINBUF)      GET INPUT BUFFER ADD
         BAL,SRTN S27RTNL           READ SELECT CRITERIA
         CI,AC1   1                 CHECK SIZE
         BLE      SELTB900          MUST BE 'CR'
         LI,X1    SELECTSZ          GET SIZE OF SELECT TABLE
         AI,X1    -1
         LW,AC3   L('    ')         SET UP A WORD OF BLANKS
         STW,AC3  *SELECTTBL,X1     BLANK OUT SELECT TABLE
         BDR,X1   %-1
         STW,AC3  *SELECTTBL,X1
         LI,X3    BA(STDINBUF)      SET UP POINTER TO START OF LINE
         LI,X4    4                 SET UP SELECT TABLE STORE INDEX
         LI,X1    0                 SET UP SELECT CNTRL WD INDEX
         STW,X1   TEMP3             CLEAR SELECT CONTROL WORD
SELTB7   RES      0
         BAL,SRTN GETFID            GET FIELD IDENTIFIER
         B        SELTB90           ERROR
         CI,AC3   #CR               WAS FIELD TERMINATOR A CR
         BE       SELTB90           YES, ERROR
         LI,X1    1
         STB,X2   TEMP3,X1          STORE LINE NUMBER (IF 'LINE' ID)
         LI,X2    SFIDSZ            GET SIZE OF FIELD ID TABLE
SELTB20  RES      0
         CD,AC1   SFIDTBL-2,X2      SEARCH FOR FIELD ID
         BE       SELTB25           FOUND
         BDR,X2   SELTB20           CONTINUE
         B        SELTB90           NOT FOUND, ERROR
SELTB25  RES      0
         AI,X2    1                 CONVERT TO FIELD CODE
         SLS,X2   -1
         STB,X2   TEMP3             STORE FIELD CODE
         LI,AC1   0
         LI,X2    0
SELTB30  RES      0
         BAL,SRTN GNC               GET NEXT CHARACTER
         B        SELTB90           CHAR = CR, ERROR
         B        SELTB35           CHAR = ';'
         STB,AC3  AC1,X2            BUILD FIELD
         AI,X2    1                 INCR STORE INDEX
         CI,X2    3                 FINISHED
         BL       SELTB30           NO
         B        SELTB90           MORE THAN 2 CHAR, ERROR
SELTB35  RES      0
         SAS,AC1  -16               RIGHT JUSTIFY 2 CHAR
         LI,X2    0
SELTB37  RES      0
         CH,AC1   CNDTNTBL,X2       SEARCH FOR CONDITION IDENTIFIER
         BE       SELTB40           FOUND
         AI,X2    1
         CI,X2    CNDTNSZ
         BL       SELTB37           CONTINUE SEARCH
         B        SELTB90           NOT FOUND, ERROR
SELTB40  RES      0
         SLS,X2   -1                CONVERT TO CONDITION CODE
         LI,X1    2
         STB,X2   TEMP3,X1          STORE CONDITION OPERATOR
         LI,X2    0                 RESET STRING CHAR COUNT
SELTB45  RES      0
         BAL,SRTN GNC               GET NEXT CHAR
         B        SELTB50           CHAR = CR
         B        SELTB50           CHAR = ';'
         STB,AC3  *SELECTTBL,X4     STORE STRING IN SELECT TABLE
         AI,X2    1                 INCR STRING CHAR COUNT
         AI,X4    1                 INCR INDEX
         B        SELTB45
SELTB50  RES      0
         OR,X2    TEMP3             STORE CHAR COUNT IN SELECT CNTRL WD
         STW,X2   *SELECT           STORE IN SELECT TABLE
         AI,X4    3                 MOVE STORE INDEX TO WORD BOUNDARY
         SLS,X4   -2
         SLS,X4   2
         LW,AC1   X4                SET UP ADDR OF NEXT CNTRL WD
         SLS,AC1  -2
         AW,AC1   SELECTTBL
         STW,AC1  SELECT
         AI,X4    4                 MOVE STORE INDEX OVER CNTRL WD
         CI,AC3   ';'               WAS STRING TERMINATOR = ';'
         BE       SELTB7            YES, GO DO AGAIN
         LI,X1    -1
         STW,X1   *SELECT           MARK END OF SELECT TABLE
         MTW,1   SELECTFLG          SET SELECT FLAG ON
         B        SELTB900          RETURN
SELTB90  RES      0
         LI,AC1   53                SET FOR 'BAD SELECTION' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        SELTB5            GO TRY AGAIN
SELTB900 RES      0
         RETURN
         PAGE
*
*
* S45XNAMD -- CLEAN UP NAME/ADDRESS MODE FOR EXIT
*
S45XNAMD RES      0
         SAVRTN
         LI,AC1   #SAVE
         LI,AC3   F:NA
         BAL,SRTN S27CLOSE          CLOSE N/A FILE WITH SAVE
         LI,AC1   2
         BAL,SRTN S36M:FP           FREE NAME/ADDR MEMORY PAGES
         LI,D1    0
         PUT,D1   WS:FORM           RESET WS FORM LETTER FLAG
         STW,D1   NAFLG             RESET NAME/ADDRESS FLAG
         STW,D1   NAEOFFLG          RESET N/A EOF FLAG
         RETURN
         PAGE
*
* SETFLD -- SETS UP BYTE POINTER TO DESIRED FIELD
*
* INPUT  X1 = FIELD NUMBER
* OUTPUT X3 = SIZE & BYTE ADDRESS OF FIELD
* RETURNS TO CALLING LINE+1 IF FIELD DOES NOT EXIST
* RETURNS TO CALLING LINE+2 IF FIELD EXISTS
*
SETFLD   RES      0
         CW,X1    *FLDPTR           DOES FIELD EXIST
         BG       *SRTN             NO
         LW,X3    *FLDPTR,X1        YES, GET FIELD CONTROL WORD
         AI,SRTN  1
         B        *SRTN             RETURN
         PAGE
45D      CSECT    0
*
* LOCAL VARIABLES FOR NMADDR
*
*
BASTART  EQU      %                 START OF BYTE ADDR WORDS
BACITY   RES      1                 BYTE ADDR OF CITY
BAFNAME  RES      1                 BYTE ADDR OF FIRST NAME
BALNAME  RES      1                 BYTE ADDR OF LAST NAME
BANAME   RES      1                 BYTE ADDR OF NAME LINE
BAPREFIX RES      1                 BYTE ADDR OF PREFIX
BASTATE  RES      1                 BYTE ADDR OF STATE
BASUFFIX RES      1                 BYTE ADDR OF SUFFIX
BAZIP    RES      1                 BYTE ADDR OF ZIP
BASIZE   EQU      %-BASTART         SIZE OF BYTE ADDR WORDS
DSADDR   RES      1                 ADDR OF DYNAMIC MEMORY PAGE
NMLINE   RES      1                 NAME LINE NUMBER
CMPLINE  RES      1                 COMPANY LINE NUMBER
CSLINE   RES      1                 CITY-STATE LINE NUMBER
FLDPTRTBL  RES    1                 ADDR OF FIELD POINTER TABLE
FLDPTR   RES      1                 POINTER TO FIELD POINTER TABLE
GETDNRL  RES      1                 GETDN RETURN LINK
GETFIDRL RES      1                 GETFID RETURN LINK
LINECNT  RES      1                 LINE COUNT
LINEPTR  RES      1                 POINTER TO LINE POINTER TABLE
LINEPTRTBL  RES   1                 ADDR OF LINE POINTER TABLE
NAEOFFLG DATA     0                 NAME/ADDR EOF FLAG
NAFLG    DATA     0                 NAME/ADDRESS FLAG
NAMVPTR  RES      1                 NAME/ADDRESS MOVE POINTER
NARTNBUF RES      1                 ADDR OF RETURN BUFFER
NARTNBUFSZ  RES   1                 RETURN BUFFER SIZE
NMADDR   RES      1                 ADDR OF NAME TABLE
NXTFLD   RES      1                 NEXT FIELD INDICATOR
OFFADDR  RES      1                 ADDR OF OFFSET TABLE
SELECT   RES      1                 POINTER TO SELECT CRITERIA TABLE
SELECTFLG  RES    1                 SELECT FLAG
SELECTTBL  RES    1                 START OF SELECT CRITERIA TABLE
*
SELSTA   RES      0
SEL:FCD  RES      1                 SELECT FIELD CODE
SEL:LNO  RES      1                 SELECT LINE NUMBER
SEL:OP   RES      1                 SELECT OPERATOR
SEL:LGTH RES      1                 SELECT LENGTH
*
SELADDR  RES      1                 SELECT ADDR
SELRSLT  RES      1                 SELECT RESULT
SELLGTH  RES      1                 SELECT ENTRY ADDR
*
TBLHI    RES      1                 OFFSET TABLE HIGH VALUE
TBLLOW   RES      1                 OFFSET TABLE LOW VALUE
XFLG     RES      1                 EDIT COMPATIBLE FILE FLAG
STARTFLG RES      1                 START-AT-ENTRY FLAG
FLDPTRSZ EQU      100               SIZE OF FIELD POINTER TABLE
LINEPTRSZ  EQU    50                SIZE OF LINE POINTER TABLE
RTNBUFSZ EQU      50                SIZE OF RETURN BUFFER
SELECTSZ EQU      50                SIZE OF SELECT CRITERIA TABLE
TSTOPNO  EQU      11                NUMBER OF TSTOP OPTIONS
*
         BOUND    8
TEMP     RES      4                 TEMP DATA AREA
TEMP1    EQU      TEMP
TEMP2    EQU      TEMP+1
TEMP3    EQU      TEMP+2
TEMP4    EQU      TEMP+3
DBLBLNK  DATA     '    ','    '
LINEFID1 DATA     'LINE','    '     FIELD ID = 'LINE'
LINEFID2 DATA     X'93899585','    '  FIELD ID = LOWER CASE 'LINE'
NUMLIM   DATA     X'F0',X'F9'       LIMITS FOR DIGIT TEST
ESERRBUF DATA     '****',X'5C5C5C0D'  BUF RETURNED WHEN NO FIELD
         USECT    #PLOC
         END
