.
.         SEARCH / LOCATE COMMAND ACTIVITY
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
LOCATE*   LA,U      A10,1               SET LOCATE MODE
          J         CIRCE               ENTER SEARCH HANDLER
.
SEARCH*   LA,U      A10                 CLEAR LOCATE MODE
CIRCE     LA,U      A7                  MARK NO HIT QUEUE ALLOCATED
          LR,U      R8                  CLEAR ANY FINDS MADE
          LX        X5,CDBPC,X8         LOAD POINTER TO FILE FDT
          LA        A1,PBVAL,X5         LOAD FDT POINTER
          LMJ       A2,IOGET            BUILD FCT FOR READ FILE
          LX,U      X10,,A0             SAVE INPUT FCT ADDRESS IN X10
          LX        X5,PBLINK,X5        CHAIN TO NEXT PARAMETER
          LA        A0,PBTYPE,X5        LOAD TYPE OF THIS PARAMETER
          LA,U      A3,0377777          LOAD ASSUMED COUNT
          TNE,U     A0,DATA             WAS NUMBER PARAMETER OMITTED ?
          J         NEGIP               YES.  USE ASSUMED COUNT
          LA        A3,PBVAL,X5         LOAD SUPPLIED CONT
          LX        X5,PBLINK,X5        CHAIN TO NEXT PARAMETER
NEGIP     SA        A3,IOCOUNT,X10      PUT I/O COUNT IN PACKET
          LA        A6,PBVAL,X5         LOAD LENGTH OF KEY
          LMJ       A2,INPUT            CREATE INPUT PROCESS
          LA,U      A8,,X5              SAVE ADDRESS OF KEY DATA BUFFER
.
.         SEARCH COMPARISON ROUTINE
.
SRLOOK    GET       IOBB,X10            REMOVE A BLOCK FROM THE BOUNDED BUFFER
          SA        A1,R7               SAVE ADDRESS OF BLOCK
          LA,U      A9                  CLEAR FIND COUNT IN THIS BLOCK
          LXI,U     X7,1                SET UP INCREMENTS
          SX        X7,X3               FOR VARIOUS POINTERS
          SX        X3,X6               WE'LL USE LATER ON
          LA        A0,IBSTAT,A1        LOAD STATUS ENCOUNTERED ON READ
          JNZ       A0,IBABNS           IF ABNORMAL, GO INTERPRET IT
STCOK     LX        X5,A8               RESTORE DATA BUFFER POINTER
          LXM,U     X6,IBDATA,A1        LOAD BLOCK POINTER
          LX        X2,CDMASK,X8        LOAD MASK ADDRESS
          TNZ,U     0,X2                ANY MASK SPECIFIED ?
          LX,U      X2,CPMZER           NO.  USE IMPLIED -0 MASK
          LA        A5,IBLEN,A1         LOAD LENGTH OF BLOCK READ
          ANA       A5,A6               SUBTRACT LENGTH OF KEY
          JN        A5,FAILED           CANNOT SUCCEED OF BLOCK < KEY
          AA,U      A5,1                BUMP LENGTH FOR SEARCH
          LR        R1,A5               LOAD REPEAT COUNT FOR SEARCH
SRST      LA        A0,PBSS,X5          LOAD FIRST WORD TO LOOK FOR
          LR        R2,PBSS,X2          LOAD FIRST WORD OF MASK
          MSE       A0,,*X6             SEARCH FOR FIRST WORD OF KEY
          J         FAILED              DIDN'T LOCATE FIRST WORD
.
.         FOUND FIRST WORD.  VERIFY REST MATCHES
.
          LR        R3,PBVAL,X5         LOAD LENGTH OF KEY
          LXM,U     X7,PBSS+1,X5        POINT TO SECOND KEY WORD
          LA        A4,PBVAL,X2         LOAD LENGTH OF MASK BUFFER
          ANA,U     A4,1                ACCOUNT FOR FIRST WORD USED ALREADY
          LXM,U     X3,PBSS+1,X2        SET UP MASK DATA POINTER
          LX        X1,X6               LOAD TEMPORARY BLOCK POINTER
          JGD       R3,QUEEG            LOOP FOR KEY LENGTH - 1
          IERR      .                   AIN'T NO WAY ZERO LENGTH KEY
.
SKLEEX    LA        A11,,*X1            LOAD A WORD OF DATA
          TZ        A4                  NEED TO RECYCLE MASK ?
          J         GEEXL               NO.  PERFORM TEST
          LA        A4,PBVAL,X2         RELOAD LENGTH OF MASK
          LXM,U     X3,PBSS,X2          SET POINTER TO START OF MASK
GEEXL     ANA,U     A4,1                DECREMENT MASK LENGTH USED
          XOR       A11,,*X7            XOR DATA AND KEY
          AND       A12,,*X3            AND RESULT WITH MASK
          JNZ       A13,SRST            START FIRST WORD SEARCH IF FAILS
QUEEG     JGD       R3,SKLEEX           LOOP FOR ALL WORDS OF KEY
.
.         WE'VE MADE A 'HIT'.  RECORD IT, AND SET UP TO PROCESS BLOCK
.
          JNZ       A7,NOTFRS           HIT BUFFER ALLOCATED YET ?
          BGET      QL                  NO.  ALLOCATE ONE
          LA,U      A7,,A0              SAVE ADDRESS OF HIT QUEUE
          INITQ     .                   INITIALISE HIT QUEUE
          SX        X10,R9              SAVE X10 FOR A WHILE
          LA        A1,IOFDT,X10        LOAD FDT WE'RE WORKING ON
          LR        R10,R1              SAVE VOLATILE SEARCH COUNT
          LMJ       A2,IOGET            MAKE AN I/O FCT TO DRIVE THE PRINTER
          LR        R1,R10              RESTORE SEARCH COUNT
          LX,U      X10,,A0             LOAD ADDRESS OF I/O FCT
          LA,U      A0,1                GET CONCURRENCY LIMIT OF ONE
          SA        A0,IOBB+QL+QPL+QN,X10 SET COUNT IN NOT FULL QUEUE
          BGET      QPL*2               ALLOCATE COMPLETION QUEUES
          LR,U      R11,,A0             SAVE COMPLETION QUEUE ADDRESS
          LX,U      X9,QPL,A0           LOAD COMPLETION QUEUE ADDRESS
          LXI,U     X9,,A0              LOAD BLOCK COMPLETION QUEUE ADDRESS
          INITQ     .                   INITIALISE THE BLOCK COMPLETION QUEUE
          INITQ     QPL,A0              INITIALISE THE COMPLETION QUEUE
          LMJ       A2,PRINT            CREATE PRINTER ACTIVITY
          LX,U      X9,,X10             LOAD PRINTER CONTROL FCT ADDRESS
          LX        X10,R9              RESTORE INPUT FCT ADDRESS
          LA        A1,R7               RESTORE BUFFER ADDRESS
NOTFRS    BGET      SFL                 ALLOCATE A FIND BUFFER
          LA,U      A2,,X6              LOAD FIND LOCATION
          ANA,U     A2,IBDATA+1,A1      SUBTRACT BLOCK START + 1
          SA        A2,SFFINDW,A0       PUT FIND ADDRESS IN BUFFER
          LA,U      A1,,A0              LOAD ADDRESS OF DATA ITEM
          LA        A0,A7               LOAD QUEUE ADDRESS
          SX        X5,R9               SAVE X5
          INSERT    .                   PLACE FIND ITEM ON HIT QUEUE
          LX        X5,R9               RELOAD X5
          AA,U      A9,1                INCREMENT FINDS IN THIS BLOCK
          LR,U      R8,1                SET A FIND WAS MADE FLAG
          LA        A1,R7               RESTORE DATA BLOCK ADDRESS
          J         SRST                KEEP ON LOOKING
.
.         DIDN'T FIND IT IN THE BLOCK.  LOOK AT NEXT ONE
.
FAILED    JZ        A9,FLAY             ANY FINDS IN BLOCK ?
          P         PRINTER             YES.  LOCK THE PRINTER
          R$DIT     .                   START EDITING
          E$MSG     KFI                 EDIT 'KEY FOUND IN '
          LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          LMJ       X11,FIST            EDIT FILE AND STATEMENT, PRINT
          LMJ       X7,FINDLE           EDIT FIND LOCATIONS
          LA        A1,R7               RELOAD BLOCK BUFFER ADDRESS
          LA        A5,IBMSAD,A1        LOAD SEARCH FIND MASS STORAGE ADDRESS
          LA        A2,IBLAST,A1        L0AD LAST BLOCK FLAG
          SZ        IBLAST,A1           CLEAR LAST FLAG FOR DUMPER
          PUT       IOBB,X9             PASS TO PRINT ACTIVITY
          P         R11,,W              WAIT FOR COMPLETION
          V         PRINTER             RELEASE THE PRINTER LOCK
          JZ        A10,FLOG            KEEP ON LOOKING IF 'SEARCH'
.
.         POSITION TO FIND LOCATION FOR TAPE OR FILE
.
          LA,U      A8,1                LOAD COUNT OF BLOCKS TO MOVE BACK
          SNONZ     CDCEASE,X8          SET CEASE FLAG
IBLCK     JNZ       A2,MBSTRT           IS THIS THE LAST BLOCK ?
          GET       IOBB,X10            NO.  GET NEXT BLOCK
          LA        A0,IBSTAT,A1        LOAD READ STATUS
          JZ        A0,MSOK             NORMAL MEANS IT MOVED
          JE        A0,1,MSOK           EOF MEANS IT MOVED
          JE        A0,4,MSOK           ABNORMAL FRAME COUNT IS OK ALSO
          J         MSNOK               OTHER STATUS.  WIPED OUT OR NOT TAPE
MSOK      AA,U      A8,1                INCREMENT COUNT TO BACK OVER
MSNOK     LA        A2,IBLAST,A1        LOAD LAST FLAG
          BRELP     A1                  RELEASE THE BLOCK BUFFER
          J         IBLCK               CHECK LAST FLAG, CONTINUE
MBSTRT    TZ        IOMASS,X10          MASS STORAGE FILE ?
          J         MSASET              YES.  SET FIND ADDRESS
          LA,U      A0,MB$              NO.  LOAD MOVE BACKWARD FUNCTION
          SA        A0,IOFUNC,X10       PUT FUNCTION IN PACKET
          SZ        IOACW,X10           PROTECT AGAINST ACW CHECK
          J         MBAKO               START BACKING UP
MESEL     IOW$      IOPKT,X10           BACK UP ONE BLOCK
          LA        A0,IOSTATUS,X10     LOAD OPERATION STATUS
          JZ        A0,MBAKO            O.K. IF NORMAL
          JE        A0,1,MBAKO          ...OR EOF
          JE        A0,4,MBAKO          ...OR AFC
          LA,U      A0,IOPKT,X10        OOPS!  LOAD PACKET ADDRESS
          LMJ       X11,IOSEDT          EDIT BAD STATUS
          ZAP       .                   ROADBLOCK THE FILE
          J         TNORM               ENTER NORMAL CLOSEOUT
MBAKO     JGD       A8,MESEL            LOOP FOR BACK UP COUNT
          J         TNORM               WIND UP THIS COMMAND
.
MSASET    LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          SA        A5,FDMSAD,A0        PUT MASS STORAGE ADDRESS IN PACKET
          J         TNORM               WIND UP
FLAY      LA        A1,R7               RELOAD BLOCK ADDRESS
          LA        A2,IBLAST,A1        LOAD LAST BLOCK FLAG
          BRELP     A1                  RELEASE THE BLOCK BUFFER
FLOG      JZ        A2,SRLOOK           GET NEXT BLOCK IF NOT LAST ONE
          TZ        R8                  ANY FINDS MADE ?
          J         TNORM               YES.  DON'T SAY NO FIND
.
.         OUTPUT NO FIND DIAGNOSTIC.  FILE WILL BE ROADBLOCKED IF
.         THE OPERATION WAS A 'LOCATE', SINCE NO FIND INDICATES
.         THAT SUBSEQUENT OPERATIONS MAY BE INVALID.  THIS IS
.         OVERRIDDEN BY THE 'C' OPTION ON LOCATE.
.
          R$DIT     .                   GET A PACKET AND LINE
          E$MSG     KNEF                EDIT NO FIND MESSAGE
          LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          LMJ       X11,FIST            APPEND FILE AND STATEMENT
          JZ        A10,TNORM           ALLOW NO FIND ON SEARCH OPERATION
          ZAP       .                   BUT NOT ON LOCATE
TNORM     BRELP     X10                 RELEASE I/O FCT
          JZ        A7,NOFH             ANY HIT BUFFER TO RELEASE ?
          BRELP     A7                  RELEASE THE HIT BUFFER
          BGET      IBDATA              ALLOCATE A DATA BUFFER
          SNONZ     IBLAST,A0           MARK AS LAST BLOCK
          LA,U      A1,STERM            LOAD TERMINATION STATUS
          SA        A1,IBSTAT,A0        PUT IN STATUS
          LA,U      A1,,A0              LOAD DATA ITEM ADDRESS
          PUT       IOBB,X9             SUBMIT PACKET TO STOP DUMPER
          P         R11,,W              WAIT FOR DUMPER TO STOP
          P         QL,A0               WAIT FOR PROCESS COMPLETION
          BRELP     X9                  RELEASE DUMP FCT
          BRELP     R11                 RELEASE THE COMPLETION QUEUE
NOFH      COMPLETE  .                   COMPLETE THE OPERATION
.
IBABNS    JE        A0,4,STCOK          ALLOW ABNORMAL FRAME COUNT
          JE        A0,5,STCOK          ...AND INCOMPLETE MASS STORAGE BLOCK
          J         FAILED              BUT THAT'S ALL
.
.         EDIT FIND ADDRESSES
.
FINDLE*   R$DIT     .                   GET EDITING
          LA        A0,('WORDS ')       LOAD WORDS INDICATOR
          TNE,U     A9,1                ONLY ONE FIND ?
          LA        A0,('WORD ')        YES.  USE SINGULAR FORM
          E$FD3     .                   EDIT FIND LOCATIONS PREFIX
          LR,U      R4,128              LOAD LINE LENGTH
          JNDEM     EPIXY               USE 20 PER LINE FOR BATCH...
          LR,U      R4,60               SHORTER LINE FOR DEMAND
EPIXY     LA        A0,A7               LOAD HIT QUEUE ADDRESS
          REMOVE    .                   REMOVE AN ITEM FROM IT
          TNE       A1,A7               END OF THE QUEUE ?
          J         IXLY                YES.  WIND UP THIS ROUTINE
          LA        A2,SFFINDW,A1       LOAD FIND ADDRESS
          BRELP     A1                  RELEASE THE HIT BUFFER
          E$OCTV    A2                  EDIT THE FIND ADDRESS
          E$CHAR    ','                 EDIT SEPARATOR
          E$SKIP    1                   SKIP A SPACE
          E$COLN    .                   GET COLUMN NUMBER
          TLE       A0,R4               PAST EDITING LIMIT ?
          J         EPIXY               NO.  KEEP ON EDITING
          R$PRT     1                   PRINT AND KEEP ON EDITING
          E$SKIP    6                   TAB TO COLUMN 6
          J         EPIXY               KEEP ON GOING
.
IXLY      E$SKIP    -2                  BACK UP TO TRAILING COMMA
          E$CHAR    ' '                 OVERLAY IT WITH A SPACE
          R$PRTX    1                   PRINT AND TERMINATE EDITING
          J         0,X7                RETURN
          PURE      DATA
.
.         CANNED MASK BUFFER FOR OMITTED MASK
.
CPMZER    *         MBUFR,0
          *         0,0
          *         1
          *         -0
.
KNEF      'KEY NOT FOUND IN !'
KFI       'KEY FOUND IN !'
          END