FTN,Q,C PROGRAM ALLOC (3,99),09580-16067 REV.2026 800415 C------------------------------------------------------------------- C C RELOC. 09580-16067 C SOURCE 09580-18067 C 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 1979. 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------------------------------------------------------------------- C C TO BUILD ALLOC, THE FOLLOWING ARE REQUIRED: C C ALLOC 09580-16067 C TRACE 09580-16068 C NUMB 09580-16072 C ALERR 09580-16116 C C------------------------------------------------------------------ DIMENSION NAME(20) ,IDCB(144),IBUF(42) DIMENSION IREG(2) DIMENSION NAME1(10) DIMENSION IRBUF(82) DIMENSION ICLTB(30) EQUIVALENCE(IREG,REG) DATA IBLNK/20040B/ DATA IOUT/1/ DATA IOPTN/0/ C C******************************************************** C********COMMENTS***** ROUTINE # 1 FOR DBUG ************* C******************************************************** C************************* C C***** #1 C USE EXEC 14 TO RETRIEVE PARAMETER STRING ASSOCIATED C WITH ...... RU,ALLOC,FILNAM,[IOUT] C WHERE: FILNAM IS THE ASCII CONFIGURATION TABLE (NAMR) C IOUT OPTIONAL IS OUTPUT DEVICE FOR ERORRS C C****** #2 C CHECK TO TO SEE IF ANY SAM HAS ALREADY BEEN ALLOCATED C FOR THE PARTICULAR STATION AND IF SO DEALLOCATE IT C AND PUT OUT WARNING MESSAGE. C C******** #3 C OPEN UP THE DEVICE TABLE FILE WITH A FILE MANAGER C CALL AND IF THE FILE DOES NOT EXIST OR IT IS MISNAMED C INFORM THE OPERATOR. C STATEMENTS 100 AND 200 FILLS THE BUFFER USED FOR C READING RECORDS WITH BLANKS. C C******** #4 C READ A RECORD, AND CHECK FOR EOF MARK (LEN = -#) C OR FILE OVERFLOW (LEN = IL). C THE SUBROUTINE TRACE IS CALLED TO DETERMINE THE TYPE C OF FIELD AND TO PARSE THE CHARACTERS INTO IRBUF. THE C VARIABLE "IFLG" IS SET BY TRACE WITH THE CODE INDICATING C THE TYPE OF FIELD ENCOUNTERED. C C******** #5 C SUBROUTINE TRFER (TRANSFER) IS INVOKED TO PERFORM THE C TRANSFERRING OF THE ASCII DATA FROM "IRBUF" TO THE CLASS I/O C BUFFERS. C AT STATEMENT 500 AFTER THE CALL TO TRFER THE FILE IS C CLOSED AND THE NUMBER OF RECORD SETS REPORTED. C***************************************************************/ C C***** #1 SET UP STATION AND DEFAULTS, THEN RETRIEVE PARAMETER STRING IER = 2 ISTN = ISN(DUMY) IF (ISTN.LE.0) GOTO 800 IOUT = ISTN C CALL EXEC(14,1,NAME(2),19) CALL ABREG (IREG,IREG(2)) NCHR = 1 C C NAME(1) = NUMBER OF CHARACTERS. WE LOOP THREE TIMES C IN CALLING NAMR TO GET TO FILE NAME. C NAME(1) = IREG(2)*2 DO 20 I=1,3 20 CALL NAMR(NAME1,NAME(2),NAME,NCHR) C C NOW SEE IF A FILE NAME HAS BEEN ENTERED IF NOT REQUEST ONE C IF(IAND(NAME1(4),3).EQ.3) GOTO 40 30 WRITE(ISTN,31) 31 FORMAT(2X," ENTER CONFIGURATION FILE NAME _") READ(ISTN,35) (NAME(J),J=2,11) 35 FORMAT(10A2) NCHR = 1 NAME = 20 CALL NAMR(NAME1,NAME(2),NAME,NCHR) C C 40 ISECU = NAME1(5) ICR = NAME1(6) IERFG = 0 LINE = 0 C C************#2 CHECK FOR ALLOCATED SAM C CALL RTCLN(ISTN,IRBUF) IF(IRBUF.EQ.0) GOTO 50 CALL DALOC(ISTN) C C*********#3 OPEN CNFG FILE C 50 IER = 4 CALL OPEN(IDCB,IERR,NAME1,IOPTN,ISECU,ICR) CALL NAMR(NAME1,NAME(2),NAME,NCHR) IF(NAME1(4).EQ.1)IOUT = NAME1 CALL NAMR(NAME1,NAME(2),NAME,NCHR) CALL DBUG(NAME1(1),0,0) IF(IERR.LT.0) GOTO 800 C C********#4 CLEAR BUFFER AND READ A LINE FROM FILE AND PARSE STRING C 100 DO 200 I=1,40 200 IBUF(I) = IBLNK IER = 5 CALL READF(IDCB,IERR,IBUF(2),41,LEN) LINE = LINE + 1 CALL DBUG(1,200,LINE) IF(LEN.LT.0) GOTO 500 IBUF(1) = LEN * 2 IF(LEN.EQ.41)GO TO 800 250 CALL TRACE(IBUF,IFLG,IRBUF,IERFG) CALL DBUG(1,250,IFLG) CALL DBUG(1,250,IERFG) C C******* #5 CHECK IFLG TO SEE WHERE TO BRANCH C IF (IERFG.LT.0) GOTO 300 IF (IFLG.EQ.0) GOTO 100 IF (IFLG.EQ.5) GOTO 500 C C********* #6 INVOKE TRFER TO TRANSFER DATA C CALL TRFER(IFLG,IRBUF,ICLTB,IERFG) CALL DBUG(1,299,IERFG) 300 CALL ERCNT(LINE,IERFG,ISTN,IOUT) GOTO 100 C C********#7 END OF FILE TRANSFER LAST DATA AND CLOSE C 500 IFLG = 5 CALL TRFER(IFLG,IRBUF,ICLTB,IERFG) CALL CLOSE(IDCB,IERR) CALL ERCNT(LINE,IFLG,ISTN,IOUT) CALL PRTN(0) CALL EXEC(6,0) 800 CALL DALOC(ISTN) CALL ALERR(IER,IOUT,LINE) CALL PRTN(-1) CALL EXEC(6,0) END SUBROUTINE TRFER(IFLG,IRBUF,ICLTB,IERFG) C C DIMENSION IRBUF(82),IDBUF(130) DIMENSION ICLTB(10),IREG(2) EQUIVALENCE (IREG,REG) DATA INIT/0/ DATA IVF/10/ DATA IX/2HXX/ C C C******************************************************* C********** COMMENTS SUBROUTINE # 2 FOR DBUG **** C******************************************************* C C******** #1 C INITIALIZE VARIABLES THE FIRST TIME THRU (WHEN C INIT = 0). IDPTR: THIS IS THE POINTER FOR THE BUFFER C WHERE THE BINARY DEVICE DATA GOES. C IC: THIS IS THE INDEX FOR THE TABLE (ICLTB) WHERE C THE POINTERS FOR THE CLASS NUMBERS ARE STORED. C IUCNT KEEPS TRACK OF THE NUMBER OF UNITS FOR EACH IDTN C C******** #2 C C IFLG IS CHECKED TO SEE IF IT INDICATES A NEW RECORD (IFLG C =1),END OF FILE (IFLG = 5), OR A NEW UNIT (IFLG=6). C C********** #3 C C TRANSFER DATA FROM IRBUF TO IDBUF USING THE FIRST WORD C OF IRBUF TO INDICATE HOW MANY WORDS TO TRANSFER. C C C********** #4 C C NOTIFY SUBROUTINE KPCNT THAT A NEW UNIT NUMBER HAS C BEEN ENCOUNTERED. KPCNT WILL DO SOME ERROR CHECKING C AND CHANGE IELG TO NEGATIVE NUMBER IF AN ERROR C OCCURS. C SUBROUTINE "CNTR" LOOKS FOR DUPLICATE UNIT AND DEVICE TYPE C NUMBERS. C C C********* #5 C C A NEW RECORD SET (IFLG =1),CHECK UNIT COUNT AND SET ICLTB C ICLTB(IC) POSITIVE TO INDICATE THAT A RECORD SET HEADER C DOES EXIST IN THE PRESENT BUFFER. C C********* #6 C C OUTPUT FILLED BUFFER TO SAM AND SET THE NEXT ICLTB(IC) C NEGATIVE, AND RESET IDPTR TO POINT TO THIRD WORD OF IDBUF. C C********* #7 C C DAS EST ALLES (FINISHED) SO DO CLEANUP. TRANSFER C THE REMAINING BUFFER TO SAM. C C**************************************************************** C C********** #1 C IF(INIT.NE.0)GO TO 50 IDPTR = 2 IUCNT = 0 IECNT = 0 I = 0 IC = 1 ICLTB(IC) = -1 INIT = 1 C C********* #2 DETERMINE WHERE TO BRANCH C 50 CALL DBUG(2,50,IFLG) IF(IFLG.EQ.1)GO TO 200 IF(IFLG.EQ.5)GO TO 500 IF(IFLG.EQ.6)GO TO 150 C C********* #3 STORE DATA C 100 K =2 IWCTR = IRBUF(1)+1 110 DO 120 JJ = K,IWCTR IDPTR = IDPTR + 1 IF(IDPTR.GT.130)GO TO 300 IF(IFLG.EQ.1.OR.IFLG.EQ.6)GO TO 120 CALL KPCNT(IFLG,IECNT,IUCNT,IERFG) 120 IDBUF(IDPTR) = IRBUF(JJ) RETURN C C********* #4 NEW UNIT NUMBER C 150 CALL KPCNT(IFLG,IECNT,IUCNT,IERFG) CALL CNTR(IRBUF(2),IERFG,1) GO TO 100 C C C********** #5 NEW RECORD SET HEADER C 200 IUCNT = IRBUF(3) IECNT = IRBUF(4) CALL CNTR(IRBUF(2),IERFG,2) CALL KPCNT(IFLG,IECNT,IUCNT,IERFG) IF(ICLTB(IC).LT.0)ICLTB(IC) = -ICLTB(IC) GO TO 100 C C*********6 OUTPUT FILLED BUFFER TO SAM C 300 ICLAS = 0 K = JJ IDPTR = 2 CALL SAM(I,IFLG,IC,ICLAS,ICLTB,IDBUF,130) IC = IC + 1 ICLTB(IC) = -1 GO TO 110 C C C******** #7 END OF FILE -TRANSFER LAST BUFFER TO SAM C 500 CALL KPCNT(IFLG ,IECNT,IUCNT,IERFG) I = 0 ICLAS = 0 IDBUF(IDPTR+1) = IX CALL SAM(I,INIT,IC,ICLAS,ICLTB,IDBUF,IDPTR+1) DO 520 I = 1,IC ICLAS = ICLTB(I) CALL SAM(I,IFLG,IC,ICLAS,ICLTB,IDBUF,IDPTR) 520 CONTINUE RETURN END SUBROUTINE DALOC(ISTN) C C SUBROUTINE # 3 FOR DBUG C DIMENSION IBUF(2),IREG(2) EQUIVALENCE(REG,IREG) C C*********** C THIS PROGRAM IS RESPONSIBLE FOR DEALLOCATING C CLASS BUFFERS. IT OPERATES BY FIRST RETRIEVING C THE CLASS NUMBER OF THE FIRST BUFFER FROM C THE CORE RESIDENT SVTBL AND USING THE SUB- C SEQUENT LAST WORD OF EACH BUFFER TO DEALLOCATE C EACH SUCCEEDING BUFFER. C AN ERROR MESSAGE IS EMITTED IF FOR SOME C STRANGE REASON A BUFFER BCOMES POLLUTED AND C AND THE IMPROPER CLASS NUMBER IS USED. C C*** #1 GET THE STATION NUMBER AND FIRST CLASS# C 10 CALL DBUG(3,10,ISTN) CALL RTCLN(ISTN,IBUF(1)) IFCLS = IBUF(1) IF(IBUF(1).EQ.0)RETURN C C*** #2 START DEALLOCATING (BITS 13&14 = 0) C 100 ICL = IAND(IBUF(1),17777B) CALL DBUG(3,100,ICL) CALL EXEC(21,ICL,IBUF,2) IF(IBUF(1).NE.IFCLS)GO TO 100 IF(IBUF(1).EQ.0)GO TO 200 ICL = 0 CALL STCLN(ISTN,ICL) RETURN C C*** #3 ERROR MESSAGE, CORRUPT TABLE IN SAM C 200 CALL ALERR(6,ISTN) RETURN END SUBROUTINE ERCNT(LINE,IFLAG,ISTN,IOUT) C C C********************************************************************* C* C* **** ERROR COUNT **** SUBROUTINE # 4 FOR DBUG C* C* COUNTS NUMBER OF ERRORS C* C* IF ANY ERRORS ARE FOUND DE-ALLOCATES SPACE USED TO STORE C* CONFIGURATION TABLE C* C* PUTS ERROR CODES AND LINE NUMBERS IN ERBUF C* C********************************************************************* INTEGER ERBUF(64,2),ERPTR DATA LASTL/0/ C C* CHECK FOR END OF FILE C 5 CALL DBUG(4,5,IFLAG) CALL DBUG(4,5,LINE) IF(IFLAG.EQ.5) GO TO 10 C C* CHECK TO SEE IF THERE IS AN ERROR C IF(IFLAG.GE.0) RETURN C C* THERE IS AN ERROR C* C* CHECK IF AN ERROR ALREADY FOUND ON THAT LINE C IF(IFLAG.EQ.LASTL) RETURN C C* INCREMENT ERROR COUNTER C* PUT CODEWORD IN ERBUF C ERPTR=ERPTR+1 15 CALL DBUG(4,15,ERPTR) ERBUF(ERPTR,1) = -IFLAG ERBUF(ERPTR,2) = LINE C C* SET IFLAG EQUAL TO ZERO C IFLAG=0 C C* IF SIXTY-FOUR ERRORS OR ANY ERRORS AT END OF FILE- C* DE-ALLOCATION OF BUFFERS CONTAINING CONFIGUARATION TABLES C* STORE ERBUF USING CLASS I/O C IF(ERPTR.LT.64) RETURN 20 CALL DALOC(ISTN) WRITE(IOUT,25) 25 FORMAT("1",17X,"CONFIGURATION TABLE GENERATION ERRORS"//) DO 50 I=1,64 IF (ERBUF(I,1).EQ.0) GOTO 60 CALL ALERR(ERBUF(I,1),IOUT,ERBUF(I,2)) 50 CONTINUE 60 CALL PRTN(-1) CALL EXEC(6) C C* CHECKS TO SEE IF ANY ERRORS WERE FOUND IN FILE C 10 IF(ERPTR.GT.0) GO TO 20 RETURN END SUBROUTINE STORE(ICLS,IBC,ICLAS,IERR) C C SUBROUTINE #5 FOR DBUG C DIMENSION IBC(130) DIMENSION IREG(2) EQUIVALENCE(REG,IREG) C C THIS ROUTINE IS RESPONSIBLE FOR STORING C THE VARIABLE IST2(CLASS #) INTO WORD ONE C OF THE CLASS BUFFER IBC C AN THEN REWRITE THE BUFFER OUT TO SAM. C C*** #1 C 10 CALL DBUG(5,10,ICLS) IERR = 0 IF(ICLS.LT.0)ICLS = -ICLS C C*** #2 C 20 IBC(1) = ICLS ICLAS = IAND(ICLAS,17777B) CALL DBUG(5,20,ICLAS) CALL EXEC(20,0,IBC,IBC(2),IDMY,JDMY,ICLAS) CALL ABREG (IREG,IREG(2)) IF(IREG.EQ.-2) IERR = -1 RETURN END END$