Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6613 Rev 7597
1
(*
1
(*
2
    Copyright 2016 Anton Krotov
2
    BSD 2-Clause License
3
 
-
 
4
    This program is free software: you can redistribute it and/or modify
-
 
5
    it under the terms of the GNU Lesser General Public License as published by
-
 
6
    the Free Software Foundation, either version 3 of the License, or
3
 
7
    (at your option) any later version.
-
 
8
 
-
 
9
    This program is distributed in the hope that it will be useful,
-
 
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-
 
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4
    Copyright (c) 2019, Anton Krotov
12
    GNU Lesser General Public License for more details.
-
 
13
 
-
 
14
    You should have received a copy of the GNU Lesser General Public License
-
 
15
    along with this program.  If not, see .
5
    All rights reserved.
16
*)
6
*)
17
 
7
 
18
MODULE HOST;
8
MODULE HOST;
19
 
9
 
-
 
10
IMPORT SYSTEM, API, RTL;
20
IMPORT sys := SYSTEM, API;
11
 
21
 
12
 
22
CONST
13
CONST
-
 
14
 
23
 
15
    slash* = "/";
-
 
16
    OS* = "LINUX";
-
 
17
 
24
  OS* = "LNX";
18
    bit_depth* = RTL.bit_depth;
-
 
19
    maxint* = RTL.maxint;
-
 
20
    minint* = RTL.minint;
25
  Slash* = "/";
21
 
26
 
22
 
27
VAR
23
VAR
28
 
24
 
29
  fsize  : INTEGER;
-
 
30
 
25
    argc: INTEGER;
31
  sec*	 : INTEGER;
-
 
32
  dsec*  : INTEGER;
-
 
33
 
-
 
34
PROCEDURE GetCommandLine* (): INTEGER;
26
 
35
  RETURN API.Param
27
    eol*: ARRAY 2 OF CHAR;
36
END GetCommandLine;
28
 
37
 
29
 
-
 
30
PROCEDURE ExitProcess* (code: INTEGER);
-
 
31
BEGIN
-
 
32
    API.exit(code)
-
 
33
END ExitProcess;
-
 
34
 
-
 
35
 
38
PROCEDURE CloseFile* (File: INTEGER);
-
 
39
BEGIN
-
 
40
  File := API.fclose(File)
36
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
41
END CloseFile;
37
VAR
-
 
38
    i, len, ptr: INTEGER;
-
 
39
    c: CHAR;
42
 
40
 
43
PROCEDURE FileRW* (hFile, Buffer, nNumberOfBytes: INTEGER; write: BOOLEAN): INTEGER;
41
BEGIN
-
 
42
    i := 0;
-
 
43
    len := LEN(s) - 1;
-
 
44
    IF (n < argc) & (len > 0) THEN
-
 
45
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
44
VAR res: INTEGER;
46
        REPEAT
45
BEGIN
47
            SYSTEM.GET(ptr, c);
46
  IF write THEN
48
            s[i] := c;
47
    res := API.fwrite(Buffer, nNumberOfBytes, 1, hFile) * nNumberOfBytes
49
            INC(i);
-
 
50
            INC(ptr)
-
 
51
        UNTIL (c = 0X) OR (i = len)
-
 
52
    END;
-
 
53
    s[i] := 0X
-
 
54
END GetArg;
48
  ELSE
-
 
49
    res := API.fread(Buffer, nNumberOfBytes, 1, hFile) * nNumberOfBytes
-
 
50
  END
55
 
-
 
56
 
-
 
57
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
-
 
58
VAR
-
 
59
    n: INTEGER;
-
 
60
 
-
 
61
BEGIN
-
 
62
    GetArg(0, path);
-
 
63
    n := LENGTH(path) - 1;
-
 
64
    WHILE path[n] # slash DO
-
 
65
        DEC(n)
51
  RETURN res
66
    END;
52
END FileRW;
67
    path[n + 1] := 0X
-
 
68
END GetCurrentDirectory;
53
 
69
 
54
PROCEDURE OutString* (str: ARRAY OF CHAR);
70
 
55
VAR res: INTEGER;
71
PROCEDURE ReadFile (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
72
    RETURN API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F)
56
BEGIN
73
END ReadFile;
57
  res := FileRW(API.stdout, sys.ADR(str), LENGTH(str), TRUE)
74
 
-
 
75
 
58
END OutString;
76
PROCEDURE WriteFile (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
77
    RETURN API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F)
59
 
78
END WriteFile;
60
PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
79
 
61
  RETURN API.fopen(sys.ADR(FName), sys.ADR("wb"))
80
 
62
END CreateFile;
-
 
63
 
-
 
64
PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
81
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
65
VAR F, res: INTEGER;
82
VAR
66
BEGIN
-
 
67
  F := API.fopen(sys.ADR(FName), sys.ADR("rb"));
-
 
68
  IF F # 0 THEN
-
 
69
    res   := API.fseek(F, 0, 2);
83
    res: INTEGER;
70
    fsize := API.ftell(F);
84
 
71
    res   := API.fseek(F, 0, 0)
85
BEGIN
72
  END
-
 
73
  RETURN F
-
 
74
END OpenFile;
-
 
75
 
86
    res := ReadFile(F, Buffer, bytes);
76
PROCEDURE FileSize* (F: INTEGER): INTEGER;
87
    IF res <= 0 THEN
-
 
88
        res := -1
77
  RETURN fsize
89
    END
-
 
90
 
78
END FileSize;
91
    RETURN res
79
 
-
 
80
PROCEDURE Align(n, m: INTEGER): INTEGER;
92
END FileRead;
81
  RETURN n + (m - n MOD m) MOD m
93
 
82
END Align;
94
 
83
 
95
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
96
VAR
84
PROCEDURE malloc* (Bytes: INTEGER): INTEGER;
97
    res: INTEGER;
85
VAR res: INTEGER;
98
 
-
 
99
BEGIN
-
 
100
    res := WriteFile(F, Buffer, bytes);
-
 
101
    IF res <= 0 THEN
-
 
102
        res := -1
-
 
103
    END
-
 
104
 
86
BEGIN
105
    RETURN res
87
  Bytes := Align(Bytes, 4);
106
END FileWrite;
-
 
107
 
-
 
108
 
-
 
109
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
-
 
110
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
-
 
111
END FileCreate;
-
 
112
 
-
 
113
 
-
 
114
PROCEDURE FileClose* (File: INTEGER);
-
 
115
BEGIN
-
 
116
    File := API.fclose(File)
-
 
117
END FileClose;
88
  res := API.malloc(Bytes);
118
 
89
  IF res # 0 THEN
119
 
-
 
120
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
-
 
121
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
-
 
122
END FileOpen;
-
 
123
 
-
 
124
 
-
 
125
PROCEDURE OutChar* (c: CHAR);
90
    API.zeromem(ASR(Bytes, 2), res)
-
 
91
  END
-
 
92
  RETURN res
126
BEGIN
93
END malloc;
127
    API.putc(c)
94
 
-
 
95
PROCEDURE ExitProcess* (code: INTEGER);
128
END OutChar;
96
BEGIN
129
 
97
  API.exit(code)
-
 
98
END ExitProcess;
130
 
99
 
131
PROCEDURE GetTickCount* (): INTEGER;
100
PROCEDURE Time* (VAR sec, dsec: INTEGER);
-
 
-
 
132
VAR
-
 
133
    tp:  API.TP;
-
 
134
    res: INTEGER;
-
 
135
 
-
 
136
BEGIN
-
 
137
    IF API.clock_gettime(0, tp) = 0 THEN
-
 
138
        res := tp[0] * 100 + tp[1] DIV 10000000
-
 
139
    ELSE
-
 
140
        res := 0
-
 
141
    END
-
 
142
 
-
 
143
    RETURN res
-
 
144
END GetTickCount;
101
VAR tp: API.TP;
145
 
-
 
146
 
-
 
147
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
-
 
148
    RETURN path[0] # slash
-
 
149
END isRelative;
-
 
150
 
-
 
151
 
-
 
152
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
-
 
153
END now;
102
BEGIN
154
 
-
 
155
 
-
 
156
PROCEDURE UnixTime* (): INTEGER;
-
 
157
    RETURN API.time(0)
-
 
158
END UnixTime;
-
 
159
 
103
  IF API.clock_gettime(0, tp) = 0 THEN
160
 
104
    sec := tp[0];
161
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
105
    dsec := tp[1] DIV 10000000
-
 
106
  ELSE
-
 
107
    sec := 0;
-
 
-
 
162
VAR
-
 
163
    res: INTEGER;
-
 
164
 
108
    dsec := 0
165
BEGIN
109
  END
166
    a := 0;
110
END Time;
167
    b := 0;
111
 
168
    SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
112
PROCEDURE init*;
169
    SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
113
BEGIN
170
    SYSTEM.GET(SYSTEM.ADR(x), res)
114
  Time(sec, dsec)
171
    RETURN res
115
END init;
172
END splitf;
116
 
173
 
117
PROCEDURE GetName*(): INTEGER;
174
 
118
  RETURN 0
175
BEGIN
119
END GetName;
176
    eol := 0AX;
120
 
177
    SYSTEM.GET(API.MainParam, argc)
121
END HOST.
178
END HOST.