-- Match.mesa -- modified by McCreight, September 8, 1980 4:30 PM -- written by McCreight, May 30, 1980 6:08 PM DIRECTORY MatchDefs: FROM "MatchDefs" USING []; Match: PROGRAM IMPORTS -- nothing -- EXPORTS MatchDefs = PUBLIC BEGIN -- IsMatch: PROCEDURE[name,pattern:STRING] RETURNS [BOOLEAN] = BEGIN -- does the name match the pattern? patternPos,namePos,patternAnchor,nameAnchor:CARDINAL; patternAnchor_0; nameAnchor_0; -- where name began matching non-* seg of pattern patternPos_patternAnchor; namePos_nameAnchor; -- next compare position WHILE patternPos BEGIN IF patternPos#0 AND patternPos=patternAnchor THEN -- first char(s) of * segment BEGIN patternAnchor_patternAnchor+1; nameAnchor_namePos+1 END; patternPos_patternPos+1; namePos_namePos+1; END; (pattern[patternPos]='') AND (patternPos -- quoted character matches BEGIN patternPos_patternPos+2; namePos_namePos+1; END; pattern[patternPos]=name[namePos] => -- chars match BEGIN patternPos_patternPos+1; namePos_namePos+1; END; ENDCASE => BEGIN IF patternAnchor=0 THEN RETURN[FALSE]; -- char mismatch, no pattern * thus far patternPos_patternAnchor; nameAnchor_nameAnchor+1; namePos_nameAnchor END; ENDLOOP; IF namePos>=name.length OR patternAnchor>=pattern.length THEN -- name finished or pattern ends with * RETURN[TRUE]; WHILE namePos NULL; '! => BEGIN namePos_namePos+1; WHILE namePos NULL; ENDCASE => EXIT; namePos_namePos+1; ENDLOOP; END; ENDCASE => RETURN[FALSE]; namePos_namePos+1; ENDLOOP; RETURN[TRUE]; -- trailing stuff was harmless END; -- IsMatch -- Capitalize: PROCEDURE[s,capS: STRING] = BEGIN c:CHARACTER; i:CARDINAL; capS.length_s.length; FOR i IN [0..s.length) DO c_s[i]; IF c IN ['a..'z] THEN capS[i]_c-40B ELSE capS[i]_c; ENDLOOP; END; -- UnCapitalize: PROCEDURE[s,unCapS: STRING] = BEGIN c:CHARACTER; i:CARDINAL; unCapS.length_s.length; FOR i IN [0..s.length) DO c_s[i]; IF c IN ['A..'Z] THEN unCapS[i]_c+40B ELSE unCapS[i]_c; ENDLOOP; END; -- Main Program END.z19932e12(1270)\f1 z19932e12