Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7597 akron1 1
(*
2
    BSD 2-Clause License
3
 
4
    Copyright (c) 2019, Anton Krotov
5
    All rights reserved.
6
*)
7
 
8
MODULE LINAPI;
9
 
10
IMPORT SYSTEM, API;
11
 
12
 
13
TYPE
14
 
15
    TP* = API.TP;
16
 
17
 
18
VAR
19
 
20
    argc*, envc*: INTEGER;
21
 
22
    libc*, librt*: INTEGER;
23
 
24
    stdout*,
25
    stdin*,
26
    stderr*        : INTEGER;
27
 
28
    malloc*        : PROCEDURE [linux] (size: INTEGER): INTEGER;
29
    free*          : PROCEDURE [linux] (ptr: INTEGER);
30
    exit*          : PROCEDURE [linux] (code: INTEGER);
31
    puts*          : PROCEDURE [linux] (pStr: INTEGER);
32
    fwrite*,
33
    fread*         : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
34
    fopen*         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
35
    fclose*        : PROCEDURE [linux] (file: INTEGER): INTEGER;
36
    time*          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
37
 
38
    clock_gettime* : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
39
 
40
 
41
PROCEDURE dlopen* (filename: ARRAY OF CHAR): INTEGER;
42
    RETURN API.dlopen(SYSTEM.ADR(filename[0]), 1)
43
END dlopen;
44
 
45
 
46
PROCEDURE dlsym* (handle: INTEGER; symbol: ARRAY OF CHAR): INTEGER;
47
    RETURN API.dlsym(handle, SYSTEM.ADR(symbol[0]))
48
END dlsym;
49
 
50
 
51
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
52
VAR
53
    i, len, ptr: INTEGER;
54
    c: CHAR;
55
 
56
BEGIN
57
    i := 0;
58
    len := LEN(s) - 1;
59
    IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN
60
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
61
        REPEAT
62
            SYSTEM.GET(ptr, c);
63
            s[i] := c;
64
            INC(i);
65
            INC(ptr)
66
        UNTIL (c = 0X) OR (i = len)
67
    END;
68
    s[i] := 0X
69
END GetArg;
70
 
71
 
72
PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR);
73
BEGIN
74
    IF (0 <= n) & (n < envc) THEN
75
        GetArg(n + argc + 1, s)
76
    ELSE
77
        s[0] := 0X
78
    END
79
END GetEnv;
80
 
81
 
82
PROCEDURE init;
83
VAR
84
    ptr: INTEGER;
85
 
86
BEGIN
87
    envc := -1;
88
    SYSTEM.GET(API.MainParam, argc);
89
    REPEAT
90
        SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr);
91
        INC(envc)
92
    UNTIL ptr = 0;
93
 
94
    libc := API.libc;
95
 
96
    stdout := API.stdout;
97
    stdin  := API.stdin;
98
    stderr := API.stderr;
99
 
100
    malloc := API.malloc;
101
    free   := API.free;
102
    exit   := API._exit;
103
    puts   := API.puts;
104
    fwrite := API.fwrite;
105
    fread  := API.fread;
106
    fopen  := API.fopen;
107
    fclose := API.fclose;
108
    time   := API.time;
109
 
110
    librt := API.librt;
111
 
112
    clock_gettime := API.clock_gettime
113
END init;
114
 
115
 
116
PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER;
117
BEGIN
118
    SYSTEM.CODE(
119
    053H,               (*  push    ebx                    *)
120
    056H,               (*  push    esi                    *)
121
    057H,               (*  push    edi                    *)
122
    08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
123
    08BH, 05DH, 00CH,   (*  mov     ebx, dword [ebp + 12]  *)
124
    08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
125
    08BH, 055H, 014H,   (*  mov     edx, dword [ebp + 20]  *)
126
    08BH, 075H, 018H,   (*  mov     esi, dword [ebp + 24]  *)
127
    08BH, 07DH, 01CH,   (*  mov     edi, dword [ebp + 28]  *)
128
    0CDH, 080H,         (*  int     128                    *)
129
    05FH,               (*  pop     edi                    *)
130
    05EH,               (*  pop     esi                    *)
131
    05BH,               (*  pop     ebx                    *)
132
    0C9H,               (*  leave                          *)
133
    0C2H, 018H, 000H    (*  ret     24                     *)
134
    )
135
    RETURN 0
136
END syscall;
137
 
138
 
139
BEGIN
140
    init
141
END LINAPI.