API.ob07 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019-2021, 2023, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE API;
  7. IMPORT SYSTEM;
  8. CONST
  9. OS* = "LINUX";
  10. eol* = 0AX;
  11. BIT_DEPTH* = (ORD(LSL(1, 31) > 0) + 1) * 32;
  12. RTLD_LAZY = 1;
  13. TYPE
  14. SOFINI = PROCEDURE;
  15. VAR
  16. MainParam*, libc*: INTEGER;
  17. dlopen* : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
  18. dlsym* : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
  19. exit*,
  20. exit_thread* : PROCEDURE [linux] (code: INTEGER);
  21. puts : PROCEDURE [linux] (pStr: INTEGER);
  22. malloc : PROCEDURE [linux] (size: INTEGER): INTEGER;
  23. free : PROCEDURE [linux] (ptr: INTEGER);
  24. fini: SOFINI;
  25. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  26. BEGIN
  27. puts(lpCaption);
  28. puts(lpText)
  29. END DebugMsg;
  30. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  31. VAR
  32. res, ptr, words: INTEGER;
  33. BEGIN
  34. res := malloc(size);
  35. IF res # 0 THEN
  36. ptr := res;
  37. words := size DIV SYSTEM.SIZE(INTEGER);
  38. WHILE words > 0 DO
  39. SYSTEM.PUT(ptr, 0);
  40. INC(ptr, SYSTEM.SIZE(INTEGER));
  41. DEC(words)
  42. END
  43. END
  44. RETURN res
  45. END _NEW;
  46. PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
  47. BEGIN
  48. free(p)
  49. RETURN 0
  50. END _DISPOSE;
  51. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  52. VAR
  53. sym: INTEGER;
  54. BEGIN
  55. sym := dlsym(lib, SYSTEM.ADR(name[0]));
  56. ASSERT(sym # 0);
  57. SYSTEM.PUT(VarAdr, sym)
  58. END GetSym;
  59. PROCEDURE init* (sp, code: INTEGER);
  60. BEGIN
  61. fini := NIL;
  62. SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen);
  63. SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER), dlsym);
  64. MainParam := sp;
  65. libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY);
  66. GetSym(libc, "exit", SYSTEM.ADR(exit_thread));
  67. exit := exit_thread;
  68. GetSym(libc, "puts", SYSTEM.ADR(puts));
  69. GetSym(libc, "malloc", SYSTEM.ADR(malloc));
  70. GetSym(libc, "free", SYSTEM.ADR(free));
  71. END init;
  72. PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
  73. RETURN 0
  74. END dllentry;
  75. PROCEDURE sofinit*;
  76. BEGIN
  77. IF fini # NIL THEN
  78. fini
  79. END
  80. END sofinit;
  81. PROCEDURE SetFini* (ProcFini: SOFINI);
  82. BEGIN
  83. fini := ProcFini
  84. END SetFini;
  85. END API.