FTN 
      PROGRAM RAPP2(5,90),92069-16015 REV.2026 800122 
C 
C 
C*****************************************************************
C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED 
C NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR
C TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR
C WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. 
C****************************************************************** 
C 
C 
C     SOURCE:    92069-18026
C     RELOC:     92069-16015
C 
C     ALTERED:   JANUARY 22, 1980 FOR SORTED CHAINS FEATURE - CEJ 
C 
C 
C****************************************************************:
C 
C 
C 
C "END." COMMAND PROCESSOR
C 
C 
C ABSTRACT: 
C 
C THIS SEGMENT PROCESSES THE "END." COMMAND.  IT SETS THE FLAG
C TO SUPPRESS THE ECHOING OF THE RECORD IN ERROR SINCE ALL RECORDS
C HAVE BEEN PROCESSED BY NOW.  IT VERIFIES THAT EVERY ITEM WAS
C USED.  IT COMPRESSES ANY UNUSED MEMORY BETWEEN THE LAST SET TABLE 
C AND THE RECORD DEFINITION AND PATH TABLES. (REMEBER THAT THE
C RECORD DEFINITION AND PATH TABLES WERE BEING BUILT AT THE 
C END OF MEMORY TOWARDS THE MAIN PART OF THE RUN TABLE.  THIS 
C WAS BECAUSE RECORD DEFINITION AND PATH TABLES ARE VARIABLE LENGTH.) 
C 
C THIS SEGMENT THEN PUTS THE SORT TABLES AFTER THE RECORD DEFINITION
C AND PATH TABLES.  THEN IT CREATES THE FREE RECORD TABLES, THEN THE
C OVERHEAD RECORD.
C 
C 
C             ------------------      ------------------
C             !                !      !                !
C             !  RUN TABLE     !      !   RUN TABLE    !
C                                     !                !
C             !                !      !                !
C             !                !      !                !
C             !                !      !                !
C             ------------------      ------------------
C             !                !      !                !
C             !      .         !      ! RECORD DEFIN.  !
C             !      .         !      !  & PATH TABLE  !
C             !                !      !                !
C             !                !      ------------------
C             !      .         !      !                !
C             !      .         !      ! ITEM & SET SORT!
C             !                !      !     TABLES     !
C             !                !      ------------------
C             !      .         !      !                !
C             !      .         !      ! FREE SPACE PTRS!
C             !      .         !      !                !
C             !                !      ------------------
C             !                !      ! OVERHEAD RECORD!
C             ------------------      ------------------
C             !  RECORD DEFIN. !      !                !
C             !   & SORT TABLES!      !        .       !
C             !                !      !        .       !
C             ------------------      ------------------
C 
C 
C 
C THIS SEGMENT THEN GATHERS UP INFORMATION NECESSARY FOR THE
C "TABLE" AND "FIELD" OPTIONS.  THEN LOADS AND EXECUTES THE 
C SUMARY SEGMENT. 
C 
C 
C 
C 
      LOGICAL OVF 
      INTEGER NPACK 
      INTEGER IDMAX(2)
      REAL DMAX 
      INTEGER PPTR,PCNT 
      INTEGER INAM(3) 
      INTEGER RCAP(2) 
      INTEGER SPACE 
      INTEGER SUMRY(3)
      INTEGER RCNT,RECSZ
      INTEGER PACK
      INTEGER ENDM
      INTEGER DI1(2),DI128(2) 
      INTEGER IBUF(3) 
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ JANUARY 23,1980
C 
C 
C                      CONSTANTS IN INTEGER 
C 
C 
C 
      INTEGER AUTO,BADC,BASE,BEGIN,BLANK,BLKCD, 
     1       CAP,CNTRL,COLON,COMMA,CRDLM, 
     2       DATA,DETAIL,DOLLR,DOT, 
     3       ELSE,END,ENTY,EQUAL,ERR, 
     4       FIELD, 
     5       ICODE,INTGR,ITM, 
     6       LEVL,LPARN,LST,
     7       MANU,MXCAP,MAXRC,
     8       MXELE,MXENT,MXITM,MXLEV,MXSTR, 
     9       NAM,RSRV,ASET,AUSET,MSET,MASET,DSET,DESET,NM,NFONX,NFO,
     C       NOLST,NORES,NOTAB, 
     1       OPSET, 
     2       PMAX,
     3       ROOTR,RPARN, 
     4       SEMI,SET,SMAX, 
     5       UPPER
C 
C 
C 
C 
C                      DATA BASE OFFSETS
C 
C 
C 
      INTEGER DBNAM,DBSCD,DBCRN,DBDSN,DBRSN,DBICT,DBITP,
     1       DBSCT,DBSTP,DBSOP,DBFRP,DBLMD,DBLVL, 
     2       DBLVE
C 
C 
C 
C                     ITEM TABLE OFFSETS
C 
C 
C 
      INTEGER ITNME,ITINF,ITTYP,ITSCT,
     1       ITSNO,ITECT,ITLNG,ITMSZ,ITMST
C 
C 
C                     DATA SET TABLE OFFSETS
C 
C 
      INTEGER DSNME,DSCRN,DSTYP,DSMDL,DSDRL,DSFCT,DSPCT,
     1       DSITP,DSCAP,DSCCT,DSPAN,SETSZ
C 
C 
C 
C               OFFSET TO OVERHEAD RECORD 
C 
C 
C 
      INTEGER OVRRC,OVRTL,OVFRL,OVDCB,OVREC 
C 
C 
C 
C              ERROR MESSAGES 
C 
C 
      INTEGER ILCTR,ILCRN,ILSEC,XBEGN,XLEV, 
     1       DUPIT,ITLIM,ILITP,FLDER,ILXTP, 
     2       ILWR,ILTRM,NAMX,DUPST,STLIM, 
     3       ENTYX,NOITM,BDSET,BDKEY,DUPHS, 
     4       NOPTH,AERR,RCLIM,CAPX,ILCAP, 
     5       EMPTY,MXERR,EOF,NOSEG,NOMEM, 
     6       DUPLV,ILNAM,ILNMR,LVDEF,ILSEP, 
     7       ILRD,ILRNG,SETX,IGNSC,INMX,
     8       PTDUP,DBKEY,ENDX,PDEFC,SIMPT,
     9       BDCNT,RTERR,GOODS,GOODR,BADS,
     C       BADR,ABORT,OPNER,XCNTR,ILLVN,
     1       SRCH2,UEND,XITM,ELERR,ROTER, 
     2       UNITM,IOAIN,IOAOT,UNRDL,UNWRL,IOERR,ILOPT, 
     3       ILLSC,MORIT,ILPTH,DEFIT, 
     4       ILSRT,SIMPS,UNDST
C 
C 
C                 VARIABLES 
C 
C 
C 
      INTEGER CARD,CHAR,CODE,CRDPR
      REAL CPACK
      INTEGER DSEC,DCRN 
      INTEGER ENTL,ERROR
      LOGICAL NMFLG 
      INTEGER FWAM
      INTEGER GGERR 
      INTEGER ICNT,IDCB,INDX
      INTEGER INFPT,INFO,IGLOB,INPUT,ITMTB
      INTEGER KPACK 
      INTEGER LDCB,LGLOB,LIST,LWAM
      INTEGER MEDIA 
      INTEGER NPACK,NSETS 
      INTEGER OVRHD 
      INTEGER PTHTB 
      INTEGER RDEF,RESNO,RFILE,RINDX
      INTEGER SCNT,SETTB,SINDX,SORTI,SORTS,STYPE
      INTEGER TYPE,PRGFLG 
C 
C 
C    EXTERNAL REFERENCES
C 
C 
      INTEGER ROOTA 
C 
C                      CONSTANTS IN COMMON
C 
C 
C 
      COMMON/CONST/ AUTO,BADC,BASE,BEGIN,BLANK,BLKCD, 
     1       CAP,CNTRL,COLON,COMMA,CRDLM, 
     2       DATA,DETAIL,DOLLR,DOT, 
     3       ELSE,END,ENTY,EQUAL,ERR, 
     4       FIELD, 
     5       ICODE,INTGR,ITM, 
     6       LEVL,LPARN,LST,
     7       MANU,MXCAP(2),MAXRC, 
     8       MXELE,MXENT,MXITM,MXLEV,MXSTR, 
     9       NAM,RSRV,ASET,AUSET,MSET,MASET,DSET,DESET,NM,NFONX(10),
     C       NFO(10), 
     C       NOLST,NORES,NOTAB, 
     1       OPSET, 
     2       PMAX,
     3       ROOTR,RPARN, 
     4       SEMI,SET,SMAX, 
     5       UPPER
C 
C 
C 
C 
C                      DATA BASE OFFSETS
C 
C 
C 
      COMMON/DBCB/ DBNAM,DBSCD,DBCRN,DBDSN,DBRSN,DBICT,DBITP, 
     1       DBSCT,DBSTP,DBSOP,DBFRP,DBLMD,DBLVL, 
     2       DBLVE
C 
C 
C 
C                     ITEM TABLE OFFSETS
C 
C 
C 
      COMMON/ITCB/ ITNME,ITINF,ITTYP,ITSCT, 
     1       ITSNO,ITECT,ITLNG,ITMSZ,ITMST
C 
C 
C                     DATA SET TABLE OFFSETS
C 
C 
      COMMON/DSCB/ DSNME,DSCRN,DSTYP,DSMDL,DSDRL,DSFCT,DSPCT, 
     1       DSITP,DSCAP,DSCCT,DSPAN,SETSZ
C 
C 
C 
C               OFFSET TO OVERHEAD RECORD 
C 
C 
C 
      COMMON /OVCB/OVRRC,OVRTL,OVFRL,OVDCB,OVREC
C 
C 
C 
C              ERROR MESSAGES 
C 
C 
      COMMON/ERRM/ ILCTR,ILCRN,ILSEC,XBEGN,XLEV,
     1       DUPIT,ITLIM,ILITP,FLDER,ILXTP, 
     2       ILWR,ILTRM,NAMX,DUPST,STLIM, 
     3       ENTYX,NOITM,BDSET,BDKEY,DUPHS, 
     4       NOPTH,AERR,RCLIM,CAPX,ILCAP, 
     5       EMPTY,MXERR,EOF,NOSEG,NOMEM, 
     6       DUPLV,ILNAM,ILNMR,LVDEF,ILSEP, 
     7       ILRD,ILRNG,SETX,IGNSC,INMX,
     8       PTDUP,DBKEY,ENDX,PDEFC,SIMPT,
     9       BDCNT,RTERR,GOODS,GOODR,BADS,
     C       BADR,ABORT,OPNER,XCNTR,ILLVN,
     1       SRCH2,UEND,XITM,ELERR,ROTER, 
     2       UNITM,IOAIN,IOAOT,UNRDL,UNWRL,IOERR,ILOPT, 
     3       ILLSC,MORIT,ILPTH,DEFIT, 
     4       ILSRT,SIMPS,UNDST
C 
C 
C                 VARIABLES 
C 
C 
C 
      COMMON// CARD(36),CHAR,CODE,CPACK(50),CRDPR 
      COMMON DSEC,DCRN
      COMMON ENTL,ERROR 
      COMMON NMFLG
      COMMON FWAM 
      COMMON GGERR
      COMMON ICNT,IDCB(144),INDX
      COMMON INFPT,INFO(6),IGLOB(10),INPUT,ITMTB
      COMMON KPACK(50)
      COMMON LDCB(144),LGLOB,LIST,LWAM
      COMMON MEDIA
      COMMON NPACK(50),NSETS(50)
      COMMON OVRHD
      COMMON PTHTB(32)
      COMMON RDEF(64),RESNO,RFILE(3),RINDX
      COMMON SCNT,SETTB,SINDX,SORTI(255),SORTS(50),STYPE
      COMMON TYPE,PRGFLG
C 
C 
C    EXTERNAL REFERENCES
C 
C 
      EXTERNAL ROOTA
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ JANUARY 23,1980
C CHANGED COMMON TO ADD ILSRT,SIMPS,UNDST AND INCREASE SIZE OF PTHTB
C 
C 
      EQUIVALENCE (DMAX,IDMAX)
C 
C 
      DATA IDMAX/077777B,177777B/ 
      DATA SUMRY/2HSU,2HMY,2H2 /
      DATA DI1/0,1/ 
      DATA DI128/0,128/ 
C 
C VERIFY THIS IS AN "END." COMMAND
C 
      IF (RESNO .NE. END) GOTO 7010 
C 
C ANY EMPTY MEMORY
C 
C TURN THE LISTING FLAG ON, SO THE LAST RECORD WILL NOT 
C PRINTED ON ERRORS.
C 
      NDX = NFONX(LST)
      INFO(NDX) = NFO(LST)
      CRDPR = 0 
C 
C MAKE SURE EVERY ITEM IS USED
C 
      IFLAG = 0 
      ICNT = ROOTA(DBICT) 
      ITMTB = ROOTA(DBITP)*2
      IF(ICNT .LT. 1) GOTO 6
      DO 5 I=ITMTB,(ICNT-1)*ITMSZ+ITMTB,ITMSZ 
      IF(ROOTA(I+ITSCT) .NE. 0) GOTO 5
C 
C IF THIS IS THE FIRST UNUSED ITEM
C   OUTPUT "THE FOLLOWING ITEM(S) ARE UNUSED."
C     FOLLOWED BY THE ITEM NAME 
C 
      IF(IFLAG .EQ. 0) CALL EMESS(UNITM)
      IFLAG = -1
C 
C OUTPUT ITEM NAME
C 
      II=I
      DO 4 J=1,3
      IBUF(J) = ROOTA(II) 
4     II = II+2 
      CALL OUTLN(IBUF,3)
5     CONTINUE
6     CONTINUE
C 
C GET SET COUNT AND SET TABLE ADDRESS 
C 
      SCNT = ROOTA(DBSCT) 
      IF ( SCNT .LE. 0) GOTO 100
      SETTB = ROOTA(DBSTP) * 2
      ENDM = (LWAM-FWAM) * 2
C 
C GET POINTER TO MEMORY JUST PAST THE SET TABLES
C CHECK IF THERE ARE ANY PATH TABLES
C    NOTE: INFPT POINTS TO THE LAST UNUSED WORD, ABOVE
C          THE INFORMATION TABLES 
C 
      RINDX = SETTB + SCNT * SETSZ
      IF(INFPT .LT. RINDX) GOTO 25
      IF(INFPT .EQ. ENDM) GOTO 25 
C 
C YES, MOVE THE INFORMATION TABLES UNDER THE SET TABLES 
C 
      SPACE = ((INFPT+2) - RINDX) / 2 
C 
C 
      DO 10 I= (INFPT+2),ENDM,2 
      CALL SROOT(RINDX,ROOTA(I) ) 
      RINDX = RINDX + 2 
10    CONTINUE
C 
C UPDATE POINTERS IN SET TABLES 
C 
      DO 20 I=0,SCNT-1
      SINDX = I*SETSZ + SETTB 
      IVAL = ROOTA(SINDX + DSITP) - SPACE 
      CALL SROOT(SINDX+DSITP,IVAL)
20    CONTINUE
C 
C PUT POINTER TO SORT TABLE IN MEMORY 
C 
25    CONTINUE
      CALL SROOT(DBSOP,RINDX/2) 
C 
C PUT ITEM SORT TABLE IN MEMORY 
C 
      ICNT = ROOTA(DBICT) 
      IF (ICNT .LE. 0) GOTO 35
      DO 30 I=1,ICNT
      CALL SROOT (RINDX,SORTI(I) )
      RINDX = RINDX + 2 
30    CONTINUE
C 
C PUT SET SORT TABLE IN MEMORY
C 
35    CONTINUE
      DO 40 I = 1,SCNT
      CALL SROOT(RINDX,SORTS(I) ) 
      RINDX = RINDX + 2 
40    CONTINUE
C 
C SAVE THE START OF THE OVERHEAD RECORD 
C   AND INITIALIZE OVERHEAD 
C 
      OVRHD = RINDX 
C 
C GET START RECORD NUMBER OF ROOT FILE
C   START REC. # = 1 REC FOR OVERHEAD + # REC. NEEDED FOR 
C                       FREE SPACE POINTERS + 1 FOR DISPLACEMENT
C 
      N = (SCNT*4+127)/128 + 2
      IF( ( N.LT.3) .OR. (N .GT.4) ) CALL ERXIT(ABORT)
      CALL SROOT(RINDX,N) 
      RINDX = RINDX +2
C 
C PUT LENGTH OF ROOT FILE IN OVERHEAD 
C 
      CALL SROOT(RINDX,OVRHD/2) 
      RINDX = RINDX +2
C 
C PUT LENGTH OF FREE SPACE POINTERS IN ROOT FILE
C 
      N= SCNT*4 
      CALL SROOT(RINDX,N) 
      RINDX =RINDX +2 
C 
C LEAVE ROOM FOR MAXIMUM DCB, AND MAXIMUM RECORD SIZE 
C 
      CALL SROOT(RINDX,0) 
      RINDX = RINDX+2 
      CALL SROOT(RINDX,0) 
      RINDX = RINDX+2 
C 
C RINDX IS POINTING TO EMPTY FREE SPACE TABLE 
C PUT THE WORD OFFSET TO THE FREE SPACE TABLE IN THE DATA BASE CONTROL
C  BLOCK FOR THE SUBROUTINE "DBCRT" - NOTE: THE DBMS ROUTINES DO NOT
C  USE THIS VALUE FOR THE FREE TABLE POINTER BUT INITIALIZES THE POINTER
C  UPON A DBOPN CALL. 
C 
      CALL SROOT(DBFRP,RINDX/2) 
C 
C VERIFY EACH MASTER DATA SET HAS ALL ITS PATHS 
C 
C SELECT THE MAXIMUM NUMBER OF PATHS IN ANY DATA SET
C 
C SELECT THE MAXIMUM RECORD SIZE OF ANY DATA SET
C 
      NPACK = 0 
      MAXP = 1
      MAXR = 0
      IFLAG = 0 
C 
C INITIALIZE BUFFERS FOR SUMRY
C 
      DO 47 I= 1,SCNT 
      KPACK(I) = 0
      NSETS(I) = 0
      CPACK(I) = 0
47    CONTINUE
C 
C VERIFY DATA SETS AND SET UP PRINT BUFFER
C 
C 
      DO 90 J=0,SCNT-1
C GET THE INDEX FOR THE CURRENT SET 
      SINDX = J*SETSZ+SETTB 
C GET THE PATH COUNT FOR THE CURRENT SET
      CALL RSGET(SINDX+DSPCT,PCNT)
C GET THE DATA TYPE FOR THE CURRENT SET 
      CALL RSGET(SINDX+DSTYP,STYPE) 
      IF(STYPE .EQ. DETAIL) GOTO 55 
C GET THE ADDRESS TO THE PATH TABLE 
      PPTR = ROOTA (SINDX+DSITP) * 2
      CALL RSGET(SINDX+DSFCT,RCNT)
C MAKE PPTR ON A WORD BOUNDRY 
      PPTR = PPTR + (RCNT+1)/2*2
C 
C VERIFY THAT EACH PATH HAS BEEN DEFINED
C 
      IF (PCNT .EQ. 0) GOTO 55
      DO 50 I=1,PCNT
      IF(ROOTA(PPTR) .EQ.0) GOTO 7020 
      PPTR = PPTR + 4 
50    CONTINUE
C 
C SELECT THE MAXIMUM PATH COUNT 
C 
55    CONTINUE
      IF (MAXP .LT. PCNT+1) MAXP = PCNT+1 
C 
C SELECT THE MAXIMUM RECORD SIZE
C 
      CALL RSGET(SINDX+DSMDL,MEDIA) 
      RECSZ = ROOTA(SINDX + DSDRL)  +  MEDIA
      IF (MAXR .LT. RECSZ) MAXR = RECSZ 
C 
C WRITE THE CAPACITY COUNT FOR CURRENT SET TO ROOT
C 
C WRITE THE CAPACITY COUNT FOR CURRENT RECORD 
C 
      RCAP(1) = ROOTA(SINDX + DSCAP)
      RCAP(2) = ROOTA(SINDX + DSCAP + 2)
      CALL SROOT(RINDX,RCAP(1) )
      RINDX = RINDX + 2 
      CALL SROOT(RINDX,RCAP(2) )
      RINDX = RINDX + 2 
      CALL SROOT(RINDX,0) 
      RINDX = RINDX +2
      N = 0 
      IF(STYPE .EQ. DETAIL) N = 1 
       CALL SROOT(RINDX,N)
      RINDX = RINDX + 2 
C 
C 
C CALCULATE THE SET LENGTHS AND ADD THEM TO THE ACCUMULATOR FOR 
C ITS CARTRIDGE NUMBER. ( THESE TABLES WILL BE PRINTED IN SUMRY)
C 
      WLEN = SIZE(RCAP,RECSZ,IERR)
      WLEN = DAD(WLEN,DI1)
      IF((IERR .NE. 0) .OR. OVF(IDMY) ) WLEN = DMAX 
C 
C SAVE PACK FOR FUTURE PRINT OUT
C 
C 
      PACK = ROOTA(SINDX + DSCRN) 
      IF(NPACK .EQ. 0) GOTO 60
      DO 60 I = 1, NPACK
      IF (KPACK(I) .NE. PACK) GOTO 60 
      NSETS(I) = NSETS(I) + 1 
      CPACK(I) = DAD(CPACK(I),WLEN) 
      IF(OVF(IDMY)) CPACK(I) = DMAX 
      GOTO 90 
60    CONTINUE
      NPACK = NPACK + 1 
      KPACK(NPACK) = PACK 
      NSETS(NPACK) = 1
      CPACK(NPACK) = WLEN 
C 
C END OF DO LOOP
C 
90    CONTINUE
C 
C PUT MAXIMUM DCB, AND RECORD SIZE IN OVERHEAD
C 
      CALL SROOT(OVRHD+OVDCB,MAXP)
      CALL SROOT(OVRHD+OVREC,MAXR)
C 
C CHECK THAT A FMP WRITE TO TYPE 1 FILE WON'T 
C GENERATE A MEMORY PROTECT ERROR - THIS IS A 
C KLUDGE FOR RTE-IV'S FILE MANAGEMENT 
C 
      I = (RINDX - OVRHD +10 + 254)/256 * 256 
      CALL SROOT(OVRHD + 10 + I,0)
C 
C LOAD AND EXECUTE SUMRY
C 
100   CONTINUE
      CALL SEGLD(SUMRY,IERR)
C 
C IF SEGLD RETURNS THEN ERROR 
C 
      CALL OUTLN(SUMRY,3) 
      CALL ERXIT(NOSEG) 
C 
C 
C 
C ERROR PROCESSORS
C 
C 
C 
C OUTPUT " 'END.' EXPECTED" 
C 
7010  CALL EMESS(ENDX)
      GOTO 100
C 
C OUTPUT "NOT ENOUGH PATHS DEFINED IN MASTER" 
C 
7020  CONTINUE
      IF(IFLAG .EQ. 0) CALL EMESS(PDEFC)
      IFLAG = -1
      PPTR = SINDX + DSNME
      DO 7025 I = 1,3 
      INAM(I) = ROOTA(PPTR) 
      PPTR = PPTR+2 
7025  CONTINUE
      CALL OUTLN(INAM,3)
      GOTO 55 
      END 
                                                                                                                                                    