Subversion Repositories Kolibri OS

Rev

Rev 7107 | 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 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:       SYSTEM.CARD16;
  46.         Reserved1:      SYSTEM.CARD16;
  47.         Reserved2:      SYSTEM.CARD16;
  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.  
  86. PROCEDURE [windows-, "kernel32.dll", "GetTickCount"]
  87.     _GetTickCount (): INTEGER;
  88.  
  89. PROCEDURE [windows-, "kernel32.dll", "GetStdHandle"]
  90.     _GetStdHandle (nStdHandle: INTEGER): INTEGER;
  91.  
  92. PROCEDURE [windows-, "kernel32.dll", "GetCommandLineA"]
  93.     _GetCommandLine (): INTEGER;
  94.  
  95. PROCEDURE [windows-, "kernel32.dll", "ReadFile"]
  96.     _ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  97.  
  98. PROCEDURE [windows-, "kernel32.dll", "WriteFile"]
  99.     _WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
  100.  
  101. PROCEDURE [windows-, "kernel32.dll", "CloseHandle"]
  102.     _CloseHandle (hObject: INTEGER): INTEGER;
  103.  
  104. PROCEDURE [windows-, "kernel32.dll", "CreateFileA"]
  105.     _CreateFile (
  106.         lpFileName, dwDesiredAccess, dwShareMode: INTEGER;
  107.         lpSecurityAttributes: PSecurityAttributes;
  108.         dwCreationDisposition, dwFlagsAndAttributes,
  109.         hTemplateFile: INTEGER): INTEGER;
  110.  
  111. PROCEDURE [windows-, "kernel32.dll", "OpenFile"]
  112.     _OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER;
  113.  
  114. PROCEDURE [windows-, "kernel32.dll", "GetCurrentDirectoryA"]
  115.     _GetCurrentDirectory (nBufferLength, lpBuffer: INTEGER): INTEGER;
  116.  
  117. PROCEDURE [windows-, "kernel32.dll", "GetSystemTime"]
  118.     _GetSystemTime (T: TSystemTime);
  119.  
  120. PROCEDURE [windows-, "kernel32.dll", "ExitProcess"]
  121.     _ExitProcess (code: INTEGER);
  122.  
  123.  
  124. PROCEDURE ExitProcess* (code: INTEGER);
  125. BEGIN
  126.     _ExitProcess(code)
  127. END ExitProcess;
  128.  
  129.  
  130. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  131. VAR
  132.     n: INTEGER;
  133.  
  134. BEGIN
  135.     n := _GetCurrentDirectory(LEN(path), SYSTEM.ADR(path[0]));
  136.     path[n] := slash;
  137.     path[n + 1] := 0X
  138. END GetCurrentDirectory;
  139.  
  140.  
  141. PROCEDURE GetChar (adr: INTEGER): CHAR;
  142. VAR
  143.     res: CHAR;
  144.  
  145. BEGIN
  146.     SYSTEM.GET(adr, res)
  147.     RETURN res
  148. END GetChar;
  149.  
  150.  
  151. PROCEDURE ParamParse;
  152. VAR
  153.     p, count, cond: INTEGER;
  154.     c: CHAR;
  155.  
  156.  
  157.     PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR);
  158.     BEGIN
  159.         IF (c <= 20X) & (c # 0X) THEN
  160.             cond := A
  161.         ELSIF c = 22X THEN
  162.             cond := B
  163.         ELSIF c = 0X THEN
  164.             cond := 6
  165.         ELSE
  166.             cond := C
  167.         END
  168.     END ChangeCond;
  169.  
  170.  
  171. BEGIN
  172.     p := _GetCommandLine();
  173.     cond := 0;
  174.     count := 0;
  175.     WHILE (count < MAX_PARAM) & (cond # 6) DO
  176.         c := GetChar(p);
  177.         CASE cond OF
  178.         |0: ChangeCond(0, 4, 1, cond, c); IF cond = 1 THEN Params[count, 0] := p END
  179.         |1: ChangeCond(0, 3, 1, cond, c); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  180.         |3: ChangeCond(3, 1, 3, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  181.         |4: ChangeCond(5, 0, 5, cond, c); IF cond = 5 THEN Params[count, 0] := p END
  182.         |5: ChangeCond(5, 1, 5, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  183.         |6:
  184.         END;
  185.         INC(p)
  186.     END;
  187.     argc := count
  188. END ParamParse;
  189.  
  190.  
  191. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  192. VAR
  193.     i, j, len: INTEGER;
  194.     c: CHAR;
  195.  
  196. BEGIN
  197.     j := 0;
  198.     IF n < argc THEN
  199.         len := LEN(s) - 1;
  200.         i := Params[n, 0];
  201.         WHILE (j < len) & (i <= Params[n, 1]) DO
  202.             c := GetChar(i);
  203.             IF c # 22X THEN
  204.                 s[j] := c;
  205.                 INC(j)
  206.             END;
  207.             INC(i)
  208.         END
  209.     END;
  210.     s[j] := 0X
  211. END GetArg;
  212.  
  213.  
  214. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  215. VAR
  216.     res, n: INTEGER;
  217.  
  218. BEGIN
  219.     IF _ReadFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
  220.         res := -1
  221.     ELSE
  222.         res := n
  223.     END
  224.  
  225.     RETURN res
  226. END FileRead;
  227.  
  228.  
  229. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  230. VAR
  231.     res, n: INTEGER;
  232.  
  233. BEGIN
  234.     IF _WriteFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
  235.         res := -1
  236.     ELSE
  237.         res := n
  238.     END
  239.  
  240.     RETURN res
  241. END FileWrite;
  242.  
  243.  
  244. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  245.     RETURN _CreateFile(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0)
  246. END FileCreate;
  247.  
  248.  
  249. PROCEDURE FileClose* (F: INTEGER);
  250. BEGIN
  251.     _CloseHandle(F)
  252. END FileClose;
  253.  
  254.  
  255. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  256. VAR
  257.     ofstr: OFSTRUCT;
  258.     res:   INTEGER;
  259.  
  260. BEGIN
  261.     res := _OpenFile(SYSTEM.ADR(FName[0]), ofstr, 0);
  262.     IF res = 0FFFFFFFFH THEN
  263.         res := -1
  264.     END
  265.  
  266.     RETURN res
  267. END FileOpen;
  268.  
  269.  
  270. PROCEDURE OutChar* (c: CHAR);
  271. VAR
  272.     count: INTEGER;
  273. BEGIN
  274.     _WriteFile(hConsoleOutput, SYSTEM.ADR(c), 1, count, NIL)
  275. END OutChar;
  276.  
  277.  
  278. PROCEDURE GetTickCount* (): INTEGER;
  279.     RETURN _GetTickCount() DIV 10
  280. END GetTickCount;
  281.  
  282.  
  283. PROCEDURE letter (c: CHAR): BOOLEAN;
  284.     RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z")
  285. END letter;
  286.  
  287.  
  288. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  289.     RETURN ~(letter(path[0]) & (path[1] = ":"))
  290. END isRelative;
  291.  
  292.  
  293. PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
  294. VAR
  295.     T: TSystemTime;
  296.  
  297. BEGIN
  298.     _GetSystemTime(T);
  299.     year  := ORD(T.Year);
  300.     month := ORD(T.Month);
  301.     day   := ORD(T.Day);
  302.     hour  := ORD(T.Hour);
  303.     min   := ORD(T.Min);
  304.     sec   := ORD(T.Sec)
  305. END now;
  306.  
  307.  
  308. PROCEDURE UnixTime* (): INTEGER;
  309.     RETURN 0
  310. END UnixTime;
  311.  
  312.  
  313. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  314. VAR
  315.     res: INTEGER;
  316.  
  317. BEGIN
  318.     a := 0;
  319.     b := 0;
  320.     SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
  321.     SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
  322.     SYSTEM.GET(SYSTEM.ADR(x), res)
  323.     RETURN res
  324. END splitf;
  325.  
  326.  
  327. BEGIN
  328.     eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X;
  329.     hConsoleOutput := _GetStdHandle(-11);
  330.     ParamParse
  331. END HOST.