SVGUtilities.Mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. MODULE SVGUtilities;
  2. IMPORT Strings, KernelLog;
  3. (* Print a message to the log *)
  4. PROCEDURE Log*(msg: ARRAY OF CHAR);
  5. BEGIN
  6. KernelLog.String(msg); KernelLog.Ln
  7. END Log;
  8. (* Report a warning *)
  9. PROCEDURE Warning*(msg: ARRAY OF CHAR);
  10. BEGIN
  11. KernelLog.String("SVG Warning: "); KernelLog.String(msg); KernelLog.Ln
  12. END Warning;
  13. (* Report an error *)
  14. PROCEDURE Error*(msg: ARRAY OF CHAR);
  15. BEGIN
  16. KernelLog.String("SVG Error: "); KernelLog.String(msg); KernelLog.Ln
  17. END Error;
  18. (* Is ch a lowercase character? *)
  19. PROCEDURE IsLowercase*(ch: CHAR):BOOLEAN;
  20. BEGIN
  21. RETURN (ch >= "a") & (ch <= "z")
  22. END IsLowercase;
  23. (* Is ch a uppercase character? *)
  24. PROCEDURE IsUppercase*(ch: CHAR):BOOLEAN;
  25. BEGIN
  26. RETURN (ch >= "A") & (ch <= "Z")
  27. END IsUppercase;
  28. (* Is ch an alphabetic character? *)
  29. PROCEDURE IsAlpha*(ch: CHAR):BOOLEAN;
  30. BEGIN
  31. RETURN IsLowercase(ch) OR IsUppercase(ch)
  32. END IsAlpha;
  33. (* Skip any whitespace characters *)
  34. PROCEDURE SkipWhiteSpace*(VAR i: SIZE; s: Strings.String);
  35. BEGIN
  36. WHILE (s[i] = 20X) OR
  37. (s[i] = 09X) OR
  38. (s[i] = 0AX) OR
  39. (s[i] = 0DX) DO INC(i) END
  40. END SkipWhiteSpace;
  41. (* Skip a specified character *)
  42. PROCEDURE SkipChar*(VAR i: SIZE; s: Strings.String; c: CHAR);
  43. BEGIN
  44. IF s[i] # c THEN
  45. Error("Expected a different character");
  46. Log(s^);
  47. END;
  48. INC(i)
  49. END SkipChar;
  50. (* Optionally skip a specified character *)
  51. PROCEDURE SkipCharOptional*(VAR i: SIZE; s: Strings.String; c: CHAR);
  52. BEGIN
  53. IF s[i] = c THEN INC(i) END
  54. END SkipCharOptional;
  55. (* Skip a comma and/or any whitespace characters *)
  56. PROCEDURE SkipCommaWhiteSpace*(VAR i: SIZE; s: Strings.String);
  57. BEGIN
  58. SkipWhiteSpace(i, s);
  59. SkipCharOptional(i, s, ',');
  60. SkipWhiteSpace(i, s);
  61. END SkipCommaWhiteSpace;
  62. (* Convert the substring beginning at position i in str into a real value. Leading whitespace is ignored.
  63. After the conversion i points to the first character after the real value. *)
  64. PROCEDURE StrToFloatPos*(VAR str: ARRAY OF CHAR; VAR val: LONGREAL; VAR i: SIZE);
  65. VAR noStr: ARRAY 16 OF CHAR;
  66. count: SIZE;
  67. BEGIN
  68. WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END;
  69. count := 0;
  70. IF str[i] = "-" THEN
  71. noStr[count] := str[i]; INC(count); INC(i);
  72. WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END
  73. END;
  74. IF str[i] = "+" THEN
  75. INC(i);
  76. WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END
  77. END;
  78. WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
  79. IF str[i] = "." THEN
  80. noStr[count] := str[i]; INC(count); INC(i);
  81. WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
  82. END;
  83. IF (str[i] = "D") OR (str[i] ="E") OR (str[i] = "d") OR (str[i] ="e") THEN
  84. noStr[count] := CAP(str[i]); INC(count); INC(i);
  85. IF str[i] = "-" THEN
  86. noStr[count] := str[i]; INC(count); INC(i);
  87. END;
  88. WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
  89. END;
  90. noStr[count] := 0X;
  91. Strings.StrToFloat(noStr, val)
  92. END StrToFloatPos;
  93. END SVGUtilities.