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
(*
7597 akron1 2
    BSD 2-Clause License
6613 leency 3
 
7983 leency 4
    Copyright (c) 2019-2020, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE API;
9
 
7597 akron1 10
IMPORT SYSTEM;
6613 leency 11
 
7597 akron1 12
 
13
CONST
14
 
8097 maxcodehac 15
    eol* = 0AX;
16
 
7983 leency 17
    BIT_DEPTH* = 32;
7597 akron1 18
 
8097 maxcodehac 19
    RTLD_LAZY = 1;
7597 akron1 20
 
8097 maxcodehac 21
 
6613 leency 22
TYPE
23
 
8097 maxcodehac 24
    SOFINI = PROCEDURE;
6613 leency 25
 
7597 akron1 26
 
6613 leency 27
VAR
28
 
8097 maxcodehac 29
    MainParam*, libc*: INTEGER;
6613 leency 30
 
8097 maxcodehac 31
    dlopen*       : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
32
    dlsym*        : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
6613 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);
6613 leency 39
 
7983 leency 40
    fini: SOFINI;
6613 leency 41
 
7983 leency 42
 
6613 leency 43
PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
44
BEGIN
7597 akron1 45
    puts(lpCaption);
46
    puts(lpText)
6613 leency 47
END DebugMsg;
48
 
7597 akron1 49
 
50
PROCEDURE _NEW* (size: INTEGER): INTEGER;
51
VAR
52
    res, ptr, words: INTEGER;
53
 
6613 leency 54
BEGIN
7597 akron1 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
6613 leency 65
 
7597 akron1 66
    RETURN res
67
END _NEW;
68
 
69
 
70
PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
7107 akron1 71
BEGIN
7597 akron1 72
    free(p)
73
    RETURN 0
74
END _DISPOSE;
7107 akron1 75
 
7597 akron1 76
 
8097 maxcodehac 77
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
7597 akron1 78
VAR
79
    sym: INTEGER;
7696 akron1 80
 
6613 leency 81
BEGIN
7597 akron1 82
    sym := dlsym(lib, SYSTEM.ADR(name[0]));
83
    ASSERT(sym # 0);
84
    SYSTEM.PUT(VarAdr, sym)
8097 maxcodehac 85
END GetSym;
6613 leency 86
 
7597 akron1 87
 
88
PROCEDURE init* (sp, code: INTEGER);
6613 leency 89
BEGIN
7983 leency 90
    fini := NIL;
7597 akron1 91
    SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER) * 2, dlopen);
92
    SYSTEM.GET(code - 1000H - SYSTEM.SIZE(INTEGER),     dlsym);
93
    MainParam := sp;
6613 leency 94
 
7696 akron1 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));
6613 leency 101
END init;
102
 
7597 akron1 103
 
7983 leency 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.