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) 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.     OS* = "LINUX";
  17.  
  18.     bit_depth* = RTL.bit_depth;
  19.     maxint* = RTL.maxint;
  20.     minint* = RTL.minint;
  21.  
  22.  
  23. VAR
  24.  
  25.     argc: INTEGER;
  26.  
  27.     eol*: ARRAY 2 OF CHAR;
  28.  
  29.     maxreal*: REAL;
  30.  
  31.  
  32. PROCEDURE ExitProcess* (code: INTEGER);
  33. BEGIN
  34.     API.exit(code)
  35. END ExitProcess;
  36.  
  37.  
  38. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  39. VAR
  40.     i, len, ptr: INTEGER;
  41.     c: CHAR;
  42.  
  43. BEGIN
  44.     i := 0;
  45.     len := LEN(s) - 1;
  46.     IF (n < argc) & (len > 0) THEN
  47.         SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
  48.         REPEAT
  49.             SYSTEM.GET(ptr, c);
  50.             s[i] := c;
  51.             INC(i);
  52.             INC(ptr)
  53.         UNTIL (c = 0X) OR (i = len)
  54.     END;
  55.     s[i] := 0X
  56. END GetArg;
  57.  
  58.  
  59. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  60. VAR
  61.     n: INTEGER;
  62.  
  63. BEGIN
  64.     GetArg(0, path);
  65.     n := LENGTH(path) - 1;
  66.     WHILE path[n] # slash DO
  67.         DEC(n)
  68.     END;
  69.     path[n + 1] := 0X
  70. END GetCurrentDirectory;
  71.  
  72.  
  73. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  74. VAR
  75.     res: INTEGER;
  76.  
  77. BEGIN
  78.     res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
  79.     IF res <= 0 THEN
  80.         res := -1
  81.     END
  82.  
  83.     RETURN res
  84. END FileRead;
  85.  
  86.  
  87. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  88. VAR
  89.     res: INTEGER;
  90.  
  91. BEGIN
  92.     res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
  93.     IF res <= 0 THEN
  94.         res := -1
  95.     END
  96.  
  97.     RETURN res
  98. END FileWrite;
  99.  
  100.  
  101. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  102.     RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
  103. END FileCreate;
  104.  
  105.  
  106. PROCEDURE FileClose* (File: INTEGER);
  107. BEGIN
  108.     File := API.fclose(File)
  109. END FileClose;
  110.  
  111.  
  112. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  113.     RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
  114. END FileOpen;
  115.  
  116.  
  117. PROCEDURE OutChar* (c: CHAR);
  118. BEGIN
  119.     API.putc(c)
  120. END OutChar;
  121.  
  122.  
  123. PROCEDURE GetTickCount* (): INTEGER;
  124. VAR
  125.     tp:  API.TP;
  126.     res: INTEGER;
  127.  
  128. BEGIN
  129.     IF API.clock_gettime(0, tp) = 0 THEN
  130.         res := tp[0] * 100 + tp[1] DIV 10000000
  131.     ELSE
  132.         res := 0
  133.     END
  134.  
  135.     RETURN res
  136. END GetTickCount;
  137.  
  138.  
  139. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  140.     RETURN path[0] # slash
  141. END isRelative;
  142.  
  143.  
  144. PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
  145. END now;
  146.  
  147.  
  148. PROCEDURE UnixTime* (): INTEGER;
  149.     RETURN API.time(0)
  150. END UnixTime;
  151.  
  152.  
  153. PROCEDURE d2s* (x: REAL): INTEGER;
  154. VAR
  155.     h, l, s, e: INTEGER;
  156.  
  157. BEGIN
  158.     SYSTEM.GET(SYSTEM.ADR(x), l);
  159.     SYSTEM.GET(SYSTEM.ADR(x) + 4, h);
  160.  
  161.     s := ASR(h, 31) MOD 2;
  162.     e := (h DIV 100000H) MOD 2048;
  163.     IF e <= 896 THEN
  164.         h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
  165.         REPEAT
  166.             h := h DIV 2;
  167.             INC(e)
  168.         UNTIL e = 897;
  169.         e := 896;
  170.         l := (h MOD 8) * 20000000H;
  171.         h := h DIV 8
  172.     ELSIF (1151 <= e) & (e < 2047) THEN
  173.         e := 1151;
  174.         h := 0;
  175.         l := 0
  176.     ELSIF e = 2047 THEN
  177.         e := 1151;
  178.         IF (h MOD 100000H # 0) OR (l # 0) THEN
  179.             h := 80000H;
  180.             l := 0
  181.         END
  182.     END;
  183.     DEC(e, 896)
  184.  
  185.     RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
  186. END d2s;
  187.  
  188.  
  189. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  190. VAR
  191.     res: INTEGER;
  192.  
  193. BEGIN
  194.     a := 0;
  195.     b := 0;
  196.     SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
  197.     SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
  198.     SYSTEM.GET(SYSTEM.ADR(x), res)
  199.     RETURN res
  200. END splitf;
  201.  
  202.  
  203. BEGIN
  204.     eol := 0AX;
  205.     maxreal := 1.9;
  206.     PACK(maxreal, 1023);
  207.     SYSTEM.GET(API.MainParam, argc)
  208. END HOST.