Subversion Repositories Kolibri OS

Rev

Rev 9628 | Rev 9903 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2021, 2022 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     CEdit is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Utils;
  21.  
  22. IMPORT SYSTEM;
  23.  
  24. CONST
  25.  
  26.     SPACE* = 20X;
  27.     SLASH* = "/";
  28.  
  29.     OS* = "KOS";
  30.  
  31.  
  32. PROCEDURE streq* (s1, s2: INTEGER; n: INTEGER): BOOLEAN;
  33. VAR
  34.     c1, c2: WCHAR;
  35.     res: BOOLEAN;
  36. BEGIN
  37.         res := TRUE;
  38.     WHILE (n > 0) & res DO
  39.         SYSTEM.GET(s1, c1);
  40.         SYSTEM.GET(s2, c2);
  41.         res := c1 = c2;
  42.         INC(s1, SYSTEM.SIZE(WCHAR));
  43.         INC(s2, SYSTEM.SIZE(WCHAR));
  44.         DEC(n)
  45.     END
  46.     RETURN res
  47. END streq;
  48.  
  49.  
  50. PROCEDURE append* (VAR s1: ARRAY OF WCHAR; s2: ARRAY OF WCHAR);
  51. VAR
  52.     n, i, j: INTEGER;
  53. BEGIN
  54.     j := LENGTH(s1);
  55.     n := LENGTH(s2);
  56.  
  57.     ASSERT(j + n < LEN(s1));
  58.  
  59.     i := 0;
  60.     WHILE i < n DO
  61.         s1[j] := s2[i];
  62.         INC(i);
  63.         INC(j)
  64.     END;
  65.  
  66.     s1[j] := 0X
  67. END append;
  68.  
  69.  
  70. PROCEDURE append8* (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR);
  71. VAR
  72.     n, i, j: INTEGER;
  73. BEGIN
  74.     j := LENGTH(s1);
  75.     n := LENGTH(s2);
  76.  
  77.     ASSERT(j + n < LEN(s1));
  78.  
  79.     i := 0;
  80.     WHILE i < n DO
  81.         s1[j] := s2[i];
  82.         INC(i);
  83.         INC(j)
  84.     END;
  85.  
  86.     s1[j] := 0X
  87. END append8;
  88.  
  89.  
  90. PROCEDURE reverse* (VAR s: ARRAY OF WCHAR);
  91. VAR
  92.     ch: WCHAR;
  93.     i, j: INTEGER;
  94. BEGIN
  95.     i := 0;
  96.     j := LENGTH(s) - 1;
  97.     WHILE i < j DO
  98.         ch := s[i];
  99.         s[i] := s[j];
  100.         s[j] := ch;
  101.         INC(i);
  102.         DEC(j)
  103.     END
  104. END reverse;
  105.  
  106.  
  107. PROCEDURE reverse8* (VAR s: ARRAY OF CHAR);
  108. VAR
  109.     ch: CHAR;
  110.     i, j: INTEGER;
  111. BEGIN
  112.     i := 0;
  113.     j := LENGTH(s) - 1;
  114.     WHILE i < j DO
  115.         ch := s[i];
  116.         s[i] := s[j];
  117.         s[j] := ch;
  118.         INC(i);
  119.         DEC(j)
  120.     END
  121. END reverse8;
  122.  
  123.  
  124. PROCEDURE int2str* (val: INTEGER; VAR s: ARRAY OF WCHAR);
  125. VAR
  126.     i: INTEGER;
  127. BEGIN
  128.     i := 0;
  129.     REPEAT
  130.         s[i] := WCHR(ORD("0") + val MOD 10);
  131.         INC(i);
  132.         val := val DIV 10
  133.     UNTIL val = 0;
  134.     s[i] := 0X;
  135.     reverse(s)
  136. END int2str;
  137.  
  138.  
  139. PROCEDURE isDigit* (ch: WCHAR): BOOLEAN;
  140.     RETURN ("0" <= ch) & (ch <= "9")
  141. END isDigit;
  142.  
  143.  
  144. PROCEDURE isOct* (ch: WCHAR): BOOLEAN;
  145.     RETURN ("0" <= ch) & (ch <= "7")
  146. END isOct;
  147.  
  148.  
  149. PROCEDURE isHex* (ch: WCHAR): BOOLEAN;
  150.     RETURN ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")
  151. END isHex;
  152.  
  153.  
  154. PROCEDURE isLetter* (ch: WCHAR): BOOLEAN;
  155.     RETURN ("a" <= ch) & (ch <= "z") OR ("A" <= ch) & (ch <= "Z")
  156. END isLetter;
  157.  
  158.  
  159. PROCEDURE cap* (VAR ch: WCHAR): BOOLEAN;
  160. VAR
  161.     res: BOOLEAN;
  162. BEGIN
  163.     IF ("a" <= ch) & (ch <= "z") THEN
  164.         ch := WCHR(ORD(ch) - (ORD("z") - ORD("Z")));
  165.         res := TRUE
  166.     ELSIF (430H <= ORD(ch)) & (ORD(ch) <= 44FH) THEN
  167.         ch := WCHR(ORD(ch) - 20H);
  168.         res := TRUE
  169.     ELSIF (450H <= ORD(ch)) & (ORD(ch) <= 45FH) THEN
  170.         ch := WCHR(ORD(ch) - 50H);
  171.         res := TRUE
  172.     ELSIF ch = 491X THEN
  173.         ch := 490X;
  174.         res := TRUE
  175.     ELSE
  176.         res := FALSE
  177.     END
  178.     RETURN res
  179. END cap;
  180.  
  181.  
  182. PROCEDURE cap8 (VAR ch: CHAR): BOOLEAN;
  183. VAR
  184.     res: BOOLEAN;
  185. BEGIN
  186.     IF ("a" <= ch) & (ch <= "z") THEN
  187.         ch := CHR(ORD(ch) - (ORD("z") - ORD("Z")));
  188.         res := TRUE
  189.     ELSE
  190.         res := FALSE
  191.     END
  192.     RETURN res
  193. END cap8;
  194.  
  195.  
  196. PROCEDURE upcase* (VAR s: ARRAY OF CHAR);
  197. VAR
  198.     i: INTEGER;
  199. BEGIN
  200.     i := LENGTH(s) - 1;
  201.     WHILE i >= 0 DO
  202.         IF cap8(s[i]) THEN
  203.         END;
  204.         DEC(i)
  205.     END
  206. END upcase;
  207.  
  208.  
  209. PROCEDURE upcase16* (VAR s: ARRAY OF WCHAR);
  210. VAR
  211.     i: INTEGER;
  212. BEGIN
  213.     i := LENGTH(s) - 1;
  214.     WHILE i >= 0 DO
  215.         IF cap(s[i]) THEN
  216.         END;
  217.         DEC(i)
  218.     END
  219. END upcase16;
  220.  
  221.  
  222. PROCEDURE low* (VAR ch: WCHAR): BOOLEAN;
  223. VAR
  224.     res: BOOLEAN;
  225. BEGIN
  226.     IF ("A" <= ch) & (ch <= "Z") THEN
  227.         ch := WCHR(ORD(ch) + (ORD("z") - ORD("Z")));
  228.         res := TRUE
  229.     ELSIF (410H <= ORD(ch)) & (ORD(ch) <= 42FH) THEN
  230.         ch := WCHR(ORD(ch) + 20H);
  231.         res := TRUE
  232.     ELSIF (400H <= ORD(ch)) & (ORD(ch) <= 40FH) THEN
  233.         ch := WCHR(ORD(ch) + 50H);
  234.         res := TRUE
  235.     ELSIF ch = 490X THEN
  236.         ch := 491X;
  237.         res := TRUE
  238.     ELSE
  239.         res := FALSE
  240.     END
  241.     RETURN res
  242. END low;
  243.  
  244.  
  245. PROCEDURE lowcase* (VAR s: ARRAY OF CHAR);
  246. VAR
  247.     i: INTEGER;
  248. BEGIN
  249.     i := LENGTH(s) - 1;
  250.     WHILE i >= 0 DO
  251.         IF ("A" <= s[i]) & (s[i] <= "Z") THEN
  252.                 s[i] := CHR(ORD(s[i]) + 32)
  253.         END;
  254.         DEC(i)
  255.     END
  256. END lowcase;
  257.  
  258.  
  259. PROCEDURE str2int* (s: ARRAY OF WCHAR; VAR val: INTEGER): BOOLEAN;
  260. VAR
  261.     i, temp: INTEGER;
  262.     res, neg: BOOLEAN;
  263. BEGIN
  264.     temp := 0;
  265.     res := TRUE;
  266.     neg := FALSE;
  267.     i := 0;
  268.     WHILE (s[i] # 0X) & (s[i] = SPACE) DO
  269.         INC(i)
  270.     END;
  271.  
  272.     IF s[i] = "-" THEN
  273.         INC(i);
  274.         neg := TRUE
  275.     ELSIF s[i] = "+" THEN
  276.         INC(i)
  277.     END;
  278.  
  279.     IF isDigit(s[i]) THEN
  280.         REPEAT
  281.             temp := temp*10 + ORD(s[i]) - ORD("0");
  282.             INC(i)
  283.         UNTIL ~isDigit(s[i]);
  284.         IF neg THEN
  285.             temp := -temp
  286.         END;
  287.         val := temp
  288.     ELSE
  289.         res := FALSE
  290.     END
  291.  
  292.     RETURN res
  293. END str2int;
  294.  
  295.  
  296. PROCEDURE getFileName* (path: ARRAY OF CHAR; VAR name: ARRAY OF CHAR; ch: CHAR);
  297. VAR
  298.     i, j: INTEGER;
  299. BEGIN
  300.     j := 0;
  301.     i := LENGTH(path) - 1;
  302.     WHILE (i >= 0) & (path[i] # ch) DO
  303.         name[j] := path[i];
  304.         DEC(i);
  305.         INC(j)
  306.     END;
  307.     name[j] := 0X;
  308.     reverse8(name)
  309. END getFileName;
  310.  
  311.  
  312. PROCEDURE getPath* (fname: ARRAY OF CHAR; VAR path: ARRAY OF CHAR);
  313. VAR
  314.     i, j: INTEGER;
  315. BEGIN
  316.     j := 0;
  317.     i := LENGTH(fname) - 1;
  318.     WHILE (i >= 0) & (fname[i] # SLASH) DO
  319.         DEC(i)
  320.     END;
  321.     path := fname;
  322.     path[i] := 0X
  323. END getPath;
  324.  
  325.  
  326. PROCEDURE lg10* (n: INTEGER): INTEGER;
  327. VAR
  328.     res: INTEGER;
  329. BEGIN
  330.     res := 0;
  331.     WHILE n >= 10 DO
  332.         n := n DIV 10;
  333.         INC(res)
  334.     END
  335.     RETURN res
  336. END lg10;
  337.  
  338.  
  339. PROCEDURE sgn* (x: INTEGER): INTEGER;
  340. BEGIN
  341.     IF x > 0 THEN
  342.         x := 1
  343.     ELSIF x < 0 THEN
  344.         x := -1
  345.     ELSE
  346.         x := 0
  347.     END
  348.     RETURN x
  349. END sgn;
  350.  
  351.  
  352. PROCEDURE between* (a, b, c: INTEGER): BOOLEAN;
  353.         RETURN (a <= b) & (b <= c)
  354. END between;
  355.  
  356.  
  357. PROCEDURE inString* (c: WCHAR; s: ARRAY OF WCHAR): BOOLEAN;
  358. VAR
  359.         i, L: INTEGER;
  360. BEGIN
  361.         L := LENGTH(s);
  362.         i := 0;
  363.         WHILE (i < L) & (c # s[i]) DO
  364.                 INC(i)
  365.         END
  366.         RETURN i < L
  367. END inString;
  368.  
  369.  
  370. END Utils.