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-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE API;
  9.  
  10. IMPORT SYSTEM;
  11.  
  12.  
  13. CONST
  14.  
  15.     RTLD_LAZY* = 1;
  16.     BIT_DEPTH* = 64;
  17.  
  18.  
  19. TYPE
  20.  
  21.     TP* = ARRAY 2 OF INTEGER;
  22.     SOFINI* = PROCEDURE;
  23.  
  24.  
  25. VAR
  26.  
  27.     eol*: ARRAY 2 OF CHAR;
  28.     MainParam*: INTEGER;
  29.  
  30.     libc*, librt*: INTEGER;
  31.  
  32.     dlopen*        : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
  33.     dlsym*         : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
  34.  
  35.     stdout*,
  36.     stdin*,
  37.     stderr*        : INTEGER;
  38.  
  39.     malloc*        : PROCEDURE [linux] (size: INTEGER): INTEGER;
  40.     free*          : PROCEDURE [linux] (ptr: INTEGER);
  41.     _exit*         : PROCEDURE [linux] (code: INTEGER);
  42.     puts*          : PROCEDURE [linux] (pStr: INTEGER);
  43.     fwrite*,
  44.     fread*         : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  45.     fopen*         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  46.     fclose*        : PROCEDURE [linux] (file: INTEGER): INTEGER;
  47.  
  48.     clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
  49.     time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
  50.  
  51.     fini: SOFINI;
  52.  
  53.  
  54. PROCEDURE putc* (c: CHAR);
  55. VAR
  56.     res: INTEGER;
  57.  
  58. BEGIN
  59.     res := fwrite(SYSTEM.ADR(c), 1, 1, stdout)
  60. END putc;
  61.  
  62.  
  63. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  64. BEGIN
  65.     puts(lpCaption);
  66.     puts(lpText)
  67. END DebugMsg;
  68.  
  69.  
  70. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  71. VAR
  72.     res, ptr, words: INTEGER;
  73.  
  74. BEGIN
  75.     res := malloc(size);
  76.     IF res # 0 THEN
  77.         ptr := res;
  78.         words := size DIV SYSTEM.SIZE(INTEGER);
  79.         WHILE words > 0 DO
  80.             SYSTEM.PUT(ptr, 0);
  81.             INC(ptr, SYSTEM.SIZE(INTEGER));
  82.             DEC(words)
  83.         END
  84.     END
  85.  
  86.     RETURN res
  87. END _NEW;
  88.  
  89.  
  90. PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
  91. BEGIN
  92.     free(p)
  93.     RETURN 0
  94. END _DISPOSE;
  95.  
  96.  
  97. PROCEDURE GetProcAdr (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  98. VAR
  99.     sym: INTEGER;
  100.  
  101. BEGIN
  102.     sym := dlsym(lib, SYSTEM.ADR(name[0]));
  103.     ASSERT(sym # 0);
  104.     SYSTEM.PUT(VarAdr, sym)
  105. END GetProcAdr;
  106.  
  107.  
  108. PROCEDURE init* (sp, code: INTEGER);
  109. BEGIN
  110.     fini := NIL;
  111.     SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen);
  112.     SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER),     dlsym);
  113.     MainParam := sp;
  114.     eol := 0AX;
  115.  
  116.     libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY);
  117.     GetProcAdr(libc, "malloc", SYSTEM.ADR(malloc));
  118.     GetProcAdr(libc, "free", SYSTEM.ADR(free));
  119.     GetProcAdr(libc, "exit", SYSTEM.ADR(_exit));
  120.     GetProcAdr(libc, "stdout", SYSTEM.ADR(stdout));
  121.     GetProcAdr(libc, "stdin", SYSTEM.ADR(stdin));
  122.     GetProcAdr(libc, "stderr", SYSTEM.ADR(stderr));
  123.     SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout);
  124.     SYSTEM.GET(stdin  - SYSTEM.SIZE(INTEGER), stdin);
  125.     SYSTEM.GET(stderr - SYSTEM.SIZE(INTEGER), stderr);
  126.     GetProcAdr(libc, "puts", SYSTEM.ADR(puts));
  127.     GetProcAdr(libc, "fwrite", SYSTEM.ADR(fwrite));
  128.     GetProcAdr(libc, "fread", SYSTEM.ADR(fread));
  129.     GetProcAdr(libc, "fopen", SYSTEM.ADR(fopen));
  130.     GetProcAdr(libc, "fclose", SYSTEM.ADR(fclose));
  131.     GetProcAdr(libc, "time", SYSTEM.ADR(time));
  132.  
  133.     librt := dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY);
  134.     GetProcAdr(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
  135. END init;
  136.  
  137.  
  138. PROCEDURE exit* (code: INTEGER);
  139. BEGIN
  140.     _exit(code)
  141. END exit;
  142.  
  143.  
  144. PROCEDURE exit_thread* (code: INTEGER);
  145. BEGIN
  146.     _exit(code)
  147. END exit_thread;
  148.  
  149.  
  150. PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
  151.     RETURN 0
  152. END dllentry;
  153.  
  154.  
  155. PROCEDURE sofinit*;
  156. BEGIN
  157.     IF fini # NIL THEN
  158.         fini
  159.     END
  160. END sofinit;
  161.  
  162.  
  163. PROCEDURE SetFini* (ProcFini: SOFINI);
  164. BEGIN
  165.     fini := ProcFini
  166. END SetFini;
  167.  
  168.  
  169. END API.