SUBROUTINE CRCTLN(LINE,NL,WORD,WLIST2,WHERE,DEBUG) C+ C SUBROUTINE CRCTLN WILL CORRECT THE GIVEN LINE SO C THAT THE MISSPELLED WORD WILL BE REPLACED WITH C THE CORRECT WORD FROM THE LIST WLIST2. C C LINE LINE TO BE CORRECTED C NL LENGTH OF LINE IN BYTES C WORD MISSPELLED WORD C WLIST2 LIST OF CORRECTIONS THAT CAN BE MADE C WHERE THE ELEMENT IN WLIST2 TO BE USED IN PLACE OF WORD C C LOCAL VARIABLES C CLINE - CHARACTER EQUIVALENCE OF BYTE LINE C BLINE - PLACE TO COPY LINE FOR MANIPULATION C BWRDB - PLACE TO COPY WORD FOR MANIPULATION C FIRST - LOOP VARIABLE USED FOR UPPER VS LOWER CASE SEARCH C ILENR - LENGTH OF CORRECT WORD C ILENW - LENGTH OF INCORRECT WORD C IPOS - POSITION IN LINE OF INCORRECT WORD C LAST - POSITION IN LINE OF END OF INCORRECT WORD C NLINE - NEW COPY OF OLD LINE CORRECTED C C SUBROUTINES AND FUNCTIONS REFERENCED C CLEAR - PUT NULLS IN BYTE ARRAY C LOWER - CONVERT UPPER CASE LETTERS TO LOWER CASE C INDEX - FORTRAN ROUTINE TO FIND POSITION IN CHAR STRINGS C C- CHARACTER*25 WORD,CLINE*255,BWORD INTEGER*2 WHERE BYTE LINE(NL),BLINE(255),NLINE(255),BWRDB(25) BYTE WLIST2(25,100) !IN MAIN 100 WORDS/LIST LOGICAL*1 DEBUG,FIRST EQUIVALENCE (BLINE(1),CLINE) EQUIVALENCE (BWORD,BWRDB(1)) C FIRST=.TRUE. CALL CLEAR(BLINE,255) DO 10,I=1,NL 10 BLINE(I)=LINE(I) 20 CALL LOWER(BLINE,NL) ILENW=INDEX(WORD,' ')-1 IF(ILENW.EQ.0)ILENW=25 IF(DEBUG)WRITE(3,1000)CLINE,WORD IPOS=INDEX(CLINE,WORD(1:ILENW)) !WHERE WORD IS IN LINE IF(IPOS.EQ.0)THEN !WORD NOT IN LINE? IF(FIRST)THEN !MAYBE WORD IS UPPER CALL LOWER(WORD,25) FIRST=.FALSE. !TRY AGAIN GO TO 20 END IF WRITE(3,1010) !2ND TIME WE GOT PROBM RETURN END IF DO 30,I=25,1,-1 IF(WLIST2(I,WHERE).NE.'0'O 1.AND.WLIST2(I,WHERE).NE.' ')THEN ILENR=I !HOW LONG RIGHT WORD GO TO 40 END IF 30 BWRDB(I)=WLIST2(I,WHERE) ILENR=25 !LONGER THAN LOOP? C C NOW COPY LINE UP TO WRONG WORD, INSERT RIGHT WORD, AND COPY REST C OF THE LINE. C 40 J=0 !NEW LINE POSITION DO 50,I=1,IPOS-1 !COPY UNTIL WRONG WORD J=J+1 50 NLINE(J)=LINE(I) DO 60,I=1,ILENR !COPY RIGHT WORD J=J+1 NLINE(J)=WLIST2(I,WHERE) 60 CONTINUE DO 70,I=ILENW+IPOS,NL !COPY REST OF LINE J=J+1 70 NLINE(J)=LINE(I) LAST=J DO 80,I=1,LAST !RECOPY LINE 80 LINE(I)=NLINE(I) NL=LAST !ADJUST LENGTH SHOWN RETURN 1000 FORMAT(' CL=',132A,/,' WORD=',A) 1010 FORMAT(' CRCTLN!') END