FTN4
      PROGRAM QY02(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-18065
C     RELOC:     92069-16060
C 
C 
C************************************************************ 
C 
C 
C  REPORT SERVICE ROUTINE 
C     MADE UP OF
C         1. QS02 
C         2. QS03 
C         3. QS04 
C         4. QS05 
C         5. QS06 
C         6. QS15 
C         7. QS12 
C         8. QS19 
C         9. QS20 
C 
C 
C 
C 
C   THE STRUCTURE OF THE SEGEMENTS IS DIAGRAMED BELOW.
C 
C 
C                QS02 - PICKS UP THE REPORT STATEMENTS
C                  !
C       -----------!
C       !          !
C     QS03         !     REPORT ALL INITIALIZE
C       !          !
C     QS18         !     PRINT ALL
C       !          !
C       QS         !
C                QS04 - VERIFIES SYNTAX OF EACH STATEMENT 
C                  !
C               --------
C               !      !
C              QS05    !   PREPARES FOR SORT
C               !      !
C              QS19    !   SORTS THE RECORDS
C               !      !
C               --------
C                  !
C                QS06      PREPARES TO PRINT
C                  !
C          ----> QS15 --> QS    CHECKS FOR LEVEL BREAKS 
C          !       !
C          !    --------
C          !    !      !
C          !  QS12     !    PRINTS TOTALS ON BREAKS 
C          !    !      !
C          !    --------
C          !       !
C          !     QS20        TOTALS EACH FIELD AND PRINTS 
C          !       !              DETAILS OR GROUP BREAKS 
C          <------- 
C 
C 
C 
C 
C  REPORT TABLE FORMAT IN ARRAY SS(6,100).
C  THIS TABLE IS BUILT BY QS02, LOGIC 
C  CHECKED BY QS04, AND SORTED (IF NEEDED)
C  BY QS05. 
C 
C  EACH ROW OF ARRAY S CONTAINS INFORMATION 
C  ABOUT EACH REPORT STATEMENT: 
C 
C     1. REPORT STATEMENT TYPE
C         10-15 SORT STATEMENT
C         21-25 HEADER STATEMENT
C         31-36 TOTAL STATEMENT 
C         41-46 GROUP STATEMENT 
C         50-59 DETAIL STATEMENT
C         60-69 EDIT MASKS
C 
C     2. DATA-ITEM NUMBER 
C 
C     3. LITERAL POINTER TO QSKIB.  QSKIB IS AN RTE TRACK 
C        WHICH CONTAINS ALL LITERALS OR EDIT
C        MASKS IN A2 FORMAT, PRECEDED BY IT'S 
C        CHARACTER LENGTH.
C 
C     4. END PRINT POSITION 
C 
C     5. REPORT OPTION 1
C        UNITS PLACE     = SPACE BEFORE (0-5) 
C        TENS PLACE      = SPACE AFTER  (0-5) 
C        HUNDREDS PLACE  = SKIP BEFORE (0-1)
C        THOUSANDS PLACE = SKIP AFTER (0-1) 
C        TEN THOUSANDS   = ADD (0-1)
C 
C     6. REPORT OPTION 2
C        UNITS PLACE  = O NO EDIT  = 1 ZERO SUPPRESS
C        60 - 69  EDIT MASK 
C        HUNDREDS PLACE  = COUNT (0-1)
C        THOUSANDS PLACE = AVERAGE (0-1)
C 
C     7. OFFSET INTO THE LIST-ARRAY 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C     T ARRAY IS USED TO HOLD INDEX INTO LIST-ARRAY FOR SORT FIELDS 
C 
C     U ARRAY IS USED TO FOR TOTAL COUNT
C        1. FIELD MAP          (1,I)
C        2. ACCUMULATE COUNTS  (2,I) - (7,I)
C 
C     ATOTAL ARRAY IS FOR TOTAL ADD 10*5
C       NOTE: THERE CAN BE NO MORE THAN 10 ITEMS TOTALED ON 
C 
C     LIST ARRAY CONTAINS INFORMATION ABOUT THE DBMS DATA BUFFER
C 
C         FIRST ENTRY IS DIFFERENT THAN THE OTHERS
C            1. CONTAINS # OF ENTRIES IN ARRAY
C            2 - 5. ARE EMPTY 
C            6. CONTAINS THE # OF SORT ITEMS
C                 NOTE: ALL THE SORT ITEMS ARE AT THE TOP OF THE ARRAY
C 
C         OTHER ENTRIES 
C            1. ITEM NUMBER 
C            2. ITEM TYPE 
C            3. ITEM LENGTH 
C            4. ELEMENT COUNT 
C            5. OFFSET INTO DBMS BUFFER 
C            6. CONTAIN THE ITEM NUMBER IFF IT IS A SORT ITEM 
C 
C 
C 
C    LEVSTR ARRAY IS AN 66 BY 5 ARRAY WHICH CONTAINS THE LEVEL BREAK
C     STRINGS 
C 
C    LEVLEN ARRAY CONTAINS THE LENGTHS OF EACH STRING 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C ANY CHANGE TO IBSZ MUST CHANGE THE SIZE OF ISORT
C 
      INTEGER ISTAT(10) 
      DIMENSION INFO(13)
      INTEGER R7,Z,Z1,R5
      INTEGER PAGE(3) 
      INTEGER A,B,D,E,F,G,H,TCHAR,ASTER,DOLLAR,X
      INTEGER DZERO(2)
      INTEGER ERR1(15)
      INTEGER ERR2(20)
      INTEGER ERR3(21)
      INTEGER ERR4(7) 
      INTEGER ERR5(13)
      INTEGER ERR6(16)
      INTEGER ERR7(14)
      DIMENSION NAME(2) 
      INTEGER END(2)
      INTEGER ALL(2)
      INTEGER REPORT(3) 
C 
      LOGICAL MEMBR 
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   $$$$$$$$$$$$$$$$$$$$$
      DATA PAGE/2HPA,2HGE,2HNO/ 
      DATA A/101B/
      DATA B/102B/
      DATA D/104B/
      DATA E/105B/
      DATA F/106B/
      DATA G/107B/
      DATA H/110B/
      DATA IS/123B/ 
      DATA TCHAR/124B/
      DATA IZ/132B/ 
      DATA DOLLAR/44B/
      DATA X/130B/
      DATA ASTER/52B/ 
      DATA NINE/71B/
      DATA DZERO/0,0/ 
C RECORD HAS NOT YET BEEN FOUND 
      DATA ERR1/2H R,2HEC,2HOR,2HD ,2HHA,2HS ,2HNO, 
     1 2HT ,2HYE,2HT ,2HBE,2HEN,2H F,2HOU,2HND/ 
C COMAND TABLE OVERFLOW REISSUE COMMAND 
      DATA ERR2/2H C,2HOM,2HMA,2HND,2H T,2HAB,
     1 2HLE,2H O,2HVE,2HRF,2HLO,2HW,,2H R,
     2 2HEI,2HSS,2HUE,2H C,2HOM,2HMA,2HND/
C ILLEGAL DATA ITEM NAME OR TOO LOW ACCESS
      DATA ERR3/2H I,2HLL,2HEG,2HAL,2H D, 
     1 2HAT,2HA ,2HIT,2HEM,2H N,2HAM,2HE ,
     2 2HOR,2H T,2HOO,2H L,2HOW,2H A,2HCC,2HES,2HS /
C SYNTAX ERROR
      DATA ERR4/2H S,2HYN,2HTA,2HX ,2HER,2HRO,2HR / 
C EDIT MASK TABLE OVERFLOW
      DATA ERR5/2H E,2HDI,2HT ,2HMA,2HSK,2H T,
     1 2HAB,2HLE,2H O,2HVE,2HRF,2HLO,2HW /
C CONSTANT LITERAL TABLE OVERFLOW 
      DATA ERR6/2H C,2HON,2HST,2HAN,
     1 2HT ,2HLI,2HTE,2HRA,2HL ,2HTA, 
     2 2HBL,2HE ,2HOV,2HER,2HFL,2HOW/ 
C NO AVAILABLE SYSTEM TRACKS
      DATA ERR7/2H N,2HO ,2H A,2HVA,2HIL,2HAB,2HLE,2H S,2HYS,2HTE,2HM , 
     &  2HTR,2HAC,2HKS/ 
C CAN NOT TOTAL ASCII VALUES
C BAD SEGMENT 
      DATA NAME/2HNA,2HME/
      DATA END/2HEN,2HD;/ 
      DATA ALL/2HAL,2HL / 
      DATA REPORT/2HRE,2HPO,2HRT/ 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C     THIS PROGRAM IS A REPORT GENERATOR.  THE
C     SELECT-FILE CONTAINS THE RECORD NUMBERS 
C     OF THE RECORDS WHICH ARE TO BE REPORTED.
C 
C     THE ARRAY S IS A 7*100 ARRAY WHICH
C     CONTAINS ENCODED REPORT COMMANDS. 
C 
C     R3 - IS THE COUNTER FOR THE NUMBER OF 
C          COMMANDS ENTERED 
C     R6 - IS THE CONSTANT LITERAL AND
C          EDIT MASK DISK STORAGE INDEX IN BYTES
C     R7 - IS THE EDIT MASK COUNT 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C BEGIN 
C 
      IOFLAG = 0
C  CHECK FOR PROCEDURE
      CALL LSCAN(IB,I,J,K)
      IF(J-I.NE.3) GOTO 30
      IF(JSCOM(NAME,1,4,IB,I,IERR).NE.0) GO TO 30 
C  SCAN ACROSS =
      CALL LSCAN(IB,I,J,K)
      IF(K.NE.6) GO TO 180
C 
C  GET PROCEDURE NAME 
C 
      CALL GTPRC(REPORT,6,IERR) 
      IF(IERR .NE. 0) GOTO 140
      IOFLAG = 0
      CALL LSCAN(IB,I,J,K)
C 
C IS THE PROCEDURE SUPPOSE TO BE PRINTED? 
C 
30    CONTINUE
      IF(K .NE. 4) GOTO 35
      CALL LSCAN(IB,I,J,K)
      IOFLAG = 1
      CALL LSCAN(IB,I,J,K)
C 
C IS THIS A "REPORT ALL [,NL] " ? 
C 
35    CONTINUE
      IF(K .EQ. 5) GOTO 40
      IF(J-I .NE. 2) GOTO 180 
      IF(JSCOM(IB,I,J,ALL,1,IERR) .NE. 0) GOTO 180
      SNAM(2) = 2H03
      GOTO 310
C 
C REPORT ;
C 
40    CONTINUE
      IF(DCO(RRCNT,DZERO))50,50,60
50    CALL ERIO(2,ITTY,ERR1,15) 
      GOTO 140
C 
C GET SYSTEM TRACKS 
C 
60    CONTINUE
      CALL EXEC(100004B,1,TRKNM,IDILU,NSEC) 
      GOTO 65 
C 
C SEE IF ANY TRACKS WERE RETURNED BY THE EXEC CALL
C 
63    IF (TRKNM .GE. 0) GOTO 67 
C 
C OUTPUT "NO AVAILABLE SYSTEM TRACKS" 
C 
65    CONTINUE
      CALL ERIO(2,ITTY,ERR7,14) 
      GOTO 140
C 
C INITIALIZE S-ARRAY
C 
67    CONTINUE
      DO 70 J=1,100 
      DO 70,I=1,7 
      SS(I,J) = 0 
70    CONTINUE
C 
C INITIALIZE COUNTERS 
C 
      R3 = 1
      R6 = 1
      R7 = 0
C 
C IS THIS AN "END;" ? 
C 
80    CALL LSCAN(IB,I,J,K)
      CALL SGET(IB,I,ICHAR) 
      IF(J-I.NE.2) GOTO 90
      IF(JSCOM(IB,I,J,END,1,IERR).EQ.0) GO TO 290 
C 
C MUST BE REPORT STATEMENT
C 
90    CONTINUE
      IF(J-I.GT.1) GO TO 180
C 
C     SORT STATEMENT
C 
C     IS ICHAR AN "S"?
C 
      IF (ICHAR.NE.IS) GO TO 190
C 
C IS THERE A LEVEL #
C 
      IF (I.NE.J) GO TO 100 
      SS(1,R3) = 10 
      GO TO 110 
C 
C GET SORT LEVEL
C 
100   CALL SGET(IB,J,ICHAR) 
      ICHAR = ICHAR - 60B 
      IF (ICHAR.LT.1 .OR. ICHAR.GT.5) GO TO 180 
      SS(1,R3) = 10 + ICHAR 
C 
C  SCAN FOR COMMA 
C 
110   CALL LSCAN(IB,I,J,K)
      IF (K.NE.4) GO TO 180 
C 
C  GET DATA ITEM NAME 
C 
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.2) GO TO 180 
      IF (J-I.GT.5) GO TO 180 
      CALL SFILL(DINAM,1,6,40B) 
      CALL SMOVE(IB,I,J,DINAM,1)
      CALL DBINF(DBNAM,DINAM,101,ISTAT,INFO)
      IF(ISTAT .NE. 0) GOTO 160 
      DINUM = IABS(INFO)
C 
C IS THIS A MEMBER OF THE SET?
C 
      IF(MEMBR(DBNAM,DSNUM,DINUM,ISTAT)) GOTO 130 
120   IF(ISTAT .EQ. 0) GOTO 160 
C 
C DBMS - ERROR
C 
      QSERR = ISTAT 
      SNAM(2) = 2H23
      GOTO 300
C 
C PUT ITEM NUMBER IN THE SS-ARRAY 
C 
130   CONTINUE
      SS(2,R3) = DINUM
C 
C 
C PROCESSOR FOR SEMICOLN
C  AT END OF EACH REPORT STATEMENT
C 
C 
C  SCAN TO ;
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.5) GO TO 180 
135   R3 = R3 +1
      IF (R3.LE.100) GO TO 80 
C  ERROR - COMMAND TABLE OVERFLOW 
      CALL ERIO(2,ITTY,ERR2,20) 
140   SNAM(2) = 2H
      GOTO 300
C 
C 
C 
C ERROR PROCESSORS
C 
C 
C 
C 
C  ERROR - CONSTANT LITERAL OVERFLOW
150   CALL ERIO(2,ITTY,ERR6,16) 
      GO TO 140 
C  ERROR - ILLEGAL DATA ITEM NAME 
160   CALL QRIO(2,ITTY,IB,-IEND)
      CALL ERIO(2,ITTY,ERR3,21) 
      GOTO 140
C  RETURN TO TTY FOR INPUT
C  ERROR - SYNTAX ERROR 
180   CALL SFILL(IMA,1,72,40B)
C 
C OUTPUT ERROR LINE IN MULTIPLE OF 72 COLUMNS 
C 
      IP = 1
185   CONTINUE
      IF (IEND .LE. 72) GOTO 187
      CALL QRIO(2,ITTY,IB(IP),-72)
      IP = IP + 36
      IEND = IEND - 72
      GOTO 185
C 
C WRITE LAST LINE 
C 
187   CONTINUE
      CALL QRIO(2,ITTY,IB(IP),-IEND)
      IF(I .GT.72) I = I-I/72*72
      CALL SPUT(IMA,I,136B) 
      CALL QRIO(2,ITTY,IMA,-I)
      CALL ERIO(2,ITTY,ERR4,7)
      GO TO 140 
C 
C     HEADER STATEMENT
C 
190   IF (ICHAR.NE.H) GO TO 240 
C 
C GET LEVEL NUMBER
C 
      CALL SGET(IB,J,ICHAR) 
      ICHAR = ICHAR - 60B 
      IF (ICHAR.LT.1 .OR. ICHAR.GT.5) GO TO 180 
      SS(1,R3) = 20 + ICHAR 
C 
C  SCAN FOR COMMA 
C 
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.4) GO TO 180 
C 
C  GET HEADER DATA TYPE 
C 
      CALL LSCAN(IB,I,J,K)
C 
C LITERAL ? 
C 
      IF (K.EQ.3) GO TO 210 
C 
C PAGE DECLARATION? 
C 
      IF(J-I.NE.5) GOTO 180 
      IF (JSCOM(PAGE,1,6,IB,I,IERR).NE.0) GO TO 180 
      SS(2,R3) = 1
C 
C THIS IS THE PRINT POSITION AND PRINT OPTION PROCESSOR 
C FOR TOTAL, GROUP, AND DETAIL STATEMENTS 
C 
C  SCAN FOR COMMA 
C 
200   CALL LSCAN(IB,I,J,K)
      IF (K.NE.4) GO TO 180 
C 
C  END PRINT POSITION 
C 
      CALL LSCAN(IB,I,J,K)
      CALL CATI(IB,I,J-I+1,INT,ISTAT) 
      IF(ISTAT.LT.0) GOTO 180 
      IF (INT.LT.1 .OR. INT.GT.132) GO TO 180 
      SS(4,R3) = INT
C 
C  CHECK FOR SEMI-COLON 
C 
      CALL LSCAN(IB,I,J,K)
      IF (K.EQ.5) GO TO 135 
C 
C     FORM REPORT OPTIONS 
C     PUT OPTIONS IN SS(5,N) AND SS(6,N)
C 
      CALL REPOP(I,J,IERR)
      IF (IERR) 180,135 
C 
C     LITERAL PROCESSOR 
C 
210   LEN = J - I + 1 
      IF(LEN.GT.0) GOTO 220 
      I=J+2 
      GOTO 180
220   CONTINUE
      IF(LEN.GT.COLLIM) GOTO 180
      IF(R6+LEN+2 .GT. IBSZ*2) GOTO 150 
C 
C     MOVE LITERAL TO BUFFER
C 
      SS(3,R3) = R6 
      CALL SMOVE(LEN,1,2,IBUFF,R6)
      R6 = R6 + 2 
      CALL SMOVE(IB,I,J,IBUFF,R6) 
      R6 = R6 + LEN 
      GO TO 200 
C 
C     TOTAL STATEMENT 
C 
240   K2 = 30 
      IF (ICHAR.NE.TCHAR) GO TO 270 
      CALL SGET(IB,J,ICHAR) 
C 
C IS THIS A "TF" STATEMENT? 
C 
      IF (ICHAR.NE.F) GO TO 250 
      ICHAR = 6 
      GO TO 260 
C 
C GET LEVEL NUMBER
C 
250   ICHAR = ICHAR - 60B 
      IF (ICHAR.LT.1 .OR. ICHAR.GT.5) GO TO 180 
260   SS(1,R3) = K2 + ICHAR 
C     SCAN ACROSS TERMINATOR
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.4) GO TO 180 
C  GET TOTAL DATA TYPE
      CALL LSCAN(IB,I,J,K)
C     TOTAL LITERAL 
      IF (K.EQ.3) GO TO 210 
C     DATA ITEM 
      IF (J-I.GT.5) GO TO 180 
      CALL SFILL(DINAM,1,6,40B) 
      CALL SMOVE(IB,I,J,DINAM,1)
      CALL DBINF(DBNAM,DINAM,101,ISTAT,INFO)
      IF(ISTAT .NE. 0) GOTO 160 
      DINUM = IABS(INFO)
      SS(2,R3) = DINUM
C 
C VERIFY THAT ITEM IS A MEMBER OF THE CORRECT SET 
C 
265   CONTINUE
      IF(MEMBR(DBNAM,DSNUM,DINUM,ISTAT)) GOTO 200 
      GOTO 120
C 
C     GROUP STATEMENT 
C 
270   K2 = 40 
      IF (ICHAR.NE.G) GO TO 280 
      CALL SGET(IB,J,ICHAR) 
      GO TO 250 
C 
C     DETAIL STATEMENT
C 
280   IF(ICHAR.NE.D) GO TO 320
      K2 = 50 
C 
C DOES THIS DETAIL STATEMENT HAVE A LEVEL 
C 
      ICHAR = 0 
      IF(I .EQ. J) GOTO 260 
C 
C NO, GET THE LEVEL NUMBER
C 
      CALL SGET(IB,J,ICHAR) 
      ICHAR = ICHAR-60B 
      IF(ICHAR .LT. 1 .OR. ICHAR .GT. 9) GOTO 180 
      GOTO 260
C 
C 
C 
C "END;" PROCESSOR
C 
C     CHECK FOR ; 
290   CALL LSCAN(IB,I,J,K)
      IF (K.NE.5) GO TO 180 
      R3 = R3 - 1 
      IF(R3.LE.0) GOTO 140
C 
C  WRITE IBUFF TO QSKIB 
C 
      CALL EXEC(2,IDILU,IBUFF,-R6,TRKNM,0)
C 
C  CALL LOGIC 
C 
      SNAM(2) = 2H04
300   CONTINUE
310   CONTINUE
      CALL LOAD(SNAM) 
C 
C 
C     EDIT STATEMENT
C 
320   IF(ICHAR.NE.E) GO TO 180
      CALL SGET(IB,J,ICHAR) 
      ICHAR = ICHAR - 60B 
      IF (ICHAR.LT.0 .OR. ICHAR.GT.9) GO TO 180 
      SS(1,R3) = 60 + ICHAR 
C     SCAN PAST COMMA 
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.4) GO TO 180 
C     GET EDIT MASK 
      CALL LSCAN(IB,I,J,K)
      IF (K.NE.3) GO TO 180 
      Z = 0 
      DO 370 Z1=J,I,-1
      CALL SGET (IB,Z1,ICHAR) 
C  CHAR AN X - THEN ALPHA EDIT MASK 
      IF(ICHAR.EQ.130B) GOTO 380
C     CHECK FOR 'Z' 
      IF (ICHAR.NE.IZ) GO TO 340
      IF (Z.NE.1 .AND. Z.NE.0) GO TO 180
      Z = 1 
      GO TO 370 
C 
C     CHECK FOR '*' 
340   IF (ICHAR.NE.ASTER) GO TO 350 
      IF (Z.NE.2 .AND. Z.NE.0) GO TO 180
      Z = 2 
      GO TO 370 
C 
C     CHECK FOR '$' 
350   IF (ICHAR.NE.DOLLAR) GO TO 360
      IF (Z.NE.3 .AND. Z.NE.0) GO TO 180
      Z = 3 
      GO TO 370 
C 
C     CHECK FOR '9' 
360   IF (ICHAR.NE.NINE) GO TO 370
      IF (Z.NE.0) GO TO 180 
370   CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C  NUMERIC EDIT MASK
C     CHECK FOR NO MORE THAN 20 CHARACTERS
      IF(J-I.GT.19) GOTO 180
      IF(J-1.LT.0) GOTO 180 
      GOTO 390
C 
C  ALPHA EDIT MASK - MAX 132 CHARS
C 
380   IF(J-I+1 .GT. COLLIM) GOTO 180
C 
C     EDIT MASK 
C 
390   CONTINUE
      LEN = J - I + 1 
      IF(R6 + LEN + 2  .GT. IBSZ*2) GOTO 150
      IF(LEN .LT. 1) GOTO 180 
C 
C MOVE MASK TO BUFFER 
C 
      SS(3,R3) = R6 
      CALL SMOVE(LEN,1,2,IBUFF,R6)
      R6 = R6 + 2 
      CALL SMOVE(IB,I,J,IBUFF,R6) 
      R6 = R6 + LEN 
C 
C INCREASE THE EDIT MASK COUNT
C 
      R7 = R7 + 1 
      IF (R7.LE.10) GO TO 410 
C  ERROR - EDIT MASK OVERFLOW 
      CALL ERIO(2,ITTY,ERR5,13) 
      GO TO 140 
C     SCAN TO ';' 
410   CALL LSCAN(IB,I,J,K)
      IF (K.EQ.5) 135,180 
      END 
$ 
                                                                                                                      