-- Match.mesa -- modified by McCreight, September 8, 1980 4:30 PM -- written by McCreight, May 30, 1980 6:08 PM -- edited by Brotz, March 9, 1981 5:41 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 DO -- loop for last '* in pattern. WHILE patternPos BEGIN IF patternPos#0 AND patternPos=patternAnchor THEN -- first char(s) of * segment {patternAnchor_patternAnchor+1; nameAnchor_namePos+1}; patternPos_patternPos+1; namePos_namePos+1; END; (pattern[patternPos]='') AND (patternPos -- quoted character matches {patternPos_patternPos+2; namePos_namePos+1}; pattern[patternPos]=name[namePos] => -- chars match {patternPos_patternPos+1; namePos_namePos+1}; 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 => EXIT; namePos_namePos+1; REPEAT FINISHED => RETURN[TRUE]; -- Trailing stuff was harmless. ENDLOOP; IF patternAnchor = 0 THEN RETURN[FALSE] ELSE {patternPos _ patternAnchor; namePos _ nameAnchor _ nameAnchor + 1}; ENDLOOP; 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