MODULE***** VAR (*READONLY; IMPORT ASCII, Text, TextExtras; CharMap
SortOrder : ARRAY CHAR OF CHAR;
=> control characters, punctuation, numbers,A
,a
,B
,b
, ...
PROCEDURE Init () = VAR next: CHAR; BEGIN next := FIRST (CHAR); FOR c := FIRST (CHAR) TO LAST (CHAR) DO IF (('0' <= c) AND (c <= '9')) OR (('a' <= c) AND (c <= 'z')) OR (('A' <= c) AND (c <= 'Z')) THEN (* skip *) ELSE SortOrder [c] := next; INC (next); END; END; FOR c := '0' TO '9' DO SortOrder [c] := next; INC (next); END; FOR c := 'a' TO 'y' DO SortOrder [ASCII.Upper[c]] := next; INC(next); SortOrder [c] := next; INC (next); END; SortOrder ['Z'] := next; INC(next); SortOrder ['z'] := next; <*ASSERT next = LAST (CHAR)*> END Init; ********) PROCEDURECmpText (t, u: TEXT): [-1 .. +1] = VAR diff := TextExtras.CICompare(t, u); BEGIN IF diff < 0 THEN RETURN -1; ELSIF diff > 0 THEN RETURN 1; ELSE RETURN 0; END; END CmpText; PROCEDURESubstr (a, b: TEXT): BOOLEAN = VAR len_a := Text.Length(a); len_b := Text.Length(b); c_a, c_b : CHAR; BEGIN FOR i := 0 TO len_a - len_b DO FOR j := 0 TO len_b-1 DO c_a := ASCII.Upper [Text.GetChar(a, i+j)]; c_b := ASCII.Upper [Text.GetChar(b, j)]; IF (c_a # c_b) THEN EXIT END; IF (j = len_b-1) THEN RETURN TRUE END; END; END; RETURN FALSE; END Substr; PROCEDUREPrefixMatch (a, b: TEXT; len: INTEGER): BOOLEAN = BEGIN IF (len > Text.Length (a)) OR (len > Text.Length (b)) THEN RETURN FALSE; END; FOR i := 0 TO len-1 DO IF ASCII.Upper[Text.GetChar(a, i)] # ASCII.Upper[Text.GetChar(b, i)] THEN RETURN FALSE END; END; RETURN TRUE; END PrefixMatch; BEGIN (***Init (); ***) END CharMap.