Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7696 akron1 1
(*
7597 akron1 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 GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
42
VAR
43
    i, len, ptr: INTEGER;
44
    c: CHAR;
45
 
46
BEGIN
47
    i := 0;
48
    len := LEN(s) - 1;
49
    IF (0 <= n) & (n <= argc + envc) & (n # argc) & (len > 0) THEN
50
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
51
        REPEAT
52
            SYSTEM.GET(ptr, c);
53
            s[i] := c;
54
            INC(i);
55
            INC(ptr)
56
        UNTIL (c = 0X) OR (i = len)
57
    END;
58
    s[i] := 0X
59
END GetArg;
60
 
61
 
62
PROCEDURE GetEnv* (n: INTEGER; VAR s: ARRAY OF CHAR);
63
BEGIN
64
    IF (0 <= n) & (n < envc) THEN
65
        GetArg(n + argc + 1, s)
66
    ELSE
67
        s[0] := 0X
68
    END
69
END GetEnv;
70
 
71
 
72
PROCEDURE init;
73
VAR
74
    ptr: INTEGER;
75
 
76
BEGIN
77
 
7696 akron1 78
    IF API.MainParam # 0 THEN
79
        envc := -1;
80
        SYSTEM.GET(API.MainParam, argc);
81
        REPEAT
82
            SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr);
83
            INC(envc)
84
        UNTIL ptr = 0
85
    ELSE
86
        envc := 0;
87
        argc := 0
88
    END;
89
 
7597 akron1 90
    libc := API.libc;
91
 
92
    stdout := API.stdout;
93
    stdin  := API.stdin;
94
    stderr := API.stderr;
95
 
96
    malloc := API.malloc;
97
    free   := API.free;
98
    exit   := API._exit;
99
    puts   := API.puts;
100
    fwrite := API.fwrite;
101
    fread  := API.fread;
102
    fopen  := API.fopen;
103
    fclose := API.fclose;
104
    time   := API.time;
105
 
106
    librt := API.librt;
107
 
108
    clock_gettime := API.clock_gettime
109
END init;
110
 
111
 
112
PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER;
113
BEGIN
114
    SYSTEM.CODE(
115
    053H,               (*  push    ebx                    *)
116
    056H,               (*  push    esi                    *)
117
    057H,               (*  push    edi                    *)
118
    08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
119
    08BH, 05DH, 00CH,   (*  mov     ebx, dword [ebp + 12]  *)
120
    08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
121
    08BH, 055H, 014H,   (*  mov     edx, dword [ebp + 20]  *)
122
    08BH, 075H, 018H,   (*  mov     esi, dword [ebp + 24]  *)
123
    08BH, 07DH, 01CH,   (*  mov     edi, dword [ebp + 28]  *)
124
    0CDH, 080H,         (*  int     128                    *)
125
    05FH,               (*  pop     edi                    *)
126
    05EH,               (*  pop     esi                    *)
127
    05BH,               (*  pop     ebx                    *)
128
    0C9H,               (*  leave                          *)
129
    0C2H, 018H, 000H    (*  ret     24                     *)
130
    )
131
    RETURN 0
132
END syscall;
133
 
134
 
135
BEGIN
136
    init
7696 akron1 137
END LINAPI.