Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2018-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE UTILS;
  9.  
  10. IMPORT HOST;
  11.  
  12.  
  13. CONST
  14.  
  15.     slash* = HOST.slash;
  16.  
  17.     bit_depth* = HOST.bit_depth;
  18.     maxint* = HOST.maxint;
  19.     minint* = HOST.minint;
  20.  
  21.     OS = HOST.OS;
  22.  
  23.     min32* = -2147483647-1;
  24.     max32* =  2147483647;
  25.  
  26.     vMajor* = 1;
  27.     vMinor* = 29;
  28.  
  29.     FILE_EXT* = ".ob07";
  30.     RTL_NAME* = "RTL";
  31.  
  32.     MAX_GLOBAL_SIZE* = 1600000000;
  33.  
  34.  
  35. TYPE
  36.  
  37.     DAYS = ARRAY 12, 31, 2 OF INTEGER;
  38.  
  39.  
  40. VAR
  41.  
  42.     time*: INTEGER;
  43.  
  44.     eol*:  ARRAY 3 OF CHAR;
  45.  
  46.     maxreal*: REAL;
  47.  
  48.     target*:
  49.  
  50.       RECORD
  51.  
  52.           bit_depth*,
  53.           maxInt*,
  54.           minInt*,
  55.           maxSet*,
  56.           maxHex*:    INTEGER;
  57.  
  58.           maxReal*:   REAL
  59.  
  60.       END;
  61.  
  62.     bit_diff*: INTEGER;
  63.  
  64.     days: DAYS;
  65.  
  66.  
  67. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  68.     RETURN HOST.FileRead(F, Buffer, bytes)
  69. END FileRead;
  70.  
  71.  
  72. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  73.     RETURN HOST.FileWrite(F, Buffer, bytes)
  74. END FileWrite;
  75.  
  76.  
  77. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  78.     RETURN HOST.FileCreate(FName)
  79. END FileCreate;
  80.  
  81.  
  82. PROCEDURE FileClose* (F: INTEGER);
  83. BEGIN
  84.     HOST.FileClose(F)
  85. END FileClose;
  86.  
  87.  
  88. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  89.     RETURN HOST.FileOpen(FName)
  90. END FileOpen;
  91.  
  92.  
  93. PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
  94. BEGIN
  95.     HOST.GetArg(i, str)
  96. END GetArg;
  97.  
  98.  
  99. PROCEDURE Exit* (code: INTEGER);
  100. BEGIN
  101.     HOST.ExitProcess(code)
  102. END Exit;
  103.  
  104.  
  105. PROCEDURE GetTickCount* (): INTEGER;
  106.     RETURN HOST.GetTickCount()
  107. END GetTickCount;
  108.  
  109.  
  110. PROCEDURE OutChar* (c: CHAR);
  111. BEGIN
  112.     HOST.OutChar(c)
  113. END OutChar;
  114.  
  115.  
  116. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  117.     RETURN HOST.splitf(x, a, b)
  118. END splitf;
  119.  
  120.  
  121. PROCEDURE d2s* (x: REAL): INTEGER;
  122.     RETURN HOST.d2s(x)
  123. END d2s;
  124.  
  125.  
  126. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  127.     RETURN HOST.isRelative(path)
  128. END isRelative;
  129.  
  130.  
  131. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  132. BEGIN
  133.     HOST.GetCurrentDirectory(path)
  134. END GetCurrentDirectory;
  135.  
  136.  
  137. PROCEDURE GetUnixTime* (year, month, day, hour, min, sec: INTEGER): INTEGER;
  138.     RETURN ((year - 1970) * 365 + days[month - 1, day - 1, ORD(year DIV 4 = 0)] + (year - 1969) DIV 4) * 86400 + hour * 3600 + min * 60 + sec
  139. END GetUnixTime;
  140.  
  141.  
  142. PROCEDURE UnixTime* (): INTEGER;
  143. VAR
  144.     year, month, day, hour, min, sec: INTEGER;
  145.     res: INTEGER;
  146.  
  147. BEGIN
  148.     IF OS = "LINUX" THEN
  149.         res := HOST.UnixTime()
  150.     ELSE
  151.         HOST.now(year, month, day, hour, min, sec);
  152.         res := GetUnixTime(year, month, day, hour, min, sec)
  153.     END
  154.  
  155.     RETURN res
  156. END UnixTime;
  157.  
  158.  
  159. PROCEDURE SetBitDepth* (BitDepth: INTEGER; Double: BOOLEAN);
  160. BEGIN
  161.     ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
  162.     bit_diff := bit_depth - BitDepth;
  163.     ASSERT(bit_diff >= 0);
  164.  
  165.     target.bit_depth := BitDepth;
  166.     target.maxSet    := BitDepth - 1;
  167.     target.maxHex    := BitDepth DIV 4;
  168.     target.minInt    := ASR(minint, bit_diff);
  169.     target.maxInt    := ASR(maxint, bit_diff);
  170.  
  171.     IF Double THEN
  172.         target.maxReal := maxreal
  173.     ELSE
  174.         target.maxReal := 1.9;
  175.         PACK(target.maxReal, 127)
  176.     END
  177. END SetBitDepth;
  178.  
  179.  
  180. PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
  181.     RETURN ASR(n, 8 * idx) MOD 256
  182. END Byte;
  183.  
  184.  
  185. PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
  186. VAR
  187.     res: BOOLEAN;
  188.  
  189. BEGIN
  190.     IF bytes MOD align # 0 THEN
  191.         res := maxint - bytes >= align - (bytes MOD align);
  192.         IF res THEN
  193.             bytes := bytes + align - (bytes MOD align)
  194.         END
  195.     ELSE
  196.         res := TRUE
  197.     END
  198.  
  199.     RETURN res
  200. END Align;
  201.  
  202.  
  203. PROCEDURE Long* (value: INTEGER): INTEGER;
  204.     RETURN ASR(LSL(value, bit_diff), bit_diff)
  205. END Long;
  206.  
  207.  
  208. PROCEDURE Short* (value: INTEGER): INTEGER;
  209.     RETURN LSR(LSL(value, bit_diff), bit_diff)
  210. END Short;
  211.  
  212.  
  213. PROCEDURE Log2* (x: INTEGER): INTEGER;
  214. VAR
  215.     n: INTEGER;
  216.  
  217. BEGIN
  218.     n := 0;
  219.     WHILE ~ODD(x) DO
  220.         x := x DIV 2;
  221.         INC(n)
  222.     END;
  223.  
  224.     IF x # 1 THEN
  225.         n := -1
  226.     END
  227.  
  228.     RETURN n
  229. END Log2;
  230.  
  231.  
  232. PROCEDURE init (VAR days: DAYS);
  233. VAR
  234.     i, j, n0, n1: INTEGER;
  235.  
  236. BEGIN
  237.  
  238.     FOR i := 0 TO 11 DO
  239.         FOR j := 0 TO 30 DO
  240.             days[i, j, 0] := 0;
  241.             days[i, j, 1] := 0;
  242.         END
  243.     END;
  244.  
  245.     days[ 1, 28, 0] := -1;
  246.  
  247.     FOR i := 0 TO 1 DO
  248.         days[ 1, 29, i] := -1;
  249.         days[ 1, 30, i] := -1;
  250.         days[ 3, 30, i] := -1;
  251.         days[ 5, 30, i] := -1;
  252.         days[ 8, 30, i] := -1;
  253.         days[10, 30, i] := -1;
  254.     END;
  255.  
  256.     n0 := 0;
  257.     n1 := 0;
  258.     FOR i := 0 TO 11 DO
  259.         FOR j := 0 TO 30 DO
  260.             IF days[i, j, 0] = 0 THEN
  261.                 days[i, j, 0] := n0;
  262.                 INC(n0)
  263.             END;
  264.             IF days[i, j, 1] = 0 THEN
  265.                 days[i, j, 1] := n1;
  266.                 INC(n1)
  267.             END
  268.         END
  269.     END
  270.  
  271. END init;
  272.  
  273.  
  274. BEGIN
  275.     time := GetTickCount();
  276.     COPY(HOST.eol, eol);
  277.     maxreal := HOST.maxreal;
  278.     init(days)
  279. END UTILS.