FTN4 PROGRAM QY05(5,90),92069-16060 REV.1940 790523 C C C C************************************************************* C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * C RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * C PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * C OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * C************************************************************* C C C SOURCE: 92069-18068 C RELOC: 92069-16060 C C C************************************************************ C C C C THIS IS A MAIN PROGRAM MODULE THAT IS CALLED BY QS04 AND QS19 UPON THE C RECOGNITION OF SORT STATEMENT(S) IN THE REPORT. QS05 WILL BUILD THE C WORK AREA WITH RECORD NUMBERS AND THEIR ASSOCIATED SORT KEYS IN C ACCORDANCE WITH THE REQUIREMENTS OF THE SORT SUBROUTINE.(IF THE WORK C AREA IS NOT OF SUFFICIENT SIZE, QS05 WILL PRINT AN ERROR MESSAGE AND C RETURN TO QS) C C IMPORTANT VARIABLES AND ARRAYS USED: C C C RRCNT IS AN INTEGER VARIABLE,PASSED IN COMMON,WHICH CONTAINS C THE RETRIEVED RECORD COUNT. C C C LOGICAL DDS REAL RECORD REAL CURBLK INTEGER SECTRK,BLKTRK INTEGER DZERO(2) INTEGER ISTAT(10) INTEGER ISORT(42) INTEGER ID1(2) INTEGER ERR1(16) INTEGER ERR2(9) INTEGER ERR3(15) C&&&&&&&&&&&& QS5COM &&&&&&&&&&&&&&&&& OCT 4 1978 &&&&&&&&& INTEGER IFTRK,ISIZE,SECBLK,WRDBLK,RECBLK,LENGTH,KEY INTEGER NTRAK,ILU REAL BLKS C&&&&&&&&&&&& QS5COM &&&&&&&&&&&&&&&&& OCT 4 1978 &&&&&&&&& C C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978 $$$$$$$$$$$$$$$$$$$$$ INTEGER INLU,ITTY,ILP,IDCB,JDCB,XEQ INTEGER DBNAM,DBLEV,DSNAM,DINAM,SELECT,SNAM INTEGER DSNUM,DINUM,PARM,LPARM,ECHO,QSERR INTEGER IMA,IB,IBSZ,SECNO,IEND,ISCAN LOGICAL BREAK INTEGER IPFLAG,IOFLAG,RMOTE LOGICAL BATCH,XQBCH INTEGER PAGCNT,LNCNT INTEGER PAGLEN,COLLIM REAL RRCNT REAL SELT,RSEC INTEGER IPTR REAL RCOUNT INTEGER S,R3,TRKNM,IDILU INTEGER R6 REAL ATOTAL INTEGER LIST,L,T,U INTEGER LEVSTR,LEVLEN INTEGER IBUFF INTEGER SS(7,100) C COMMON INLU(145),ITTY(145),ILP(145),IDCB(145),JDCB(144),XEQ(145) COMMON DBNAM(10),DBLEV(3),DSNAM(3),DINAM(3),SELECT(6),SNAM(3) COMMON DSNUM,DINUM,PARM(40),LPARM,ECHO,QSERR COMMON IMA(37),IB(896),IBSZ,SECNO,IEND,ISCAN COMMON BREAK COMMON IPFLAG,IOFLAG,RMOTE COMMON BATCH,XQBCH COMMON PAGCNT,LNCNT COMMON PAGLEN,COLLIM COMMON RRCNT COMMON SELT(64),RSEC COMMON IPTR COMMON RCOUNT COMMON S(15,50),R3,TRKNM,IDILU COMMON R6 COMMON ATOTAL(6,5) COMMON LIST(101,6),L(7),T(5),U(7,5) COMMON LEVSTR(66,5),LEVLEN(5) COMMON IBUFF(2048) C EQUIVALENCE (S,SS) C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978 $$$$$$$$$$$$$$$$$$$$$ C%%%%%%% QS5EQU %%%%%%%%%%%%%%%%%%%%%%%%%%%% OCT 5, 1978 %%%%%%%% EQUIVALENCE(IB,IFTRK) EQUIVALENCE(IB(2),ISIZE) EQUIVALENCE(IB(3),SECBLK) EQUIVALENCE(IB(4),WRDBLK) EQUIVALENCE(IB(5),RECBLK) EQUIVALENCE(IB(6),LENGTH) EQUIVALENCE(IB(7),KEY) EQUIVALENCE(IB(8),NTRAK) EQUIVALENCE(IB(9),ILU) EQUIVALENCE(IB(10),BLKS) EQUIVALENCE(IB(12),XXXXX) C%%%%%%% QS5EQU %%%%%%%%%%%%%%%%%%%%%%%%%%%% OCT 5, 1978 %%%%%%%% EQUIVALENCE (D1,ID1) C C INSUFFICIENT WORK AREA DATA ERR1/2H I,2HNS,2HUF,2HFI, ERR1 1 2HCI,2HEN,2HT ,2HWO,2HRK,2H A, ERR1 2 2HRE,2HA ,2HFO,2HR ,2HSO,2HRT/ ERR1 C SORT VALUE SIZES EXCEED LIMIT DATA ERR3/2H S,2HOR,2HT ,2HVA,2HLU,2HE ,2HSI,2HZE,2HS ,2HEX,2HCE, ERR3 12HED,2H L,2HIM,2HIT/ DATA ID1/0,1/ DATA DZERO/0,0/ C C SECBLK - SECTORS PER BLOCK C WRDBLK - WORDS PER BLOCK C SECTRK - SECTORS PER TRACK C RECBLK - RECORDS PER BLOCK C BLKTRK - BLOCKS PER TRACK C RECLF - RECORDS LEFT IN LAST BLOCK C BLKS - TOTAL NUMBER OF BLOCKS NEEDED C C C C C C C C C C C C BEGIN C C INITIALIZE THE NUMBER OF 128 WORD SECTORS PER BLOCK C SECBLK = 5 WRDBLK = 5 * 128 C C INITIALIZE THE SIZE OF THE KEY FIELD AND THE SIZE OF THE SORT C RECORD C C SIZE OF KEY = OFFSET OF LAST KEY + IT'S LENGTH * # ELELMENTS -1 C LENGTH OF RECORD IS LENGTH OF KEY + SIZE OF D-INTEGER RECORD # C I = LIST(1,6) + 1 KEY = LIST(I,5) + LIST(I,3) * LIST(I,4) -1 LENGTH = KEY + 4 C C VERIFY THAT THE SORT RECORDS DO NOT EXCEED THE BUFFERS IN QSORT C IF(LENGTH .LE. 84) GOTO 20 CALL ERIO(2,ITTY,ERR3,15) GOTO 310 C C GET THE NUMBER OF 128 WORD SECTORS PER TRACK C 20 CONTINUE CALL EXEC(4,107777B,IFTRK,ILU,ISIZE) SECTRK = ISIZE/2 RECBLK = WRDBLK/(LENGTH/2) IWRDS = RECBLK * LENGTH / 2 C C GET THE NUMBER OF BLOCKS NEEDED TO HOLD ALL THE SORT DATA C BLKS = DDI(RRCNT,DBLEI(RECBLK) ) IF(DCO(BLKS,DZERO))25,25,24 C C ALLOW FOR EXTRA C 24 IF(DCO(DSB(RRCNT, DMP(BLKS,DBLEI(RECBLK))),DZERO)) 26,26,25 25 BLKS = DIN(BLKS) 26 BLKTRK = SECTRK/SECBLK NTRAK = ISNGL(DDI(BLKS,DBLEI(BLKTRK))) + 1 IF(NTRAK .LE. 0) NTRAK = 1 CALL EXEC(4,NTRAK+100000B,IFTRK,ILU,ISIZE) ISIZE = BLKTRK * SECBLK * 2 IF(IFTRK .GE. 0) GOTO 30 C C NEED MORE SYSTEM TRACKS C CALL ERIO(2,ITTY,ERR1,16) GOTO 310 C C C READ THE SELECT FILE C 30 CONTINUE RSEC = D1 CALL EREAD(JDCB,ISTAT,SELT,128,IL,RSEC) IF(ISTAT .LT. 0) GOTO 280 IPTR = 9 RSEC = DIN(RSEC) C C C READ ALL THE SORT RECORDS AND PUT THEM ON THE TRACKS C C C INITIALIZE THE WORK AREA C CALL INITX(IFTRK,ISIZE,SECBLK,ILU) C C GET SORT RECORDS ON DISC C RCOUNT = RRCNT IOFF = 1 CURBLK = D1 C C WRITE THE BLOCK WHEN IT IS FULL C 40 CONTINUE IF(IOFF .LT. IWRDS+IWRDS) GOTO 45 CALL WORKX(2,IBUFF,IWRDS,CURBLK) IOFF = 1 CURBLK = DIN(CURBLK) C C GET THE SELECTED RECORD # FROM THE SELECT FILE C 45 CONTINUE IF(IPTR .LT. 65) GOTO 50 CALL EREAD(JDCB,ISTAT,SELT,128,IL,RSEC) IF(ISTAT .LT. 0) GOTO 280 IPTR = 1 RSEC = DIN(RSEC) C C GET RECORD # FROM SELECT FILE C 50 CONTINUE RECORD = SELT(IPTR) IPTR = IPTR + 1 C C READ RECORD FROM DATA SET C CALL DBGET(DBNAM,DSNUM,4,ISTAT,LIST(1,6), & IBUFF((IOFF+1)/2),RECORD) IF(ISTAT .NE. 0) GOTO 280 C C PUT RECORD IN SORT TRACKS C IOFF = IOFF + KEY CALL SMOVE(RECORD,1,4,IBUFF,IOFF) IOFF = IOFF+4 IF(DDS(RCOUNT)) GOTO 80 GOTO 40 C C C C C C 80 CONTINUE CALL WORKX(2,IBUFF,IWRDS,CURBLK) SNAM(2) = 2H19 GOTO 320 C C DBMS ERROR AND FMP ERROR C 280 CONTINUE CALL EXEC(5,NTRAK,IFTRK,ILU) QSERR = ISTAT SNAM(2) = 2H23 GOTO 320 C C C 300 CALL EXEC(5,NTRAK,IFTRK,ILU) 310 SNAM(2) = 2H C C C EXIT C C 320 CONTINUE CALL LOAD(SNAM) END $