Subversion Repositories Kolibri OS

Rev

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

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