Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2019-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE HOST;
  9.  
  10. IMPORT SYSTEM, API, RTL;
  11.  
  12.  
  13. CONST
  14.  
  15.     slash* = "/";
  16.     eol* = 0AX;
  17.  
  18.     bit_depth* = RTL.bit_depth;
  19.     maxint* = RTL.maxint;
  20.     minint* = RTL.minint;
  21.  
  22.     RTLD_LAZY = 1;
  23.  
  24.  
  25. TYPE
  26.  
  27.     TP = ARRAY 2 OF INTEGER;
  28.  
  29.  
  30. VAR
  31.  
  32.     maxreal*: REAL;
  33.  
  34.     argc: INTEGER;
  35.  
  36.     libc, librt: INTEGER;
  37.  
  38.     stdout: INTEGER;
  39.  
  40.     fread, fwrite : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  41.     fopen         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  42.     fclose        : PROCEDURE [linux] (file: INTEGER): INTEGER;
  43.     _chmod        : PROCEDURE [linux] (fname: INTEGER; mode: SET): INTEGER;
  44.     time          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  45.     clock_gettime : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  46.     exit          : PROCEDURE [linux] (code: INTEGER);
  47.  
  48.  
  49. PROCEDURE ExitProcess* (code: INTEGER);
  50. BEGIN
  51.     exit(code)
  52. END ExitProcess;
  53.  
  54.  
  55. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  56. VAR
  57.     i, len, ptr: INTEGER;
  58.     c: CHAR;
  59.  
  60. BEGIN
  61.     i := 0;
  62.     len := LEN(s) - 1;
  63.     IF (n < argc) & (len > 0) THEN
  64.         SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
  65.         REPEAT
  66.             SYSTEM.GET(ptr, c);
  67.             s[i] := c;
  68.             INC(i);
  69.             INC(ptr)
  70.         UNTIL (c = 0X) OR (i = len)
  71.     END;
  72.     s[i] := 0X
  73. END GetArg;
  74.  
  75.  
  76. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  77. VAR
  78.     n: INTEGER;
  79.  
  80. BEGIN
  81.     GetArg(0, path);
  82.     n := LENGTH(path) - 1;
  83.     WHILE path[n] # slash DO
  84.         DEC(n)
  85.     END;
  86.     path[n + 1] := 0X
  87. END GetCurrentDirectory;
  88.  
  89.  
  90. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  91. VAR
  92.     res: INTEGER;
  93.  
  94. BEGIN
  95.     res := fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
  96.     IF res <= 0 THEN
  97.         res := -1
  98.     END
  99.  
  100.     RETURN res
  101. END FileRead;
  102.  
  103.  
  104. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  105. VAR
  106.     res: INTEGER;
  107.  
  108. BEGIN
  109.     res := fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
  110.     IF res <= 0 THEN
  111.         res := -1
  112.     END
  113.  
  114.     RETURN res
  115. END FileWrite;
  116.  
  117.  
  118. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  119.     RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
  120. END FileCreate;
  121.  
  122.  
  123. PROCEDURE FileClose* (File: INTEGER);
  124. BEGIN
  125.     File := fclose(File)
  126. END FileClose;
  127.  
  128.  
  129. PROCEDURE chmod* (FName: ARRAY OF CHAR);
  130. VAR
  131.     res: INTEGER;
  132. BEGIN
  133.     res := _chmod(SYSTEM.ADR(FName[0]), {0, 2..8}) (* rwxrwxr-x *)
  134. END chmod;
  135.  
  136.  
  137. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  138.     RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
  139. END FileOpen;
  140.  
  141.  
  142. PROCEDURE OutChar* (c: CHAR);
  143. VAR
  144.     res: INTEGER;
  145.  
  146. BEGIN
  147.     res := fwrite(SYSTEM.ADR(c), 1, 1, stdout)
  148. END OutChar;
  149.  
  150.  
  151. PROCEDURE GetTickCount* (): INTEGER;
  152. VAR
  153.     tp:  TP;
  154.     res: INTEGER;
  155.  
  156. BEGIN
  157.     IF clock_gettime(0, tp) = 0 THEN
  158.         res := tp[0] * 100 + tp[1] DIV 10000000
  159.     ELSE
  160.         res := 0
  161.     END
  162.  
  163.     RETURN res
  164. END GetTickCount;
  165.  
  166.  
  167. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  168.     RETURN path[0] # slash
  169. END isRelative;
  170.  
  171.  
  172. PROCEDURE UnixTime* (): INTEGER;
  173.     RETURN time(0)
  174. END UnixTime;
  175.  
  176.  
  177. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  178. VAR
  179.     res: INTEGER;
  180.  
  181. BEGIN
  182.     a := 0;
  183.     b := 0;
  184.     SYSTEM.GET32(SYSTEM.ADR(x), a);
  185.     SYSTEM.GET32(SYSTEM.ADR(x) + 4, b);
  186.     SYSTEM.GET(SYSTEM.ADR(x), res)
  187.     RETURN res
  188. END splitf;
  189.  
  190.  
  191. PROCEDURE d2s* (x: REAL): INTEGER;
  192. VAR
  193.     h, l, s, e: INTEGER;
  194.  
  195. BEGIN
  196.     e := splitf(x, l, h);
  197.  
  198.     s := ASR(h, 31) MOD 2;
  199.     e := (h DIV 100000H) MOD 2048;
  200.     IF e <= 896 THEN
  201.         h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
  202.         REPEAT
  203.             h := h DIV 2;
  204.             INC(e)
  205.         UNTIL e = 897;
  206.         e := 896;
  207.         l := (h MOD 8) * 20000000H;
  208.         h := h DIV 8
  209.     ELSIF (1151 <= e) & (e < 2047) THEN
  210.         e := 1151;
  211.         h := 0;
  212.         l := 0
  213.     ELSIF e = 2047 THEN
  214.         e := 1151;
  215.         IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN
  216.             h := 80000H;
  217.             l := 0
  218.         END
  219.     END;
  220.     DEC(e, 896)
  221.  
  222.     RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
  223. END d2s;
  224.  
  225.  
  226. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  227. VAR
  228.     sym: INTEGER;
  229.  
  230. BEGIN
  231.     sym := API.dlsym(lib, SYSTEM.ADR(name[0]));
  232.     ASSERT(sym # 0);
  233.     SYSTEM.PUT(VarAdr, sym)
  234. END GetSym;
  235.  
  236.  
  237. BEGIN
  238.     maxreal := 1.9;
  239.     PACK(maxreal, 1023);
  240.     SYSTEM.GET(API.MainParam, argc);
  241.  
  242.     libc := API.libc;
  243.     GetSym(libc, "fread",  SYSTEM.ADR(fread));
  244.     GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
  245.     GetSym(libc, "fopen",  SYSTEM.ADR(fopen));
  246.     GetSym(libc, "fclose", SYSTEM.ADR(fclose));
  247.     GetSym(libc, "chmod",  SYSTEM.ADR(_chmod));
  248.     GetSym(libc, "time",   SYSTEM.ADR(time));
  249.     GetSym(libc, "exit",   SYSTEM.ADR(exit));
  250.     GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout);
  251.  
  252.     librt := API.dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY);
  253.     GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
  254. END HOST.