Subversion Repositories Kolibri OS

Rev

Rev 7209 | 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, K := KOSAPI, API, RTL;
  11.  
  12.  
  13. CONST
  14.  
  15.     slash* = "/";
  16.     OS* = "KOS";
  17.  
  18.     bit_depth* = RTL.bit_depth;
  19.     maxint* = RTL.maxint;
  20.     minint* = RTL.minint;
  21.  
  22.     MAX_PARAM = 1024;
  23.  
  24.  
  25. TYPE
  26.  
  27.     FNAME = ARRAY 520 OF CHAR;
  28.  
  29.     FS = POINTER TO rFS;
  30.  
  31.     rFS = RECORD
  32.         subfunc, pos, hpos, bytes, buffer: INTEGER;
  33.         name: FNAME
  34.     END;
  35.  
  36.     FD = POINTER TO rFD;
  37.  
  38.     rFD = RECORD
  39.         attr: INTEGER;
  40.         ntyp: CHAR;
  41.         reserved: ARRAY 3 OF CHAR;
  42.         time_create, date_create,
  43.         time_access, date_access,
  44.         time_modif,  date_modif,
  45.         size, hsize: INTEGER;
  46.         name: FNAME
  47.     END;
  48.  
  49.  
  50. VAR
  51.  
  52.  
  53.     Console: BOOLEAN;
  54.  
  55.     Params: ARRAY MAX_PARAM, 2 OF INTEGER;
  56.     argc*: INTEGER;
  57.  
  58.     eol*: ARRAY 3 OF CHAR;
  59.  
  60.  
  61. PROCEDURE [stdcall, "Console.obj", "con_init"] con_init (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
  62.  
  63. PROCEDURE [stdcall, "Console.obj", "con_exit"] con_exit (bCloseWindow: BOOLEAN);
  64.  
  65. PROCEDURE [stdcall, "Console.obj", "con_write_string"] con_write_string (string, length: INTEGER);
  66.  
  67.  
  68. PROCEDURE ExitProcess* (p1: INTEGER);
  69. BEGIN
  70.     IF Console THEN
  71.         con_exit(FALSE)
  72.     END;
  73.     K.sysfunc1(-1)
  74. END ExitProcess;
  75.  
  76.  
  77. PROCEDURE OutChar* (c: CHAR);
  78. BEGIN
  79.     IF Console THEN
  80.         con_write_string(SYSTEM.ADR(c), 1)
  81.     ELSE
  82.         K.sysfunc3(63, 1, ORD(c))
  83.     END
  84. END OutChar;
  85.  
  86.  
  87. PROCEDURE GetFileInfo (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
  88. VAR
  89.     res2: INTEGER;
  90.     fs:   rFS;
  91.  
  92. BEGIN
  93.     fs.subfunc := 5;
  94.     fs.pos := 0;
  95.     fs.hpos := 0;
  96.     fs.bytes := 0;
  97.     fs.buffer := SYSTEM.ADR(Info);
  98.     COPY(FName, fs.name)
  99.     RETURN K.sysfunc22(70, SYSTEM.ADR(fs), res2) = 0
  100. END GetFileInfo;
  101.  
  102.  
  103. PROCEDURE Exists (FName: ARRAY OF CHAR): BOOLEAN;
  104. VAR
  105.     fd: rFD;
  106.  
  107. BEGIN
  108.     RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
  109. END Exists;
  110.  
  111.  
  112. PROCEDURE Close (VAR F: FS);
  113. BEGIN
  114.     IF F # NIL THEN
  115.         DISPOSE(F)
  116.     END
  117. END Close;
  118.  
  119.  
  120. PROCEDURE Open (FName: ARRAY OF CHAR): FS;
  121. VAR
  122.     F: FS;
  123.  
  124. BEGIN
  125.     IF Exists(FName) THEN
  126.         NEW(F);
  127.         IF F # NIL THEN
  128.             F.subfunc := 0;
  129.             F.pos := 0;
  130.             F.hpos := 0;
  131.             F.bytes := 0;
  132.             F.buffer := 0;
  133.             COPY(FName, F.name)
  134.         END
  135.     ELSE
  136.         F := NIL
  137.     END
  138.  
  139.     RETURN F
  140. END Open;
  141.  
  142.  
  143. PROCEDURE Read (F: FS; Buffer, Count: INTEGER): INTEGER;
  144. VAR
  145.     res, res2: INTEGER;
  146.  
  147. BEGIN
  148.     IF F # NIL THEN
  149.         F.subfunc := 0;
  150.         F.bytes := Count;
  151.         F.buffer := Buffer;
  152.         res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
  153.         IF res2 > 0 THEN
  154.             F.pos := F.pos + res2
  155.         END
  156.     ELSE
  157.         res2 := 0
  158.     END
  159.  
  160.     RETURN res2
  161. END Read;
  162.  
  163.  
  164. PROCEDURE Write (F: FS; Buffer, Count: INTEGER): INTEGER;
  165. VAR
  166.     res, res2: INTEGER;
  167.  
  168. BEGIN
  169.     IF F # NIL THEN
  170.         F.subfunc := 3;
  171.         F.bytes := Count;
  172.         F.buffer := Buffer;
  173.         res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
  174.         IF res2 > 0 THEN
  175.             F.pos := F.pos + res2
  176.         END
  177.     ELSE
  178.         res2 := 0
  179.     END
  180.  
  181.     RETURN res2
  182. END Write;
  183.  
  184.  
  185. PROCEDURE Create (FName: ARRAY OF CHAR): FS;
  186. VAR
  187.     F:    FS;
  188.     res2: INTEGER;
  189.  
  190. BEGIN
  191.     NEW(F);
  192.     IF F # NIL THEN
  193.         F.subfunc := 2;
  194.         F.pos := 0;
  195.         F.hpos := 0;
  196.         F.bytes := 0;
  197.         F.buffer := 0;
  198.         COPY(FName, F.name);
  199.         IF K.sysfunc22(70, SYSTEM.ADR(F^), res2) # 0 THEN
  200.             DISPOSE(F)
  201.         END
  202.     END
  203.  
  204.     RETURN F
  205. END Create;
  206.  
  207.  
  208. PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  209. VAR
  210.     n: INTEGER;
  211.     fs: FS;
  212.  
  213. BEGIN
  214.     SYSTEM.GET(SYSTEM.ADR(F), fs);
  215.     n := Read(fs, SYSTEM.ADR(Buffer[0]), bytes);
  216.     IF n = 0 THEN
  217.         n := -1
  218.     END
  219.  
  220.     RETURN n
  221. END FileRead;
  222.  
  223.  
  224. PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
  225. VAR
  226.     n: INTEGER;
  227.     fs: FS;
  228.  
  229. BEGIN
  230.     SYSTEM.GET(SYSTEM.ADR(F), fs);
  231.     n := Write(fs, SYSTEM.ADR(Buffer[0]), bytes);
  232.     IF n = 0 THEN
  233.         n := -1
  234.     END
  235.  
  236.     RETURN n
  237. END FileWrite;
  238.  
  239.  
  240. PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
  241. VAR
  242.     fs: FS;
  243.     res: INTEGER;
  244.  
  245. BEGIN
  246.     fs := Create(FName);
  247.     SYSTEM.GET(SYSTEM.ADR(fs), res)
  248.     RETURN res
  249. END FileCreate;
  250.  
  251.  
  252. PROCEDURE FileClose* (F: INTEGER);
  253. VAR
  254.     fs: FS;
  255.  
  256. BEGIN
  257.     SYSTEM.GET(SYSTEM.ADR(F), fs);
  258.     Close(fs)
  259. END FileClose;
  260.  
  261.  
  262. PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
  263. VAR
  264.     fs: FS;
  265.     res: INTEGER;
  266.  
  267. BEGIN
  268.     fs := Open(FName);
  269.     SYSTEM.GET(SYSTEM.ADR(fs), res)
  270.     RETURN res
  271. END FileOpen;
  272.  
  273.  
  274. PROCEDURE GetTickCount* (): INTEGER;
  275.     RETURN K.sysfunc2(26, 9)
  276. END GetTickCount;
  277.  
  278.  
  279. PROCEDURE AppAdr (): INTEGER;
  280. VAR
  281.     buf: ARRAY 1024 OF CHAR;
  282.     a: INTEGER;
  283.  
  284. BEGIN
  285.     a := K.sysfunc3(9, SYSTEM.ADR(buf), -1);
  286.     SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
  287.     RETURN a
  288. END AppAdr;
  289.  
  290.  
  291. PROCEDURE GetCommandLine (): INTEGER;
  292. VAR
  293.     param: INTEGER;
  294.  
  295. BEGIN
  296.     SYSTEM.GET(28 + AppAdr(), param)
  297.     RETURN param
  298. END GetCommandLine;
  299.  
  300.  
  301. PROCEDURE GetName (): INTEGER;
  302. VAR
  303.     name: INTEGER;
  304.  
  305. BEGIN
  306.     SYSTEM.GET(32 + AppAdr(), name)
  307.     RETURN name
  308. END GetName;
  309.  
  310.  
  311. PROCEDURE GetChar (adr: INTEGER): CHAR;
  312. VAR
  313.     res: CHAR;
  314.  
  315. BEGIN
  316.     SYSTEM.GET(adr, res)
  317.     RETURN res
  318. END GetChar;
  319.  
  320.  
  321. PROCEDURE ParamParse;
  322. VAR
  323.     p, count, name, cond: INTEGER;
  324.     c: CHAR;
  325.  
  326.  
  327.     PROCEDURE ChangeCond (A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
  328.     BEGIN
  329.         IF (c <= 20X) & (c # 0X) THEN
  330.             cond := A
  331.         ELSIF c = 22X THEN
  332.             cond := B
  333.         ELSIF c = 0X THEN
  334.             cond := 6
  335.         ELSE
  336.             cond := C
  337.         END
  338.     END ChangeCond;
  339.  
  340.  
  341. BEGIN
  342.     p := GetCommandLine();
  343.     name := GetName();
  344.     Params[0, 0] := name;
  345.     WHILE GetChar(name) # 0X DO
  346.         INC(name)
  347.     END;
  348.     Params[0, 1] := name - 1;
  349.     cond := 0;
  350.     count := 1;
  351.     WHILE (argc < MAX_PARAM) & (cond # 6) DO
  352.         c := GetChar(p);
  353.         CASE cond OF
  354.         |0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
  355.         |1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
  356.         |3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  357.         |4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
  358.         |5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
  359.         |6:
  360.         END;
  361.         INC(p)
  362.     END;
  363.     argc := count
  364. END ParamParse;
  365.  
  366.  
  367. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  368. VAR
  369.     i, j, len: INTEGER;
  370.     c: CHAR;
  371.  
  372. BEGIN
  373.     j := 0;
  374.     IF n < argc THEN
  375.         len := LEN(s) - 1;
  376.         i := Params[n, 0];
  377.         WHILE (j < len) & (i <= Params[n, 1]) DO
  378.             c := GetChar(i);
  379.             IF c # 22X THEN
  380.                 s[j] := c;
  381.                 INC(j)
  382.             END;
  383.             INC(i);
  384.         END;
  385.     END;
  386.     s[j] := 0X
  387. END GetArg;
  388.  
  389.  
  390. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  391. VAR
  392.     n: INTEGER;
  393.  
  394. BEGIN
  395.     GetArg(0, path);
  396.     n := LENGTH(path) - 1;
  397.     WHILE path[n] # slash DO
  398.         DEC(n)
  399.     END;
  400.     path[n + 1] := 0X
  401. END GetCurrentDirectory;
  402.  
  403.  
  404. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  405.     RETURN path[0] # slash
  406. END isRelative;
  407.  
  408.  
  409. PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
  410. VAR
  411.     date, time: INTEGER;
  412.  
  413. BEGIN
  414.     date  := K.sysfunc1(29);
  415.     time  := K.sysfunc1(3);
  416.  
  417.     year  := date MOD 16;
  418.     date  := date DIV 16;
  419.     year  := (date MOD 16) * 10 + year;
  420.     date  := date DIV 16;
  421.  
  422.     month := date MOD 16;
  423.     date  := date DIV 16;
  424.     month := (date MOD 16) * 10 + month;
  425.     date  := date DIV 16;
  426.  
  427.     day   := date MOD 16;
  428.     date  := date DIV 16;
  429.     day   := (date MOD 16) * 10 + day;
  430.     date  := date DIV 16;
  431.  
  432.     hour  := time MOD 16;
  433.     time  := time DIV 16;
  434.     hour  := (time MOD 16) * 10 + hour;
  435.     time  := time DIV 16;
  436.  
  437.     min   := time MOD 16;
  438.     time  := time DIV 16;
  439.     min   := (time MOD 16) * 10 + min;
  440.     time  := time DIV 16;
  441.  
  442.     sec   := time MOD 16;
  443.     time  := time DIV 16;
  444.     sec   := (time MOD 16) * 10 + sec;
  445.     time  := time DIV 16;
  446.  
  447.     year := year + 2000
  448. END now;
  449.  
  450.  
  451. PROCEDURE UnixTime* (): INTEGER;
  452.     RETURN 0
  453. END UnixTime;
  454.  
  455.  
  456. PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
  457. BEGIN
  458.     SYSTEM.GET(SYSTEM.ADR(x),     a);
  459.     SYSTEM.GET(SYSTEM.ADR(x) + 4, b)
  460.     RETURN a
  461. END splitf;
  462.  
  463.  
  464. BEGIN
  465.     eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X;
  466.     Console := API.import;
  467.     IF Console THEN
  468.         con_init(-1, -1, -1, -1, SYSTEM.SADR("Oberon-07 for KolibriOS"))
  469.     END;
  470.     ParamParse
  471. END HOST.