FTN,C,Q SUBROUTINE TRACE(IBUF,IFLG,IRBUF,IERFG),09580-16068 REV.2001 79101 C7 C------------------------------------------------------------------- C C RELOC. 09580-16068 C SOURCE 09580-18068 C C C. LEATH REV.A 770519 C C HP 92425A TEST SYSTEM SOFTWARE IS THE PROPRIETARY C MATERIAL OF THE HEWLETT-PACKARD COMPANY. USE AND C DISCLOSURE THEREOF ARE RESTRICTED BY WRITTEN AGREEMENT. C C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. C ALL RIGHTS RESERVED. NO PART OF THIS PROGRAM C MAY BE PHOTOCOPIED, REPRODUCED OR TRANSLATED C TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR C WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. C C------------------------------------------------------------------- DIMENSION IBUF(40) DIMENSION IRBUF(10) INTEGER STATE DATA IAST,IA,IR,IBLNK,IU/ 52B,101B,122B,40B,125B/ DATA ISPC/20000B/,STATE/0/ DATA IE/105B/ DATA IB/41000B/ C C THIS SUBROUTINE IS RESPONSIBLE FOR TRACING THROUGH C THE CONTENTS OF IBUF, AND BASED ON THE CHARACTER IN C FIRST COLUMN, AND DETERMINES WHICH PORTION OF TRACE C WILL ANALYZE THE STRING. THIS ROUTINE ALSO USE THE STRING C PROCESSING ROUTINES: C LJUST - LEFT JUSTIFY STRING DELETING LEADING BLANKS C SCAN - PUTS A TOKEN INTO LOCATION DESIGNATED. C THE VALUES RETURNED IN "IFLG"HAVE THE FOLLOWING MEANINGS C C FLG = 0 COMMENT (* IN THE FIRST COLUMN) C FLG = 1 RECORD (R " " " " ) C " = 2 INTEGER ( " " " " ) C " = 2 FLOAT C " = 4 ASCII (A IN THE FIRST COLUMN) C " = 5 END OF FILE C " = 6 UNIT # (U IN THE FIRST COLUMN) C********** C THE VARIBLE 'STATE' IS USED TO CHECK FOR ILLEGAL STATE TRANSITIONS C C STATE = 0 INITIAL STATE. RETURN TO THIS STATE ON CONTEXT ERROR. C 1 RECORD HEADER RECEIVED. LEGAL ENTRANCES FROM STATES C 0 (INIT) AND 3 (DATA RECEIVED). C 2 UNIT HEADER RECEIVED. LEGAL ENTRANCES FROM STATES C 1 (RECORD) AND 3 (DATA RECEIVED) C 3 DATA RECEIVED. LEGAL ENTRANCES FROM STATES 2 (UNIT) C AND 3 (DATA RECEIVED). C 4 END. LEGAL ENTRANCES FROM 0 (INIT) AND 3 (DATA). C C AN ILLEGAL ENTRANCE CAUSES ERROR -16, 'MISSING REC OR UNIT HEADER' C********** C C COMMENTS SUBROUTINE # 6 FOR DBUG C C*******1 EAXMININE THE FIRST WORD OF IBUF (INPUT BUFFER) C TO DETERMINE WHAT THE ASCII CHARACTER IS. THIS CHARACTER C IS REPLACED WITH A BLANK AND THE WHOLE IS LEFT JUSTIFIED. C THE VARIABLE "ITST" IS EXAMINED TO DETERMINE WHERE TO GO. C C C*******2 C THIS SECTION PROCESSES AN ASCII STRING. THE NUMBER C OF CHARACTERS IS ASCERTAINED, AND THEN THE FIRST C WORD OF IRBUF IS FILLED WITH THE CHARACTER COUNT C AND THE REMAINDER IS FILLED WITH THE STRING STARTING C FROM COLUMN 7. C C C*******4 C THIS IS A NEW RECORD HEADER FIELD SO TRANSFER C RECORD HEADER INFORMATION (DEVICE TYPE,# OF UNITS, AND C THE NUMBER OF ENTRIES PER UNIT). THE FIRST WORD OF THE C RETURN BUFFER (IRBUF) CONTAINS THE WORD LENGTH 3. C C*******5 C THE SUBROUTINE NUMB IS INVOKED TO ANALYZE A NUMERIC FIELD. C IFLG = 0 IFL = 0 IRBUF(1) = 1 C C*******1 COLUMN 1 ANALYSIS C ITST = (IAND(IBUF(2),177400B))/400B IBUF(2) = IOR((IAND(IBUF(2),177B)),ISPC) IF(ITST.EQ.IA)GO TO 200 CALL LJUST(IBUF) 10 CALL DBUG(6,10,ITST) CALL DBUG(6,11,STATE) IF(ITST.EQ.IAST) RETURN IF(ITST .EQ.IE)GO TO 500 IF(ITST .EQ.IR)GO TO 300 IF(ITST.EQ.IBLNK)GO TO 400 IF(ITST.EQ.IU)GO TO 450 C IERFG = -9 RETURN C C C*******2 ASCII STRING C 200 IF ((STATE.NE.2).AND.(STATE.NE.3)) GOTO 700 CALL DBUG(6,200,STATE) STATE = 3 IFLG = 4 NIN = 0 CALL SCAN(IBUF,IRBUF,NIN,Q) ICHR = INTV(IRBUF,IFL) IF(IFL.EQ.-1)GO TO 800 IF((IAND(ICHR,1)).NE.0)ICHR = ICHR + 1 IRBUF(1) =(ICHR/2) LL = IRBUF(1) + 4 DO 250 J = 5,LL 250 IRBUF(J-3) = IBUF(J) RETURN C C*******4 NEW RECORD SET C 300 IF ((STATE.NE.0).AND.(STATE.NE.3)) GOTO 700 CALL DBUG(6,300,STATE) STATE = 1 IFLG =1 NIN = 0 DO 350 J = 2,4 CALL SCAN(IBUF,IRBUF(J),NIN,Q) IRBUF(J) = INTV(IRBUF(J),IFL) IF(IFL.EQ.-1)GO TO 800 350 CONTINUE IRBUF(1) = 3 RETURN C C*******5 NUMERIC FIELD C 400 IF ((STATE.NE.2).AND.(STATE.NE.3)) GOTO 700 CALL DBUG(6,400,STATE) STATE = 3 CALL NUMB(IBUF,IRBUF,IFLG,IERFG) RETURN C C********#6 UNIT NUMBER C 450 IF ((STATE.NE.1).AND.(STATE.NE.3)) GOTO 700 CALL DBUG(6,450,STATE) STATE = 2 IFLG = 6 NIN = 0 CALL SCAN(IBUF,IRBUF,NIN,Q) IRBUF(2) = INTV(IRBUF,IFL) IF(IFL.EQ.-1.OR.IRBUF(1).EQ.-1)GO TO 800 IRBUF(1) = 1 RETURN C C******* CHECK CONTEXT C 700 IERFG = -16 STATE = 0 CALL DBUG(6,700,STATE) RETURN C C******* ERRORS -NEGATE IFLG C 800 IERFG= -IFLG-6 CALL DBUG(6,800,IERFG) RETURN C C*******8 END OF FILE C 500 IF ((STATE.NE.0).AND.(STATE.NE.3)) GOTO 700 CALL DBUG(6,500,STATE) IFLG = 5 RETURN END SUBROUTINE KPCNT(IFLG,IECNT,IUCNT,IERFG) C C SUBROUTINE # 7 FOR DBUG C DATA INIT/0/ C C C THIS ROUTINE IS RESPONSIBLE FOR SAVING AND COUNTING C THE NUMBER OF ENTRIES FOR EACH RECORD SET THAT C GOES INTO THE BINARY FILE IN SAM. C THE PARAMETERS IN THE CALLING SEQUENCE HAVE THE FOLLOWING C MEANINGS: C IFLG= GLOBAL VARIABLE WHICH IS USED TO INDICATE C THE TYPE OF FIELD BEING ANALYZED. C C IUCNT = UNIT COUNT FOR THE CURRENT RECORD SET BEING C CRACKED TO BINARY. C THIS VARIABLE IS USED FOR ERROR CHECKING, TO C VERIFY THAT THE NUMBER OF UNITS DESIGNATED C IN THE RECORD SET ACTUALLY CONFORM TO THE C NUMBER STORED IN THE TABLE FOR A PARTICULAR C RECORD SET. C C IERFG = ERROR FLG C WHERE: C -10 = UNIT COUNT > UNIT DESIGNATION IN CONFIG. TABLE C -11 = " " < " " " " " C -13 = # ENTRIES NOT CONSISTENT WITH CONFIG. TABLE C C C*** #1 DETERMINE WHERE TO BRANCH C 10 CALL DBUG(7,10,IFLG) C THE FIRST TIME THRU HERE MUST BE FOR A RECORD. IF (INIT.EQ.0 .AND. IFLG.NE.1) IERFG = -16 IF(IFLG.EQ.1)GO TO 100 IF(IFLG.EQ.6)GO TO 200 IF(IFLG.EQ.5)GO TO 150 IECTR = IECTR + 1 RETURN C C*** #2 INITIALIZE POINTERS (FIRST TIME THRU) C 100 IF(INIT.NE.0)GO TO 150 INIT = 1 IUCHK = 0 IECHK = 0 IECTR = 0 IUCTR = 0 C C*******# 3 ERROR CHECKS FOR NEW RECORD. C 150 CONTINUE C C CHECK THE ENTRY COUNT OF THE LAST UNIT OF THE LAST RECORD. IF (IECHK.NE.IECTR)IERFG= -13 C C CHECK THE UNIT COUNT OF THE LAST RECORD. C IS UNIT COUNT > UNIT DESIG.? IF(IUCTR.GT.IUCHK)IERFG = -10 C IS UNIT COUNT < UNIT DESIG.? IF(IUCTR.LT.IUCHK)IERFG = -11 C C SET THE UNIT AND ENTRY CHECK VALUES OF THE NEW RECORD. IUCHK = IUCNT IECHK = IECNT C SET THE COUNTS OF ENTRIES AND UNITS FOR THIS RECORD TO ZERO. IUCTR = 0 IECTR = 0 C REJECT ILLEGAL VALUES OF UNITS, ENTRIES. IF (IUCNT.LE.0.OR.IUCNT.GT.15)IERFG = -7 IF (IECNT.LE.0)IERFG = -7 RETURN C C*** #5 UNIT FLAG C 200 CONTINUE C IF THIS IS FIRST UNIT LINE FOR THIS RECORD, C THEN THE ENTRY COUNT MUST BE ZERO. IF (IUCTR.EQ.0 .AND. IECTR.NE.0) IERFG = -16 C CHECK LAST ENTRY COUNT OF LAST UNIT (IF ANY) OF THIS RECORD. IF (IECHK.NE.IECTR .AND. IUCTR.GT.0) IERFG = -13 C COUNT THE NEW UNIT. IUCTR = IUCTR + 1 C SET THE COUNT OF ENTRIES FOR THIS NEW UNIT TO ZERO. IECTR = 0 RETURN END SUBROUTINE SAM(I,IFLG,IC,ICLAS,ICLTB,IBC,IDPTR) C C SUBROUTINE # 8 FOR DBUG C DIMENSION ICLTB(30),IBC(130) DIMENSION IREG(2) C C THIS IS THE ROUTINE THAT HANDLES CLASS I/O C FOR THE CONFIGURATION TABLES. C C************************ C************************ C***#1 CLASS READ WRITE - A NEGATIVE ICLAS # MEANS C NO RECORD SET HEADER IN THE BUFFER PERTAINING C TO THAT PARTICULAR CLASS NUMBER. C IBC(2) WILL CONTAIN IDPTR (BUFFER LENGTH) C C BIT 15 OF ICLAS IS SET TO 1 (NO WAIT BIT) -THIS IS C SO THAT IS CASE THERE IS NO MEMORY AVAILABLE OR C NO CLASS NUMBER ALLOC WILL NOT GO INTO A WAIT STATE C AND WE CAN EMIT MESSAGES TO THE OPERATOR. C C C 10 CALL DBUG(8,10,ICLAS) II = 1 IF(ICLAS.LT.0)ICLAS = -ICLAS IF(IFLG.EQ.5)GO TO 100 IBC(2) = IDPTR ICLAS = 100000B CALL EXEC(20,0,IBC,IDPTR,IDMY,JDMY,ICLAS) CALL ABREG(IREG,IREG(2)) IF(IREG.LT.0)GO TO 800 ICLAS = IAND(ICLAS,77777B) IF(IC.NE.1)GO TO 50 ISTN = ISN(DUMMY) CALL STCLN(ISTN,ICLAS) 50 IF(ICLTB(IC).LT.0)ICLAS = -ICLAS ICLTB(IC) = ICLAS RETURN C C*** #2 CLASS GET - BIT 13 IS ET TO SAVE CLASS #, WITH C BIT 14 = 0 TO RELEASE BUFFER. C C 100 ICL = IOR(ICLAS,20000B) IREG = EXEC(21,ICL,IBC,130) IF(ICLTB( I ).LT.0)GO TO 150 C C*** #3 PUT CLASS # FOR NEXT BUFFER INTO FIRST WORD OF IBC C 150 IF(I.EQ.IC)GO TO 300 CALL STORE(ICLTB(I+1),IBC,ICLAS,IERR) IF (IERR.EQ.-1) GOTO 800 RETURN C 300 CALL STORE(ICLTB(1),IBC,ICLAS,IERR) IF (IERR.EQ.-1) GOTO 800 RETURN C C PURGE TABLE, REPORT ERROR (NO SAM/NO CLASS #), TERMINATE C 800 CALL DALOC(ISTN) CALL ALERR(17,ISTN) CALL PRTN(-1) CALL EXEC(6) END SUBROUTINE DBUG(ISUB,LINE,IVALU) DATA INIT/0/ C C THIS ROUTINE IS USED TO DISPLAY DE-BUG INFORMATION WHEN THE OPERATOR C HAS ENTERED "ZX" (55130B) AFTER THE ERROR OUTPUT PARAMETER IN THE C SCHEDULING STRING, EG. :RU,ALLOC,&CONFG::80,6,55130B C C EACH ROUTINE IN ALLOC HAS AN IDENTIFING NUMBER: C ALLOC = 1 C TRFER = 2 C DALOC = 3 C ERCNT = 4 C STORE = 5 C TRACE = 6 C KPCNT = 7 C SAM = 8 C NUMB = 9 C FLCNT = 10 DELETED FROM &TRACE REV. 2001 C CNTR = 11 C ALERR = 12 C C THIS ROUTINE ALWAYS PRINTS ON LU 6. IT ALSO PRINTS THE VALUE C IN DECIMAL, OCTAL, AND ASCII. C IF (ISUB-55130B) 10,300,10 10 IF (INIT) 100,200 100 WRITE(6,110) ISUB,LINE,IVALU,IVALU,IVALU 110 FORMAT(" SUBR "I2" LINE "I4" DEC "I5" OCT "K6" ASC "A2) 200 RETURN C 300 INIT = -1 RETURN END END$