PROGRAM CPUREP C C .IDENT /6/ C C This is report program reads LB:[1,4]SYSLOG.DAT or any accounting file and C displays information on total system usage. The % utilization value C is obtained by subtracting NULL time from available elapsed time. All the C global statistics are displayed (#checkpoint requests, # ldr requests, C SHF requests, RUN requests) as well as the number of logins within the C sample interval and the usage of CO:, if CO: logging is enabled. C The % CO: column gives the % of CPU time the computer spends servicing C tasks running on CO: The QIO counts are displayed only if QIO counting C is enabled ($ACMSK) and CO: QIO counts are displayed only if user C QIO accounting is enabled. C C The user is given the option of running the program over a range of dates C and of electing to profile the average system usage over that date range. C If profiling is elected, the user has the choice of including or excluding C data collected on weekends. C C To build this task C C F4P CPUREP=CPUREP/NOTR C TKB>CPUREP.TSK/CP/FP=CPUREP,DAOFWK,XX:[1,1]F4POTS/LB C TKB>/ C TKB>ACTFIL=2 C TKB>UNITS=2 C TKB>LIBR=F4PRES:RO C TKB>// C -- CPU STATISTICS REPORT PARAMETER NBRBIN=48 ! DIV DAY INTO 1/2 HRS LOGICAL*1 LFILE(24) ! FOR FILE NAME LOGICAL*1 LDATE(8),LLOGIN(3),LCOUTL(5),LCOQIO(10),LOLD,LUSERS(3) LOGICAL*1 LTIME(8),LSTTIM(8), LQIO(10),LLOGOF(3),LANS LOGICAL*1 LFF,LFLAG INTEGER*2 IBUF(13) INTEGER*2 YEAR,MONTH,DAY,DAYFYR,DAOFWK INTEGER*2 NTIMES(NBRBIN),NBRON(NBRBIN) INTEGER*2 NHELLO(NBRBIN),NBYE(NBRBIN) INTEGER*4 ICPUTM,IQIOS,NULTIM,ISTART,IEND,IELAPS,INULL INTEGER*4 ICOQIO,NMDAYS(12) INTEGER*4 NTKRUN(NBRBIN),NSHFL(NBRBIN),NCKPTS(NBRBIN) REAL*4 TUTILZ(NBRBIN),TQIOS(NBRBIN) COMMON /LUN/ LUN1 ! All subroutine use TI: EQUIVALENCE (IREC,IBUF(1)) C -- START RECORD EQUIVALENCE (IHR,IBUF(2)) EQUIVALENCE (IMIN,IBUF(3)) EQUIVALENCE (ISEC,IBUF(4)) EQUIVALENCE (IYEAR,IBUF(5)) EQUIVALENCE (IMONTH,IBUF(6)) EQUIVALENCE (IDAY,IBUF(7)) EQUIVALENCE (ITICS,IBUF(8)) EQUIVALENCE (ITKPS,IBUF(9)) EQUIVALENCE (IDELTA,IBUF(10)) EQUIVALENCE (IACMSK,IBUF(13)) C -- GBL DATA EQUIVALENCE (NULTIM,IBUF(5)) ! IBUF(5)=LOWVAL,IBUF(6)=HIVAL EQUIVALENCE (ISHFCT,IBUF(7)) EQUIVALENCE (ICKPCT,IBUF(8)) EQUIVALENCE (ILDRCT,IBUF(9)) EQUIVALENCE (IQIOS,IBUF(10)) ! I*4 WORD MATCHES 2 BFR WORDS EQUIVALENCE (IRUNCT,IBUF(12)) C -- CO PACKET EQUIVALENCE(ICPUTM,IBUF(8)) DATA NMDAYS /31,29,31,30,31,30,31,31,30,31,30,31/ LUN1=1 ! TERMINAL LUN LUN2=2 ! FILE LUN(LB:[1,4]SYSLOG.DAT) LUN3=1 ! ASSUME WON'T SPOOL LFF="14 ! FORM FEED INTRVL=24*60/NBRBIN ! TIME BETWEEN BINS OPEN(UNIT=LUN1,NAME='TI:') ! SET UP TERMINAL FOR I/O CALL GETLMT(IFIRST,ILAST,IPRFIL,IWKEND,IDAILY) ! GET DAY RANGE ! AND FLAGS TO SELECT PROFILING ! AND WEEKEND PROFILING C -- OPEN LB:[1,4]SYSLOG.DAT CALL ERRSET(43,.TRUE.,.FALSE.,,.FALSE.,)! DON'T WARN USER IF UIC ON ! LB: IS MISSING CALL ERRSET(29,.TRUE.,.FALSE.,,.FALSE.,)! DON'T WARN IF OPEN ERROR CALL ERRSET(73,.TRUE.,.FALSE.,,.FALSE.,)! DON'T DIE IF DIVD BY 0 WRITE(LUN1,5) ! SPOOL OUTPUT? 5 FORMAT(' Spool Output[Y/N]: ',$) ! READ(LUN1,10,END=9999)LANS ! GEN ANSWER 10 FORMAT(1A1) ! IF(LANS.NE.'Y') GOTO 15 ! DON'T SPOOL LUN3=3 ! SET TO SPOOL OPEN(UNIT=LUN3,NAME='LP.LST', ! OPEN SPOOL FILE - CARRIAGECONTROL='LIST', ! - DISPOSE='PRINT') ! 15 WRITE(LUN1,20) 20 FORMAT(' Logfile: ',$) ! PROMPT FOR LOGFILE NAME READ(LUN1,25,ERR=15,END=9999)N,LFILE ! GET FILE NAME 25 FORMAT(Q,24A1) ! IN CHARACTER FORMAT IF(N.EQ.0) GOTO 40 ! , => LB:[1,4]SYSLOG.DAT OPEN(UNIT=LUN2,NAME='LB:TMP.TMP;1', ! TEMP SCRATCH FILE TO SET LB: - TYPE='SCRATCH') ! CLOSE(UNIT=LUN2) ! AND CLOSE IT IMMEDIATELY OPEN(UNIT=LUN2, ! OPEN FILE SPECIFIED BY LFILE - NAME =LFILE, ! - READONLY, ! - FORM ='UNFORMATTED', ! - TYPE ='OLD', ! - ACCESS ='SEQUENTIAL', ! - SHARED, ! LOG...MUST HAVE WRITE ACCESS - ERR =9000) ! ! GOTO 50 ! SKIP SECOND OPEN 40 OPEN(UNIT=LUN2, ! OPEN DEFAULT FILE - NAME = 'LB:[1,4]SYSLOG.DAT', ! - READONLY, ! - FORM = 'UNFORMATTED', ! - TYPE = 'OLD', ! - ACCESS = 'SEQUENTIAL', ! - SHARED, ! LOG... MUST HAVE WRITE ACCES - ERR = 9000) ! 50 IF(IDAILY.EQ.0) GOTO 90 ! Skip if no daily reports WRITE(LUN3,80) 80 FORMAT(' 'T45,'Global CPU Usage Statistics',/, - ' 'T45,' (* -> Accounting Started)',/) 90 LSTDAY=0 ! ASSUME DAY(UNMATCHABLE DATE) JREC=-1 ! INITIALIZE ISTPKT=.FALSE. ! HAVE NOT GOT START PKT YET 100 JREC=IREC ! KEEP TRACK OF LAST RECORD READ(LUN2,ERR=9100,END=1000) IBUF ! READ THE ACCOUNT FILE IF(IREC.EQ.1) ISTPKT=.TRUE. ! WE GOT A START PACKET IF(IREC.EQ.1) LFLAG='*' ! MARK EACH RESTART IF(IREC.NE.1 .AND. ! SKIP IF NOT START OR - IREC.NE.0 .AND. ! DAYFLAG PACKET OR - IREC.NE.4) GOTO 140! CHANGE DELTA PACKET JDELTA=IDELTA ! SAVE DELTA TIME NEWDAY=IDAY ! POINT TO NEW DATE NEWMON=IMONTH ! GET NEW MONTH IDYFYR=DAYFYR(IYEAR,IMONTH,IDAY) ! GET DAY OF YEAR IWKDAY=DAOFWK(IMONTH,IDAY,IYEAR) ! WHICH DAY OF WEEK IS IT IF(IREC.EQ.1) NUSERS=0 ! ALWAYS SET TO ZERO AT START IF(IREC.EQ.0 .AND. ! IF GET A NEWDAY PKT AND SAW - ISTPKT) GOTO 100! START PKT, IGNORE NEWDAY PKT DO 110 ,I=1,8 ! 110 LTIME(I)=' ' ! ENCODE(8,120,LDATE)IMONTH,IDAY,IYEAR ! GET ASCII DATE 120 FORMAT(I2,'/',I2,'/',I2) ! DO 130,I=1,8 ! 130 IF(LDATE(I).EQ.' ')LDATE(I)='0' ! CONVERT SPACES TO '0' JACMSK=IACMSK ! SAVE ACCOUNTING MASK WORD ICOFLG=0 ! ASSUME NO CO: LOGGING IF((JACMSK.AND."400).EQ."400)ICOFLG=1 ! SHOW CO: LOGGING IS ENABLED 140 CONTINUE ! IF(IREC.NE.1 .AND. ! SKIP OVER IF START OR - IREC.NE.0) GOTO 145! DAYFLAG RECORD RECORD ISTHR=IHR ! SET START TIME ISTMIN=IMIN ! SET START TIME ISTSEC=ISEC ! SET START TIME ENCODE(8,150,LSTTIM)ISTHR,ISTMIN,ISTSEC! ENCODE THE START TIME JTKPS=ITKPS ! SAVE THE TICS/SEC DO 142, I=1,8 ! CONVERT SPACES TO 0'S 142 IF(LSTTIM(I).EQ.' ')LSTTIM(I)='0' ! TO MAKE PRETTY GOTO 100 ! READ AGAIN IF START RECORD 145 CONTINUE ! IF(LDATE(1).EQ.' ') GOTO 100 ! IF FIRST RECORD NOT START IF(LDATE(1).EQ.0) GOTO 100 ! " " " " " IF(IREC.EQ.5)NLOGIN=NLOGIN+1 ! KEEP TRACK OF LOGONS IF(IREC.EQ.6)NLOGOF=NLOGOF+1 ! AND NUMBER OF LOGOFFS IF(IREC.EQ.5) GOTO 100 ! AND READ AGAIN IF(IREC.EQ.8)COTIM=ICPUTM/JTKPS ! IF CO: PACKET SAVE CPUTIME IF(IREC.EQ.2)QIOS=IQIOS ! CONVERT TO REAL VALUE IF(IREC.EQ.2)QIOTMP=QIOS ! SAVE IF(IREC.EQ.8)ICOQIO=IQIOS ! AND QIO COUNT IF(IREC.EQ.8) GOTO 180 ! AND PROCESS CO: PACKET DATA IF(IREC.NE.2) GOTO 100 ! FIND GLOBL STAT RECORDS ISTART=60*ISTHR+ISTMIN ! CPU TIME IN MINUTES AT START ILOC=ISTART-(JDELTA/2) ! BACK UP TO MID INTERVAL IF(ILOC.LT.0)ILOC=0 ! NEVER LET IT BE NEGATIVE IBNLOC=ILOC/INTRVL+1 ! FIND WHICH BIN WE ARE IN ISTART=60*ISTART+ISTSEC ! CONVERT TO SECONDS ENCODE(8,150,LTIME)IHR,IMIN,ISEC ! CONVERT TIME TO ASCII DO 147,I=1,8 ! CONVERT SPACES TO 0'S 147 IF(LTIME(I).EQ.' ')LTIME(I)='0' ! TO MAKE PRETTY 150 FORMAT(I2,':',I2,':',I2) ! IEND=60*IHR+IMIN ! PUT THE TIME IN SEC (I*4) IEND=IEND*60+ISEC ! SO WON'T HAVE OVERFLOW ELAPS=IEND-ISTART ! IF(ELAPS.GT.0) GOTO 155 ! IF SYSTEM RUNS PAST MIDNIGHT C ! TIME CALC GETS SCREWED UP ELAPS=ELAPS+60*60*24 ! OFFSET VALUE BY 24*60*60 SEC IF(JREC.EQ.0 .AND. ! IF NEWDAY PKT PRECEEDS THE - IREC.EQ.2 .AND. ! GBL PKT AND TIME INTERVLAL - .NOT.ISTPKT) ELAPS=60*JDELTA ! AND NEVER GOT STRT PKT C IF(ISTPKT)NEWDAY=NEWDAY+1 ! TRICK FAILS IF END OF MONTH C IF(NEWDAY.GT.NMDAYS(NEWMON))NEWDAY=0 ! GOT TO START A NEW MONTH C IF(NEWDAY.EQ.0)NEWMON=NEWMON+1 ! SO BUMP UP MONTH C IF(NEWDAY.EQ.0)NEWDAY=1 ! AND START A NEW MONTH ENCODE(5,151,LDATE)NEWMON,NEWDAY !**THIS SHOULD BE FIXED 151 FORMAT(I2,'/',I2) ! DO 152,I=1,8 ! FILL SPACES WITH '0' 152 IF(LDATE(I).EQ.' ')LDATE(I)='0' ! TO MAKE PRETTY 155 FREE=NULTIM/JTKPS ! COMPUTE NULL TIME IN SECONDS ISHF=ISHFCT ! SAVE VALUES ICKP=ICKPCT ! FOR PRINTING LATER ILDR=ILDRCT ! IRUN=IRUNCT ! X=FREE !*****TEMP UTILIZ=100.*(1-FREE/ELAPS) ! % SYSTEM UTILIZATION 175 IF(ICOFLG.EQ.1) GOTO 100! IF CO: LOGGING ENABLED 180 CONTINUE ! DO 195,I=1,5 ! FILL IN WITH SPACES IN CASE 195 LCOUTL(I)=' ' ! CO: LOGGING NOT ENABLED IF(ICOFLG.EQ.0) GOTO 400! IF CO: LOGGING NOT ENABLED FREE=100.*COTIM/ELAPS ! COMPUTE % CO: TIME ENCODE(5,200,LCOUTL)FREE ! 200 FORMAT(F5.1) ! IF((COTIM+X).GT.ELAPS)WRITE(LUN3,99)ELAPS,COTIM,X!****TEMP 99 FORMAT(' TIME CHECK ERROR - ELAPSE, COTIME, NULL TIME) =',3F8.0)!*TEMP 400 CONTINUE ! DO 440,I=1,10 ! SPACE OUT QIO WORD LQIO(I)=' ' ! FILL WITH BLANKS 440 LCOQIO(I)=' ' ! PUT SPACES IN QIO FIELDS IF((JACMSK.AND."2).NE."2) GOTO 500! IF QIO'S NOT BEING LOGGED ENCODE(10,460,LQIO)QIOS ! ENCODE THE QIO'S 460 FORMAT(1PE10.3) ! THERE MAY BE A LOG IF(ICOFLG.NE.1) GOTO 500! IF CO: LOGGING NOT ENABLED IF((JACMSK.AND."1000).NE."1000) GOTO 500! IF USER QIO NOT ENABLED QIOS=ICOQIO ! MAKE A REAL NUMBER ENCODE(10,460,LCOQIO)QIOS ! AND ENCODE FOR PRINTOUT 500 CONTINUE ! DO 510, I=1,3 ! FILL IN WITH SPACES LUSERS(I)=' ' ! LLOGOF(I)=' ' ! 510 LLOGIN(I)=' ' ! IF((JACMSK.AND."200).NE."200) GOTO 550 ! IF LOGON COUNTING DISABLED ENCODE(3,520,LLOGIN)NLOGIN ! ENCODE # OF LOGINS ENCODE(3,520,LLOGOF)NLOGOF ! ENCODE # OF LOGOFFS 520 FORMAT(I3) ! NOT >999/4HRS PLEASE 550 CONTINUE ! IF(IRUN.GT.0)JRUN=IRUN ! IF(IRUN.LT.0)JRUN=32768-IRUN ! IF(IDYFYR.LT.IFIRST .OR. ! IF DATE NOT WITHIN RANGE - IDYFYR.GT.ILAST) GOTO 595! SKIP OVER IF(IDAILY.EQ.0) GOTO 595! Skip if only want summary IF(LSTDAY.NE.NEWDAY)WRITE(LUN3,575) ! SKIP LINE IF DATE CHANGES 575 FORMAT(' ') ! TO MAKE LIST EASIER TO READ IF(LSTDAY.NE.NEWDAY) WRITE(LUN3,590) ! AND STICK IN HEADER 590 FORMAT(' 'T5,'DATE',T19,'TIME',T33,'% UTIL', - T40,'SHF RQST',T49,'CHK RQST',T59,'LDR RQST',T69,'RUN RQST', - T79,'QIO COUNT',T90,' HELLOs',T97,' BYEs', - T104,'# ON',T111,'% CO:',T118,'CO: QIOs') 595 LSTDAY=NEWDAY ! RESET VALUE NUSERS=NUSERS+(NLOGIN-NLOGOF) ! KEEP TRACK OF # ON SYSTEM IF(NUSERS.LT.0) NUSERS=0 ! IN CASE OF MIDDAY CRASH**** ENCODE(3,520,LUSERS)NUSERS ! TOTAL # ON SYSTEM IF(IDYFYR.LT.IFIRST .OR. ! IF DATE NOT WITHIN RANGE - IDYFYR.GT.ILAST) GOTO 970! SKIP OVER IF(IDAILY.EQ.0) GOTO 950! Skip if only want summary WRITE(LUN3,900)LFLAG,LDATE,LSTTIM,LTIME,! - UTILIZ,ISHF,ICKP, ! - ILDR,JRUN,LQIO, ! - LLOGIN,LLOGOF,LUSERS, ! - LCOUTL,LCOQIO 900 FORMAT(' '1A1,8A1,2X,8A1,'-',8A1,3X,F6.1,I6,! - 3I10,3X,10A1,3X,3A1,4X,3A1, ! - 3X,3A1,3X,5A1,2X,10A1) ! 950 LFLAG=' ' ! PRINT * ONLY ONCE/REBOOT IF(IPRFIL.NE.1) GOTO 970! SKIP PROFILING IF(IWKEND.EQ.0 .AND. ! IF SHOULD NOT COUNT WEEKEND - (IWKDAY.EQ.1 .OR. ! AND IS EITHER SUNDAY - IWKDAY.EQ.7)) GOTO 970! OR SATURDAY, SKIP PROFILE C WRITE(LUN3,960)IBNLOC,NLOGIN,NLOGOF,NUSERS,QIOTMP,ISHF,ICKP, C - JRUN,UTILIZ C960 FORMAT(' '4I6,E10.3,3I6,F8.2) NTIMES(IBNLOC)=NTIMES(IBNLOC)+1 ! COUNT # ADDED IN THIS BIN NHELLO(IBNLOC)=NHELLO(IBNLOC)+NLOGIN ! COUNT # OF LOGINS NBYE(IBNLOC) =NBYE(IBNLOC) +NLOGOF ! COUNT # OF LOGOFFS NBRON(IBNLOC) =NBRON(IBNLOC) +NUSERS ! AVERAGE IN # USERS TQIOS(IBNLOC) =TQIOS(IBNLOC) +QIOTMP ! AVERAGE QIO # NSHFL(IBNLOC) =NSHFL(IBNLOC) +ISHF ! AVERAGE SHF RUNS NCKPTS(IBNLOC)=NCKPTS(IBNLOC)+ICKP ! AVERAGE # CHECKPOINTS NTKRUN(IBNLOC)=NTKRUN(IBNLOC)+JRUN ! AVERAGE # TASKS RUN TUTILZ(IBNLOC)=TUTILZ(IBNLOC)+UTILIZ ! AVERAGE % UTILIZATION 970 CONTINUE ! DO 990, I=1,8 ! PUT END TIME IN START TIME 990 LSTTIM(I)=LTIME(I) ! FOR THE NEXT TIME ISTHR=IHR ! ISTMIN=IMIN ! ISTSEC=ISEC ! NLOGIN=0 ! RESET COUNTER NLOGOF=0 ! ALSO RESET QIOTMP=0 ! JRUN=0 ! GOTO 100 ! AND READ LOG FILE AGAIN 1000 IF(IPRFIL.NE.1) GOTO 9990! IF NO PROFILE, CLOSE& EXIT ISEC=0 ! RESET WRITE(LUN3,1100)LFF 1100 FORMAT(' ',1A1,T45,'System Usage Profile') WRITE(LUN3,1120) 1120 FORMAT(' '/,' ',T2,'TIME',6X,'% UTIL', - 3X,'SHF RQST',3X,'CHK RQST',4X,'RUN RQST', - 3X,'QIO COUNT',8X,' HELLOs',5X,' BYEs', - 6X,'# ON') NMIN=24*60/NBRBIN ! # MIN EACH INTERVAL DO 1160, I=1,NBRBIN ! PRINT OUT ALL THE STATISTICS NBRMIN=I*NMIN ! ELAPSED # MIN IN DAY IHOUR=NBRMIN/60 ! NUMBER OF HOURS (0-24) NBRMIN=NBRMIN-IHOUR*60 ! REMAINING MIN IN HOUR N=NTIMES(I) ! NUMBER OF TIMES COUNTED IF(N.EQ.0) GOTO 1130! DON'T DIVIDE BY ZERO NHELLO(I)=NHELLO(I)/N ! AVERAGE # OF LOGINS NBYE(I) =NBYE(I)/N ! AVERAGE # OF LOGOFFS NBRON(I) =NBRON(I)/N ! AVERAGE # USERS ON SYSTEM TQIOS(I) =TQIOS(I)/N ! AVERAGE QIO # NSHFL(I) =NSHFL(I)/N ! AVERAGE SHF RUNS NCKPTS(I)=NCKPTS(I)/N ! AVERAGE # CHECKPOINTS NTKRUN(I)=NTKRUN(I)/N ! AVERAGE # TASKS RUN TUTILZ(I)=TUTILZ(I)/N ! AVERAGE % UTILIZATION 1130 CONTINUE ! ISEC=0 ! ENCODE(8,150,LTIME)IHOUR,NBRMIN,ISEC ! DO 1135, J=1,5 ! 1135 IF(LTIME(J).EQ.' ')LTIME(J)='0' ! Leave no blanks LTIME(6)=' ' ! Blank out seconds LTIME(7)=' ' ! LTIME(8)=' ' ! To make pretty WRITE(LUN3,1140)LTIME,TUTILZ(I),NSHFL(I),NCKPTS(I), - NTKRUN(I),TQIOS(I),NHELLO(I),NBYE(I),NBRON(I) 1140 FORMAT(' ',8A1,1X,F6.1,I8,4X,I8,4X,I8,5X,1PE10.3,3(4X,I8)) 1160 CONTINUE GOTO 9990 ! CLOSE UP AND EXIT 9000 WRITE(LUN1,9010) ! WE GOT AN ERROR, WARN USER 9010 FORMAT(' CPUREP -- OPEN ERROR, FILE NOT FOUND') ! GOTO 9990 ! 9100 WRITE(LUN1,9010) ! IF WE GET A READ ERROR 9110 FORMAT(' CPUREP -- READ ERROR IN SYSLOG.DAT') ! WARN USER GOTO 9990 ! 9990 CLOSE(UNIT=LUN2) ! CLOSE UP AND EXIT CLOSE(UNIT=LUN3) ! CLOSE SPOOL FILE 9999 CONTINUE ! END ! SUBROUTINE GETLMT(IFIRST,ILAST,IPRFIL,IWKEND,IDAILY) INTEGER BEGDAY,BEGMON,ENDDAY,ENDMON INTEGER*2 DAYFYR LOGICAL*1 LANS ! FOR Y/N ANSWER COMMON /LUN/ LUN1 ! TERMINAL TI: IFIRST=1 ! ASSUME WHOLE YEAR ILAST=365 ! IPRFIL=0 ! ASSUME NO PROFILE IWKEND=0 ! ASSUME NO WEEKENDS IDAILY =1 ! ASSUME DAILY REPORTS CALL IDATE(IMON,IDAY,IYEAR) ! GET TODAY'S DATE WRITE(LUN1,10) ! 10 FORMAT(' Limit the report to a date interval (Y/N): ',$) READ(LUN1,20,END=999)LANS ! 20 FORMAT(1A1) ! IF(LANS.NE.'Y') GOTO 100! JUST RETURN WRITE(LUN1,25) ! 25 FORMAT(' Date should be entered as TWO integers, M,D', - /,' with M = 1-12, D = 1-31') ! 27 WRITE(LUN1,30) ! 30 FORMAT(' Enter Starting Month, Starting Day (M,D): ',$) READ(1,40,END=999,ERR=27)BEGMON,BEGDAY ! 40 FORMAT(2I2) ! IF(BEGMON.LT.1 .OR. ! CHECK VALIDITY - BEGMON.GT.12 .OR. ! - BEGDAY.LT.1 .OR. ! - BEGDAY.GT.31) GOTO 27 ! REPROMPT 45 WRITE(LUN1,50) 50 FORMAT(' Enter Ending Month, Ending Day (M,D): ',$) READ(LUN1,40,END=999,ERR=45)ENDMON,ENDDAY ! IF(ENDMON.LT.1 .OR. !CHECK VALIDITY - ENDMON.GT.12 .OR. ! - BEGDAY.LT.1 .OR. ! - BEGDAY.GT.31) GOTO 45 ! REPROMPT IFIRST=DAYFYR(IYEAR,BEGMON,BEGDAY) ! CALC DAY OF YEAR ILAST =DAYFYR(IYEAR,ENDMON,ENDDAY) ! FOR 1ST AND LAST IF(ILAST.LT.IFIRST) GOTO 27 ! IF NOT>, REPROMPT 100 WRITE(LUN1,110) ! 110 FORMAT(' Create a profile of average CPU usage [Y,N]: ',$) READ(LUN1,20,END=999,ERR=100)LANS ! GET ANSWER IF(LANS.NE.'Y') GOTO 200! IF NO, SKIP IPRFIL=1 ! Yes, we should 120 WRITE(LUN1,130) ! Ask about weekends 130 FORMAT(' Include weekend use in profile [Y/N]: ',$)! READ(LUN1,20,END=999,ERR=120)LANS ! Count them? IF(LANS.EQ.'Y') IWKEND=1 ! If yes, set flag 140 WRITE(LUN1,150) ! Should we skip the 150 FORMAT(' Only output total system profile [Y/N]: ',$) ! daily reports? READ(LUN1,20,END=999,ERR=140)LANS ! Find out IF(LANS.EQ.'Y')IDAILY=0 ! If yes, skip daily 200 RETURN 999 CALL EXIT ! TRAP ^Z END INTEGER*2 FUNCTION DAYFYR(Y,M,D) INTEGER A(12),Y,M,D DATA A/31,28,31,30,31,30,31,31,30,31,30,31/ IF(4.*INT(Y/4.).EQ.Y)A(2)=29 DAYFYR=0 IF(M.EQ.1)GO TO 20 DO 10,I=1,M-1 10 DAYFYR=DAYFYR+A(I) 20 DAYFYR=DAYFYR+D RETURN END