Subversion Repositories Kolibri OS

Rev

Rev 7983 | 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.     eol* = 0AX;
  16.  
  17.     BIT_DEPTH* = 64;
  18.  
  19.     RTLD_LAZY = 1;
  20.  
  21.  
  22. TYPE
  23.  
  24.     SOFINI = PROCEDURE;
  25.  
  26.  
  27. VAR
  28.  
  29.     MainParam*, libc*: INTEGER;
  30.  
  31.     dlopen*       : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
  32.     dlsym*        : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
  33.  
  34.     exit*,
  35.     exit_thread*  : PROCEDURE [linux] (code: INTEGER);
  36.     puts          : PROCEDURE [linux] (pStr: INTEGER);
  37.     malloc        : PROCEDURE [linux] (size: INTEGER): INTEGER;
  38.     free          : PROCEDURE [linux] (ptr: INTEGER);
  39.  
  40.     fini: SOFINI;
  41.  
  42.  
  43. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  44. BEGIN
  45.     puts(lpCaption);
  46.     puts(lpText)
  47. END DebugMsg;
  48.  
  49.  
  50. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  51. VAR
  52.     res, ptr, words: INTEGER;
  53.  
  54. BEGIN
  55.     res := malloc(size);
  56.     IF res # 0 THEN
  57.         ptr := res;
  58.         words := size DIV SYSTEM.SIZE(INTEGER);
  59.         WHILE words > 0 DO
  60.             SYSTEM.PUT(ptr, 0);
  61.             INC(ptr, SYSTEM.SIZE(INTEGER));
  62.             DEC(words)
  63.         END
  64.     END
  65.  
  66.     RETURN res
  67. END _NEW;
  68.  
  69.  
  70. PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
  71. BEGIN
  72.     free(p)
  73.     RETURN 0
  74. END _DISPOSE;
  75.  
  76.  
  77. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  78. VAR
  79.     sym: INTEGER;
  80.  
  81. BEGIN
  82.     sym := dlsym(lib, SYSTEM.ADR(name[0]));
  83.     ASSERT(sym # 0);
  84.     SYSTEM.PUT(VarAdr, sym)
  85. END GetSym;
  86.  
  87.  
  88. PROCEDURE init* (sp, code: INTEGER);
  89. BEGIN
  90.     fini := NIL;
  91.     SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen);
  92.     SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER),     dlsym);
  93.     MainParam := sp;
  94.  
  95.     libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY);
  96.     GetSym(libc, "exit", SYSTEM.ADR(exit_thread));
  97.     exit := exit_thread;
  98.     GetSym(libc, "puts", SYSTEM.ADR(puts));
  99.     GetSym(libc, "malloc", SYSTEM.ADR(malloc));
  100.     GetSym(libc, "free", SYSTEM.ADR(free));
  101. END init;
  102.  
  103.  
  104. PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
  105.     RETURN 0
  106. END dllentry;
  107.  
  108.  
  109. PROCEDURE sofinit*;
  110. BEGIN
  111.     IF fini # NIL THEN
  112.         fini
  113.     END
  114. END sofinit;
  115.  
  116.  
  117. PROCEDURE SetFini* (ProcFini: SOFINI);
  118. BEGIN
  119.     fini := ProcFini
  120. END SetFini;
  121.  
  122.  
  123. END API.