Subversion Repositories Kolibri OS

Rev

Rev 7107 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7107 Rev 7597
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016, 2017 Anton Krotov
2
    BSD 2-Clause License
Line 3... Line 3...
3
 
3
 
4
    This file is part of Compiler.
-
 
5
 
-
 
6
    Compiler is free software: you can redistribute it and/or modify
-
 
7
    it under the terms of the GNU General Public License as published by
-
 
8
    the Free Software Foundation, either version 3 of the License, or
4
    Copyright (c) 2018, 2019, Anton Krotov
9
    (at your option) any later version.
-
 
10
 
-
 
11
    Compiler is distributed in the hope that it will be useful,
-
 
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-
 
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-
 
14
    GNU General Public License for more details.
-
 
15
 
-
 
16
    You should have received a copy of the GNU General Public License
-
 
17
    along with Compiler. If not, see .
5
    All rights reserved.
Line 18... Line 6...
18
*)
6
*)
Line 19... Line 7...
19
 
7
 
-
 
8
MODULE UTILS;
Line 20... Line 9...
20
MODULE UTILS;
9
 
Line 21... Line -...
21
 
-
 
22
IMPORT sys := SYSTEM, H := HOST, ERRORS;
10
IMPORT HOST, UNIXTIME;
23
 
-
 
24
CONST
-
 
25
 
-
 
26
  OS* = H.OS;
-
 
27
  Slash* = H.Slash;
-
 
28
  Ext* = ".ob07";
-
 
29
  MAX_PATH = 1024;
-
 
30
  MAX_PARAM = 1024;
-
 
31
  Date* = 1509580800;  (* 2017-11-02 *)
-
 
32
 
-
 
33
TYPE
-
 
34
 
-
 
35
  STRING* = ARRAY MAX_PATH OF CHAR;
-
 
36
 
-
 
37
  ITEM* = POINTER TO rITEM;
-
 
38
 
-
 
39
  rITEM* = RECORD
-
 
40
    Next*, Prev*: ITEM
-
 
41
  END;
-
 
42
 
-
 
43
  LIST* = POINTER TO RECORD
-
 
44
    First*, Last*: ITEM;
-
 
45
    Count*: INTEGER
-
 
46
  END;
-
 
Line -... Line 11...
-
 
11
 
-
 
12
 
47
 
13
CONST
Line 48... Line -...
48
  STRCONST* = POINTER TO RECORD (rITEM)
-
 
49
    Str*: STRING;
-
 
50
    Len*, Number*: INTEGER
14
 
Line 51... Line -...
51
  END;
-
 
52
 
-
 
53
VAR
-
 
54
 
-
 
Line 55... Line -...
55
  Params: ARRAY MAX_PARAM, 2 OF INTEGER;
-
 
56
  ParamCount*, Line*, Unit*: INTEGER;
-
 
57
  FileName: STRING;
15
    slash* = HOST.slash;
Line 58... Line -...
58
 
-
 
59
PROCEDURE SetFile*(F: STRING);
16
 
60
BEGIN
-
 
61
  FileName := F
-
 
62
END SetFile;
-
 
63
 
-
 
Line 64... Line -...
64
PROCEDURE IsInf*(x: LONGREAL): BOOLEAN;
-
 
65
  RETURN ABS(x) = sys.INF(LONGREAL)
17
    bit_depth* = HOST.bit_depth;
Line 66... Line -...
66
END IsInf;
-
 
67
 
-
 
68
PROCEDURE GetChar(adr: INTEGER): CHAR;
-
 
69
VAR res: CHAR;
-
 
70
BEGIN
18
    maxint* = HOST.maxint;
71
  sys.GET(adr, res)
-
 
72
  RETURN res
-
 
73
END GetChar;
-
 
74
 
-
 
75
PROCEDURE ParamParse(count: INTEGER);
-
 
Line 76... Line -...
76
VAR c: CHAR; cond, p: INTEGER;
-
 
77
 
-
 
78
  PROCEDURE ChangeCond(A, B, C: INTEGER);
-
 
79
  BEGIN
-
 
80
    cond := C;
-
 
81
    CASE c OF
-
 
82
    |0X: cond := 6
-
 
83
    |1X..20X: cond := A
-
 
84
    |22X: cond := B
-
 
85
    ELSE
-
 
86
    END
-
 
87
  END ChangeCond;
-
 
88
 
-
 
89
BEGIN
-
 
90
  p := H.GetCommandLine();
-
 
91
  cond := 0;
-
 
Line 92... Line 19...
92
  WHILE (count < MAX_PARAM) & (cond # 6) DO
19
    minint* = HOST.minint;
93
    c := GetChar(p);
-
 
94
    CASE cond OF
-
 
95
    |0: ChangeCond(0, 4, 1); IF cond = 1 THEN Params[count, 0] := p END
-
 
96
    |4: ChangeCond(5, 0, 5); IF cond = 5 THEN Params[count, 0] := p END
-
 
97
    |1: ChangeCond(0, 3, 1); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
-
 
98
    |3, 5: ChangeCond(cond, 1, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
-
 
99
    ELSE
20
    
100
    END;
-
 
101
    INC(p)
-
 
102
  END;
-
 
103
  ParamCount := count - 1
-
 
104
END ParamParse;
-
 
105
 
-
 
106
PROCEDURE ParamStr*(VAR str: ARRAY OF CHAR; n: INTEGER);
-
 
107
VAR i, j, len: INTEGER; c: CHAR;
-
 
108
BEGIN
-
 
109
  j := 0;
-
 
110
  IF n <= ParamCount THEN
-
 
111
    len := LEN(str) - 1;
-
 
112
    i := Params[n, 0];
-
 
113
    WHILE (j < len) & (i <= Params[n, 1]) DO
21
    OS = HOST.OS;
Line 114... Line -...
114
      c := GetChar(i);
-
 
115
      IF c # 22X THEN
-
 
116
        str[j] := c;
-
 
117
        INC(j)
-
 
Line 118... Line -...
118
      END;
-
 
119
      INC(i)
-
 
120
    END
-
 
121
  END;
-
 
122
  str[j] := 0X
22
 
123
END ParamStr;
23
 
124
 
-
 
125
PROCEDURE GetMem*(n: INTEGER): INTEGER;
-
 
126
  RETURN H.malloc(n)
-
 
127
END GetMem;
-
 
128
 
24
VAR
Line 129... Line -...
129
PROCEDURE CloseF*(F: INTEGER);
-
 
130
BEGIN
-
 
131
  H.CloseFile(F)
-
 
132
END CloseF;
-
 
133
 
-
 
134
PROCEDURE Read*(F, Buffer, Count: INTEGER): INTEGER;
-
 
135
  RETURN H.FileRW(F, Buffer, Count, FALSE)
-
 
Line 136... Line -...
136
END Read;
-
 
137
 
25
 
138
PROCEDURE Write*(F, Buffer, Count: INTEGER): INTEGER;
-
 
139
  RETURN H.FileRW(F, Buffer, Count, TRUE)
-
 
140
END Write;
-
 
141
 
-
 
142
PROCEDURE FileSize*(F: INTEGER): INTEGER;
-
 
143
  RETURN H.FileSize(F)
-
 
144
END FileSize;
-
 
145
 
-
 
146
PROCEDURE CharC*(x: CHAR);
-
 
147
VAR str: ARRAY 2 OF CHAR;
26
    time*: INTEGER;
148
BEGIN
-
 
149
  str[0] := x;
27
 
Line 150... Line -...
150
  str[1] := 0X;
-
 
151
  H.OutString(str)
-
 
152
END CharC;
-
 
153
 
-
 
154
PROCEDURE Int*(x: INTEGER);
-
 
Line 155... Line 28...
155
VAR i: INTEGER; buf: ARRAY 11 OF INTEGER;
28
    eol*:  ARRAY 3 OF CHAR;
156
BEGIN
29
 
157
  i := 0;
30
    maxreal*: REAL;
158
  REPEAT
31
 
Line 159... Line -...
159
    buf[i] := x MOD 10;
-
 
160
    x := x DIV 10;
-
 
161
    INC(i)
-
 
162
  UNTIL x = 0;
-
 
163
  REPEAT
-
 
164
    DEC(i);
-
 
Line 165... Line 32...
165
    CharC(CHR(buf[i] + ORD("0")))
32
 
166
  UNTIL i = 0
-
 
167
END Int;
-
 
168
 
-
 
169
PROCEDURE Ln*;
33
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
170
BEGIN
-
 
171
  CharC(0DX);
-
 
172
  CharC(0AX)
34
    RETURN HOST.FileRead(F, Buffer, bytes)
Line 173... Line -...
173
END Ln;
-
 
174
 
-
 
175
PROCEDURE OutString*(str: ARRAY OF CHAR);
-
 
176
BEGIN
-
 
177
  H.OutString(str)
-
 
178
END OutString;
-
 
179
 
-
 
180
PROCEDURE ErrMsg*(code: INTEGER);
-
 
181
VAR str: ARRAY 1024 OF CHAR;
-
 
Line 182... Line 35...
182
BEGIN
35
END FileRead;
183
  ERRORS.ErrorMsg(code, str);
36
 
184
  OutString("error: ("); Int(code); OutString(") "); OutString(str); Ln
-
 
185
END ErrMsg;
37
 
186
 
-
 
187
PROCEDURE ErrMsgPos*(line, col, code: INTEGER);
-
 
188
VAR s: STRING;
38
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
Line 189... Line -...
189
BEGIN
-
 
190
  ErrMsg(code);
-
 
191
  OutString("file:  "); OutString(FileName); Ln;
-
 
192
  OutString("line:  "); Int(line); Ln;
-
 
193
  OutString("pos:   "); Int(col); Ln;
-
 
194
END ErrMsgPos;
-
 
195
 
-
 
196
PROCEDURE UnitLine*(newUnit, newLine: INTEGER);
-
 
197
BEGIN
-
 
Line 198... Line -...
198
  Unit := newUnit;
-
 
199
  Line := newLine
39
    RETURN HOST.FileWrite(F, Buffer, bytes)
200
END UnitLine;
40
END FileWrite;
201
 
41
 
202
PROCEDURE Align*(n: INTEGER): INTEGER;
-
 
203
  RETURN (4 - n MOD 4) MOD 4
-
 
204
END Align;
-
 
205
 
-
 
206
PROCEDURE CAP(x: CHAR): CHAR;
-
 
207
BEGIN
-
 
208
  IF (x >= "a") & (x <= "z") THEN
-
 
209
    x := CHR(ORD(x) - 32)
42
 
Line 210... Line -...
210
  END
-
 
211
  RETURN x
-
 
212
END CAP;
-
 
213
 
-
 
214
PROCEDURE streq*(a, b: ARRAY OF CHAR): BOOLEAN;
-
 
215
VAR i: INTEGER;
-
 
216
BEGIN
-
 
217
  i := -1;
-
 
218
  REPEAT
-
 
219
    INC(i)
-
 
220
  UNTIL (CAP(a[i]) # CAP(b[i])) OR (a[i] = 0X) OR (b[i] = 0X)
-
 
221
  RETURN a[i] = b[i]
-
 
222
END streq;
-
 
223
 
-
 
224
PROCEDURE concat*(VAR L: STRING; R: STRING);
-
 
225
VAR i, n, pos: INTEGER;
-
 
226
BEGIN
-
 
227
  n := LENGTH(R);
-
 
228
  i := 0;
-
 
229
  pos := LENGTH(L);
-
 
230
  WHILE (i <= n) & (pos < LEN(L)) DO
-
 
231
    L[pos] := R[i];
-
 
232
    INC(pos);
-
 
Line 233... Line 43...
233
    INC(i)
43
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
234
  END
-
 
235
END concat;
-
 
236
 
-
 
237
PROCEDURE GetStr*(this: LIST; str: STRING): STRCONST;
-
 
238
VAR res: STRCONST;
-
 
239
BEGIN
-
 
240
  res := this.First(STRCONST);
44
    RETURN HOST.FileCreate(FName)
241
  WHILE (res # NIL) & (res.Str # str) DO
-
 
242
    res := res.Next(STRCONST)
-
 
243
  END
-
 
244
  RETURN res
45
END FileCreate;
Line 245... Line -...
245
END GetStr;
-
 
246
 
-
 
247
PROCEDURE Push*(this: LIST; item: ITEM);
-
 
248
BEGIN
-
 
249
  IF this.Count = 0 THEN
-
 
250
    this.First := item;
-
 
Line 251... Line 46...
251
    item.Prev := NIL
46
 
252
  ELSE
-
 
253
    this.Last.Next := item;
47
 
254
    item.Prev := this.Last
-
 
255
  END;
-
 
256
  INC(this.Count);
-
 
257
  this.Last := item;
48
PROCEDURE FileClose* (F: INTEGER);
258
  item.Next := NIL
-
 
259
END Push;
-
 
260
 
-
 
261
PROCEDURE Insert*(this: LIST; item, prev: ITEM);
-
 
262
BEGIN
-
 
263
  IF prev # this.Last THEN
49
BEGIN
Line 264... Line -...
264
    item.Next := prev.Next;
-
 
265
    item.Prev := prev;
-
 
266
    prev.Next := item;
-
 
267
    item.Next.Prev := item;
-
 
268
    INC(this.Count)
-
 
269
  ELSE
-
 
270
    Push(this, item)
-
 
271
  END
-
 
272
END Insert;
-
 
273
 
-
 
274
PROCEDURE Clear*(this: LIST);
-
 
275
BEGIN
-
 
276
  this.First := NIL;
-
 
277
  this.Last := NIL;
-
 
278
  this.Count := 0
-
 
279
END Clear;
-
 
280
 
-
 
281
PROCEDURE Revers(VAR str: STRING);
-
 
282
VAR a, b: INTEGER; c: CHAR;
-
 
283
BEGIN
-
 
284
  a := 0;
-
 
285
  b := LENGTH(str) - 1;
-
 
286
  WHILE a < b DO
-
 
287
    c := str[a];
-
 
288
    str[a] := str[b];
-
 
289
    str[b] := c;
-
 
290
    INC(a);
-
 
291
    DEC(b)
-
 
292
  END
-
 
293
END Revers;
-
 
294
 
-
 
295
PROCEDURE Split*(FName: STRING; VAR Path, Name, Ext: STRING);
-
 
296
VAR i, j, k: INTEGER;
-
 
Line 297... Line -...
297
BEGIN
-
 
298
  i := LENGTH(FName) - 1;
50
    HOST.FileClose(F)
299
  j := 0;
-
 
300
  WHILE (i >= 0) & (FName[i] # Slash) DO
-
 
301
    Name[j] := FName[i];
-
 
302
    DEC(i);
-
 
303
    INC(j)
-
 
304
  END;
51
END FileClose;
305
  Name[j] := 0X;
-
 
306
  Revers(Name);
-
 
307
  j := 0;
-
 
308
  k := LENGTH(Name) - 1;
-
 
309
  WHILE (k >= 0) & (Name[k] # ".") DO
-
 
310
    Ext[j] := Name[k];
-
 
311
    DEC(k);
-
 
312
    INC(j)
-
 
313
  END;
52
 
Line 314... Line -...
314
  IF k >= 0 THEN
-
 
315
    Name[k] := 0X;
-
 
316
    Ext[j] := ".";
-
 
317
    INC(j)
-
 
318
  ELSE
-
 
319
    j := 0
-
 
320
  END;
-
 
321
  Ext[j] := 0X;
-
 
322
  Revers(Ext);
-
 
323
  FOR j := 0 TO i DO
-
 
324
    Path[j] := FName[j]
-
 
325
  END;
-
 
326
  Path[i + 1] := 0X
-
 
327
END Split;
-
 
328
 
-
 
Line 329... Line 53...
329
PROCEDURE LinuxParam;
53
 
330
VAR p, i, str: INTEGER; c: CHAR;
-
 
331
BEGIN
-
 
332
  p := H.GetCommandLine();
54
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
333
  sys.GET(p, ParamCount);
55
    RETURN HOST.FileOpen(FName)
Line 334... Line -...
334
  sys.GET(p + 4, p);
-
 
335
  FOR i := 0 TO ParamCount - 1 DO
-
 
336
    sys.GET(p + i * 4, str);
-
 
337
    Params[i, 0] := str;
-
 
338
    REPEAT
-
 
339
      sys.GET(str, c);
-
 
340
      INC(str)
-
 
Line 341... Line 56...
341
    UNTIL c = 0X;
56
END FileOpen;
342
    Params[i, 1] := str - 1
-
 
343
  END;
57
 
344
  DEC(ParamCount)
-
 
345
END LinuxParam;
-
 
346
 
-
 
347
PROCEDURE Time*;
-
 
348
VAR sec, dsec: INTEGER;
-
 
349
BEGIN
-
 
350
  OutString("elapsed time ");
58
 
351
  H.Time(sec, dsec);
59
PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
352
  sec := sec - H.sec;
-
 
353
  dsec := dsec - H.dsec;
-
 
354
  dsec := dsec + sec * 100;
-
 
355
  Int(dsec DIV 100); CharC(".");
-
 
Line 356... Line -...
356
  dsec := dsec MOD 100;
-
 
357
  IF dsec < 10 THEN
-
 
Line 358... Line 60...
358
    Int(0)
60
BEGIN
359
  END;
61
    HOST.GetArg(i, str)
360
  Int(dsec); OutString(" sec"); Ln
62
END GetArg;
361
END Time;
63
 
362
 
-
 
Line 363... Line 64...
363
PROCEDURE HALT*(n: INTEGER);
64
 
364
BEGIN
-
 
365
  Time;
65
PROCEDURE Exit* (code: INTEGER);
366
  H.ExitProcess(n)
-
 
367
END HALT;
66
BEGIN
368
 
67
    HOST.ExitProcess(code)
369
PROCEDURE MemErr*(err: BOOLEAN);
68
END Exit;
370
BEGIN
69
 
371
  IF err THEN
-
 
372
    ErrMsg(72);
-
 
373
    HALT(1)
-
 
374
  END
70
 
-
 
71
PROCEDURE GetTickCount* (): INTEGER;
-
 
72
    RETURN HOST.GetTickCount()
375
END MemErr;
73
END GetTickCount;
-
 
74
 
Line 376... Line 75...
376
 
75
 
-
 
76
PROCEDURE OutChar* (c: CHAR);
-
 
77
BEGIN
377
PROCEDURE CreateList*(): LIST;
78
    HOST.OutChar(c)
-
 
79
END OutChar;
378
VAR nov: LIST;
80
 
379
BEGIN
81