C
C GENERIC MERGING PROGRAM to create output from primary file with
C                         improved data from auxilliary file
C
C get files
C initialize bufsiz and bufmax
C until eof on primary file
C     read line from primary file
C     if end file then stop (normally)
C     to set up window CALL SETWINDOW(line)
C     match ctr=0
C     do for all elements in buffer
C         if element is in window then
C             increment match ctr and set match ptr
C         else if element below window then
C             cull line from file
C         endif
C     end do
C     while bufsiz < bufmax
C         read line from aux file
C         if end file then
C             bufmax=-1
C             more = false
C         else if line is in window then
C             increment match ctr and set match ptr
C             put in buffer
C         else if line is above window then
C             put in buffer
C         endif
C     end while
C     if match ctr == 0 then
C         output line to no match file
C     else if match ctr == 1 then
C         CALL FMTLINE(line,auxline) to add data from auxline to line
C         output line to match file
C     else
C         output line to blend file
C     endif
C************************************************************************
      PARAMETER (NBUF=10)
      CHARACTER*80 LINE, AUXLINE(NBUF),ALINE
      INTEGER BUFSIZ,BUFMAX
C get files
      CALL FILOPN(LUPRI,LUAUX,LUNULL,LUEQ,LUBLND)
C initialize bufsiz and bufmax
      BUFSIZ=0
      BUFMAX=NBUF
      NMATCH=0
      NNULL=0
      NBLND=0
      NREAD=0
      NPRN=99
C until eof on primary file
C     read line from primary file
  1   READ(LUPRI,100,END=500) LINE
C     if end file then stop (normally)
      NREAD=NREAD+1
      IF(NREAD.GT.NPRN) THEN
          NPRN=NPRN+100
          WRITE(*,*) NREAD,' lines read'
      ENDIF
C     set up window
      CALL SETWINDOW(LINE)
      MATCH =0
C     do for all elements in buffer
      I=1
 10   IF(I.LE.BUFSIZ) THEN
          IFLG=ISWINDOW( AUXLINE(I) )
          IF( IFLG.EQ.0 )THEN
C             element is in window
              MATCH=MATCH+1
              IF(MATCH.LT.I) THEN
                  ALINE=AUXLINE(MATCH)
                  AUXLINE(MATCH)=AUXLINE(I)
                  AUXLINE(I)=ALINE
              ENDIF
              I=I+1
          ELSE IF( IFLG.LT.0 ) THEN
C             cull line from buffer
              AUXLINE(I)=AUXLINE(BUFSIZ)
              BUFSIZ=BUFSIZ-1
          ELSE
              I=I+1
          ENDIF
          GO TO 10
      ENDIF
C     while bufsiz < bufmax
 20   IF(BUFSIZ.LT.BUFMAX)THEN
C         read line from aux file into buffer
          READ(LUAUX,100,IOSTAT=IERR) ALINE
          IF(IERR.NE.0) THEN
              BUFMAX=-1
          ELSE
              IFLG=ISWINDOW( ALINE )
              IF(IFLG.LT.0) THEN
C                 element is below window
                  GO TO 20
              ELSE
                  BUFSIZ=BUFSIZ+1
                  AUXLINE(BUFSIZ)=ALINE
                  IF (IFLG.EQ.0) THEN
                      MATCH=MATCH+1
                      GO TO 20
                  ENDIF
              ENDIF
          ENDIF
      ENDIF
C     end while
      CALL FMTLINE(LINE,AUXLINE,MATCH)
      IF(MATCH.EQ.0) THEN
C         output line to no match file
          NNULL=NNULL+1
          WRITE(LUNULL,100) LINE
      ELSE IF(MATCH.EQ.1) THEN
C         output line to match file
          NMATCH=NMATCH+1
          WRITE(LUEQ,100) LINE
      ELSE
C         output line to blend file
          NBLND=NBLND+1
          WRITE(LUBLND,100) LINE
      ENDIF
      GO TO 1
C
C     if end file then stop (normally)
 500  WRITE(*,*) NNULL,' lines not matched'
      WRITE(*,*) NMATCH,' lines matched'
      WRITE(*,*) NBLND,' lines blended'
C
 100  FORMAT(A)
      END
      SUBROUTINE FILOPN(LUPRI,LUAUX,LUNULL,LUEQ,LUBLND)
C
C   OPEN 5 FILES
C
      CHARACTER*32 FF
      NARG=IARGC()
      LUPRI = 101
      CALL GETARG(1,FF)
      OPEN(LUPRI ,FILE=FF,ERR=500)
      WRITE(*,*) ' primary file :' ,FF
      LUAUX = 102
      CALL GETARG(2,FF)
      OPEN(LUAUX ,FILE=FF,ERR=500)
      WRITE(*,*) '    aux. file :' ,FF
      LUNULL= 103
      IF(NARG.GE.3) THEN
          CALL GETARG(3,FF)
      ELSE
          FF='null.dat'
      ENDIF
      OPEN(LUNULL,FILE=FF,ERR=500)
      WRITE(*,*) '    null file :' ,FF
      IF(NARG.GE.4) THEN
          CALL GETARG(4,FF)
      ELSE
          FF='match.dat'
      ENDIF
      LUEQ=104
      OPEN(LUEQ,FILE=FF,ERR=500)
      WRITE(*,*) '   match file :' ,FF
      IF(NARG.GE.5) THEN
          CALL GETARG(5,FF)
      ELSE
          FF='blnd.dat'
      ENDIF
      LUBLND=105
      OPEN(LUBLND,FILE=FF,ERR=500)
      WRITE(*,*) '   blend file :' ,FF
      RETURN
C
 500  WRITE(*,*) ' OPEN ERROR, FILE =',FF
      STOP
      END

