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 HOST;
  9.  
  10. IMPORT SYSTEM, RTL;
  11.  
  12.  
  13. CONST
  14.  
  15.     slash* = "\";
  16.     OS* = "WINDOWS";
  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.     TSystemTime = RECORD
  63.  
  64.         Year,
  65.         Month,
  66.         DayOfWeek,
  67.         Day,
  68.         Hour,
  69.         Min,
  70.         Sec,
  71.         MSec:  WCHAR
  72.  
  73.     END;
  74.  
  75.  
  76. VAR
  77.  
  78.     hConsoleOutput: INTEGER;
  79.  
  80.     Params: ARRAY MAX_PARAM, 2 OF INTEGER;
  81.     argc: INTEGER;
  82.  
  83.     eol*: ARRAY 3 OF CHAR;
  84.  
  85.     maxreal*: REAL;
  86.  
  87.  
  88. PROCEDURE [windows-, "kernel32.dll", "GetTickCount"]
  89.     _GetTickCount (): INTEGER;
  90.  
  91. PROCEDURE [windows-, "kernel32.dll", "GetStdHandle"]
  92.     _GetStdHandle (nStdHandle: INTEGER): INTEGER;
  93.  
  94. PROCEDURE [windows-, "kernel32.dll", "GetCommandLineA"]
  95.     _GetCommandLine (): INTEGER;
  96.  
  97. PROCEDURE [windows-, "kernel32.dll", "ReadFile"]
  98.     _ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  99.  
  100. PROCEDURE [windows-, "kernel32.dll", "WriteFile"]
  101.     _WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  102.  
  103. PROCEDURE [windows-, "kernel32.dll", "CloseHandle"]
  104.     _CloseHandle (hObject: INTEGER): INTEGER;
  105.  
  106. PROCEDURE [windows-, "kernel32.dll", "CreateFileA"]
  107.     _CreateFile (
  108.         lpFileName, dwDesiredAccess, dwShareMode: INTEGER;
  109.         lpSecurityAttributes: PSecurityAttributes;
  110.         dwCreationDisposition, dwFlagsAndAttributes,
  111.         hTemplateFile: INTEGER): INTEGER;
  112.  
  113. PROCEDURE [windows-, "kernel32.dll", "OpenFile"]
  114.     _OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER;
  115.  
  116. PROCEDURE [windows-, "kernel32.dll", "GetCurrentDirectoryA"]
  117.     _GetCurrentDirectory (nBufferLength, lpBuffer: INTEGER): INTEGER;
  118.  
  119. PROCEDURE [windows-, "kernel32.dll", "GetSystemTime"]
  120.     _GetSystemTime (T: TSystemTime);
  121.  
  122. PROCEDURE [windows-, "kernel32.dll", "ExitProcess"]
  123.     _ExitProcess (code: INTEGER);
  124.  
  125.  
  126. PROCEDURE ExitProcess* (code: INTEGER);
  127. BEGIN
  128.     _ExitProcess(code)
  129. END ExitProcess;
  130.  
  131.  
  132. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  133. VAR
  134.     n: INTEGER;
  135.  
  136. BEGIN
  137.     n := _GetCurrentDirectory(LEN(path), SYSTEM.ADR(path[0]));
  138.     path[n] := slash;
  139.     path[n + 1] := 0X
  140. END GetCurrentDirectory;
  141.  
  142.  
  143. PROCEDURE GetChar (adr: INTEGER): CHAR;
  144. VAR
  145.     res: CHAR;
  146.  
  147. BEGIN
  148.     SYSTEM.GET(adr, res)
  149.     RETURN res
  150. END GetChar;
  151.  
  152.  
  153. PROCEDURE ParamParse;
  154. VAR
  155.     p, count, cond: INTEGER;
  156.     c: CHAR;
  157.  
  158.  
  159.     PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR);
  160.     BEGIN
  161.         IF (c <= 20X) & (c # 0X) THEN
  162.             cond := A
  163.         ELSIF c = 22X THEN
  164.             cond := B
  165.         ELSIF c = 0X THEN
  166.             cond := 6
  167.         ELSE
  168.             cond := C
  169.         END
  170.     END ChangeCond;
  171.  
  172.  
  173. BEGIN
  174.     p := _GetCommandLine();
  175.     cond := 0;
  176.     count := 0;
  177.     WHILE (count < MAX_PARAM) & (cond # 6) DO
  178.         c := GetChar(p);
  179.         CASE cond OF
  180.         |0: ChangeCond(0, 4, 1, cond, c); IF cond = 1 THEN Params[count, 0] := p END
  181.         |1: ChangeCond(0, 3, 1, cond, c); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  182.         |3: ChangeCond(3, 1, 3, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  183.         |4: ChangeCond(5, 0, 5, cond, c); IF cond = 5 THEN Params[count, 0] := p END
  184.         |5: ChangeCond(5, 1, 5, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  185.         |6:
  186.         END;
  187.         INC(p)
  188.     END;
  189.     argc := count
  190. END ParamParse;
  191.  
  192.  
  193. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  194. VAR
  195.     i, j, len: INTEGER;
  196.     c: CHAR;
  197.  
  198. BEGIN
  199.     j := 0;
  200.     IF n < argc THEN
  201.         len := LEN(s) - 1;
  202.         i := Params[n, 0];
  203.         WHILE (j < len) & (i <= Params[n, 1]) DO
  204.             c := GetChar(i);
  205.             IF c # 22X THEN
  206.                 s[j] := c;
  207.                 INC(j)
  208.             END;
  209.             INC(i)
  210.         END
  211.     END;
  212.     s[j] := 0X
  213. END GetArg;
  214.  
  215.  
  216. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
  217. VAR
  218.     res, n: INTEGER;
  219.  
  220. BEGIN
  221.     IF _ReadFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
  222.         res := -1
  223.     ELSE
  224.         res := n
  225.     END
  226.  
  227.     RETURN res
  228. END FileRead;
  229.  
  230.  
  231. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  232. VAR
  233.     res, n: INTEGER;
  234.  
  235. BEGIN
  236.     IF _WriteFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
  237.         res := -1
  238.     ELSE
  239.         res := n
  240.     END
  241.  
  242.     RETURN res
  243. END FileWrite;
  244.  
  245.  
  246. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  247.     RETURN _CreateFile(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0)
  248. END FileCreate;
  249.  
  250.  
  251. PROCEDURE FileClose* (F: INTEGER);
  252. BEGIN
  253.     _CloseHandle(F)
  254. END FileClose;
  255.  
  256.  
  257. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  258. VAR
  259.     ofstr: OFSTRUCT;
  260.     res:   INTEGER;
  261.  
  262. BEGIN
  263.     res := _OpenFile(SYSTEM.ADR(FName[0]), ofstr, 0);
  264.     IF res = 0FFFFFFFFH THEN
  265.         res := -1
  266.     END
  267.  
  268.     RETURN res
  269. END FileOpen;
  270.  
  271.  
  272. PROCEDURE OutChar* (c: CHAR);
  273. VAR
  274.     count: INTEGER;
  275. BEGIN
  276.     _WriteFile(hConsoleOutput, SYSTEM.ADR(c), 1, count, NIL)
  277. END OutChar;
  278.  
  279.  
  280. PROCEDURE GetTickCount* (): INTEGER;
  281.     RETURN _GetTickCount() DIV 10
  282. END GetTickCount;
  283.  
  284.  
  285. PROCEDURE letter (c: CHAR): BOOLEAN;
  286.     RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z")
  287. END letter;
  288.  
  289.  
  290. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  291.     RETURN ~(letter(path[0]) & (path[1] = ":"))
  292. END isRelative;
  293.  
  294.  
  295. PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
  296. VAR
  297.     T: TSystemTime;
  298.  
  299. BEGIN
  300.     _GetSystemTime(T);
  301.     year  := ORD(T.Year);
  302.     month := ORD(T.Month);
  303.     day   := ORD(T.Day);
  304.     hour  := ORD(T.Hour);
  305.     min   := ORD(T.Min);
  306.     sec   := ORD(T.Sec)
  307. END now;
  308.  
  309.  
  310. PROCEDURE UnixTime* (): INTEGER;
  311.     RETURN 0
  312. END UnixTime;
  313.  
  314.  
  315. PROCEDURE d2s* (x: REAL): INTEGER;
  316. VAR
  317.     h, l, s, e: INTEGER;
  318.  
  319. BEGIN
  320.     SYSTEM.GET(SYSTEM.ADR(x), l);
  321.     SYSTEM.GET(SYSTEM.ADR(x) + 4, h);
  322.  
  323.     s := ASR(h, 31) MOD 2;
  324.     e := (h DIV 100000H) MOD 2048;
  325.     IF e <= 896 THEN
  326.         h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
  327.         REPEAT
  328.             h := h DIV 2;
  329.             INC(e)
  330.         UNTIL e = 897;
  331.         e := 896;
  332.         l := (h MOD 8) * 20000000H;
  333.         h := h DIV 8
  334.     ELSIF (1151 <= e) & (e < 2047) THEN
  335.         e := 1151;
  336.         h := 0;
  337.         l := 0
  338.     ELSIF e = 2047 THEN
  339.         e := 1151;
  340.         IF (h MOD 100000H # 0) OR (l # 0) THEN
  341.             h := 80000H;
  342.             l := 0
  343.         END
  344.     END;
  345.     DEC(e, 896)
  346.  
  347.     RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
  348. END d2s;
  349.  
  350.  
  351. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  352. VAR
  353.     res: INTEGER;
  354.  
  355. BEGIN
  356.     a := 0;
  357.     b := 0;
  358.     SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
  359.     SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
  360.     SYSTEM.GET(SYSTEM.ADR(x), res)
  361.     RETURN res
  362. END splitf;
  363.  
  364.  
  365. BEGIN
  366.     eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X;
  367.     maxreal := 1.9;
  368.     PACK(maxreal, 1023);
  369.     hConsoleOutput := _GetStdHandle(-11);
  370.     ParamParse
  371. END HOST.