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) 2018-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE HOST;
  9.  
  10. IMPORT SYSTEM, RTL;
  11.  
  12.  
  13. CONST
  14.  
  15.     slash* = "\";
  16.     eol* = 0DX + 0AX;
  17.  
  18.     bit_depth* = RTL.bit_depth;
  19.     maxint* = RTL.maxint;
  20.     minint* = RTL.minint;
  21.  
  22.     MAX_PARAM = 1024;
  23.  
  24.     OFS_MAXPATHNAME = 128;
  25.  
  26.  
  27. TYPE
  28.  
  29.     POverlapped = POINTER TO OVERLAPPED;
  30.  
  31.     OVERLAPPED = RECORD
  32.  
  33.         Internal:       INTEGER;
  34.         InternalHigh:   INTEGER;
  35.         Offset:         INTEGER;
  36.         OffsetHigh:     INTEGER;
  37.         hEvent:         INTEGER
  38.  
  39.     END;
  40.  
  41.     OFSTRUCT = RECORD
  42.  
  43.         cBytes:         CHAR;
  44.         fFixedDisk:     CHAR;
  45.         nErrCode:       WCHAR;
  46.         Reserved1:      WCHAR;
  47.         Reserved2:      WCHAR;
  48.         szPathName:     ARRAY OFS_MAXPATHNAME OF CHAR
  49.  
  50.     END;
  51.  
  52.     PSecurityAttributes = POINTER TO TSecurityAttributes;
  53.  
  54.     TSecurityAttributes = RECORD
  55.  
  56.         nLength:               INTEGER;
  57.         lpSecurityDescriptor:  INTEGER;
  58.         bInheritHandle:        INTEGER
  59.  
  60.     END;
  61.  
  62.  
  63. VAR
  64.  
  65.     hConsoleOutput: INTEGER;
  66.  
  67.     Params: ARRAY MAX_PARAM, 2 OF INTEGER;
  68.     argc: INTEGER;
  69.  
  70.     maxreal*: REAL;
  71.  
  72.  
  73. PROCEDURE [windows-, "kernel32.dll", "GetTickCount"]
  74.     _GetTickCount (): INTEGER;
  75.  
  76. PROCEDURE [windows-, "kernel32.dll", "GetStdHandle"]
  77.     _GetStdHandle (nStdHandle: INTEGER): INTEGER;
  78.  
  79. PROCEDURE [windows-, "kernel32.dll", "GetCommandLineA"]
  80.     _GetCommandLine (): INTEGER;
  81.  
  82. PROCEDURE [windows-, "kernel32.dll", "ReadFile"]
  83.     _ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  84.  
  85. PROCEDURE [windows-, "kernel32.dll", "WriteFile"]
  86.     _WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  87.  
  88. PROCEDURE [windows-, "kernel32.dll", "CloseHandle"]
  89.     _CloseHandle (hObject: INTEGER): INTEGER;
  90.  
  91. PROCEDURE [windows-, "kernel32.dll", "CreateFileA"]
  92.     _CreateFile (
  93.         lpFileName, dwDesiredAccess, dwShareMode: INTEGER;
  94.         lpSecurityAttributes: PSecurityAttributes;
  95.         dwCreationDisposition, dwFlagsAndAttributes,
  96.         hTemplateFile: INTEGER): INTEGER;
  97.  
  98. PROCEDURE [windows-, "kernel32.dll", "OpenFile"]
  99.     _OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER;
  100.  
  101. PROCEDURE [windows-, "kernel32.dll", "GetCurrentDirectoryA"]
  102.     _GetCurrentDirectory (nBufferLength, lpBuffer: INTEGER): INTEGER;
  103.  
  104. PROCEDURE [windows-, "kernel32.dll", "ExitProcess"]
  105.     _ExitProcess (code: INTEGER);
  106.  
  107. PROCEDURE [ccall, "msvcrt.dll", "time"]
  108.     _time (ptr: INTEGER): INTEGER;
  109.  
  110.  
  111. PROCEDURE ExitProcess* (code: INTEGER);
  112. BEGIN
  113.     _ExitProcess(code)
  114. END ExitProcess;
  115.  
  116.  
  117. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  118. VAR
  119.     n: INTEGER;
  120.  
  121. BEGIN
  122.     n := _GetCurrentDirectory(LEN(path), SYSTEM.ADR(path[0]));
  123.     path[n] := slash;
  124.     path[n + 1] := 0X
  125. END GetCurrentDirectory;
  126.  
  127.  
  128. PROCEDURE GetChar (adr: INTEGER): CHAR;
  129. VAR
  130.     res: CHAR;
  131.  
  132. BEGIN
  133.     SYSTEM.GET(adr, res)
  134.     RETURN res
  135. END GetChar;
  136.  
  137.  
  138. PROCEDURE ParamParse;
  139. VAR
  140.     p, count, cond: INTEGER;
  141.     c: CHAR;
  142.  
  143.  
  144.     PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR);
  145.     BEGIN
  146.         IF (c <= 20X) & (c # 0X) THEN
  147.             cond := A
  148.         ELSIF c = 22X THEN
  149.             cond := B
  150.         ELSIF c = 0X THEN
  151.             cond := 6
  152.         ELSE
  153.             cond := C
  154.         END
  155.     END ChangeCond;
  156.  
  157.  
  158. BEGIN
  159.     p := _GetCommandLine();
  160.     cond := 0;
  161.     count := 0;
  162.     WHILE (count < MAX_PARAM) & (cond # 6) DO
  163.         c := GetChar(p);
  164.         CASE cond OF
  165.         |0: ChangeCond(0, 4, 1, cond, c); IF cond = 1 THEN Params[count, 0] := p END
  166.         |1: ChangeCond(0, 3, 1, cond, c); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  167.         |3: ChangeCond(3, 1, 3, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  168.         |4: ChangeCond(5, 0, 5, cond, c); IF cond = 5 THEN Params[count, 0] := p END
  169.         |5: ChangeCond(5, 1, 5, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  170.         |6:
  171.         END;
  172.         INC(p)
  173.     END;
  174.     argc := count
  175. END ParamParse;
  176.  
  177.  
  178. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  179. VAR
  180.     i, j, len: INTEGER;
  181.     c: CHAR;
  182.  
  183. BEGIN
  184.     j := 0;
  185.     IF n < argc THEN
  186.         len := LEN(s) - 1;
  187.         i := Params[n, 0];
  188.         WHILE (j < len) & (i <= Params[n, 1]) DO
  189.             c := GetChar(i);
  190.             IF c # 22X THEN
  191.                 s[j] := c;
  192.                 INC(j)
  193.             END;
  194.             INC(i)
  195.         END
  196.     END;
  197.     s[j] := 0X
  198. END GetArg;
  199.  
  200.  
  201. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  202. VAR
  203.     res: INTEGER;
  204.  
  205. BEGIN
  206.     IF _ReadFile(F, SYSTEM.ADR(Buffer[0]), bytes, res, NIL) = 0 THEN
  207.         res := -1
  208.     END
  209.  
  210.     RETURN res
  211. END FileRead;
  212.  
  213.  
  214. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  215. VAR
  216.     res: INTEGER;
  217.  
  218. BEGIN
  219.     IF _WriteFile(F, SYSTEM.ADR(Buffer[0]), bytes, res, NIL) = 0 THEN
  220.         res := -1
  221.     END
  222.  
  223.     RETURN res
  224. END FileWrite;
  225.  
  226.  
  227. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  228.     RETURN _CreateFile(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0)
  229. END FileCreate;
  230.  
  231.  
  232. PROCEDURE FileClose* (F: INTEGER);
  233. BEGIN
  234.     _CloseHandle(F)
  235. END FileClose;
  236.  
  237.  
  238. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  239. VAR
  240.     ofstr: OFSTRUCT;
  241.     res:   INTEGER;
  242.  
  243. BEGIN
  244.     res := _OpenFile(SYSTEM.ADR(FName[0]), ofstr, 0);
  245.     IF res = 0FFFFFFFFH THEN
  246.         res := -1
  247.     END
  248.  
  249.     RETURN res
  250. END FileOpen;
  251.  
  252.  
  253. PROCEDURE chmod* (FName: ARRAY OF CHAR);
  254. END chmod;
  255.  
  256.  
  257. PROCEDURE OutChar* (c: CHAR);
  258. VAR
  259.     count: INTEGER;
  260. BEGIN
  261.     _WriteFile(hConsoleOutput, SYSTEM.ADR(c), 1, count, NIL)
  262. END OutChar;
  263.  
  264.  
  265. PROCEDURE GetTickCount* (): INTEGER;
  266.     RETURN _GetTickCount() DIV 10
  267. END GetTickCount;
  268.  
  269.  
  270. PROCEDURE letter (c: CHAR): BOOLEAN;
  271.     RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z")
  272. END letter;
  273.  
  274.  
  275. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  276.     RETURN ~(letter(path[0]) & (path[1] = ":"))
  277. END isRelative;
  278.  
  279.  
  280. PROCEDURE UnixTime* (): INTEGER;
  281.     RETURN _time(0)
  282. END UnixTime;
  283.  
  284.  
  285. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  286. BEGIN
  287.     SYSTEM.GET32(SYSTEM.ADR(x), a);
  288.     SYSTEM.GET32(SYSTEM.ADR(x) + 4, b)
  289.     RETURN a
  290. END splitf;
  291.  
  292.  
  293. PROCEDURE d2s* (x: REAL): INTEGER;
  294. VAR
  295.     h, l, s, e: INTEGER;
  296.  
  297. BEGIN
  298.     e := splitf(x, l, h);
  299.  
  300.     s := ASR(h, 31) MOD 2;
  301.     e := (h DIV 100000H) MOD 2048;
  302.     IF e <= 896 THEN
  303.         h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
  304.         REPEAT
  305.             h := h DIV 2;
  306.             INC(e)
  307.         UNTIL e = 897;
  308.         e := 896;
  309.         l := (h MOD 8) * 20000000H;
  310.         h := h DIV 8
  311.     ELSIF (1151 <= e) & (e < 2047) THEN
  312.         e := 1151;
  313.         h := 0;
  314.         l := 0
  315.     ELSIF e = 2047 THEN
  316.         e := 1151;
  317.         IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN
  318.             h := 80000H;
  319.             l := 0
  320.         END
  321.     END;
  322.     DEC(e, 896)
  323.  
  324.     RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
  325. END d2s;
  326.  
  327.  
  328. BEGIN
  329.     maxreal := 1.9;
  330.     PACK(maxreal, 1023);
  331.     hConsoleOutput := _GetStdHandle(-11);
  332.     ParamParse
  333. END HOST.