Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7597 Rev 7693
Line 20... Line 20...
20
    DLL_THREAD_ATTACH   = 2;
20
    DLL_THREAD_ATTACH   = 2;
21
    DLL_THREAD_DETACH   = 3;
21
    DLL_THREAD_DETACH   = 3;
22
    DLL_PROCESS_DETACH  = 0;
22
    DLL_PROCESS_DETACH  = 0;
Line 23... Line 23...
23
 
23
 
-
 
24
    SIZE_OF_DWORD = 4;
Line 24... Line 25...
24
    SIZE_OF_DWORD = 4;
25
    MAX_SET = 31;
Line 25... Line 26...
25
 
26
 
-
 
27
 
Line 26... Line 28...
26
 
28
TYPE
Line 27... Line 29...
27
TYPE
29
 
Line 38... Line 40...
38
        process_detach,
40
        process_detach,
39
        thread_detach,
41
        thread_detach,
40
        thread_attach: DLL_ENTRY
42
        thread_attach: DLL_ENTRY
41
    END;
43
    END;
Line -... Line 44...
-
 
44
 
-
 
45
    fini: PROC;
Line 42... Line 46...
42
 
46
 
43
 
47
 
44
PROCEDURE [stdcall] _move* (bytes, source, dest: INTEGER);
48
PROCEDURE [stdcall] _move* (bytes, source, dest: INTEGER);
Line 105... Line 109...
105
 
109
 
106
    RETURN res
110
    RETURN res
Line 107... Line 111...
107
END _arrcpy;
111
END _arrcpy;
108
 
112
 
109
 
113
 
110
PROCEDURE [stdcall] _strcpy* (chr_size, len_dst, dst, len_src, src: INTEGER);
114
PROCEDURE [stdcall] _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER);
Line 111... Line -...
111
BEGIN
-
 
112
    _move(MIN(len_dst, len_src) * chr_size, src, dst)
-
 
113
END _strcpy;
-
 
114
 
-
 
115
 
-
 
116
PROCEDURE [stdcall] _strcpy2* (chr_size, len_src, src, len_dst, dst: INTEGER);
-
 
117
BEGIN
115
BEGIN
118
    _move(MIN(len_dst, len_src) * chr_size, src, dst)
116
    _move(MIN(len_dst, len_src) * chr_size, src, dst)
119
END _strcpy2;
117
END _strcpy;
Line 120... Line 118...
120
 
118
 
Line 135... Line 133...
135
    A[k] := n
133
    A[k] := n
Line 136... Line 134...
136
 
134
 
Line 137... Line 135...
137
END _rot;
135
END _rot;
138
 
-
 
139
 
-
 
140
PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER;
-
 
141
VAR
136
 
142
    res: INTEGER;
137
 
143
 
138
PROCEDURE [stdcall] _set* (b, a: INTEGER): INTEGER;
144
BEGIN
139
BEGIN
145
    IF (a <= b) & (a <= 31) & (b >= 0) THEN
140
    IF (a <= b) & (a <= MAX_SET) & (b >= 0) THEN
146
        IF b > 31 THEN
141
        IF b > MAX_SET THEN
147
            b := 31
142
            b := MAX_SET
148
        END;
143
        END;
149
        IF a < 0 THEN
144
        IF a < 0 THEN
150
            a := 0
145
            a := 0
151
        END;
146
        END;
152
        res := LSR(ASR(ROR(1, 1), b - a), 31 - b)
147
        a := LSR(ASR(ROR(1, 1), b - a), MAX_SET - b)
Line 153... Line 148...
153
    ELSE
148
    ELSE
154
        res := 0
149
        a := 0
Line 155... Line 150...
155
    END
150
    END
156
 
151
 
157
    RETURN res
152
    RETURN a
Line 158... Line 153...
158
END _set2;
153
END _set;
159
 
154
 
160
 
155
 
Line 183... Line 178...
183
 
178
 
184
    RETURN 0
179
    RETURN 0
Line 185... Line 180...
185
END divmod;
180
END divmod;
186
 
181
 
187
 
182
 
Line 188... Line 183...
188
PROCEDURE div_ (x, y: INTEGER): INTEGER;
183
PROCEDURE [stdcall] _div2* (x, y: INTEGER): INTEGER;
189
VAR
184
VAR
190
    div, mod: INTEGER;
185
    div, mod: INTEGER;
191
 
186
 
192
BEGIN
187
BEGIN
Line 193... Line 188...
193
    div := divmod(x, y, mod);
188
    div := divmod(x, y, mod);
194
    IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN
189
    IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN
Line 195... Line 190...
195
        DEC(div)
190
        DEC(div)
196
    END
191
    END
197
 
192
 
Line 198... Line 193...
198
    RETURN div
193
    RETURN div
199
END div_;
194
END _div2;
200
 
195
 
201
 
196
 
202
PROCEDURE mod_ (x, y: INTEGER): INTEGER;
197
PROCEDURE [stdcall] _mod2* (x, y: INTEGER): INTEGER;
Line 203... Line 198...
203
VAR
198
VAR
204
    div, mod: INTEGER;
199
    div, mod: INTEGER;
Line 205... Line 200...
205
 
200
 
206
BEGIN
201
BEGIN
207
    div := divmod(x, y, mod);
202
    div := divmod(x, y, mod);
Line 208... Line -...
208
    IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN
-
 
209
        INC(mod, y)
-
 
210
    END
-
 
211
 
-
 
212
    RETURN mod
-
 
213
END mod_;
203
    IF (mod # 0) & ((x < 0) & (y > 0) OR (x > 0) & (y < 0)) THEN
214
 
204
        INC(mod, y)
215
 
205
    END
Line 216... Line -...
216
PROCEDURE [stdcall] _div* (b, a: INTEGER): INTEGER;
-
 
217
    RETURN div_(a, b)
-
 
218
END _div;
-
 
219
 
-
 
220
 
-
 
221
PROCEDURE [stdcall] _div2* (a, b: INTEGER): INTEGER;
206
 
222
    RETURN div_(a, b)
207
    RETURN mod
223
END _div2;
208
END _mod2;
224
 
209
 
225
 
210
 
Line 249... Line 234...
249
        ptr := API._DISPOSE(ptr - SIZE_OF_DWORD)
234
        ptr := API._DISPOSE(ptr - SIZE_OF_DWORD)
250
    END
235
    END
251
END _dispose;
236
END _dispose;
Line 252... Line -...
252
 
-
 
253
 
-
 
254
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
-
 
255
VAR
-
 
256
    A, B: CHAR;
-
 
257
    res:  INTEGER;
-
 
258
 
-
 
259
BEGIN
-
 
260
    res := 0;
-
 
261
    WHILE n > 0 DO
-
 
262
        SYSTEM.GET(a, A); INC(a);
-
 
263
        SYSTEM.GET(b, B); INC(b);
-
 
264
        DEC(n);
-
 
265
        IF A # B THEN
-
 
266
            res := ORD(A) - ORD(B);
-
 
267
            n := 0
-
 
268
        ELSIF A = 0X THEN
-
 
269
            n := 0
-
 
270
        END
-
 
271
    END
-
 
272
    RETURN res
-
 
273
END strncmp;
-
 
274
 
-
 
275
 
-
 
276
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
-
 
277
VAR
-
 
278
    A, B: WCHAR;
-
 
279
    res:  INTEGER;
-
 
280
 
-
 
281
BEGIN
-
 
282
    res := 0;
-
 
283
    WHILE n > 0 DO
-
 
284
        SYSTEM.GET(a, A); INC(a, 2);
-
 
285
        SYSTEM.GET(b, B); INC(b, 2);
-
 
286
        DEC(n);
-
 
287
        IF A # B THEN
-
 
288
            res := ORD(A) - ORD(B);
-
 
289
            n := 0
-
 
290
        ELSIF A = 0X THEN
-
 
291
            n := 0
-
 
292
        END
-
 
293
    END
-
 
294
    RETURN res
-
 
295
END strncmpw;
-
 
296
 
237
 
297
 
238
 
298
PROCEDURE [stdcall] _length* (len, str: INTEGER): INTEGER;
239
PROCEDURE [stdcall] _length* (len, str: INTEGER): INTEGER;
Line 299... Line 240...
299
BEGIN
240
BEGIN
Line 343... Line 284...
343
 
284
 
344
    RETURN 0
285
    RETURN 0
Line -... Line 286...
-
 
286
END _lengthw;
-
 
287
 
-
 
288
 
-
 
289
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
-
 
290
VAR
-
 
291
    A, B: CHAR;
-
 
292
    res: INTEGER;
-
 
293
 
-
 
294
BEGIN
-
 
295
    res := minint;
-
 
296
    WHILE n > 0 DO
-
 
297
        SYSTEM.GET(a, A); INC(a);
-
 
298
        SYSTEM.GET(b, B); INC(b);
-
 
299
        DEC(n);
-
 
300
        IF A # B THEN
-
 
301
            res := ORD(A) - ORD(B);
-
 
302
            n := 0
-
 
303
        ELSIF A = 0X THEN
-
 
304
            res := 0;
-
 
305
            n := 0
-
 
306
        END
-
 
307
    END
-
 
308
    RETURN res
-
 
309
END strncmp;
-
 
310
 
-
 
311
 
-
 
312
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
-
 
313
VAR
-
 
314
    A, B: WCHAR;
-
 
315
    res: INTEGER;
-
 
316
 
-
 
317
BEGIN
-
 
318
    res := minint;
-
 
319
    WHILE n > 0 DO
-
 
320
        SYSTEM.GET(a, A); INC(a, 2);
-
 
321
        SYSTEM.GET(b, B); INC(b, 2);
-
 
322
        DEC(n);
-
 
323
        IF A # B THEN
-
 
324
            res := ORD(A) - ORD(B);
-
 
325
            n := 0
-
 
326
        ELSIF A = 0X THEN
-
 
327
            res := 0;
-
 
328
            n := 0
-
 
329
        END
-
 
330
    END
-
 
331
    RETURN res
345
END _lengthw;
332
END strncmpw;
346
 
333
 
347
 
334
 
348
PROCEDURE [stdcall] _strcmp* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
335
PROCEDURE [stdcall] _strcmp* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
-
 
336
VAR
Line 349... Line 337...
349
VAR
337
    res:  INTEGER;
Line 350... Line 338...
350
    res:  INTEGER;
338
    bRes: BOOLEAN;
351
    bRes: BOOLEAN;
339
    c:    CHAR;
-
 
340
 
352
 
341
BEGIN
-
 
342
 
-
 
343
    res := strncmp(str1, str2, MIN(len1, len2));
-
 
344
    IF res = minint THEN
-
 
345
        IF len1 > len2 THEN
-
 
346
            SYSTEM.GET(str1 + len2, c);
-
 
347
            res := ORD(c)
-
 
348
        ELSIF len1 < len2 THEN
353
BEGIN
349
            SYSTEM.GET(str2 + len1, c);
Line 354... Line 350...
354
 
350
            res := -ORD(c)
355
    res := strncmp(str1, str2, MIN(len1, len2));
351
        ELSE
356
    IF res = 0 THEN
352
            res := 0
Line 368... Line 364...
368
 
364
 
369
    RETURN bRes
365
    RETURN bRes
Line 370... Line -...
370
END _strcmp;
-
 
371
 
-
 
372
 
-
 
373
PROCEDURE [stdcall] _strcmp2* (op, len1, str1, len2, str2: INTEGER): BOOLEAN;
-
 
374
    RETURN _strcmp(op, len2, str2, len1, str1)
-
 
375
END _strcmp2;
366
END _strcmp;
376
 
367
 
377
 
368
 
378
PROCEDURE [stdcall] _strcmpw* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
369
PROCEDURE [stdcall] _strcmpw* (op, len2, str2, len1, str1: INTEGER): BOOLEAN;
-
 
370
VAR
Line 379... Line 371...
379
VAR
371
    res:  INTEGER;
Line 380... Line 372...
380
    res:  INTEGER;
372
    bRes: BOOLEAN;
381
    bRes: BOOLEAN;
373
    c:    WCHAR;
-
 
374
 
382
 
375
BEGIN
-
 
376
 
-
 
377
    res := strncmpw(str1, str2, MIN(len1, len2));
-
 
378
    IF res = minint THEN
-
 
379
        IF len1 > len2 THEN
-
 
380
            SYSTEM.GET(str1 + len2 * 2, c);
-
 
381
            res := ORD(c)
-
 
382
        ELSIF len1 < len2 THEN
383
BEGIN
383
            SYSTEM.GET(str2 + len1 * 2, c);
Line 384... Line 384...
384
 
384
            res := -ORD(c)
385
    res := strncmpw(str1, str2, MIN(len1, len2));
385
        ELSE
386
    IF res = 0 THEN
386
            res := 0
Line 398... Line 398...
398
 
398
 
399
    RETURN bRes
399
    RETURN bRes
Line 400... Line -...
400
END _strcmpw;
-
 
401
 
-
 
402
 
-
 
403
PROCEDURE [stdcall] _strcmpw2* (op, len1, str1, len2, str2: INTEGER): BOOLEAN;
-
 
404
    RETURN _strcmpw(op, len2, str2, len1, str1)
-
 
405
END _strcmpw2;
400
END _strcmpw;
406
 
401
 
407
 
402
 
408
PROCEDURE PCharToStr (pchar: INTEGER; VAR s: ARRAY OF CHAR);
403
PROCEDURE PCharToStr (pchar: INTEGER; VAR s: ARRAY OF CHAR);
Line 468... Line 463...
468
    s1[j] := 0X
463
    s1[j] := 0X
Line 469... Line 464...
469
 
464
 
Line 470... Line 465...
470
END append;
465
END append;
471
 
466
 
472
 
467
 
Line 473... Line 468...
473
PROCEDURE [stdcall] _error* (module, err: INTEGER);
468
PROCEDURE [stdcall] _error* (module, err, line: INTEGER);
Line 474... Line 469...
474
VAR
469
VAR
475
    s, temp: ARRAY 1024 OF CHAR;
470
    s, temp: ARRAY 1024 OF CHAR;
476
 
471
 
477
BEGIN
472
BEGIN
478
 
473
 
479
    s := "";
474
    s := "";
480
    CASE err MOD 16 OF
475
    CASE err OF
Line 492... Line 487...
492
    END;
487
    END;
Line 493... Line 488...
493
 
488
 
Line 494... Line 489...
494
    append(s, API.eol);
489
    append(s, API.eol);
495
 
490
 
Line 496... Line 491...
496
    append(s, "module: ");   PCharToStr(module, temp);     append(s, temp); append(s, API.eol);
491
    append(s, "module: "); PCharToStr(module, temp); append(s, temp); append(s, API.eol);
Line 497... Line 492...
497
    append(s, "line: ");     IntToStr(LSR(err, 4), temp);  append(s, temp);
492
    append(s, "line: ");   IntToStr(line, temp);     append(s, temp);
498
 
493
 
Line 499... Line 494...
499
    API.DebugMsg(SYSTEM.ADR(s[0]), name);
494
    API.DebugMsg(SYSTEM.ADR(s[0]), name);
500
 
495
 
501
    API.exit_thread(0)
-
 
502
END _error;
-
 
503
 
-
 
504
 
496
    API.exit_thread(0)
505
PROCEDURE [stdcall] _isrec* (t0, t1, r: INTEGER): BOOLEAN;
-
 
506
BEGIN
-
 
507
    (* r IS t0 *)
497
END _error;
508
 
498
 
Line 509... Line 499...
509
    WHILE (t1 # 0) & (t1 # t0) DO
499
 
510
        SYSTEM.GET(types + t1 * SIZE_OF_DWORD, t1)
-
 
511
    END
-
 
512
 
-
 
513
    RETURN t1 = t0
500
PROCEDURE [stdcall] _isrec* (t0, t1, r: INTEGER): INTEGER;
514
END _isrec;
-
 
515
 
-
 
516
 
501
BEGIN
517
PROCEDURE [stdcall] _is* (t0, p: INTEGER): BOOLEAN;
502
    SYSTEM.GET(t0 + t1 + types, t0)
518
VAR
503
    RETURN t0 MOD 2
519
    t1: INTEGER;
-
 
520
 
-
 
521
BEGIN
-
 
522
    (* p IS t0 *)
-
 
523
 
-
 
524
    IF p # 0 THEN
504
END _isrec;
Line 525... Line 505...
525
        DEC(p, SIZE_OF_DWORD);
505
 
526
        SYSTEM.GET(p, t1);
506
 
Line 527... Line 507...
527
        WHILE (t1 # 0) & (t1 # t0) DO
507
PROCEDURE [stdcall] _is* (t0, p: INTEGER): INTEGER;
528
            SYSTEM.GET(types + t1 * SIZE_OF_DWORD, t1)
508
BEGIN
529
        END
-
 
530
    ELSE
-
 
531
        t1 := -1
-
 
532
    END
509
    IF p # 0 THEN
533
 
-
 
534
    RETURN t1 = t0
-
 
535
END _is;
510
        SYSTEM.GET(p - SIZE_OF_DWORD, p);
536
 
511
        SYSTEM.GET(t0 + p + types, p)
Line 537... Line 512...
537
 
512
    END
538
PROCEDURE [stdcall] _guardrec* (t0, t1: INTEGER): BOOLEAN;
-
 
539
BEGIN
-
 
540
    (* r:t1 IS t0 *)
-
 
541
 
513
 
542
    WHILE (t1 # 0) & (t1 # t0) DO
-
 
543
        SYSTEM.GET(types + t1 * SIZE_OF_DWORD, t1)
514
    RETURN p MOD 2
544
    END
515
END _is;
545
 
516
 
546
    RETURN t1 = t0
517
 
547
END _guardrec;
-
 
548
 
-
 
549
 
-
 
550
PROCEDURE [stdcall] _guard* (t0, p: INTEGER): BOOLEAN;
518
PROCEDURE [stdcall] _guardrec* (t0, t1: INTEGER): INTEGER;
551
VAR
519
BEGIN
552
    t1:  INTEGER;
520
    SYSTEM.GET(t0 + t1 + types, t0)
Line 553... Line 521...
553
 
521
    RETURN t0 MOD 2
554
BEGIN
522
END _guardrec;
Line 555... Line 523...
555
    (* p IS t0 *)
523
 
556
    SYSTEM.GET(p, p);
524
 
Line 611... Line 579...
611
BEGIN
579
BEGIN
612
    API.exit(code)
580
    API.exit(code)
613
END _exit;
581
END _exit;
Line 614... Line 582...
614
 
582
 
-
 
583
 
-
 
584
PROCEDURE [stdcall] _init* (modname: INTEGER; tcount, _types: INTEGER; code, param: INTEGER);
-
 
585
VAR
615
 
586
    t0, t1, i, j: INTEGER;
616
PROCEDURE [stdcall] _init* (modname: INTEGER; typesc, _types: INTEGER; code, param: INTEGER);
587
 
617
BEGIN
588
BEGIN
Line -... Line 589...
-
 
589
    SYSTEM.CODE(09BH, 0DBH, 0E3H); (* finit *)
-
 
590
    API.init(param, code);
-
 
591
 
-
 
592
    types := API._NEW(tcount * tcount + SYSTEM.SIZE(INTEGER));
-
 
593
    ASSERT(types # 0);
-
 
594
    FOR i := 0 TO tcount - 1 DO
-
 
595
        FOR j := 0 TO tcount - 1 DO
-
 
596
            t0 := i; t1 := j;
618
    SYSTEM.CODE(09BH, 0DBH, 0E3H); (* finit *)
597
 
-
 
598
            WHILE (t1 # 0) & (t1 # t0) DO
-
 
599
                SYSTEM.GET(_types + t1 * SIZE_OF_DWORD, t1)
-
 
600
            END;
-
 
601
 
-
 
602
            SYSTEM.PUT8(i * tcount + j + types, ORD(t0 = t1))
619
    API.init(param, code);
603
        END
Line 620... Line 604...
620
 
604
    END;
621
    types := _types;
605
 
622
    name  := modname;
606
    name  := modname;
-
 
607
 
-
 
608
    dll.process_detach := NIL;
623
 
609
    dll.thread_detach  := NIL;
Line -... Line 610...
-
 
610
    dll.thread_attach  := NIL;
-
 
611
 
-
 
612
    fini := NIL
-
 
613
END _init;
-
 
614
 
-
 
615
 
-
 
616
PROCEDURE [stdcall] _sofinit*;
-
 
617
BEGIN
-
 
618
    IF fini # NIL THEN
-
 
619
        fini
-
 
620
    END
-
 
621
END _sofinit;
-
 
622
 
-
 
623
 
624
    dll.process_detach := NIL;
624
PROCEDURE SetFini* (ProcFini: PROC);
625
    dll.thread_detach  := NIL;
625
BEGIN