CompilerUtil.mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. IMPLEMENTATION MODULE CompilerUtil ;
  2. (* Pure helpers: character classification, 16-bit folding, bit operations and
  3. fixed-buffer string/name copies. No compiler state is touched. *)
  4. PROCEDURE Digit (ch : CHAR) : BOOLEAN ;
  5. BEGIN
  6. RETURN (ch >= '0') AND (ch <= '9')
  7. END Digit ;
  8. PROCEDURE Alpha (ch : CHAR) : BOOLEAN ;
  9. BEGIN
  10. RETURN ((ch >= 'A') AND (ch <= 'Z')) OR ((ch >= 'a') AND (ch <= 'z'))
  11. OR (ch = '_')
  12. END Alpha ;
  13. PROCEDURE AlphaNum (ch : CHAR) : BOOLEAN ;
  14. BEGIN
  15. RETURN (Alpha (ch)) OR (Digit (ch))
  16. END AlphaNum ;
  17. PROCEDURE IsHexCh (ch : CHAR) : BOOLEAN ;
  18. BEGIN
  19. RETURN (Digit (ch)) OR ((ch >= 'A') AND (ch <= 'F'))
  20. OR ((ch >= 'a') AND (ch <= 'f'))
  21. END IsHexCh ;
  22. PROCEDURE W16 (x : LONGINT) : CARDINAL ;
  23. (* fold x modulo 10000H, handling negatives (no negative MOD) *)
  24. VAR m : CARDINAL ;
  25. BEGIN
  26. IF x >= 0 THEN
  27. RETURN VAL (CARDINAL, x MOD 10000H)
  28. END ;
  29. m := VAL (CARDINAL, (0 - x) MOD 10000H) ;
  30. RETURN (10000H - m) MOD 10000H
  31. END W16 ;
  32. PROCEDURE DropCh (v : CHAR) ;
  33. BEGIN
  34. END DropCh ;
  35. PROCEDURE DropB (v : BOOLEAN) ;
  36. BEGIN
  37. END DropB ;
  38. PROCEDURE DropC (v : CARDINAL) ;
  39. BEGIN
  40. END DropC ;
  41. PROCEDURE BitAnd (a, b : LONGINT) : LONGINT ;
  42. BEGIN
  43. RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, W16 (a))
  44. * VAL (BITSET, W16 (b))))
  45. END BitAnd ;
  46. PROCEDURE BitOr (a, b : LONGINT) : LONGINT ;
  47. BEGIN
  48. RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, W16 (a))
  49. + VAL (BITSET, W16 (b))))
  50. END BitOr ;
  51. PROCEDURE BitNot (a : LONGINT) : LONGINT ;
  52. BEGIN
  53. RETURN VAL (LONGINT, CARDINAL (VAL (BITSET, 0FFFFH)
  54. - VAL (BITSET, W16 (a))))
  55. END BitNot ;
  56. PROCEDURE NameEq (a : ARRAY OF CHAR ; b : ARRAY OF CHAR) : BOOLEAN ;
  57. VAR i : CARDINAL ;
  58. BEGIN
  59. i := 0 ;
  60. LOOP
  61. IF i > HIGH (a) THEN
  62. RETURN FALSE
  63. END ;
  64. IF i > HIGH (b) THEN
  65. RETURN FALSE
  66. END ;
  67. IF a [i] # b [i] THEN
  68. RETURN FALSE
  69. END ;
  70. IF a [i] = 0C THEN
  71. RETURN TRUE
  72. END ;
  73. INC (i)
  74. END
  75. END NameEq ;
  76. PROCEDURE CopyStr (VAR dst : ARRAY OF CHAR ; src : ARRAY OF CHAR) ;
  77. VAR i : CARDINAL ;
  78. BEGIN
  79. i := 0 ;
  80. LOOP
  81. IF i > HIGH (dst) THEN
  82. dst [HIGH (dst)] := 0C ;
  83. RETURN
  84. END ;
  85. IF i > HIGH (src) THEN
  86. dst [i] := 0C ;
  87. RETURN
  88. END ;
  89. dst [i] := src [i] ;
  90. IF src [i] = 0C THEN
  91. RETURN
  92. END ;
  93. INC (i)
  94. END
  95. END CopyStr ;
  96. PROCEDURE NumToName (n : CARDINAL ; VAR dst : ARRAY OF CHAR) ;
  97. VAR buf : ARRAY [0..9] OF CHAR ;
  98. i, j : CARDINAL ;
  99. BEGIN
  100. IF n = 0 THEN
  101. dst [0] := '0' ;
  102. dst [1] := 0C ;
  103. RETURN
  104. END ;
  105. i := 0 ;
  106. WHILE n > 0 DO
  107. IF i <= 9 THEN
  108. buf [i] := CHR (ORD ('0') + (n MOD 10)) ;
  109. INC (i)
  110. END ;
  111. n := n DIV 10
  112. END ;
  113. j := 0 ;
  114. WHILE i > 0 DO
  115. DEC (i) ;
  116. IF j <= HIGH (dst) THEN
  117. dst [j] := buf [i] ;
  118. INC (j)
  119. END
  120. END ;
  121. IF j <= HIGH (dst) THEN
  122. dst [j] := 0C
  123. END
  124. END NumToName ;
  125. END CompilerUtil.