C** ACLIST - ACCOUNTING SUMMARY LISTING PROGRAM C PROGRAM ACLIST C LOGICAL*1 SINGLE,FIRST,FOPEN,DEBUG,MULTI BYTE BUF(512),FILE(30) BYTE STIM(6) ! TIME OF FIRST PACKET REAL MONTHS(12) INTEGER IBUF(256) REAL*8 RFILE(3) C INCLUDE 'ACNDF.FTN' C EQUIVALENCE (FILE,RFILE),(IBUF,BUF) EQUIVALENCE (BLNK,BUF) ! FORCE DATA INTO COMMON C COMMON/MONTHS/MONTHS COMMON/DEBUG/DEBUG C DATA RFILE/'[1,7]AC1','0APR80.D','AT;1 '/ DATA MONTHS/'JAN','FEB','MAR','APR','MAY','JUN','JUL', 1 'AUG','SEP','OCT','NOV','DEC'/ DATA DEBUG/.FALSE./,FIRST/.TRUE./ C C.. ENTRY POINT CALL ERRSET(29,.TRUE.,.FALSE.,.TRUE.,.FALSE.) ! STOP 'NO SUCH FILE' C OPEN(UNIT=2,NAME='ACCOUNT.LST') OPEN(UNIT=3,NAME='ACCOUNT.ERR;1',TYPE='UNKNOWN') C WRITE(5,5000) 5000 FORMAT ('$Enter system ID <4 char> : ') READ(5,5010) SYS 5010 FORMAT(A4) IF(SYS.EQ.'TEST') DEBUG=.TRUE. ! ENABLE DEBUG PRINTOUTS 1 WRITE(5,5015) 5015 FORMAT ('$Enter input device :') READ(5,5016)INCHR,INDEV,INUNIT 5016 FORMAT(Q,A2,O1) IF(INCHR.EQ.0) CALL ASNLUN (1,'LB',0,IER) IF(INCHR.NE.0) CALL ASNLUN (1,INDEV,INUNIT,IER) IF(IER.NE.1) GOTO 1 C C.. REQUEST FILE IDENTIFICATION 2 WRITE(5,5020) 5020 FORMAT('$Enter ddmmmyy for the data file : ') READ(5,1000)IFCHR,(FILE(I),I=8,14) IF(IFCHR.NE.7)GOTO 2 ! INVALID INPUT DO 3 I=10,12 IF(FILE(I).GE."140)FILE(I)=FILE(I)-"40 3 CONTINUE SINGLE=.TRUE. ! DO A SINGLE DAY BY DEFAULT IVER=1 ! START W/ FILE VERSION 1 C C.. WRITE OUT REPORT HEADER LDAY=' ' ! INITIALIZE TO SPACES DECODE(2,3000,FILE(8))IDAY ! GET THE DAY HE ASKED FOR IF(IDAY.GT.0)ENCODE(2,3000,LDAY)IDAY WRITE(2,2000) LDAY,(FILE(J),J=10,14),SYS 2000 FORMAT(1H1,T48,'AFRRI CENTRAL COMPUTING FACILITY'/ 1T40,'ACCOUNTING SYSTEM SUMMARY FOR ',A2,1X,3A1,1X,'19',2A1, 2 ' OF CCF',A4/T40,50('-')/) C C NFILES=0 ! INITIALIZE FILE COUNT IF(IDAY.GT.0) GO TO 10 ! ONLY A SINGLE DAY IF(IDAY.EQ.-1) MULTI=.TRUE. ! MULTIPLE MONTHS SINGLE=.FALSE. ! DO ALL DAYS IN MONTH IDAY=1 ! STARTING WITH 1 IF(.NOT.MULTI) GOTO 5 C C.. PROCESS MULTI-MONTH SETUP DECODE (3,2500,FILE(10))TEMP 2500 FORMAT(A3) DO 415 J=1,12 IF(MONTHS(J).EQ. TEMP) GOTO 420 415 CONTINUE GOTO 2 420 IFMON=J IMONTH=IFMON C 4 TYPE 2200 2200 FORMAT ('$Enter ending month : ') READ(5,2400)ICH,TEMP 2400 FORMAT(Q,A3) IF(ICH .NE. 3) GOTO 4 DO 401 J=1,12 IF(MONTHS(J).EQ. TEMP) GOTO 410 401 CONTINUE GOTO 4 410 ILMON=J WRITE (2,2300) MONTHS(IFMON),MONTHS(ILMON) WRITE (5,2300) MONTHS(IFMON),MONTHS(ILMON) 2300 FORMAT (T50,'FOR THE MONTHS OF ',A3,' THRU ',A3/) C C.. HERE LOOP THRU ALL FILES 5 IF(MULTI)ENCODE(3,3100,FILE(10)) MONTHS(IMONTH) ! LOAD MONTH STRING 3100 FORMAT(A3) ENCODE (2,3000,FILE(8)) IDAY ! PUT DAY OF MONTH IN FILSPEC 3000 FORMAT (I2) IF(FILE(8).EQ.' ') FILE(8)='0' ! ENCODE DROPS LEADING ZEROS 10 ENCODE (3,3010,FILE(20)) IVER ! AND VERSION NUMBER 3010 FORMAT (O3) C IF(IDAY.EQ.1) TYPE 9000,FILE ! LOG THIS MONTH STARTING IF(DEBUG) WRITE(3,9000)FILE 9000 FORMAT(1X,30A1) C C.. OPEN FILE HERE FOPEN=.FALSE. ! ASSUME ERROR OPEN (UNIT=1,NAME=FILE,TYPE='OLD', 1 READONLY,RECORDTYPE='VARIABLE', 2 RECORDSIZE=512,ERR=20,SHARED 9 ) C FOPEN=.TRUE. ! MARK FILE OPEN NFILES=NFILES+1 ! COUNT FILE GOTO 100 ! GO DO SOME READING C C.. HANDLE ALL OPEN ERRORS HERE 20 IF(SINGLE) GOTO 900 ! DONE ON FIRST OPEN ERROR IVER=1 ! RESET VERSION NUMBER FOR NEXT DAY IDAY=IDAY+1 ! BUMP DAY NUMBER IF(IDAY.GT.31) GOTO 900 ! FINISHED WITH MONTH GOTO 40 C C.. READ ERRORS/EOF COME HERE 30 IVER=IVER+1 ! TRY FOR NEXT VERSION 40 IF(FOPEN)CLOSE (UNIT=1) ! CLOSE THIS FILE GOTO 5 ! GO OPEN NEXT FILE C C.. GET ALL DATA HERE - MAIN READ LOOP 100 READ(1,1000,ERR=30,END=30)ICHR,BUF 1000 FORMAT(Q,4(128A1)) CDD WRITE(3,9100)(IBUF(I),I=1,ICHR) CDD9100 FORMAT(11O7/20(7X,10O7/)) CALL REPORT (IOPER) IF(.NOT.FIRST)GOTO 100 DO 110 J=1,6 110 STIM(J)=BTIM(J) ! SAVE STARTING TIME FIRST=.FALSE. GOTO 100 C C.. CHECK FOR MULTI-MONTH RUNS 900 IF(.NOT.MULTI) GOTO 990 ! NO CHECK FOR ONLY ONE MONTH IDAY=1 ! RESET DAY COUNTER IMONTH=IMONTH+1 ! UPDATE CURRENT MONTH IF(IMONTH.LE.ILMON) GOTO 5 ! CONTINUE IF MORE MONTHS LEFT C C.. PRINT OUT REPORT AND EXIT 990 WRITE(2,2100)NFILES, 2 STIM(4),STIM(5),STIM(6),STIM(3),MONTHS(STIM(2)),STIM(1), 1 BTIM(4),BTIM(5),BTIM(6),BTIM(3),MONTHS(BTIM(2)),BTIM(1), 2100 FORMAT(/T20,'Number of files processed:',T50,I5,/ 1 T20,'Date and time of first entry:',T50, 2 I2,':',I2,':',I2,X,I2,'-',A3,'-',I2,/ 2 T20,'Date and time of last entry: ',T50, 2 I2,':',I2,':',I2,X,I2,'-',A3,'-',I2,/ 9 //) C IOPER=1 CALL REPORT (IOPER) CLOSE (UNIT=2,DISPOSE='SAVE') STOP END C** REPORT - ACCUMULATE ACCOUNTING DATA AND REPORT C SUBROUTINE REPORT(IOPER) C INCLUDE 'ACNDF.FTN/-LI' C PARAMETER MAXACN=100 ! MAXIMUM NUMBER OF ACCOUNTS ALLOWED C REAL MONTHS(12) ! NAMES OF MONTHS COMMON/MONTHS/MONTHS COMMON /DEBUG/DEBUG ! DEBUG FLAG LOGICAL*1 DEBUG LOGICAL*1 SWAP BYTE CHRB,CHRC,CHRT,CHRV ! CHARACTERS 'B','C','T','V' DATA CHRB,CHRC,CHRT,CHRV/'B','C','T','V'/ C BYTE LINK(MAXACN) ! INDEX FOR SORTING BYTE JNAM(16,MAXACN) ! USER NAME INTEGER JCOUNT(MAXACN) ! NUMBER OF LOGINS INTEGER JACN(MAXACN) ! CHARGING ACCOUNT NUMBER INTEGER JUUIC(MAXACN) ! LOGIN ACCOUNT NUMBER INTEGER JUID(MAXACN) ! DEPARTMENT CODE INTEGER*4 JTIM(MAXACN) ! TOTAL LOGIN TIME(SEC) INTEGER*4 JCPU(MAXACN) ! TOTAL CPU TIME USED INTEGER*4 JDIR(MAXACN) ! TOTAL DIRECTIVES INTEGER*4 JQIO(MAXACN) ! TOTAL I/O REQUESTS INTEGER*4 JTSK(MAXACN) ! TOTAL TASKS RUN INTEGER*4 JPAGE(MAXACN) ! TOTAL PAGES PRINTED INTEGER JOBS(MAXACN) ! TOTAL PRINT JOBS RUN INTEGER JFILES(MAXACN) ! TOTAL FILES PRINTED INTEGER*4 JCRASH ! ABSOLUTE TIME OF CRASH C C.. FUNCTIONS CALLED LOGICAL*1 UICCMP ! COMPARE BINARY UIC'S INTEGER*4 JSWAP ! WORD SWAP FUNCTION INTEGER*4 JSECND ! CUMULATIVE SECONDS FROM TIME C C.. I/O BUFFER FOR PACKETS BYTE BUF(512) INTEGER IBUF(256) EQUIVALENCE (BUF,IBUF),(BLNK,BUF) C C.. MASK TO BREAK BYTES APART INTEGER UICC BYTE UIC(2) EQUIVALENCE (UICC,UIC) C DATA LASTAC/1/ ! HIGHEST ACCOUNT SLOT USED C C.. CHECK FOR REPORT PHASE IF(IOPER.NE.0) GOTO 9000 ! PRINT OUT DATA IRECRD=IRECRD+1 ! COUNT TRANSACTIONS C C.. VECTOR TO HANDLER FOR THIS PACKET IF(BTYP.EQ.BTSAB) GOTO 100 ! SYSTEM BLOCK IF(BTYP.EQ.BTUAB) GOTO 200 ! USER ACCOUNTING BLOCK IF(BTYP.EQ.BTSS) GOTO 1100 ! ACCOUNTING SYSTEM STARTUP IF(BTYP.EQ.BTINV) GOTO 1200 ! INVALID LOGIN ATTEMPT IF(BTYP.EQ.BTTIM) GOTO 1300 ! SYSTEM TIME CHANGE IF(BTYP.EQ.BTALL) GOTO 1400 ! ALLOCATE DEVICE IF(BTYP.EQ.BTDEA) GOTO 1500 ! DEALLOCATE DEVICE IF(BTYP.EQ.BTMOU) GOTO 1600 ! MOUNT DEVICE IF(BTYP.EQ.BTDMO) GOTO 1700 ! DEMOUNT DEVICE IF(BTYP.EQ.BTPRT) GOTO 2000 ! PRINT DESPOOLER BLOCK IF(BTYP.EQ.BTDIR) GOTO 2100 ! DISK ACCOUNTING BY DIRECTORY IF(BTYP.EQ.BTVOL) GOTO 2200 ! DISK ACCOUNTING BY VOLUME IF(BTYP.EQ.BTLOG) GOTO 2300 ! LOGIN TRANSACTION IF(BTYP.EQ.BTCRH) GOTO 2400 ! SYSTEM CRASH REPORT C C.. COME HERE FOR ALL OTHER PACKETS RETURN C C.. PROCESS SYSTEM ACCOUNTING BLOCKS 100 CONTINUE ! SHOULD WRITE OUT SYSTEM STATS HERE RETURN C C.. PROCESS USER BLOCKS 200 IF(DEBUG) WRITE(3,19000) (IBUF(I),I=1,44) 19000 FORMAT(22O6) C DO 205 I=1,LASTAC IF(JUUIC(I).EQ.BUUIC) GOTO 220 ! FOUND RIGHT SLOT 205 CONTINUE C C.. NEW ENTRY JUUIC(LASTAC)=BUUIC ! SET UP THIS SLOT I=LASTAC LASTAC=LASTAC+1 DO 210 J=1,15 210 JNAM(J,I)=BNAM(J) ! FILL IN USER NAME JNAM(16,I)='.' JACN(I)=BACN ! SAVE ACCOUNT NUMBER JUID(I)=BUID(1) ! SAVE DEPARTMENT CODE C C.. UPDATE TOTALS FOR RESOURCES USED 220 JCOUNT(I)=JCOUNT(I)+1 ! COUNT THIS LOGIN JCPU(I)=JCPU(I)+JSWAP(BCPU) ! CPU TIME, TICS JDIR(I)=JDIR(I)+JSWAP(BDIR) ! DIRECTIVES JQIO(I)=JQIO(I)+JSWAP(BQIO) ! QIO'S JTSK(I)=JTSK(I)+JSWAP(BTAS) ! AND TASKS C IF(BTID(1).EQ.CHRV) IVTLOG=IVTLOG+1 ! VITRUAL TERMINAL LOGIN IF(BTID(1).EQ.CHRB) IBATCH=IBATCH+1 ! BATCH JOB C C.. UPDATE LOGIN TOTAL TIMES IF(BTID(1).NE.CHRT) GOTO 299 ! COUNT ONLY TERMINALS UIC(1)=BSTM ! GET STATUS BYTE INTO WORD IF(IAND(UICC,BSCRH).EQ.0) GOTO 230 ! CRASH RECOVERY PACKETS JTIM(I)=JTIM(I)+(JCRASH-JSECND(BBEG)) ! TOTAL SECONDS TO CRASH GOTO 299 230 IF(IAND(UICC,BSACT).EQ.0) GOTO 240 ! ACTIVE AT SHUTDOWN JTIM(I)=JTIM(I)+(JSECND(BTIM)-JSECND(BBEG))! TOTAL SECONDS TO SHUTDOWN GOTO 299 240 CONTINUE ! NORMAL PACKETS IF(BLGO(1).NE.0)JTIM(I)=JTIM(I)+(JSECND(BLGO)-JSECND(BBEG)) C TIME OF LOGOUT ZERO FOR SOME REASON USE TIME OF PACKET IF(BLGO(1).EQ.0)JTIM(I)=JTIM(I)+(JSECND(BTIM)-JSECND(BBEG)) 299 CONTINUE C C.. DONE RETURN C C.. ACCOUNTING SYSTEM STARTUP..... 1100 JRECRD=JRECRD+IRECRD ! CUMULATIVE COUNT OF RECORDS IRECRD=0 ! RESET COUNT OF RECORDS IFILE=IFILE+1 ! INCREMENT FILE NUMBER RETURN C C.. INVALID LOGIN ATTEMPT 1200 NVALID=NVALID+1 RETURN C C.. SYSTEM TIME CHANGE 1300 WRITE(2,13000) 2 BTOLD(4),BTOLD(5),BTOLD(6),BTOLD(3),MONTHS(BTOLD(2)),BTOLD(1), 1 BTNEW(4),BTNEW(5),BTNEW(6),BTNEW(3),MONTHS(BTNEW(2)),BTNEW(1), 13000 FORMAT(/T20,'System time changed from:',T50, 2 I2,':',I2,':',I2,X,I2,'-',A3,'-',I2,/ 2 T42,'to:',T50, 2 I2,':',I2,':',I2,X,I2,'-',A3,'-',I2,/ 9 ) IF(DEBUG)WRITE(3,13000) 1 BTOLD(4),BTOLD(5),BTOLD(6),BTOLD(3),MONTHS(BTOLD(2)),BTOLD(1), 2 BTNEW(4),BTNEW(5),BTNEW(6),BTNEW(3),MONTHS(BTNEW(2)),BTNEW(1), RETURN C C.. ALLOCATE DEVICE SUMMATION 1400 IALLOC=IALLOC+1 RETURN C C.. DEALLOCATE DEVICE 1500 IDEALL=IDEALL+1 RETURN C C.. MOUNT DEVICE 1600 IMOUNT=IMOUNT+1 RETURN C C.. DEMOUNT DEVICE 1700 IDEMOU=IDEMOU+1 RETURN C C.. PRINT JOB PROCESSING 2000 DO 2005 I=1,LASTAC ! LOOK FOR THIS USER IF(JACN(I).EQ.BACN) GOTO 2010 2005 CONTINUE RETURN ! DIDN'T FIND HIM 2010 JPAGE(I)=JPAGE(I)+BPPGS ! COUNT HIS PRINT PAGES JFILES(I)=JFILES(I)+BPNFI ! AND FILES JOBS(I)=JOBS(I)+1 ! AND JOBS RETURN C C.. DISK ACCOUNTING BY DIRECTORY 2100 RETURN C C.. DISK ACCOUNTING BY VOLUME 2200 RETURN C C.. NORMAL LOGIN TRANSACTION 2300 RETURN C C.. SYSTEM CRASH RECOVERY REPORT 2400 JCRASH=JSECND(BCTLS) ! ABSOLUTE TIME OF CRASH SCAN IF(DEBUG) WRITE(3,20000) JCRASH,(IBUF(I),I=1,42) 20000 FORMAT(I12,20O6/22O6) ICRASH=ICRASH+1 ! COUNT CRASHES RETURN C C.. END OF REPORT PROCESSING 9000 LASTAC=LASTAC-1 ! RELEASE UNUSED SLOT DO 9005 J=1,LASTAC 9005 LINK(J)=J ! SET UP INDEX LIST C C.. BUBBLE SORT OF ACCOUNTS 9010 SWAP=.FALSE. ! ASSUME IN ORDER DO 9020 J=1,LASTAC-1 ! LOOP THRU WHOLE LIST C UICCMP RETURNS .TRUE. IF FIRST > SECOND IF(UICCMP(JUUIC(LINK(J+1)),JUUIC(LINK(J)))) GOTO 9020 SWAP=.TRUE. ! FLAG THE SWAP ITMP=LINK(J+1) ! REVERSE THESE TWO LINK(J+1)=LINK(J) ! POINTERS LINK(J)=ITMP 9020 CONTINUE IF(SWAP)GOTO 9010 ! DO IT AGAIN, WE MOVED ONE C DO 9100 JJ=1,LASTAC J=LINK(JJ) ! PICK UP DATA IN SORTED ORDER IF(MOD(JJ,25).NE.1) GOTO 10010 ! PUT IN HEADER EVERY 50 WRITE (2,10000) 10000 FORMAT(1H1,'LOGIN USER NAME LOGINS DEPT ', 1' ACCOUNT # ', 2 T61,'CPU TIME',T70,'DIRECTIVES',T83,'I/O',T93,'TASKS', 3 T106,'PRINT',T113,'CONNECT' 3 / 4 ' UIC',T62,'(TICS)',T72,'ISSUED',T81,'REQUESTS',T94,'RUN', 5 T102,'PAG FIL JOB',T115,'TIME' 7/128('-')/) 10010 UICC=JUUIC(J) CALL R50ASC(3,JUID(J),DEPT) CALL JTIME(JTIM(J),IH,IM,IS) WRITE(2,10100) UIC(2),UIC(1), 1 (JNAM(K,J),K=1,16),JCOUNT(J),DEPT,JACN(J), 2 JCPU(J),JDIR(J),JQIO(J),JTSK(J),JPAGE(J),JFILES(J),JOBS(J), 3 IH,IM,IS CCCCC 3 JTIM(J)/3600,MOD(JTIM(J),3600)/60,MOD(JTIM(J),60) 10100 FORMAT(1X,'[',O3,','O3,']',2X,16A1,I4,2X,A3,4X,I6, 1 9X,4I10, 2 I9,I4,I3, 3 I6,':',I2,':',I2/) 9100 CONTINUE C C.. CALCULATE TOTAL USER STATE AMOUNTS DO 9200 J=1,LASTAC JCOUNT(100)=JCOUNT(100)+JCOUNT(J) JCPU(100)=JCPU(100)+JCPU(J) JDIR(100)=JDIR(100)+JDIR(J) JQIO(100)=JQIO(100)+JQIO(J) JTSK(100)=JTSK(100)+JTSK(J) JTIM(100)=JTIM(100)+JTIM(J) JPAGE(100)=JPAGE(100)+JPAGE(J) JFILES(100)=JFILES(100)+JFILES(J) JOBS(100)=JOBS(100)+JOBS(J) 9200 CONTINUE CALL JTIME(JTIM(100),IH,IM,IS) WRITE(2,10200)LASTAC,JCOUNT(100),IVTLOG,IBATCH,JTSK(100), 1 JCPU(100)/1000,JDIR(100)/1000, 1 JQIO(100)/1000,JPAGE(100),JFILES(100),JOBS(100), 2 IH,IM,IS CCCCC 2 JTIM(100)/3600,MOD(JTIM(100),3600)/60,MOD(JTIM(100),60) 10200 FORMAT(1H1,T10,'ACCOUNTING SYSTEM WIDE USER TOTALS'/// 1T10,'Number of users: ',I12/ T10,'Number of logins: ',I12/ 2T10,'Number of VT logins:',I10/T10,'Number of BATCH jobs:',I9/ 3T10,'Number of tasks: ',I12// 4T10,'CPU Time (TICS): ',I12,' x 1000'/ 5T10,'Directives issued:',I12,' x 1000'/ 6T10,'I/O Requests: ',I12,' x 1000'/ 7T10,' Pages: ',I12/ 7T10,'Print Files: ',I12/ 7T10,' Jobs: ',I12/ 8T10,'Total connect time:',I8,':',I2,':',I2/ 9 ) C WRITE(2,10300)IFILE,IRECRD+JRECRD,NVALID, 1 IALLOC,IDEALL,IMOUNT,IDEMOU,ICRASH 10300 FORMAT (// 1T10,'This run processed',I4,' files with',I8,' records.'/ 2T10,'Invalid or unsuccessful login attempts:',I4// 3T10,'Devices allocated: ',I12/ 4T10,'Devices deallocated: ',I12/ 5T10,'Devices mounted: ',I12/ 6T10,'Devices demounted: ',I12/ 7T10,'Accounting improperly shutdown or system crash:',I4// 9 ) RETURN END C** JTIME - CALC HOURS, MINUTES, SECONDS FROM I*4 SECONDS C SUBROUTINE JTIME(J,IH,IM,IS) C INTEGER*4 J,JM,JS C IH=J/3600 ! HOURS JM=IH*60 ! MINUTES IN THESE HOURS IM=J/60-JM ! REMAINDER MINUTES JS=(IM+JM)*60 ! SECONDS IM THESE MIN/HOUR IS=J-JS ! NET SECONDS RETURN END C** JSWAP - REVERSE WORDS OF I*4 ENTRY C INTEGER*4 FUNCTION JSWAP (JINPUT) C INTEGER*4 J,JINPUT INTEGER I(2) C EQUIVALENCE (J,I) ! OVERLAY 2 INTEGERS ON DOUBLE WORD C+ C FUNCTION: C THIS ROUTINE SWAPS THE WORDS OF THE INPUT I*4 PARAMETER SO C THAT DATA COMPATABLE WITH THE SYSTEM LIBRARY ROUTINES CAN BE USED C WITH FORTRAN 4-PLUS C- J=JINPUT ! GET THE INPUT WORD K=I(1) ! SAVE LOW PART I(1)=I(2) ! COPY HIGH TO LOW I(2)=K ! PUT LOW INTO HIGH JSWAP=J ! RETURN WORD REVERSED RETURN END C** JSECND - CONVERT TIME VECTOR TO SECONDS ABSOLUTE C INTEGER*4 FUNCTION JSECND(BUF) C+ C FUNCTION: C THIS ROUTINE CALCULATES THE TOTAL ELAPSED SECONDS FROM C 00:00:00 1 JAN '80 AND RETURNS IT AS AN INTEGER*4 VALUE C THE INPUT IS A 6 BYTE ARRAY OF BINARY VALUES, STORED AS C YEAR,MONTH,DAY,HOUR,MINUTE, AND SECOND C- BYTE BUF(6) INTEGER BASE(12) INTEGER*4 SIXTY,J24 C C.. INDEX INTO ARRAY FOR THIS FIELD PARAMETER YEAR=1,MONTH=2,DAY=3,HOUR=4,MINUTE=5,SECOND=6 C C.. DAYS TO START OF MONTH DATA BASE/0,31,59,90,120,151,181,212,243,273,304,334/ DATA SIXTY/60/,J24/24/ C C.. ENTRY POINT JSECND=BUF(SECOND)+SIXTY*(BUF(MINUTE)+SIXTY*(BUF(HOUR)+24* 1 (BUF(DAY)-1+BASE(BUF(MONTH))+365*(BUF(YEAR)-80)))) C RETURN END C** UICCMP - COMPARE UIC'S FOR ORDERING PURPOSES C LOGICAL FUNCTION UICCMP (IN1,IN2) C INTEGER*4 J1,J2 INTEGER I1,I2 EQUIVALENCE (I1,J1),(I2,J2) C J1=0 J2=0 I1=IN1 I2=IN2 UICCMP=.FALSE. IF(J1.GT.J2)UICCMP=.TRUE. RETURN END