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 |