*DECK S$GNGR2 
          IDENT  S$GNGR2
          TITLE  S$GNGR2 -  GENERATE- GET-USER-RECORD, CASE 2 
          COMMENT  GEN- GET-USER-RECORD, CASE 2 
          B1=1               FOR (GENMAC (GET)) 
  
*CALL LBLPTR
  
          SPACE  4
**        S$GNGR2 -  GENERATE- GET-USER-RECORD, CASE 2
* 
*     CALLING SEQUENCE- 
*         S$GNGR2(SPEC$OWN1, SPEC$OWN2, WSAS$OREC, SPEC$OWNT);
* 
*     GIVEN-
*         SPEC$OWN1 = 0 OR ADDRESS OF OWNCODE 1.
*         SPEC$OWN2 = 0 OR ADDRESS OF OWNCODE 2.
*         WSAS$OREC = ADDRESS OF EXTERNAL RECORD. 
*         SPEC$OWNT = TRUE IF SM5 STYLE INTERFACE,
*                     FALSE IF SM4 STYLE INTERFACE. 
* 
*     GENERATES-  "GETREC":  SET UP APLIST WITH WSAS$OREC 
*                            AND  RECLEN (0 FOR S$GNGR2)
*                            CALL OWNCODE EXIT 1. 
*                            IF NRA FROM OWNCODE1 IS 0,1 OR 2 , 
*                              SETS WSAS$OREC = USER-RECORD.
*                              GOTO "GOTUREC".
*                "GRILBL1":  SET "GETENTRY" TO "ENTRY2" 
*                 "ENTRY2":  CALL OWNCODE2 TO DETERMINE ACTION. 
*                            IF ACTION = *INSERT*,
*                                COPY USER RECORD TO WSAS$OREC
*                                GOTO "GOTUREC" 
* 
*                            SET "GETENTRY" TO "ENTRY3".
*                 "ENTRY3":  SET REGISTER = EOD 
*                            GOTO "GOTIREC".
* 
  
  
          ENTRY  S$GNGR2
 S$GNGR2  SUBR
  
          SB1    1           CONSTANT 1 
  
*     PUT RELEVANT PARAMETERS IN REGISTERS
  
          SA2    X1          VALUE OF SPEC$OWN1 
          SB2    X2          B2 = ZERO OR ADDRESS OF OWN1 PROCEDURE 
          SA2    A1+B1       ADDRESS OF SPEC$OWN2 
          SA2    X2          VALUE OF SPEC$OWN2 
          SB3    X2          B3 = VALUE OF SPEC$OWN2
          SA2    A1+2        ADDRESS OF WSAS$OREC 
          SA2    X2          VALUE OF WSAS$OREC 
          SB4    X2          B4 = VALUE OF WSAS$OREC
          SA4    A1+3        ADDRESS OF SPEC$OWNT 
          SA4    X4          VALUE OF SPEC$OWNT 
  
          NEWLBL ORECLEN
          NEWLBL SRECLEN
          NEWLBL LRECLEN
  
*     GENERATE-   "GETREC":  GO TO "ENTRY<N>" ACCORDING TO
*                             "GETENTRY" (ORIGINALLY "ENTRY0")
  
          GENLBL GETREC 
          NEWLBL GETENTRY 
          GEN    (SA1 "GETENTRY") 
          NEWLBL ENTRY3 
          GEN    (NZ X1,"ENTRY3")      *NON-ZERO MEANS "ENTRY3" 
  
* GENERATE RUNTIME ERROR - VARIABLE RECORD TOO SHORT
  
          NEWLBL NEXT 
          GEN    (EQ "NEXT")
          NEWLBL ERROR4 
          NEWLBL ERROR156 
          NEWLBL ERRORZ 
          GENLBL ERROR4 
          GEN    (PS) 
          GEN    (PS "ERROR156")
          GENLBL ERRORZ 
          GENMAC (DATA 0) 
          GENMAC (DATA 0)     TERMINATOR
          GENLBL ERROR156 
          GENMAC (DATA 156) 
  
          GENLBL NEXT 
          IFTHEN B3"0        IF OWN2 PROCEDURE
            NEWLBL ENTRY2 
            GEN    (NG X1,"ENTRY2")    *MINUS ZERO MEANS "ENTRY2" 
            ENDIF.
  
            NEWLBL NEXT 
            GEN    (EQ "NEXT")
  
  
            GENLBL APLIST                *APLIST
            GEN    (PS) 
            NEWLBL RTNCODE
            GEN    (PS "RTNCODE")        *ADDR OF RETURN CODE NRA 
            GENMAC (DATA 0)              *ADDR OF WSA$OREC
            GEN    (PS) 
            GEN    (PS "ORECLEN") 
            GENMAC (DATA 0) 
            GENLBL ORECLEN             *RECORD LENGTH (OF OREC) 
            GENMAC (DATA 0) 
            GENLBL RTNCODE               *FTN RETURN CODE NRA 
            GENMAC (DATA 0) 
  
            GENLBL ERROR1 
            GEN    (PS) 
            NEWLBL ERROR152 
            GEN    (PS "ERROR152")
            GENMAC (DATA 0)                *ZERO TERMINATOR 
  
            GENLBL ERROR2 
            GEN    (PS) 
            NEWLBL ERROR154 
            GEN    (PS "ERROR154")
            GENMAC (DATA 0)                *ZERO TERMINATOR 
  
  
            GENLBL ERROR3 
            GEN    (PS) 
            NEWLBL ERROR155 
            GEN    (PS "ERROR155")
            GENMAC (DATA 0)              *ZERO TERMINATOR 
  
            GENLBL ERROR0 
            GEN    (PS) 
            GEN    (PS 1+"ERROR1")         *ZERO WORD PARAMETER 
            GENMAC (DATA 0)                *ZERO TERMINATOR 
  
  
            GENLBL ERROR152              *RETURN FROM FTN4 W/O SMRTN
            GENMAC (DATA 152)            * (E$152)
  
            GENLBL ERROR154              *CALLING SMRTN FROM FTN5 
            GENMAC (DATA 154)            * (E$154)
  
            GENLBL ERROR155 
            GENMAC (DATA 155) 
  
          GENLBL INDXFIT
          GENMAC (DATA 0)    *THIS IS A DUMMY WORD
  
            GENLBL NEXT 
  
          GEN    (SA5 "WSA")
          GEN    (SX6 X5+0),B4         *SX6 WSA+OREC
          GEN    (SA6 B1+"APLIST")     *SET WSAS$OREC AT APLIST+1 
  
          NEWLBL GRILBL2
          IFTHEN B2=B0       IF NO OWNCODE 1 ROUTINE
            GEN    (EQ "GRILBL2")      DO NOT CALL IT 
            ENDIF.
  
          IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
            GEN    (SA1 "APLIST")      *APLIST = NRA,RECADDR,RECLEN 
            GEN    (MX6 0)
            GEN    (SA6 X1)            *ZERO OUT NRA
          ELSE- 
            GEN    (SA1 A6)            *APLIST = RECADDR,RECLEN 
            ENDIF.
  
          NEWLBL NEXT 
          GEN    (SX6 "NEXT")          *RETURN ADDR FROM SMRTN
          GEN    (SA6 S$RTNAD)
          GEN    (RJ 0),B2             *RJ OWNCODE1 
          GEN    (SB0 0)
  
  
* 
* USER GOT HERE WITH NORMAL RETURN, ONLY OK WITH FTN5 INTERFACE 
* 
          IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
              GEN    (SA1 "APLIST")        *USE SAME APLIST FOR FTN5
            NEWLBL LABEL4 
            GEN    (EQ "LABEL4")
          ELSE- 
  
            GEN    (SA1 "ERROR1")      * (E$152)
            GEN    (RJ =XS$ERROR)      *CALL ERROR ROUTINE
            GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
            GEN    (RJ =XS$ERROR) 
            GEN    (RJ =XS$ABT)           *CALL SORT5 ABORT ROUTINE 
  
          ENDIF.
  
  
          GENLBL NEXT                  *RETURN HERE FROM SMRTN
  
          IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
            GEN    (SA1 "ERROR2")      * (E$154)
            GEN    (RJ =XS$ERROR)      *CALL ERROR ROUTINE
            GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
            GEN    (RJ =XS$ERROR) 
            GEN    (RJ =XS$ABT)        *SORT5 ABORT ROUTINE 
  
            GENLBL LABEL4 
            ENDIF.
  
          GEN    (SB1 1)               *CONSTANT 1
                                         * A1 SET TO APLIST ABOVE FOR FTN5
                                         * OR SET IN FTN4 PROGRAM 
          GEN    (SA2 X1)              *X2 = NRA
          NEWLBL NEXT 
          GEN    (PL X2,"NEXT")        *IF NRA IS POSITIVE
  
          GEN    (SA1 "ERROR3")         * E$155 
          GEN    (RJ =XS$ERROR) 
          GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
          GEN    (RJ =XS$ERROR) 
          GEN    (RJ =XS$ABT)          *SORT5 ABORT ROUTINE 
  
          GENLBL NEXT 
          NEWLBL NEXT 
          GEN    (SX0 X2-4) 
          GEN    (MI X0,"NEXT")        *IF NRA LE 3 
  
          GEN    (SA1 "ERROR3")         * E$155 
          GEN    (RJ =XS$ERROR) 
          GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
          GEN    (RJ =XS$ERROR) 
          GEN    (RJ =XS$ABT)          *SORT5 ABORT ROUTINE 
  
          GENLBL NEXT 
          GEN    (SX0 X2) 
          GEN    (SX0 X0-3)            *TEST FOR TERMINATE
          GEN    (ZR X0,"GRILBL2")     *IF NRA=3(TERMINATE) 
*         INCREMENT THE ELEMENT OF S$ARRY WHICH HOLDS THE COUNT OF
*         THE NUMBER OF RECORDS INSERTED BY OWN1
            GEN  (SA5 S$ARRY+2)        *GET COUNT OF REC.S INSERTED 
            GEN  (SX7 B1) 
            GEN  (IX7 X5+X7)           *INCREMENT COUNT FOR OWN1
            GEN  (SA7 A5)              *UPDATE STAT. ARRAY ELEMENT
  
  
          GEN    (SA2 A1+B1)           *ADDR OF OUTARR1 
          GEN    (SA2 X2)              *VALUE OF OUTARR1
          GEN    (SA3 A1+2)            *ADDR OF OUTRL1
          GEN    (SA3 X3)              *VALUE OF OUTRL1 
          GEN    (BX6 X3) 
          GEN    (SA6 "ORECLEN")
* 
* MOVE RECORD AT ADDR OUTARR1 WITH LENGTH IN OUTRL1 TO OREC 
* 
          GEN    (SA5 "WSA")
          GEN    (SX5 X5+0),B4         *SX5 WSA+OREC ADDR 
  
          GEN    (SB2 A2) 
          GEN    (SB3 X5) 
          NEWLBL NEXT 
          GEN    (EQ B2,B3,"NEXT")     *IF SAME ADDR TO MOVE
  
          GEN    (SB2 10)              *NO CHAR/WORD
          GEN    (SB3 X3)              *VALUE OF OUTRL1 
  
  
          GENLBL GRILOOP1 
          GEN    (BX6 X2) 
          GEN    (SA6 X5)              *COPY TO 1ST WORD OF WSAS$OREC 
          GEN    (SA2 A2+B1)           *NEXT WORD 
          GEN    (SX5 X5+B1)
          GEN    (SB3 B3-B2)           *DECREMENT CHAR COUNT
          GEN    (LT B0,B3,"GRILOOP1") *IF MORE WORDS TO MOVE 
  
          GENLBL NEXT 
          GEN    (SA1 "WSA")
          GEN    (SB2 X1) 
  
  
          NEWLBL GOTUREC
          GEN    (EQ "GOTUREC") 
  
* 
*     GENERATE-             "GETENTRY" = 0 FOR NORMAL CASE
* 
        GENLBL GETENTRY 
        GENMAC (DATA 0) 
  
*     GENERATE-             "GRILBL2": SET "GETENTRY" TO "ENTRY2" 
  
          GENLBL GRILBL2
  
  
*     GENERATE-          (IF OWN2 PROCEDURE)
*                            SET "GETENTRY" = "ENTRY2". 
*                 "ENTRY2":  CALL OWN2 PROCEDURE TO DETERMINE <ACTION>. 
*                            IF <ACTION> = *INSERT*,
*                                COPY USER RECORD TO WSAS$OREC
*                                GO TO "GOTUREC". 
*                        (END OF -OWN2-PROCEDURE) 
  
          IFTHEN B3"0        IF OWN2 PROCEDURE SPECIFIED
  
            GEN    (MX6 60)             *X6 = - 0 
            GEN    (SA6 "GETENTRY") 
  
            GENLBL ENTRY2 
* 
  
            IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
              GEN    (SA1 "APLIST")      *APLIST = NRA,RECADDR,RECLEN 
              GEN    (MX6 0)
              GEN    (SA6 X1)            *ZERO OUT NRA
              GEN    (SA6 "ORECLEN")   *ZERO OUT RECLEN 
            ELSE- 
              GEN    (SA1 A6)            *APLIST = RECADDR,RECLEN 
              ENDIF.
  
            NEWLBL NEXT 
            GEN    (SX6 "NEXT")        *RETURN ADDR FROM SMRTN
            GEN    (SA6 S$RTNAD)
  
            GEN    (RJ 0),B3           *RJ OWNCODE2 
            GEN    (SB0 0)
  
  
* 
* USER GOT HERE WITH NORMAL RETURN, ONLY OK WITH FTN5 INTERFACE 
* 
            IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
              GEN    (SA1 "APLIST")        *USE SAME APLIST FOR FTN5
              NEWLBL LABEL5 
              GEN    (EQ "LABEL5")
            ELSE- 
  
              GEN    (SA1 "ERROR1")      * (E$152)
              GEN    (RJ =XS$ERROR)      *CALL ERROR ROUTINE
              GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
              GEN    (RJ =XS$ERROR) 
              GEN    (RJ =XS$ABT)           *CALL SORT5 ABORT ROUTINE 
  
            ENDIF.
  
  
  
            GENLBL NEXT                *RETURN HERE FROM SMRTN
  
            IFTHEN X4"0        IF SPEC$OWNT (SM5 INTERFACE) 
              GEN    (SA1 "ERROR2")      * (E$154)
              GEN    (RJ =XS$ERROR)      *CALL ERROR ROUTINE
              GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
              GEN    (RJ =XS$ERROR) 
              GEN    (RJ =XS$ABT)        *SORT5 ABORT ROUTINE 
  
              GENLBL LABEL5 
              ENDIF.
  
            GEN    (SB1 1)             *CONSTANT 1
                                         * A1 SET TO APLIST ABOVE FOR FTN5
                                         * OR SET IN FTN4 PROGRAM 
            GEN    (SA2 X1)            *X2 = NRA
            NEWLBL NEXT 
            GEN    (PL X2,"NEXT")        *IF NRA IS POSITIVE
  
            GEN    (SA1 "ERROR3")         * E$155 
            GEN    (RJ =XS$ERROR) 
            GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
            GEN    (RJ =XS$ERROR) 
            GEN    (RJ =XS$ABT)          *SORT5 ABORT ROUTINE 
  
            GENLBL NEXT 
            NEWLBL NEXT 
            GEN    (SX0 X2-4) 
            GEN    (MI X0,"NEXT")        *IF NRA LE 3 
  
            GEN    (SA1 "ERROR3")         * E$155 
            GEN    (RJ =XS$ERROR) 
            GEN    (SA1 "ERROR0")      * ZERO TO PRINT ERROR
            GEN    (RJ =XS$ERROR) 
            GEN    (RJ =XS$ABT)          *SORT5 ABORT ROUTINE 
  
            GENLBL NEXT 
            GEN    (SX0 X2) 
            NEWLBL GRILBL3
            GEN    (ZR X2,"GRILBL3")   *IF EOF FROM OWNCODE2
  
  
*         INCREMENT THE ELEMENT OF S$ARRY WHICH HOLDS THE COUNT OF
*         THE NUMBER OF RECORDS INSERTED BY OWN2
            GEN  (SA2 S$ARRY+3)        *GET COUNT OF RECS INSERTED
            GEN  (SX7 B1) 
            GEN  (IX7 X2+X7)           *INCREMENT COUNT OF OWN2 
            GEN  (SA7 A2)              *UPDATE STAT. ARRAY
  
            GEN    (SA2 A1+B1)         *ADDRESS OF OUTARR1
            GEN    (SA2 X2)            *VALUE OF OUTARR1
            GEN    (SA3 A1+2)          *ADDRESS OF OUTRL1 
            GEN    (SA3 X3)            *VALUE OF OUTRL1 
* 
* MOVE RECORD AT ADDR OUTARR1 WITH LENGTH IN OUTRL1 TO OREC 
* 
            GEN    (SA5 "WSA")
            GEN    (SX5 X5+0),B4       *SX5 WSA+OREC ADDR 
  
  
            GEN    (SB2 A2) 
            GEN    (SB3 X5) 
            NEWLBL NEXT 
            GEN    (EQ B2,B3,"NEXT")     *IF SAME ADDR TO MOVE
  
            GEN    (SB2 10)              *NO CHAR/WORD
            GEN    (SB3 X3)              *VALUE OF OUTRL1 
          GEN    (BX6 X3) 
          GEN    (SA6 "ORECLEN")
  
            GENLBL GRILOOP2 
            GEN    (BX6 X2) 
            GEN    (SA6 X5)            *COPY TO 1ST WORD OF WSAS$OREC 
            GEN    (SA2 A2+B1)           *NEXT WORD 
            GEN    (SX5 X5+B1)
            GEN    (SB3 B3-B2)         *DECREMENT CHAR COUNT
            GEN    (LT B0,B3,"GRILOOP2")  *IF MORE WORDS TO MOVE
  
            GENLBL NEXT 
            GEN    (SA1 "WSA")
            GEN    (SB2 X1) 
  
            GEN    (EQ "GOTUREC") 
  
            GENLBL GRILBL3
            GEN    (SA1 "WSA")
            GEN    (SB2 X1) 
  
            ENDIF.
  
*     GENERATE-              SET "GETENTRY" TO "ENTRY3" 
*                 "ENTRY3":  SET REGISTER = END-OF-DATA.
*                            GO TO "GOTIREC". 
  
          GEN    (MX6 1)               *X6 = NON-ZERO 
          GEN    (SA6 "GETENTRY") 
  
          GENLBL ENTRY3 
          GEN    (BX6 X0-X0)           *X6 = 0
          NEWLBL GOTIREC
          GEN    (EQ "GOTIREC") 
  
  
*     GENERATE-     "GOTUREC":  
  
          GENLBL GOTUREC
  
*         INCREMENT THE ELEMENT OF S$ARRY WHICH HOLDS THE COUNT OF
*         THE TOTAL RECORD LENGTH 
            GEN  (SA1 "ORECLEN")       *GET CURRENT REC. LENGTH 
            GEN  (SA3 S$ARRY+13)       *GET TOTAL OF REC. LEN.
            GEN  (IX7 X3+X1)           *ADD CURRENT RECLEN TO TOTAL 
            GEN  (SA7 A3)              *UPDATE COUNT
  
          EXIT
  
 S$ARRY   EXTERNAL
 S$RTNAD  EXTERNAL
  
          END 
