IMPLEMENTATION MODULE CompilerUtil ; (* Pure helpers: character classification, 16-bit folding, bit operations and fixed-buffer string/name copies. No compiler state is touched. *) PROCEDURE Digit (ch : CHAR) : BOOLEAN ; BEGIN RETURN (ch >= '0') AND (ch <= '9') END Digit ; PROCEDURE Alpha (ch : CHAR) : BOOLEAN ; BEGIN RETURN ((ch >= 'A') AND (ch <= 'Z')) OR ((ch >= 'a') AND (ch <= 'z')) OR (ch = '_') END Alpha ; PROCEDURE AlphaNum (ch : CHAR) : BOOLEAN ; BEGIN RETURN (Alpha (ch)) OR (Digit (ch)) END AlphaNum ; PROCEDURE IsHexCh (ch : CHAR) : BOOLEAN ; BEGIN RETURN (Digit (ch)) OR ((ch >= 'A') AND (ch <= 'F')) OR ((ch >= 'a') AND (ch <= 'f')) END IsHexCh ; PROCEDURE W16 (x : LONGINT) : CARDINAL ; (* fold x modulo 10000H, handling negatives (no negative MOD) *) VAR m : CARDINAL ; BEGIN IF x >= 0 THEN RETURN VAL (CARDINAL, x MOD 10000H) END ; m := VAL (CARDINAL, (0 - x) MOD 10000H) ; RETURN (10000H - m) MOD 10000H END W16 ; PROCEDURE DropCh (v : CHAR) ; BEGIN END DropCh ; PROCEDURE DropB (v : BOOLEAN) ; BEGIN END DropB ; PROCEDURE DropC (v : CARDINAL) ; BEGIN END DropC ; PROCEDURE BitAnd (a, b : LONGINT) : LONGINT ; BEGIN RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, W16 (a)) * VAL (BITSET, W16 (b)))) END BitAnd ; PROCEDURE BitOr (a, b : LONGINT) : LONGINT ; BEGIN RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, W16 (a)) + VAL (BITSET, W16 (b)))) END BitOr ; PROCEDURE BitNot (a : LONGINT) : LONGINT ; BEGIN RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, 0FFFFH) - VAL (BITSET, W16 (a)))) END BitNot ; PROCEDURE NameEq (a : ARRAY OF CHAR ; b : ARRAY OF CHAR) : BOOLEAN ; VAR i : CARDINAL ; BEGIN i := 0 ; LOOP IF i > HIGH (a) THEN RETURN FALSE END ; IF i > HIGH (b) THEN RETURN FALSE END ; IF a [i] # b [i] THEN RETURN FALSE END ; IF a [i] = 0C THEN RETURN TRUE END ; INC (i) END END NameEq ; PROCEDURE CopyStr (VAR dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ; VAR i : CARDINAL ; BEGIN i := 0 ; LOOP IF i > HIGH (dst) THEN dst [HIGH (dst)] := 0C ; RETURN END ; IF i > HIGH (src) THEN dst [i] := 0C ; RETURN END ; dst [i] := src [i] ; IF src [i] = 0C THEN RETURN END ; INC (i) END END CopyStr ; PROCEDURE NumToName (n : CARDINAL ; VAR dst : ARRAY OF CHAR) ; VAR buf : ARRAY [0..9] OF CHAR ; i, j : CARDINAL ; BEGIN IF n = 0 THEN dst [0] := '0' ; dst [1] := 0C ; RETURN END ; i := 0 ; WHILE n > 0 DO IF i <= 9 THEN buf [i] := CHR (ORD ('0') + (n MOD 10)) ; INC (i) END ; n := n DIV 10 END ; j := 0 ; WHILE i > 0 DO DEC (i) ; IF j <= HIGH (dst) THEN dst [j] := buf [i] ; INC (j) END END ; IF j <= HIGH (dst) THEN dst [j] := 0C END END NumToName ; END CompilerUtil.