123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- MODULE SVGUtilities;
- IMPORT Strings, KernelLog;
- (* Print a message to the log *)
- PROCEDURE Log*(msg: ARRAY OF CHAR);
- BEGIN
- KernelLog.String(msg); KernelLog.Ln
- END Log;
- (* Report a warning *)
- PROCEDURE Warning*(msg: ARRAY OF CHAR);
- BEGIN
- KernelLog.String("SVG Warning: "); KernelLog.String(msg); KernelLog.Ln
- END Warning;
- (* Report an error *)
- PROCEDURE Error*(msg: ARRAY OF CHAR);
- BEGIN
- KernelLog.String("SVG Error: "); KernelLog.String(msg); KernelLog.Ln
- END Error;
- (* Is ch a lowercase character? *)
- PROCEDURE IsLowercase*(ch: CHAR):BOOLEAN;
- BEGIN
- RETURN (ch >= "a") & (ch <= "z")
- END IsLowercase;
- (* Is ch a uppercase character? *)
- PROCEDURE IsUppercase*(ch: CHAR):BOOLEAN;
- BEGIN
- RETURN (ch >= "A") & (ch <= "Z")
- END IsUppercase;
- (* Is ch an alphabetic character? *)
- PROCEDURE IsAlpha*(ch: CHAR):BOOLEAN;
- BEGIN
- RETURN IsLowercase(ch) OR IsUppercase(ch)
- END IsAlpha;
- (* Skip any whitespace characters *)
- PROCEDURE SkipWhiteSpace*(VAR i: SIZE; s: Strings.String);
- BEGIN
- WHILE (s[i] = 20X) OR
- (s[i] = 09X) OR
- (s[i] = 0AX) OR
- (s[i] = 0DX) DO INC(i) END
- END SkipWhiteSpace;
- (* Skip a specified character *)
- PROCEDURE SkipChar*(VAR i: SIZE; s: Strings.String; c: CHAR);
- BEGIN
- IF s[i] # c THEN
- Error("Expected a different character");
- Log(s^);
- END;
- INC(i)
- END SkipChar;
- (* Optionally skip a specified character *)
- PROCEDURE SkipCharOptional*(VAR i: SIZE; s: Strings.String; c: CHAR);
- BEGIN
- IF s[i] = c THEN INC(i) END
- END SkipCharOptional;
- (* Skip a comma and/or any whitespace characters *)
- PROCEDURE SkipCommaWhiteSpace*(VAR i: SIZE; s: Strings.String);
- BEGIN
- SkipWhiteSpace(i, s);
- SkipCharOptional(i, s, ',');
- SkipWhiteSpace(i, s);
- END SkipCommaWhiteSpace;
- (* Convert the substring beginning at position i in str into a real value. Leading whitespace is ignored.
- After the conversion i points to the first character after the real value. *)
- PROCEDURE StrToFloatPos*(VAR str: ARRAY OF CHAR; VAR val: LONGREAL; VAR i: SIZE);
- VAR noStr: ARRAY 16 OF CHAR;
- count: SIZE;
- BEGIN
- WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END;
- count := 0;
- IF str[i] = "-" THEN
- noStr[count] := str[i]; INC(count); INC(i);
- WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END
- END;
- IF str[i] = "+" THEN
- INC(i);
- WHILE (str[i] # 0X) & (str[i] <= " ") DO INC(i) END
- END;
- WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
- IF str[i] = "." THEN
- noStr[count] := str[i]; INC(count); INC(i);
- WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
- END;
- IF (str[i] = "D") OR (str[i] ="E") OR (str[i] = "d") OR (str[i] ="e") THEN
- noStr[count] := CAP(str[i]); INC(count); INC(i);
- IF str[i] = "-" THEN
- noStr[count] := str[i]; INC(count); INC(i);
- END;
- WHILE (str[i] >= "0") & (str[i] <= "9") DO noStr[count] := str[i]; INC(count); INC(i) END;
- END;
- noStr[count] := 0X;
- Strings.StrToFloat(noStr, val)
- END StrToFloatPos;
- END SVGUtilities.
|