      PROGRAM COMPFITS
C----------------------------------------------------------------------
C   This VAX FORTRAN-77 program compares FITS-like files to assure that
C   they are identical. It uses the SYS$TRNLOG service in the same
C   way that COPYFITS does in order to be able to read either tape
C   or disk. It rewinds both inputs and then does a comparison of both 
C   their structure and their contents. It types out informative 
C   messages about the structure as it proceeds. The input logical
C   names are INFIL1 and INFIL2.
C   DCW, 04Jan82; revised slightly 15Sept83.
C----------------------------------------------------------------------
      INTEGER*4   NF, NR, NT
      INTEGER*4   STATUS, SYS$TRNLOG, SS$_NORMAL, SS$_NOTRAN
      CHARACTER   INNAM1*63, INCLS1*4, B1*2880, DEVTYP*4
      CHARACTER   INNAM2*63, INCLS2*4, B2*2880
C
      DATA        SS$_NORMAL /1/, SS$_NOTRAN /'00000629'X/
C-----------------------------------------------------------------------
C                                       Is input1 tape, or disk?
      STATUS = SYS$TRNLOG ('INFIL1', LC, INNAM1, , , )
      IF (STATUS.EQ.SS$_NORMAL) GO TO 1
         IF (STATUS.EQ.SS$_NOTRAN) TYPE *, 'INFIL1 not ASSIGNed!'
         IF (STATUS.NE.SS$_NOTRAN) TYPE *, 
     *      'Unexpected STATUS returned by SYS$TRNLOG! STATUS=', STATUS
         GO TO 999
 1    CONTINUE
      DEVTYP = INNAM1(1:2)
      IF (DEVTYP(1:1).EQ.'_') DEVTYP = INNAM1(2:3)
      INCLS1 = 'DISK'
C                                       MF = TU78; 
C                                       MM = 6250 bpi drives @ NRAO;
C                                       MS = TS-11;
C                                       MT = TE16, TU45, or TU77:
      IF ((DEVTYP.EQ.'MF') .OR. (DEVTYP.EQ.'MM') .OR. (DEVTYP.EQ.'MS')
     *                     .OR. (DEVTYP.EQ.'MT')) INCLS1 = 'TAPE'
      TYPE *, 'INFIL1=', ''''//INNAM1(1:LC)//''',', 
     *            'Device_Class=',INCLS1
      IF (INCLS1.EQ.'DISK') OPEN (UNIT=1, FILE=INNAM1,
     *                           STATUS='OLD', READONLY)
      IF (INCLS1.EQ.'TAPE') OPEN (UNIT=1, FILE=INNAM1, STATUS='OLD', 
     *                     ACCESS='SEQUENTIAL', FORM='FORMATTED',
     *                     RECORDTYPE='FIXED', RECL=2880, BUFFERCOUNT=2)
C                                       Is input2 tape, or disk?
      STATUS = SYS$TRNLOG ('INFIL2', LC, INNAM2, , , )
      IF (STATUS.EQ.SS$_NORMAL) GO TO 2
         IF (STATUS.EQ.SS$_NOTRAN) TYPE *, 'INFIL2 not ASSIGNed!'
         IF (STATUS.NE.SS$_NOTRAN) TYPE *, 
     *      'Unexpected STATUS returned by SYS$TRNLOG! STATUS=', STATUS
         GO TO 999
 2    CONTINUE
      DEVTYP = INNAM2(1:2)
      IF (DEVTYP(1:1).EQ.'_') DEVTYP = INNAM2(2:3)
      INCLS2 = 'DISK'
C                                       MF = TU78; 
C                                       MM = 6250 bpi drives @ NRAO;
C                                       MS = TS-11;
C                                       MT = TE16, TU45, or TU77:
      IF ((DEVTYP.EQ.'MF') .OR. (DEVTYP.EQ.'MM') .OR. (DEVTYP.EQ.'MS')
     *                     .OR. (DEVTYP.EQ.'MT')) INCLS2 = 'TAPE'
      TYPE *, 'INFIL2=', ''''//INNAM2(1:LC)//''',', 
     *            'Device_Class=',INCLS2
      IF (INCLS2.EQ.'DISK') OPEN (UNIT=2, FILE=INNAM2,
     *                           STATUS='OLD', READONLY)
      IF (INCLS2.EQ.'TAPE') OPEN (UNIT=2, FILE=INNAM2, STATUS='OLD',
     *                     ACCESS='SEQUENTIAL', FORM='FORMATTED',
     *                     RECORDTYPE='FIXED', RECL=2880, BUFFERCOUNT=2)
C
      REWIND 1
      REWIND 2
      NF = 0
      NT = 0
C                                    Loop to compare files:
 40   CONTINUE
      NR = 0
C                                    Loop to compare records in a file:
 50   CONTINUE
      READ (1, 1020, END=70) B1
      NR = NR + 1
      NT = NT + 1
      READ (2, 1020, END=80) B2
      IF (B1.NE.B2) GO TO 90
      GO TO 50
C                                    Assure tapemarks in same position:
 70   CONTINUE
      READ (2, 1020, END=100) B2
      TYPE *, ' Tapemark seen on 1 but not seen on 2!   NR=', NR
      STOP 70
C
 80   CONTINUE
      TYPE *, ' Tapemark seen on 2 but not seen on 1!   NR=', NR
      STOP 80
C
 90   CONTINUE
      TYPE *, ' Bad compare in record', NR
      STOP 90
C                                    Tapemark seen on both tapes:
 100  CONTINUE
      NF = NF + 1
      NT = NT + 1
      TYPE *, ' Tapemark number', NF, ' seen after', NR, ' records.'
C                                    Test for double tapemark:
      IF (NR.GT.0) GO TO 40
C
      TYPE *, ' Double tape mark seen. Good compare!'
      TYPE *, ' Total number of blocks (data+tapemarks) =', NT
C
      CLOSE (UNIT=1)
      CLOSE (UNIT=2)
C
 999  STOP
C----------------------------------------------------------------------
 1020 FORMAT (A2880)
      END
