Rev 6613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6613 | Rev 7107 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | Copyright 2016 Anton Krotov |
2 | Copyright 2016, 2017 Anton Krotov |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | This program is free software: you can redistribute it and/or modify |
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 |
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 |
6 | the Free Software Foundation, either version 3 of the License, or |
Line 26... | Line 26... | ||
26 | PROC = PROCEDURE; |
26 | PROC = PROCEDURE; |
Line 27... | Line 27... | ||
27 | 27 | ||
Line 28... | Line 28... | ||
28 | VAR |
28 | VAR |
- | 29 | ||
- | 30 | SelfName, rtab: INTEGER; CloseProc: PROC; |
|
Line 29... | Line 31... | ||
29 | 31 | init: BOOLEAN; |
|
30 | SelfName, rtab: INTEGER; CloseProc: PROC; |
32 | main_thread_id: INTEGER; |
31 | 33 | ||
32 | PROCEDURE [stdcall] _halt*(n: INTEGER); |
34 | PROCEDURE [stdcall] _halt*(n: INTEGER); |
Line 114... | Line 116... | ||
114 | END; |
116 | END; |
115 | Arr[m + n] := t |
117 | Arr[m + n] := t |
116 | END |
118 | END |
117 | END _arrayrot; |
119 | END _arrayrot; |
Line 118... | Line -... | ||
118 | - | ||
119 | PROCEDURE Min(a, b: INTEGER): INTEGER; |
- | |
120 | BEGIN |
- | |
121 | IF a > b THEN |
- | |
122 | a := b |
- | |
123 | END |
- | |
124 | RETURN a |
- | |
125 | END Min; |
- | |
126 | 120 | ||
127 | PROCEDURE [stdcall] _length*(s: ARRAY OF CHAR): INTEGER; |
121 | PROCEDURE [stdcall] _length*(s: ARRAY OF CHAR): INTEGER; |
128 | BEGIN |
122 | BEGIN |
129 | sys.CODE("8B4508"); // mov eax, [ebp + 08h] |
123 | sys.CODE("8B4508"); // mov eax, [ebp + 08h] |
130 | sys.CODE("8B4D0C"); // mov ecx, [ebp + 0Ch] |
124 | sys.CODE("8B4D0C"); // mov ecx, [ebp + 0Ch] |
Line 142... | Line 136... | ||
142 | RETURN 0 |
136 | RETURN 0 |
143 | END _length; |
137 | END _length; |
Line 144... | Line 138... | ||
144 | 138 | ||
145 | PROCEDURE [stdcall] _strcopy*(b, blen, a, alen: INTEGER); |
139 | PROCEDURE [stdcall] _strcopy*(b, blen, a, alen: INTEGER); |
146 | BEGIN |
140 | BEGIN |
147 | _savearr(Min(alen, blen), a, b); |
141 | _savearr(MIN(alen, blen), a, b); |
148 | IF blen > alen THEN |
142 | IF blen > alen THEN |
149 | sys.PUT(b + alen, 0X) |
143 | sys.PUT(b + alen, 0X) |
150 | END |
144 | END |
Line 151... | Line 145... | ||
151 | END _strcopy; |
145 | END _strcopy; |
152 | 146 | ||
153 | PROCEDURE [stdcall] _strcmp*(op: INTEGER; b, a: ARRAY OF CHAR): BOOLEAN; |
147 | PROCEDURE [stdcall] _strcmp*(op: INTEGER; b, a: ARRAY OF CHAR): BOOLEAN; |
154 | VAR i: INTEGER; Res: BOOLEAN; |
148 | VAR i: INTEGER; Res: BOOLEAN; |
155 | BEGIN |
149 | BEGIN |
156 | i := API.strncmp(sys.ADR(a), sys.ADR(b), Min(LEN(a), LEN(b))); |
150 | i := API.strncmp(sys.ADR(a), sys.ADR(b), MIN(LEN(a), LEN(b))); |
157 | IF i = 0 THEN |
151 | IF i = 0 THEN |
158 | i := _length(a) - _length(b) |
152 | i := _length(a) - _length(b) |
159 | END; |
153 | END; |
Line 250... | Line 244... | ||
250 | StrAppend(0AX); |
244 | StrAppend(0AX); |
251 | StrAppend("code "); |
245 | StrAppend("code "); |
252 | Int(code, int); |
246 | Int(code, int); |
253 | StrAppend(int) |
247 | StrAppend(int) |
254 | END; |
248 | END; |
255 | API.DebugMsg(sys.ADR(msg), SelfName) |
249 | IF API.GetCurrentThreadId() = main_thread_id THEN |
- | 250 | API.ExitProcess(0) |
|
- | 251 | ELSE |
|
- | 252 | API.ExitThread(0) |
|
- | 253 | END |
|
256 | END _assrt; |
254 | END _assrt; |
Line 257... | Line 255... | ||
257 | 255 | ||
258 | PROCEDURE [stdcall] _close*; |
256 | PROCEDURE [stdcall] _close*; |
259 | BEGIN |
257 | BEGIN |
Line 262... | Line 260... | ||
262 | END |
260 | END |
263 | END _close; |
261 | END _close; |
Line 264... | Line 262... | ||
264 | 262 | ||
265 | PROCEDURE [stdcall] _init*(self, rec, gsize, gadr, esp: INTEGER); |
263 | PROCEDURE [stdcall] _init*(self, rec, gsize, gadr, esp: INTEGER); |
- | 264 | BEGIN |
|
266 | BEGIN |
265 | IF ~init THEN |
- | 266 | API.zeromem(gsize, gadr); |
|
267 | API.zeromem(gsize, gadr); |
267 | init := TRUE; |
- | 268 | API.init(esp); |
|
268 | API.init(esp); |
269 | main_thread_id := API.GetCurrentThreadId(); |
269 | SelfName := self; |
270 | SelfName := self; |
270 | rtab := rec; |
271 | rtab := rec; |
- | 272 | CloseProc := NIL |
|
271 | CloseProc := NIL; |
273 | END |
Line 272... | Line 274... | ||
272 | END _init; |
274 | END _init; |
273 | 275 | ||
274 | PROCEDURE SetClose*(proc: PROC); |
276 | PROCEDURE SetClose*(proc: PROC); |