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