Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2019, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE LINAPI;
  9.  
  10. IMPORT SYSTEM, API;
  11.  
  12.  
  13. TYPE
  14.  
  15.     TP* = API.TP;
  16.  
  17.  
  18. VAR
  19.  
  20.     argc*, envc*: INTEGER;
  21.  
  22.     libc*, librt*: INTEGER;
  23.  
  24.     stdout*,
  25.     stdin*,
  26.     stderr*        : INTEGER;
  27.  
  28.     malloc*        : PROCEDURE [linux] (size: INTEGER): INTEGER;
  29.     free*          : PROCEDURE [linux] (ptr: INTEGER);
  30.     exit*          : PROCEDURE [linux] (code: INTEGER);
  31.     puts*          : PROCEDURE [linux] (pStr: INTEGER);
  32.     fwrite*,
  33.     fread*         : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  34.     fopen*         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  35.     fclose*        : PROCEDURE [linux] (file: INTEGER): INTEGER;
  36.     time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  37.  
  38.     clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  39.  
  40.  
  41. PROCEDURE dlopen* (filename: ARRAY OF CHAR): INTEGER;
  42.     RETURN API.dlopen(SYSTEM.ADR(filename[0]), 1)
  43. END dlopen;
  44.  
  45.  
  46. PROCEDURE dlsym* (handle: INTEGER; symbol: ARRAY OF CHAR): INTEGER;
  47.     RETURN API.dlsym(handle, SYSTEM.ADR(symbol[0]))
  48. END dlsym;
  49.  
  50.  
  51. PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
  52. VAR
  53.     i, len, ptr: INTEGER;
  54.     c: CHAR;
  55.  
  56. BEGIN
  57.     i := 0;
  58.     len := LEN(s) - 1;
  59.     IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN
  60.         SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
  61.         REPEAT
  62.             SYSTEM.GET(ptr, c);
  63.             s[i] := c;
  64.             INC(i);
  65.             INC(ptr)
  66.         UNTIL (c = 0X) OR (i = len)
  67.     END;
  68.     s[i] := 0X
  69. END GetArg;
  70.  
  71.  
  72. PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR);
  73. BEGIN
  74.     IF (0 <= n) & (n < envc) THEN
  75.         GetArg(n + argc + 1, s)
  76.     ELSE
  77.         s[0] := 0X
  78.     END
  79. END GetEnv;
  80.  
  81.  
  82. PROCEDURE init;
  83. VAR
  84.     ptr: INTEGER;
  85.  
  86. BEGIN
  87.     envc := -1;
  88.     SYSTEM.GET(API.MainParam, argc);
  89.     REPEAT
  90.         SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr);
  91.         INC(envc)
  92.     UNTIL ptr = 0;
  93.  
  94.     libc := API.libc;
  95.  
  96.     stdout := API.stdout;
  97.     stdin  := API.stdin;
  98.     stderr := API.stderr;
  99.  
  100.     malloc := API.malloc;
  101.     free   := API.free;
  102.     exit   := API._exit;
  103.     puts   := API.puts;
  104.     fwrite := API.fwrite;
  105.     fread  := API.fread;
  106.     fopen  := API.fopen;
  107.     fclose := API.fclose;
  108.     time   := API.time;
  109.  
  110.     librt := API.librt;
  111.  
  112.     clock_gettime := API.clock_gettime
  113. END init;
  114.  
  115.  
  116. PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER;
  117. BEGIN
  118.     SYSTEM.CODE(
  119.     053H,               (*  push    ebx                    *)
  120.     056H,               (*  push    esi                    *)
  121.     057H,               (*  push    edi                    *)
  122.     08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
  123.     08BH, 05DH, 00CH,   (*  mov     ebx, dword [ebp + 12]  *)
  124.     08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
  125.     08BH, 055H, 014H,   (*  mov     edx, dword [ebp + 20]  *)
  126.     08BH, 075H, 018H,   (*  mov     esi, dword [ebp + 24]  *)
  127.     08BH, 07DH, 01CH,   (*  mov     edi, dword [ebp + 28]  *)
  128.     0CDH, 080H,         (*  int     128                    *)
  129.     05FH,               (*  pop     edi                    *)
  130.     05EH,               (*  pop     esi                    *)
  131.     05BH,               (*  pop     ebx                    *)
  132.     0C9H,               (*  leave                          *)
  133.     0C2H, 018H, 000H    (*  ret     24                     *)
  134.     )
  135.     RETURN 0
  136. END syscall;
  137.  
  138.  
  139. BEGIN
  140.     init
  141. END LINAPI.