C CONSOLE - LAST MODIFIED 14-MAY-81 C C A PROGRAM TO READ (A) REQUESTED CONSOLE LOG FILE(S) AND PRODUCE (A) C COMPRESSED VERSION(S). IT WILL ACCESS CONSOLE.LOG;VERSION OVER A C USER SPECIFIED RANGE OF VERSIONS. EACH SUCH FILE WILL GIVE RISE TO C A COMPRESSED CONSOLE.CLG FILE WITH THE SAME VERSION. A USER MAY C OPTIONALLY HAVE THE PROGRAM CREATE ONE OUTPUT FILE, C WITH A USER-SPECIFIED NAME, WHICH WILL CONTAIN C THE COMPRESSED DATA OF ALL OF THE CONSOLE.LOG FILES REQUESTED. C FILES ARE COMPRESSED BY THE ELIMINATION OF EXTRANEOUS CONTROL C CHARACTERS AND DUPLICATED RECORDS. C C LLOYD A. TREINISH C CODE 934 C GSFC C NOVEMBER 1979 C C MODIFICATIONS - C C 08-FEB-81 - MODIFIED TO CHECK FOR LENGTH ZERO RECORDS, REPORT C THEM, AND TREAT EACH AS AN END OF FILE. ALSO, IF THE C LAST RECORD IN THE FILE IS A "REPEAT," PRINT THE C APPROPRIATE MESSAGE. C C BOB TURKELSON C NASA/GSFC CODE 935 C GREENBELT, MD 20771 C C 14-MAY-81 - MODIFIED TO PROMPT FOR OUTPUT FILE NAME IF CONCATENATION C IS DESIRED (RATHER THAN USING THE DATE WITHIN THE FIRST C RECORD TO FORM THE FILE NAME); TO CHANGE TO A ONE BYTE Y/N C RESPONSE; TO REPORT INPUT FILE ERRORS AND TREAT AS AN END OF C FILE. C BOB TURKELSON C C NOTES: C THIS PROGRAM IS INTEDED TO BE RUN FROM UIC [1,4]. C C SEE THE NOTE A FEW LINES BELOW STATEMENT 45 BELOW. OUR C [1,2]STARTUP.CMD ISSUES A C "BRO ALL: ..." C WHICH RESULTS IN THE CURRENT DATE AND TIME BEING CONTAINED C WITHIN THE FIRST RECORD OF CONSOLE.LOG. THIS PROGRAM C ENTERS THE DATE/TIME INTO THE OUTPUT FILE HEADINGS. C C TO COMPILE AND BUILD: C F4P CONSOLE,CONSOLE/NOSP=CONSOLE C TKB @CONSOLBLD C C CONSOLBLD.CMD CONTAINS: C CONSOLE,CONSOLE/NOSP=CONSOLE C / C MAXBUF=520 C // C LOGICAL*1 INPREC(512), LSTREC(512), INDATA(504), LDATA(504), 1 FNAME(18), OUTNAM(20), LTIME(8), VERS(5), FIRST, ANSWER INTEGER*2 VERSON, SRTVER, ENDVER, LENGTH, LLGNTH, COUNT DATA FNAME(1), FNAME(2), FNAME(3), FNAME(4), FNAME(5), FNAME(6), 1 FNAME(7), FNAME(8)/'C', 'O', 'N', 'S', 'O', 'L', 'E', '.'/, 2 FNAME(12), FNAME(18)/';', 0/ EQUIVALENCE (INDATA(1), INPREC(9)), (LTIME(1), LSTREC(1)), (LDATA(1), 1 LSTREC(9)), (VERS(1), FNAME(13)) C C PROMPT USER FOR INPUT/OUTPUT VERSION SPECIFICATIONS. C TYPE *, 'PLEASE SUPPLY STARTING 5-DIGIT OCTAL VERSION NUMBER' ACCEPT 170, SRTVER TYPE *, 'PLEASE SUPPLY ENDING 5-DIGIT OCTAL VERSION NUMBER (0 => ', 1 'SAME AS STARTING NUMBER)' ACCEPT 170, ENDVER IF (ENDVER.EQ.0) ENDVER = SRTVER TYPE *, 'DO YOU WANT ALL THE OUTPUT CONCATENATED INTO ONE FILE?', 1 '(Y/N)' ACCEPT 180, ANSWER IF(ANSWER.NE.'Y') GO TO 5 C PROMPT USER FOR OUTPUT FILE NAME TYPE *, 'ENTER OUTPUT FILE NAME' ACCEPT 200, LENOFN, OUTNAM C INSERT ZERO BYTE AT END OF NAME OUTNAM(MIN(LENOFN+1,20))=0 C OPEN OUTPUT FILE OPEN(UNIT=2, NAME=OUTNAM, RECORDSIZE=513, ERR=160) 5 CONTINUE INCR = 1 IF (ENDVER.LT.SRTVER) INCR = -1 C C LOOP FOR EACH REQUESTED VERSION. C DO 100 VERSON = SRTVER, ENDVER, INCR C C OPEN CURRENT INPUT FILE. C ENCODE(5, 170, VERS) VERSON FNAME(9) = 'L' FNAME(10) = 'O' FNAME(11) = 'G' OPEN(UNIT=1, NAME=FNAME, TYPE='OLD', RECORDSIZE=512, READONLY, 1 ERR=85) C C OPEN CURRENT OUTPUT FILE. C IF THE OUTPUT FILES ARE TO BE CONCATENATED THEN CREATE ONE FILE C WITH A USER SPECIFIED NAME, AND KEEP IT C OPEN UNTIL ALL VERSIONS ARE PROCESSED. C OTHERWISE, CREATE ONE FILE FOR EACH INPUT FILE. C IF (ANSWER.EQ.'Y') GO TO 15 FNAME(9) = 'C' FNAME(10) = 'L' FNAME(11) = 'G' OPEN(UNIT=2, NAME=FNAME, RECORDSIZE=513, ERR=160) 15 DO 20 I = 1, 512 20 LSTREC(I) = ' ' LLGNTH = 0 COUNT = 1 FIRST = .TRUE. 30 DO 40 I = 1, 512 40 INPREC(I) = ' ' C C READ AN INPUT RECORD, FLAG IT IF IT IS THE FIRST RECORD IN C THE FILE, AND COMPARE IT WITH THE PREVIOUS RECORD. C READ (1, 200, END=90, ERR=85) LENGTH, INPREC IF (LENGTH.GT.512) TYPE 210, LENGTH, INPREC IF (LENGTH.NE.0) GO TO 45 C REPORT ZERO LENGTH RECORD TO USER AND INDICATE IN OUTPUT FILE; C TREAT AS AN EOF TYPE 230,VERSON WRITE (2,230) VERSON LLNGTH=LENGTH GO TO 90 45 CONTINUE IF (LENGTH.GT.512) LENGTH = 512 C NOTE: IF FIRST CONSOLE RECORD DOES NOT CONTAIN DATE/TIME, MODIFY C WRITE STATEMENT BELOW, REMOVING ", (INPREC..." IF (FIRST) WRITE (2, 220) VERSON, (INPREC(I), I = 15, 29) IF (FIRST) FIRST = .FALSE. IF (LENGTH.NE.LLNGTH.OR.LENGTH.LT.8) GO TO 60 DO 50 I = 1, LENGTH - 8 IF (INDATA(I).NE.LDATA(I).AND.INDATA(I).GT."15) GO TO 60 50 CONTINUE C C THE CURRENT RECORD IS THE SAME AS THE PREVIOUS RECORD - DO NOT C PRINT IT AND INCREMENT THE REPETITION COUNTER. C COUNT = COUNT + 1 GO TO 70 C C THE CURRENT RECORD IS DIFFERENT THAN THE PREVIOUS RECORD. C 60 CALL CHKCNT (COUNT, INPREC, LENGTH, LTIME) C C SET THE PREVIOUS RECORD TO THE CURRENT RECORD AND GET NEW C CURRENT RECORD. C 70 LLNGTH = LENGTH DO 80 I = 1, LENGTH 80 LSTREC(I) = INPREC(I) GO TO 30 C C I/O ERROR ON INPUT FILE; REPORT TO USER AND INDICATE C IN OUTPUT FILE; TREAT AS AN EOF 85 TYPE 240,VERSON WRITE (2,240) VERSON LLNGTH=LENGTH GO TO 90 C C CLOSE FILES AND GET NEW VERSION. C 90 CLOSE(UNIT=1) C IF LAST RECORD IN FILE IS A "REPEAT," PRINT REPEATED MSG LENGTH=-1 IF (COUNT.GT.1) CALL CHKCNT(COUNT,INREC,LENGTH,LTIME) IF (ANSWER.NE.'Y'.OR.VERSON.EQ.ENDVER) CLOSE(UNIT=2) C END OF LOOP 100 CONTINUE STOP 160 STOP 'I/O ERROR ON OUTPUT FILE' C 170 FORMAT (O5) 180 FORMAT (A1) 190 FORMAT (T15, 2A1, 1X, 3A1, 2X, A1) 200 FORMAT (Q, 4(128A1)) 210 FORMAT (' THE FOLLOWING INPUT RECORD HAS', I4, ' CHARACTERS AND ', 1 'WAS TRUNCATED AFTER 512'/' CHARACTERS:'/4(1X, 128A1/)) 220 FORMAT('1CONSOLE FILE VERSION #', O6, :,' BEGINNING ', 15A1) 230 FORMAT (/' *** ZERO LENGTH RECORD FOUND IN FILE VERSION ',O5, 1 ' - REST OF FILE IGNORED ***') 240 FORMAT (/' *** I/O ERROR IN INPUT FILE VERSION ',O5, 1 ' - REST OF FILE IGNORED ***') END SUBROUTINE CHKCNT (COUNT, INPREC, LENGTH, LTIME) C C ROUTINE TO HANDLE A NEW CURRENT RECORD (I.E. DIFFERENT THAN THE PRE- C VIOUS RECORD). SPECIAL CALL IF LENGTH NON-POSITIVE TO PRINT C "PREVIOUS MESSAGE REPEATED" IF APPROPRIATE AT END OF FILE. C LOGICAL*1 INPREC(512), LTIME(8), CR, LF, BELL INTEGER*2 COUNT, LENGTH DATA CR, LF, BELL/"15, "12, "7/ C C CONVERT CERTAIN CONTROL CHARACTERS TO BLANKS. C IF (LENGTH.LE.0) GO TO 15 C DO 10 I = 1, LENGTH 10 IF (INPREC(I).EQ.CR.OR.INPREC(I).EQ.LF.OR.INPREC(I).EQ.BELL) 1 INPREC(I) = ' ' C C DOES THE CURRENT RECORD END A GROUP OF REPEATED RECORDS? C 15 IF (COUNT.EQ.1) GO TO 20 C C YES, FLAG THE GROUP. C WRITE (2, 40) COUNT, LTIME COUNT = 1 IF (LENGTH.LE.0) GO TO 35 C C OUTPUT EDITED VERSION OF THE CURRENT RECORD. C 20 DO 30 I = 1, IFIX(LENGTH/128 + 1.5) JEND=MIN(I*128,LENGTH) 30 WRITE (2, 50) (INPREC(J), J = (I - 1)*128 + 1, JEND) 35 RETURN C 40 FORMAT (T12, 'PREVIOUS MESSAGE REPEATED', I4, ' TIMES UNTIL ', 8A1) 50 FORMAT (1X, 128A1) END