INTEGER IN,TEXT,WORDS,SWORDS
      INTEGER MKTEMP,OPEN
      INTEGER MISSP0
      INTEGER MKTABL
      INTEGER STATE(4),INCLU0,VERBO0
      INTEGER GFNARG
      INTEGER FNAME(180)
      INTEGER A$BUF(200)
      INTEGER MEMAA0(32767)
      COMMON /DS$MEM/MEMAA0
      INTEGER PARSCL
      INTEGER AAAAA0(15)
      INTEGER AAAAB0
      INTEGER AAAAC0
      DATA AAAAA0/246,188,230,190,230,188,230,190,238,188,233,231,238,19
     *0,0/
      IF((PARSCL(AAAAA0,A$BUF).NE.-3))GOTO 10000
        CALL ERROR('Usage:  spell [-{v|f}] {file}.')
10000 IF((A$BUF(246-225+1).EQ.0))GOTO 10001
        VERBO0=1
        GOTO 10002
10001   VERBO0=0
10002 IF((A$BUF(230-225+1).EQ.0))GOTO 10003
        INCLU0=1
        GOTO 10004
10003   INCLU0=0
10004 TEXT=MKTEMP(3)
      IF((TEXT.NE.-3))GOTO 10005
        CALL ERROR('can''t create temporary file.')
10005 STATE(1)=1
10006   AAAAB0=GFNARG(FNAME,STATE)
        GOTO 10007
10008     GOTO 10009
10010     CALL PRINT(-15,'*s:  can''t open*n.',FNAME)
        GOTO 10011
10012     IN=OPEN(FNAME,1)
          IF((IN.NE.-3))GOTO 10013
            CALL PRINT(-15,'*s:  can''t open*n.',FNAME)
            GOTO 10014
10013       CALL FCOPY(IN,TEXT)
            CALL CLOSE(IN)
10014   GOTO 10011
10007   AAAAC0=AAAAB0+4
        GOTO(10010,10012,10008),AAAAC0
10011 CONTINUE
      GOTO 10006
10009 WORDS=MKTEMP(3)
      IF((WORDS.NE.-3))GOTO 10015
        CALL ERROR('can''t open temporary file.')
10015 CALL REWIND(TEXT)
      CALL SEPAR0(TEXT,WORDS,INCLU0)
      SWORDS=MKTEMP(3)
      IF((SWORDS.NE.-3))GOTO 10016
        CALL ERROR('can''t open temporary file.')
10016 CALL REWIND(WORDS)
      CALL SORT(WORDS,SWORDS)
      CALL RMTEMP(WORDS)
      CALL REWIND(SWORDS)
      CALL DSINIT(32767)
      MISSP0=MKTABL(0)
      CALL FINDM0(SWORDS,MISSP0)
      IF((VERBO0.NE.1))GOTO 10017
        CALL REWIND(TEXT)
        CALL HIGHL0(TEXT,MISSP0,-11,INCLU0)
        GOTO 10018
10017   CALL REPOR0(MISSP0,-11,INCLU0)
10018 CALL RMTEMP(TEXT)
      CALL RMTEMP(SWORDS)
      CALL SWT
      END
      SUBROUTINE SEPAR0(TEXT,WORDS,IFC)
      INTEGER TEXT,WORDS
      INTEGER IFC
      INTEGER LINE(102),WORD(102)
      INTEGER I,FIRST,LAST
      INTEGER GETWO0,GETLIN
10019 IF((GETLIN(LINE,TEXT).EQ.-1))GOTO 10020
        IF((IFC.NE.0))GOTO 10021
        IF((LINE(1).NE.174))GOTO 10021
          GOTO 10019
10021   I=1
10022   IF((GETWO0(WORD,LINE,I,FIRST,LAST).EQ.-1))GOTO 10023
          CALL PUTLIN(WORD,WORDS)
          CALL PUTCH(138,WORDS)
        GOTO 10022
10023 GOTO 10019
10020 RETURN
      END
      INTEGER FUNCTION GETWO0(WORD,LINE,I,FIRST,LAST)
      INTEGER WORD(102),LINE(102)
      INTEGER I,FIRST,LAST
      INTEGER J
10024   CONTINUE
10025     IF((LINE(I).NE.0))GOTO 10026
            GETWO0=-1
            RETURN
10026     IF((193.GT.LINE(I)))GOTO 10029
          IF((LINE(I).GT.218))GOTO 10029
          GOTO 10028
10029     IF((225.GT.LINE(I)))GOTO 10030
          IF((LINE(I).GT.250))GOTO 10030
          GOTO 10028
10030     GOTO 10027
10028       GOTO 10031
10027     I=I+(1)
        GOTO 10025
10031   J=1
        FIRST=I
10032   IF((LINE(I).EQ.167))GOTO 10034
        IF((193.GT.LINE(I)))GOTO 10035
        IF((LINE(I).GT.218))GOTO 10035
        GOTO 10034
10035   IF((225.GT.LINE(I)))GOTO 10036
        IF((LINE(I).GT.250))GOTO 10036
        GOTO 10034
10036   GOTO 10033
10034     WORD(J)=LINE(I)
          IF((193.GT.WORD(J)))GOTO 10037
          IF((WORD(J).GT.218))GOTO 10037
            WORD(J)=WORD(J)-193+225
10037     J=J+(1)
          I=I+(1)
        GOTO 10032
10033   IF((WORD(J-1).NE.167))GOTO 10038
          J=J-(1)
          LAST=I-2
          GOTO 10039
10038     LAST=I-1
10039   WORD(J)=0
      IF((J.LE.1))GOTO 10024
      GETWO0=J-1
      RETURN
      END
      SUBROUTINE FINDM0(SWORDS,MISSP0)
      INTEGER SWORDS
      INTEGER MISSP0
      INTEGER WORD(102),DWORD(102)
      INTEGER DICTI0
      INTEGER OPEN
      INTEGER I
      INTEGER STRCMP,GETLIN
      INTEGER LENGTH
      INTEGER AAAAD0(13)
      INTEGER AAAAE0
      DATA AAAAD0/189,228,233,227,244,233,239,238,225,242,249,189,0/
      DICTI0=OPEN(AAAAD0,1)
      IF((DICTI0.NE.-3))GOTO 10040
        CALL ERROR('=dictionary=:  can''t open.')
10040 IF((GETLIN(DWORD,DICTI0).NE.-1))GOTO 10041
        CALL ERROR('dictionary is empty!.')
10041 IF((GETLIN(WORD,SWORDS).NE.-1))GOTO 10042
        RETURN
10042 CONTINUE
10043   I=LENGTH(WORD)
        IF((WORD(I-2).NE.167))GOTO 10044
        IF((WORD(I-1).NE.243))GOTO 10044
          I=I-(2)
          WORD(I)=138
          WORD(I+1)=0
10044   AAAAE0=STRCMP(WORD,DWORD)
        GOTO 10045
10046     I=1
          GOTO 10049
10047     I=I+(1)
10049     IF((WORD(I).EQ.138))GOTO 10048
          GOTO 10047
10048     WORD(I)=0
          CALL ENTER(WORD,0,MISSP0)
          IF((GETLIN(WORD,SWORDS).NE.-1))GOTO 10050
            GOTO 10051
10050   GOTO 10052
10053     IF((GETLIN(WORD,SWORDS).NE.-1))GOTO 10054
            GOTO 10051
10054   GOTO 10052
10055     IF((GETLIN(DWORD,DICTI0).NE.-1))GOTO 10056
10057         I=1
              GOTO 10060
10058         I=I+(1)
10060         IF((WORD(I).EQ.138))GOTO 10059
              GOTO 10058
10059         WORD(I)=0
              CALL ENTER(WORD,0,MISSP0)
            IF((GETLIN(WORD,SWORDS).NE.-1))GOTO 10057
            GOTO 10051
10056   GOTO 10052
10045   GOTO(10046,10053,10055),AAAAE0
10052 CONTINUE
      GOTO 10043
10051 CALL CLOSE(DICTI0)
      RETURN
      END
      SUBROUTINE HIGHL0(TEXT,MISSP0,OUT,IFC)
      INTEGER TEXT,OUT
      INTEGER MISSP0
      INTEGER IFC
      INTEGER JUNK,I,FIRST,LAST,J,LIMIT
      INTEGER GETWO0,LOOKUP,GETLIN
      INTEGER LINE(102),WORD(102),HIGHM0(102)
      DO 10061 J=1,102
        HIGHM0(J)=160
10061 CONTINUE
10062 CONTINUE
10063 IF((GETLIN(LINE,TEXT).EQ.-1))GOTO 10064
        CALL PUTCH(160,OUT)
        CALL PUTLIN(LINE,OUT)
        IF((IFC.NE.0))GOTO 10065
        IF((LINE(1).NE.174))GOTO 10065
          GOTO 10063
10065   LIMIT=0
        I=1
10066   IF((GETWO0(WORD,LINE,I,FIRST,LAST).EQ.-1))GOTO 10067
          IF((LOOKUP(WORD,JUNK,MISSP0).NE.1))GOTO 10068
            DO 10069 J=FIRST,LAST
              HIGHM0(J)=LINE(J)
10069       CONTINUE
10070       LIMIT=LAST
10068   GOTO 10066
10067   IF((LIMIT.LE.0))GOTO 10071
          HIGHM0(LIMIT+1)=138
          HIGHM0(LIMIT+2)=0
          CALL PUTCH(171,OUT)
          CALL PUTLIN(HIGHM0,OUT)
          J=1
          GOTO 10074
10072     J=J+(1)
10074     IF((J.GT.LIMIT+2))GOTO 10073
            HIGHM0(J)=160
          GOTO 10072
10073   CONTINUE
10071 GOTO 10063
10064 RETURN
      END
      SUBROUTINE REPOR0(MISSP0,OUT,IFC)
      INTEGER MISSP0
      INTEGER OUT
      INTEGER IFC
      INTEGER POSN
      INTEGER JUNK
      INTEGER SCTABL
      INTEGER EXPAND,NEWWO0,OPEN
      INTEGER WORD(102)
      INTEGER NEWST0(102)
      LOGICAL SAVEB0
      INTEGER AAAAF0(12)
      DATA AAAAF0/189,238,229,247,223,247,239,242,228,243,189,0/
      SAVEB0=(EXPAND(AAAAF0,NEWST0,102).NE.-3)
      IF((.NOT.SAVEB0))GOTO 10075
        NEWWO0=OPEN(NEWST0,3)
        IF((NEWWO0.NE.-3))GOTO 10076
          SAVEB0=.FALSE.
          GOTO 10077
10076     CALL WIND(NEWWO0)
10077 CONTINUE
10075 POSN=0
10078 IF((SCTABL(MISSP0,WORD,JUNK,POSN).EQ.-1))GOTO 10079
        CALL PUTLIN(WORD,OUT)
        CALL PUTCH(138,OUT)
        IF((.NOT.SAVEB0))GOTO 10080
          CALL PUTLIN(WORD,NEWWO0)
          CALL PUTCH(138,NEWWO0)
10080 GOTO 10078
10079 RETURN
      END
      SUBROUTINE SORT(IFD,OFD)
      INTEGER IFD,OFD
      INTEGER LINBUF(32767)
      INTEGER INFIL(7),LINPTR(4096),NLINES,HIGH,LIM,LOW,T
      INTEGER GTEXT
      INTEGER OUTFD
      INTEGER MAKFIL
      HIGH=0
10081   T=GTEXT(LINPTR,NLINES,LINBUF,IFD)
        CALL QUICK(LINPTR,NLINES,LINBUF)
        IF((T.NE.-1))GOTO 10083
        IF((HIGH.GT.0))GOTO 10083
        GOTO 10082
10083     HIGH=HIGH+(1)
          OUTFD=MAKFIL(HIGH)
          CALL PTEXT(LINPTR,NLINES,LINBUF,OUTFD)
          CALL CLOSE(OUTFD)
10082 CONTINUE
      IF((T.NE.-1))GOTO 10081
      IF((HIGH.NE.0))GOTO 10084
        CALL PTEXT(LINPTR,NLINES,LINBUF,OFD)
        CALL REWIND(OFD)
        RETURN
10084 LOW=1
      GOTO 10087
10085 LOW=LOW+(7)
10087 IF((LOW.GE.HIGH))GOTO 10086
        LIM=MIN0(LOW+7-1,HIGH)
        CALL GOPEN(INFIL,LOW,LIM)
        IF((LIM.LT.HIGH))GOTO 10088
          CALL MERGE(INFIL,LIM-LOW+1,OFD)
          GOTO 10089
10088     HIGH=HIGH+(1)
          OUTFD=MAKFIL(HIGH)
          CALL MERGE(INFIL,LIM-LOW+1,OUTFD)
          CALL CLOSE(OUTFD)
10089   CALL GREMOV(INFIL,LOW,LIM)
      GOTO 10085
10086 CALL REWIND(OFD)
      RETURN
      END
      SUBROUTINE GNAME(N,NAME)
      INTEGER N
      INTEGER NAME(30)
      INTEGER AAAAG0(17)
      DATA AAAAG0/189,244,229,237,240,189,175,243,240,189,240,233,228,18
     *9,170,233,0/
      CALL ENCODE(NAME,30,AAAAG0,N)
      RETURN
      END
      INTEGER FUNCTION MAKFIL(N)
      INTEGER N
      INTEGER NAME(30)
      INTEGER CREATE
      CALL GNAME(N,NAME)
      MAKFIL=CREATE(NAME,3)
      IF((MAKFIL.NE.-3))GOTO 10090
        CALL CANT(NAME)
10090 RETURN
      END
      SUBROUTINE GOPEN(INFIL,LOW,LIM)
      INTEGER INFIL(7)
      INTEGER LOW,LIM
      INTEGER NAME(30)
      INTEGER I
      INTEGER OPEN
      I=1
      GOTO 10093
10091 I=I+(1)
10093 IF((I.GT.LIM-LOW+1))GOTO 10092
        CALL GNAME(LOW+I-1,NAME)
        INFIL(I)=OPEN(NAME,1)
        IF((INFIL(I).NE.-3))GOTO 10094
          CALL CANT(NAME)
10094 GOTO 10091
10092 RETURN
      END
      SUBROUTINE GREMOV(INFIL,LOW,LIM)
      INTEGER INFIL(7)
      INTEGER LOW,LIM
      INTEGER NAME(30)
      INTEGER I
      I=1
      GOTO 10097
10095 I=I+(1)
10097 IF((I.GT.LIM-LOW+1))GOTO 10096
        CALL CLOSE(INFIL(I))
        CALL GNAME(LOW+I-1,NAME)
        CALL REMOVE(NAME)
      GOTO 10095
10096 RETURN
      END
      SUBROUTINE MERGE(INFIL,NFILES,OUTFIL)
      INTEGER INFIL(7),OUTFIL
      INTEGER NFILES
      INTEGER LINBUF(900)
      INTEGER GETLIN
      INTEGER I,INF,LBP,LP1,NF,LINPTR(7)
      LBP=1
      NF=0
      I=1
      GOTO 10100
10098 I=I+(1)
10100 IF((I.GT.NFILES))GOTO 10099
        IF((GETLIN(LINBUF(LBP),INFIL(I)).EQ.-1))GOTO 10101
          NF=NF+(1)
          LINPTR(NF)=LBP
          LBP=LBP+(102)
10101 GOTO 10098
10099 CALL QUICK(LINPTR,NF,LINBUF)
10102 IF((NF.LE.0))GOTO 10103
        LP1=LINPTR(1)
        CALL PUTLIN(LINBUF(LP1),OUTFIL)
        INF=LP1/102+1
        IF((GETLIN(LINBUF(LP1),INFIL(INF)).NE.-1))GOTO 10104
          LINPTR(1)=LINPTR(NF)
          NF=NF-(1)
10104   CALL REHEAP(LINPTR,NF,LINBUF)
      GOTO 10102
10103 RETURN
      END
      SUBROUTINE REHEAP(LINPTR,NF,LINBUF)
      INTEGER LINPTR(1),NF
      INTEGER LINBUF(32767)
      INTEGER I,J
      INTEGER COMPA0
      I=1
      GOTO 10107
10105 I=J
10107 IF((2*I.GT.NF))GOTO 10106
        J=2*I
        IF((J.GE.NF))GOTO 10108
          IF((COMPA0(LINPTR(J),LINPTR(J+1),LINBUF).LE.0))GOTO 10109
            J=J+(1)
10109   CONTINUE
10108   IF((COMPA0(LINPTR(I),LINPTR(J),LINBUF).GT.0))GOTO 10110
          GOTO 10106
10110   CALL EXCHAN(LINPTR(I),LINPTR(J),LINBUF)
      GOTO 10105
10106 RETURN
      END
      INTEGER FUNCTION GTEXT(LINPTR,NLINES,LINBUF,INFILE)
      INTEGER LINPTR(4096),NLINES
      INTEGER LINBUF(32767)
      INTEGER INFILE
      INTEGER LBP,LEN
      INTEGER GETLIN
      NLINES=0
      LBP=1
10111   LEN=GETLIN(LINBUF(LBP),INFILE)
        IF((LEN.NE.-1))GOTO 10112
          GOTO 10113
10112   NLINES=NLINES+(1)
        LINPTR(NLINES)=LBP
        LBP=LBP+(LEN+1)
      IF((LBP.GE.32767-102))GOTO 10114
      IF((NLINES.GE.4096))GOTO 10114
      GOTO 10111
10114 CONTINUE
10113 GTEXT=LEN
      RETURN
      END
      SUBROUTINE PTEXT(LINPTR,NLINES,LINBUF,OUTFIL)
      INTEGER LINPTR(4096),NLINES
      INTEGER LINBUF(32767)
      INTEGER OUTFIL
      INTEGER I,J
      I=1
      GOTO 10117
10115 I=I+(1)
10117 IF((I.GT.NLINES))GOTO 10116
        J=LINPTR(I)
        CALL PUTLIN(LINBUF(J),OUTFIL)
      GOTO 10115
10116 RETURN
      END
      INTEGER FUNCTION COMPA0(LP1,LP2,LINBUF)
      INTEGER LP1,LP2
      INTEGER LINBUF(1)
      INTEGER C1,C2,UC1,UC2
      INTEGER MAPUP
      INTEGER I,J
      I=LP1
      J=LP2
10118   C1=LINBUF(I)
        C2=LINBUF(J)
        IF((C1.EQ.C2))GOTO 10119
          GOTO 10120
10119   IF((C1.NE.0))GOTO 10121
          COMPA0=0
          RETURN
10121   I=I+(1)
        J=J+(1)
      GOTO 10118
10120 UC1=MAPUP(C1)
      UC2=MAPUP(C2)
      GOTO 10122
10123   COMPA0=-1
      GOTO 10124
10125   COMPA0=+1
      GOTO 10124
10126   COMPA0=-1
      GOTO 10124
10122 IF((UC1.LT.UC2))GOTO 10123
      IF((UC1.GT.UC2))GOTO 10125
      IF((225.GT.C1))GOTO 10127
      IF((C1.GT.250))GOTO 10127
      GOTO 10126
10127 CONTINUE
        COMPA0=+1
10124 RETURN
      END
      SUBROUTINE EXCHAN(LP1,LP2,LINBUF)
      INTEGER LP1,LP2
      INTEGER LINBUF(1)
      INTEGER K
      K=LP1
      LP1=LP2
      LP2=K
      RETURN
      END
      SUBROUTINE QUICK(LINPTR,NLINES,LINBUF)
      INTEGER LINPTR(1),NLINES
      INTEGER LINBUF(1)
      INTEGER I,J,LV(12),P,PIVLIN,UV(12)
      INTEGER COMPA0
      LV(1)=1
      UV(1)=NLINES
      P=1
10128 IF((P.LE.0))GOTO 10129
        IF((LV(P).LT.UV(P)))GOTO 10130
          P=P-(1)
          GOTO 10131
10130     I=LV(P)-1
          J=UV(P)
          PIVLIN=LINPTR(J)
10132     IF((I.GE.J))GOTO 10133
            I=I+(1)
            GOTO 10136
10134       I=I+(1)
10136       IF((COMPA0(LINPTR(I),PIVLIN,LINBUF).GE.0))GOTO 10135
            GOTO 10134
10135       J=J-(1)
            GOTO 10139
10137       J=J-(1)
10139       IF((J.LE.I))GOTO 10138
              IF((COMPA0(LINPTR(J),PIVLIN,LINBUF).GT.0))GOTO 10140
                GOTO 10138
10140       GOTO 10137
10138       IF((I.GE.J))GOTO 10141
              CALL EXCHAN(LINPTR(I),LINPTR(J),LINBUF)
10141     GOTO 10132
10133     J=UV(P)
          CALL EXCHAN(LINPTR(I),LINPTR(J),LINBUF)
          IF((I-LV(P).GE.UV(P)-I))GOTO 10142
            LV(P+1)=LV(P)
            UV(P+1)=I-1
            LV(P)=I+1
            GOTO 10143
10142       LV(P+1)=I+1
            UV(P+1)=UV(P)
            UV(P)=I-1
10143     P=P+(1)
10131 GOTO 10128
10129 RETURN
      END
C ---- Long Name Map ----
C highlightmisspellings          highl0
C misspellings                   missp0
C compare                        compa0
C includefmtcommands             inclu0
C newstuff                       newst0
C verbose                        verbo0
C reportmisspellings             repor0
C newwords                       newwo0
C Mem                            memaa0
C getword                        getwo0
C savebadwords                   saveb0
C separate                       separ0
C findmisspellings               findm0
C dictionary                     dicti0
C highlighter                    highm0