<> <> DIRECTORY Rope USING [ROPE, Size, Fetch, FromRefText], SpellingCorrection; SpellingCorrectionImpl: CEDAR MONITOR IMPORTS Rope EXPORTS SpellingCorrection = BEGIN ROPE: TYPE = Rope.ROPE; BruteForceCorrection: PUBLIC PROC [word: ROPE, f: PROC [REF TEXT] RETURNS [BOOL], buffer: REF TEXT] RETURNS [corrections: LIST OF ROPE _ NIL, newBuffer: REF TEXT] = { <> s: CARDINAL _ word.Size[]; w: REF TEXT; c, t: CHAR; Test: PROC [w: REF TEXT] = INLINE { <> IF f[w] THEN corrections _ CONS[Rope.FromRefText[w], corrections]; }; IF buffer.maxLength < s THEN buffer _ NEW[TEXT[s+1]]; w _ buffer; w.length _ s; FOR i: CARDINAL IN [0..s) DO w[i] _ Rope.Fetch[word, i]; ENDLOOP; <> FOR i: CARDINAL IN [0..s-1) DO t _ w[i]; w[i] _ w[i+1]; w[i+1] _ t; Test[w]; w[i+1] _ w[i]; w[i] _ t; ENDLOOP; <> c _ w[s-1]; w.length _ s - 1; FOR i: CARDINAL DECREASING IN [0..s-1) DO Test[w]; t _ c; c _ w[i]; w[i] _ t; ENDLOOP; Test[w]; w.length _ s; FOR i: CARDINAL DECREASING IN [0..s-1) DO w[i+1] _ w[i]; ENDLOOP; w[0] _ c; <> w.length _ s + 1; FOR i: CARDINAL DECREASING IN [0..s] DO IF i < s THEN w[i+1] _ w[i]; IF i = s THEN c _ w[s-1] ELSE c _ w[i]; IF c IN ['A..'Z] THEN FOR x: CHAR IN ['A..'Z] DO w[i] _ x; Test[w]; ENDLOOP ELSE FOR x: CHAR IN ['a..'z] DO w[i] _ x; Test[w]; ENDLOOP; ENDLOOP; FOR i: CARDINAL IN [0..s) DO w[i] _ w[i+1]; ENDLOOP; w.length _ s; <> FOR i: CARDINAL IN [0..s) DO c _ w[i]; IF c IN ['A..'Z] THEN FOR x: CHAR IN ['A..'Z] DO IF x # c THEN { w[i] _ x; Test[w]; }; ENDLOOP ELSE FOR x: CHAR IN ['a..'z] DO IF x # c THEN { w[i] _ x; Test[w]; }; ENDLOOP; w[i] _ c; ENDLOOP; newBuffer _ buffer; }; END. CHANGE LOG Created by Nix on October 7, 1983 2:22 pm