Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7983 leency 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
 
8097 maxcodehac 15
    eol* = 0AX;
16
 
7983 leency 17
    BIT_DEPTH* = 64;
18
 
8097 maxcodehac 19
    RTLD_LAZY = 1;
7983 leency 20
 
8097 maxcodehac 21
 
7983 leency 22
TYPE
23
 
8097 maxcodehac 24
    SOFINI = PROCEDURE;
7983 leency 25
 
26
 
27
VAR
28
 
8097 maxcodehac 29
    MainParam*, libc*: INTEGER;
7983 leency 30
 
8097 maxcodehac 31
    dlopen*       : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
32
    dlsym*        : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
7983 leency 33
 
8097 maxcodehac 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);
7983 leency 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
 
8097 maxcodehac 77
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
7983 leency 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)
8097 maxcodehac 85
END GetSym;
7983 leency 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);
8097 maxcodehac 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));
7983 leency 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.