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