Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Details | Compare with Previous | 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 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
    envc := -1;
78
    SYSTEM.GET(API.MainParam, argc);
79
    REPEAT
80
        SYSTEM.GET(API.MainParam + (envc + argc + 3) * SYSTEM.SIZE(INTEGER), ptr);
81
        INC(envc)
82
    UNTIL ptr = 0;
83
 
84
    libc := API.libc;
85
 
86
    stdout := API.stdout;
87
    stdin  := API.stdin;
88
    stderr := API.stderr;
89
 
90
    malloc := API.malloc;
91
    free   := API.free;
92
    exit   := API._exit;
93
    puts   := API.puts;
94
    fwrite := API.fwrite;
95
    fread  := API.fread;
96
    fopen  := API.fopen;
97
    fclose := API.fclose;
98
    time   := API.time;
99
 
100
    librt := API.librt;
101
 
102
    clock_gettime := API.clock_gettime
103
END init;
104
 
105
 
106
PROCEDURE [stdcall-] syscall* (eax, ebx, ecx, edx, esi, edi: INTEGER): INTEGER;
107
BEGIN
108
    SYSTEM.CODE(
109
    053H,               (*  push    ebx                    *)
110
    056H,               (*  push    esi                    *)
111
    057H,               (*  push    edi                    *)
112
    08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
113
    08BH, 05DH, 00CH,   (*  mov     ebx, dword [ebp + 12]  *)
114
    08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
115
    08BH, 055H, 014H,   (*  mov     edx, dword [ebp + 20]  *)
116
    08BH, 075H, 018H,   (*  mov     esi, dword [ebp + 24]  *)
117
    08BH, 07DH, 01CH,   (*  mov     edi, dword [ebp + 28]  *)
118
    0CDH, 080H,         (*  int     128                    *)
119
    05FH,               (*  pop     edi                    *)
120
    05EH,               (*  pop     esi                    *)
121
    05BH,               (*  pop     ebx                    *)
122
    0C9H,               (*  leave                          *)
123
    0C2H, 018H, 000H    (*  ret     24                     *)
124
    )
125
    RETURN 0
126
END syscall;
127
 
128
 
129
BEGIN
130
    init
131
END LINAPI.