Subversion Repositories Kolibri OS

Rev

Rev 7696 | 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
 
7696 akron1 15
    RTLD_LAZY* = 1;
7983 leency 16
    BIT_DEPTH* = 32;
7597 akron1 17
 
18
 
6613 leency 19
TYPE
20
 
7597 akron1 21
    TP* = ARRAY 2 OF INTEGER;
7983 leency 22
    SOFINI* = PROCEDURE;
6613 leency 23
 
7597 akron1 24
 
6613 leency 25
VAR
26
 
7696 akron1 27
    eol*: ARRAY 2 OF CHAR;
28
    MainParam*: INTEGER;
6613 leency 29
 
7597 akron1 30
    libc*, librt*: INTEGER;
6613 leency 31
 
7597 akron1 32
    dlopen*        : PROCEDURE [linux] (filename, flag: INTEGER): INTEGER;
33
    dlsym*         : PROCEDURE [linux] (handle, symbol: INTEGER): INTEGER;
6613 leency 34
 
7597 akron1 35
    stdout*,
36
    stdin*,
37
    stderr*        : INTEGER;
6613 leency 38
 
7597 akron1 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;
6613 leency 47
 
7597 akron1 48
    clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
49
    time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
6613 leency 50
 
7983 leency 51
    fini: SOFINI;
6613 leency 52
 
7983 leency 53
 
7597 akron1 54
PROCEDURE putc* (c: CHAR);
55
VAR
56
    res: INTEGER;
6613 leency 57
 
58
BEGIN
7597 akron1 59
    res := fwrite(SYSTEM.ADR(c), 1, 1, stdout)
60
END putc;
6613 leency 61
 
7597 akron1 62
 
6613 leency 63
PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
64
BEGIN
7597 akron1 65
    puts(lpCaption);
66
    puts(lpText)
6613 leency 67
END DebugMsg;
68
 
7597 akron1 69
 
70
PROCEDURE _NEW* (size: INTEGER): INTEGER;
71
VAR
72
    res, ptr, words: INTEGER;
73
 
6613 leency 74
BEGIN
7597 akron1 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
6613 leency 85
 
7597 akron1 86
    RETURN res
87
END _NEW;
88
 
89
 
90
PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
7107 akron1 91
BEGIN
7597 akron1 92
    free(p)
93
    RETURN 0
94
END _DISPOSE;
7107 akron1 95
 
7597 akron1 96
 
97
PROCEDURE GetProcAdr (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
98
VAR
99
    sym: INTEGER;
7696 akron1 100
 
6613 leency 101
BEGIN
7597 akron1 102
    sym := dlsym(lib, SYSTEM.ADR(name[0]));
103
    ASSERT(sym # 0);
104
    SYSTEM.PUT(VarAdr, sym)
105
END GetProcAdr;
6613 leency 106
 
7597 akron1 107
 
108
PROCEDURE init* (sp, code: INTEGER);
6613 leency 109
BEGIN
7983 leency 110
    fini := NIL;
7597 akron1 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;
6613 leency 115
 
7696 akron1 116
    libc := dlopen(SYSTEM.SADR("libc.so.6"), RTLD_LAZY);
7597 akron1 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));
6613 leency 132
 
7696 akron1 133
    librt := dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY);
7597 akron1 134
    GetProcAdr(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
6613 leency 135
END init;
136
 
7597 akron1 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
 
7983 leency 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.