Chars

This module provides common character oriented tests.

InRange
Check to see if a character, c, is in an inclusive range from a lower to upper character.
IsUpper
Check to see if a character is upper case
IsLower
Check to see if a character is lower case
IsAlpha
Check to see if a character is alphabetic, i.e. in the range of “a” to “z” or “A” to “Z”.
IsDigit
Check to see if a character is a digit, i.e. in range of “0” to “9”
IsAlphaNum
Check to see if a character is alpha or a digit
IsSpace
Check to see if a character is a space, tab, carriage return or line feed
AppendChar
Append a single char to the end of an ARRAY OF CHAR adjusting the terminating null character and return TRUE on success or FALSE otherwise.
AppendChars
Append an ARRAY OF CHAR to another the destination ARRAY OF CHAR.
Equal
Compares two ARRAY OF CHAR and returns TRUE if they match, FALSE otherwise
Clear
Sets all cells in an ARRAY OF CHAR to 0X.
TrimSpace
Trim the leading and trailing space characters from an ARRAY OF CHAR
TrimLeftSpace
Trim the leading space characters from an ARRAY OF CHAR
TrimRightSpace
Trim the trailing space characters from an ARRAY OF CHAR
StartsWith
Checks to see if a prefix ARRAY OF CHAR matches a target ARRAY OF CHAR return TRUE if found, FALSE otherwise
EndsWith
Checks to see if a suffix ARRAY OF CHAR matches a target ARRAY OF CHAR return TRUE if found, FALSE otherwise
TrimPrefix
Trim a prefix ARRAY OF CHAR from a target ARRAY OF CHAR
TrimSuffix
Trim a suffix ARRAY OF CHAR from a target ARRAY OF CHAR

Source code for Chars.Mod

  1. MODULE Chars;
  2. IMPORT Strings;
  3. CONST
  4. MAXSTR* = 1024; (* or whatever *)
  5. (* byte constants *)
  6. LF* = 10;
  7. CR* = 13;
  8. (* Character constants *)
  9. ENDSTR* = 0X;
  10. NEWLINE* = 10X;
  11. TAB* = 9X;
  12. SPACE* = " ";
  13. DASH* = "-";
  14. CARET* = "^";
  15. TILDE* = "~";
  16. QUOTE* = CHR(34);
  17. (* InRange -- given a character to check and an inclusive range of
  18. characters in the ASCII character set. Compare the ordinal values
  19. for inclusively. Return TRUE if in range FALSE otherwise. *)
  20. PROCEDURE InRange* (c, lower, upper : CHAR) : BOOLEAN;
  21. VAR inrange : BOOLEAN;
  22. BEGIN
  23. IF (ORD(c) >= ORD(lower)) & (ORD(c) <= ORD(upper)) THEN
  24. inrange := TRUE;
  25. ELSE
  26. inrange := FALSE;
  27. END;
  28. RETURN inrange
  29. END InRange;
  30. (* IsUpper return true if the character is an upper case letter *)
  31. PROCEDURE IsUpper*(c : CHAR) : BOOLEAN;
  32. VAR isupper : BOOLEAN;
  33. BEGIN
  34. IF InRange(c, "A", "Z") THEN
  35. isupper := TRUE;
  36. ELSE
  37. isupper := FALSE;
  38. END
  39. RETURN isupper
  40. END IsUpper;
  41. (* IsLower return true if the character is a lower case letter *)
  42. PROCEDURE IsLower*(c : CHAR) : BOOLEAN;
  43. VAR islower : BOOLEAN;
  44. BEGIN
  45. IF InRange(c, "a", "a") THEN
  46. islower := TRUE;
  47. ELSE
  48. islower := FALSE;
  49. END
  50. RETURN islower
  51. END IsLower;
  52. (* IsDigit return true if the character in the range of "0" to "9" *)
  53. PROCEDURE IsDigit*(c : CHAR) : BOOLEAN;
  54. VAR isdigit : BOOLEAN;
  55. BEGIN
  56. IF InRange(c, "0", "9") THEN
  57. isdigit := TRUE;
  58. ELSE
  59. isdigit := FALSE;
  60. END;
  61. RETURN isdigit
  62. END IsDigit;
  63. (* IsAlpha return true is character is either upper or lower case letter *)
  64. PROCEDURE IsAlpha*(c : CHAR) : BOOLEAN;
  65. VAR isalpha : BOOLEAN;
  66. BEGIN
  67. IF IsUpper(c) OR IsLower(c) THEN
  68. isalpha := TRUE;
  69. ELSE
  70. isalpha := FALSE;
  71. END;
  72. RETURN isalpha
  73. END IsAlpha;
  74. (* IsAlphaNum return true is IsAlpha or IsDigit *)
  75. PROCEDURE IsAlphaNum* (c : CHAR) : BOOLEAN;
  76. VAR isalphanum : BOOLEAN;
  77. BEGIN
  78. IF IsAlpha(c) OR IsDigit(c) THEN
  79. isalphanum := TRUE;
  80. ELSE
  81. isalphanum := FALSE;
  82. END;
  83. RETURN isalphanum
  84. END IsAlphaNum;
  85. (* IsSpace returns TRUE if the char is a space, tab, carriage return or line feed *)
  86. PROCEDURE IsSpace*(c : CHAR) : BOOLEAN;
  87. VAR isSpace : BOOLEAN;
  88. BEGIN
  89. isSpace := FALSE;
  90. IF (c = SPACE) OR (c = TAB) OR (ORD(c) = CR) OR (ORD(c) = LF) THEN
  91. isSpace := TRUE;
  92. END;
  93. RETURN isSpace
  94. END IsSpace;
  95. (* AppendChar - this copies the char and appends it to
  96. the destination. Returns FALSE if append fails. *)
  97. PROCEDURE AppendChar*(c : CHAR; VAR dest : ARRAY OF CHAR) : BOOLEAN;
  98. VAR res : BOOLEAN; l : INTEGER;
  99. BEGIN
  100. l := Strings.Length(dest);
  101. (* NOTE: we need to account for a trailing 0X to end
  102. the string. *)
  103. IF l < (LEN(dest) - 1) THEN
  104. dest[l] := c;
  105. dest[l + 1] := 0X;
  106. res := TRUE;
  107. ELSE
  108. res := FALSE;
  109. END;
  110. RETURN res
  111. END AppendChar;
  112. (* AppendChars - copy the contents of src ARRAY OF CHAR to end of
  113. dest ARRAY OF CHAR *)
  114. PROCEDURE AppendChars*(src : ARRAY OF CHAR; VAR dest : ARRAY OF CHAR);
  115. VAR i, j : INTEGER;
  116. BEGIN
  117. i := 0;
  118. WHILE (i < LEN(dest)) & (dest[i] # 0X) DO
  119. i := i + 1;
  120. END;
  121. j := 0;
  122. WHILE (i < LEN(dest)) & (j < Strings.Length(src)) DO
  123. dest[i] := src[j];
  124. i := i + 1;
  125. j := j + 1;
  126. END;
  127. WHILE i < LEN(dest) DO
  128. dest[i] := 0X;
  129. i := i + 1;
  130. END;
  131. END AppendChars;
  132. (* Equal - compares two ARRAY OF CHAR and returns TRUE
  133. if the characters match up to the end of string, FALSE otherwise. *)
  134. PROCEDURE Equal*(a : ARRAY OF CHAR; b : ARRAY OF CHAR) : BOOLEAN;
  135. VAR isSame : BOOLEAN; i : INTEGER;
  136. BEGIN
  137. isSame := (Strings.Length(a) = Strings.Length(b));
  138. i := 0;
  139. WHILE isSame & (i < Strings.Length(a)) DO
  140. IF a[i] # b[i] THEN
  141. isSame := FALSE;
  142. END;
  143. i := i + 1;
  144. END;
  145. RETURN isSame
  146. END Equal;
  147. (* StartsWith - check to see of a prefix starts an ARRAY OF CHAR *)
  148. PROCEDURE StartsWith*(prefix : ARRAY OF CHAR; VAR src : ARRAY OF CHAR) : BOOLEAN;
  149. VAR startsWith : BOOLEAN; i: INTEGER;
  150. BEGIN
  151. startsWith := FALSE;
  152. IF Strings.Length(prefix) <= Strings.Length(src) THEN
  153. startsWith := TRUE;
  154. i := 0;
  155. WHILE (i < Strings.Length(prefix)) & startsWith DO
  156. IF prefix[i] # src[i] THEN
  157. startsWith := FALSE;
  158. END;
  159. i := i + 1;
  160. END;
  161. END;
  162. RETURN startsWith
  163. END StartsWith;
  164. (* EndsWith - check to see of a prefix starts an ARRAY OF CHAR *)
  165. PROCEDURE EndsWith*(suffix : ARRAY OF CHAR; VAR src : ARRAY OF CHAR) : BOOLEAN;
  166. VAR endsWith : BOOLEAN; i, j : INTEGER;
  167. BEGIN
  168. endsWith := FALSE;
  169. IF Strings.Length(suffix) <= Strings.Length(src) THEN
  170. endsWith := TRUE;
  171. i := 0;
  172. j := Strings.Length(src) - Strings.Length(suffix);
  173. WHILE (i < Strings.Length(suffix)) & endsWith DO
  174. IF suffix[i] # src[j] THEN
  175. endsWith := FALSE;
  176. END;
  177. i := i + 1;
  178. j := j + 1;
  179. END;
  180. END;
  181. RETURN endsWith
  182. END EndsWith;
  183. (* Clear - resets all cells of an ARRAY OF CHAR to 0X *)
  184. PROCEDURE Clear*(VAR a : ARRAY OF CHAR);
  185. VAR i : INTEGER;
  186. BEGIN
  187. FOR i := 0 TO (LEN(a) - 1) DO
  188. a[i] := 0X;
  189. END;
  190. END Clear;
  191. (* Shift returns the first character of an ARRAY OF CHAR and shifts the
  192. remaining elements left appending an extra 0X if necessary *)
  193. PROCEDURE Shift*(VAR src : ARRAY OF CHAR) : CHAR;
  194. VAR i, last : INTEGER; c : CHAR;
  195. BEGIN
  196. i := 0;
  197. c := src[i];
  198. Strings.Delete(src, 0, 1);
  199. last := Strings.Length(src) - 1;
  200. FOR i := last TO (LEN(src) - 1) DO
  201. src[i] := 0X;
  202. END;
  203. RETURN c
  204. END Shift;
  205. (* Pop returns the last non-OX element of an ARRAY OF CHAR replacing
  206. it with an OX *)
  207. PROCEDURE Pop*(VAR src : ARRAY OF CHAR) : CHAR;
  208. VAR i, last : INTEGER; c : CHAR;
  209. BEGIN
  210. (* Move to the last non-0X cell *)
  211. i := 0;
  212. last := LEN(src);
  213. WHILE (i < last) & (src[i] # 0X) DO
  214. i := i + 1;
  215. END;
  216. IF i > 0 THEN
  217. i := i - 1;
  218. ELSE
  219. i := 0;
  220. END;
  221. c := src[i];
  222. WHILE (i < last) DO
  223. src[i] := 0X;
  224. i := i + 1;
  225. END;
  226. RETURN c
  227. END Pop;
  228. (* TrimLeftSpace - remove leading spaces from an ARRAY OF CHAR *)
  229. PROCEDURE TrimLeftSpace*(VAR src : ARRAY OF CHAR);
  230. VAR i : INTEGER;
  231. BEGIN
  232. (* find the first non-space or end of the string *)
  233. i := 0;
  234. WHILE (i < LEN(src)) & IsSpace(src[i]) DO
  235. i := i + 1;
  236. END;
  237. (* Trims the beginning of the string *)
  238. IF i > 0 THEN
  239. Strings.Delete(src, 0, i);
  240. END;
  241. END TrimLeftSpace;
  242. (* TrimRightSpace - remove the trailing spaces from an ARRAY OF CHAR *)
  243. PROCEDURE TrimRightSpace*(VAR src : ARRAY OF CHAR);
  244. VAR i, l : INTEGER;
  245. BEGIN
  246. (* Find the first 0X, end of string *)
  247. l := Strings.Length(src);
  248. i := l - 1;
  249. (* Find the start of the trailing space sequence *)
  250. WHILE (i > 0) & IsSpace(src[i]) DO
  251. i := i - 1;
  252. END;
  253. (* Delete the trailing spaces *)
  254. Strings.Delete(src, i + 1, l - i);
  255. END TrimRightSpace;
  256. (* TrimSpace - remove leading and trailing space CHARS from an ARRAY OF CHAR *)
  257. PROCEDURE TrimSpace*(VAR src : ARRAY OF CHAR);
  258. BEGIN
  259. TrimLeftSpace(src);
  260. TrimRightSpace(src);
  261. END TrimSpace;
  262. (* TrimPrefix - remove a prefix ARRAY OF CHAR from a target ARRAY OF CHAR *)
  263. PROCEDURE TrimPrefix*(prefix : ARRAY OF CHAR; VAR src : ARRAY OF CHAR);
  264. VAR l : INTEGER;
  265. BEGIN
  266. IF StartsWith(prefix, src) THEN
  267. l := Strings.Length(prefix);
  268. Strings.Delete(src, 0, l);
  269. END;
  270. END TrimPrefix;
  271. (* TrimSuffix - remove a suffix ARRAY OF CHAR from a target ARRAY OF CHAR *)
  272. PROCEDURE TrimSuffix*(suffix : ARRAY OF CHAR; VAR src : ARRAY OF CHAR);
  273. VAR i, l : INTEGER;
  274. BEGIN
  275. IF EndsWith(suffix, src) THEN
  276. l := Strings.Length(src) - 1;
  277. FOR i := ((l - Strings.Length(suffix)) + 1) TO l DO
  278. src[i] := 0X;
  279. END;
  280. END;
  281. END TrimSuffix;
  282. END Chars.