Subversion Repositories Kolibri OS

Rev

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

Rev 9577 Rev 9645
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
VAR
18
VAR
Line 19... Line -...
19
 
-
 
20
    DLL_INIT: PROCEDURE [stdcall] (entry: INTEGER);
-
 
21
 
-
 
22
    imp_error*: RECORD
-
 
23
 
-
 
24
        proc*, lib*: STRING;
-
 
25
        error*: INTEGER
-
 
Line 26... Line 19...
26
 
19
 
27
    END;
20
    DLL_INIT: PROCEDURE [stdcall] (entry: INTEGER);
28
 
21
 
29
 
22
 
Line 174... Line 167...
174
 
167
 
175
 
168
 
176
PROCEDURE mem_commit (adr, size: INTEGER);
169
PROCEDURE mem_commit (adr, size: INTEGER);
177
VAR
-
 
178
    tmp: INTEGER;
170
VAR
179
 
171
    tmp: INTEGER;
180
BEGIN
172
BEGIN
181
    FOR tmp := adr TO adr + size - 1 BY 4096 DO
173
    FOR tmp := adr TO adr + size - 1 BY 4096 DO
182
        SYSTEM.PUT(tmp, 0)
174
        SYSTEM.PUT(tmp, 0)
Line 183... Line 175...
183
    END
175
    END
184
END mem_commit;
176
END mem_commit;
185
 
177
 
186
 
-
 
187
PROCEDURE [stdcall] malloc* (size: INTEGER): INTEGER;
178
 
188
VAR
179
PROCEDURE [stdcall] malloc* (size: INTEGER): INTEGER;
189
    ptr: INTEGER;
180
VAR
190
 
181
    ptr: INTEGER;
191
BEGIN
182
BEGIN
Line 225... Line 216...
225
 
216
 
226
PROCEDURE AppAdr (): INTEGER;
217
PROCEDURE AppAdr (): INTEGER;
227
VAR
218
VAR
228
    buf: ARRAY 1024 OF CHAR;
219
    buf: ARRAY 1024 OF CHAR;
229
    a: INTEGER;
-
 
230
 
220
    a: INTEGER;
231
BEGIN
221
BEGIN
232
    a := sysfunc3(9, SYSTEM.ADR(buf), -1);
222
    a := sysfunc3(9, SYSTEM.ADR(buf), -1);
233
    SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
223
    SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
234
    RETURN a
224
    RETURN a
Line 235... Line 225...
235
END AppAdr;
225
END AppAdr;
236
 
226
 
237
 
227
 
238
PROCEDURE GetCommandLine* (): INTEGER;
-
 
239
VAR
228
PROCEDURE GetCommandLine* (): INTEGER;
240
    param: INTEGER;
229
VAR
241
 
230
    param: INTEGER;
242
BEGIN
231
BEGIN
Line 243... Line 232...
243
    SYSTEM.GET(28 + AppAdr(), param)
232
    SYSTEM.GET(28 + AppAdr(), param)
244
    RETURN param
233
    RETURN param
245
END GetCommandLine;
234
END GetCommandLine;
246
 
-
 
247
 
235
 
248
PROCEDURE GetName* (): INTEGER;
236
 
249
VAR
237
PROCEDURE GetName* (): INTEGER;
250
    name: INTEGER;
238
VAR
Line 274... Line 262...
274
 
262
 
275
PROCEDURE GetProcAdr* (name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
263
PROCEDURE GetProcAdr* (name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
276
VAR
264
VAR
Line 277... Line -...
277
    cur, procname, adr: INTEGER;
-
 
278
 
265
    cur, procname, adr: INTEGER;
279
 
266
 
280
    PROCEDURE streq (str1, str2: INTEGER): BOOLEAN;
267
    PROCEDURE streq (str1, str2: INTEGER): BOOLEAN;
281
    VAR
-
 
282
        c1, c2: CHAR;
268
    VAR
283
 
269
        c1, c2: CHAR;
284
    BEGIN
270
    BEGIN
285
        REPEAT
271
        REPEAT
286
            SYSTEM.GET(str1, c1);
272
            SYSTEM.GET(str1, c1);
Line 290... Line 276...
290
        UNTIL (c1 # c2) OR (c1 = 0X)
276
        UNTIL (c1 # c2) OR (c1 = 0X)
Line 291... Line 277...
291
 
277
 
292
        RETURN c1 = c2
278
        RETURN c1 = c2
Line 293... Line -...
293
    END streq;
-
 
294
 
279
    END streq;
295
 
280
 
296
BEGIN
281
BEGIN
297
    adr := 0;
282
    adr := 0;
298
    IF (lib # 0) & (name # "") THEN
283
    IF (lib # 0) & (name # "") THEN
Line 311... Line 296...
311
 
296
 
312
 
297
 
313
PROCEDURE init (dll: INTEGER);
298
PROCEDURE init (dll: INTEGER);
314
VAR
-
 
315
    lib_init: INTEGER;
299
VAR
316
 
300
    lib_init: INTEGER;
317
BEGIN
301
BEGIN
318
    lib_init := GetProcAdr("lib_init", dll);
302
    lib_init := GetProcAdr("lib_init", dll);
319
    IF lib_init # 0 THEN
303
    IF lib_init # 0 THEN
Line 324... Line 308...
324
        DLL_INIT(lib_init)
308
        DLL_INIT(lib_init)
325
    END
309
    END
326
END init;
310
END init;
Line -... Line 311...
-
 
311
 
-
 
312
 
-
 
313
PROCEDURE OutChar* (c: CHAR);
-
 
314
BEGIN
-
 
315
    sysfunc3(63, 1, ORD(c))
-
 
316
END OutChar;
-
 
317
 
-
 
318
 
-
 
319
PROCEDURE OutLn*;
-
 
320
BEGIN
-
 
321
    OutChar(0DX);
-
 
322
    OutChar(0AX)
-
 
323
END OutLn;
-
 
324
 
-
 
325
 
-
 
326
PROCEDURE OutString (s: ARRAY OF CHAR);
-
 
327
VAR
-
 
328
    i: INTEGER;
-
 
329
BEGIN
-
 
330
    i := 0;
-
 
331
    WHILE (i < LEN(s)) & (s[i] # 0X) DO
-
 
332
        OutChar(s[i]);
-
 
333
        INC(i)
-
 
334
    END
-
 
335
END OutString;
-
 
336
 
-
 
337
 
-
 
338
PROCEDURE imp_error (lib, proc: STRING);
-
 
339
BEGIN
-
 
340
    OutString("import error: ");
-
 
341
    IF proc = "" THEN
-
 
342
        OutString("can't load '")
-
 
343
    ELSE
-
 
344
        OutString("not found '"); OutString(proc); OutString("' in '")
-
 
345
    END;
-
 
346
    OutString(lib);
-
 
347
    OutString("'" + 0DX + 0AX)
-
 
348
END imp_error;
327
 
349
 
328
 
350
 
329
PROCEDURE GetStr (adr, i: INTEGER; VAR str: STRING);
351
PROCEDURE GetStr (adr, i: INTEGER; VAR str: STRING);
330
VAR
352
VAR
331
    c: CHAR;
353
    c: CHAR;
Line 335... Line 357...
335
        str[i] := c; INC(i)
357
        str[i] := c; INC(i)
336
    UNTIL c = 0X
358
    UNTIL c = 0X
337
END GetStr;
359
END GetStr;
Line 338... Line 360...
338
 
360
 
339
 
361
 
340
PROCEDURE [stdcall] dll_Load* (import_table: INTEGER): INTEGER;
362
PROCEDURE [stdcall-] dll_Load* (import_table: INTEGER): INTEGER;
341
CONST
363
CONST
342
	path = "/sys/lib/";
364
	path = "/sys/lib/";
343
VAR
-
 
344
    imp, lib, exp, proc, res, pathLen: INTEGER;
365
VAR
345
    fail, done: BOOLEAN;
-
 
346
    procname, libname: STRING;
366
    imp, lib, exp, proc, pathLen: INTEGER;
347
 
367
    procname, libname: STRING;
348
BEGIN
-
 
349
    SYSTEM.CODE(060H); (* pusha *)
-
 
350
    fail := FALSE;
-
 
351
    done := FALSE;
368
BEGIN
352
    res := 0;
369
    SYSTEM.CODE(060H); (* pusha *)
353
    libname := path;
370
    libname := path;
354
    pathLen := LENGTH(libname);
371
    pathLen := LENGTH(libname);
355
    REPEAT
372
 
356
        SYSTEM.GET(import_table, imp);
373
    SYSTEM.GET(import_table, imp);
357
        IF imp # 0 THEN
374
    WHILE imp # 0 DO
358
            SYSTEM.GET(import_table + 4, lib);
375
        SYSTEM.GET(import_table + 4, lib);
359
            GetStr(lib, pathLen, libname);
376
        GetStr(lib, pathLen, libname);
-
 
377
        exp := sysfunc3(68, 19, SYSTEM.ADR(libname[0]));
360
            exp := sysfunc3(68, 19, SYSTEM.ADR(libname[0]));
378
        IF exp = 0 THEN
361
            fail := exp = 0;
-
 
362
        ELSE
-
 
363
            done := TRUE
-
 
364
        END;
-
 
365
        IF fail THEN
-
 
366
            done := TRUE;
-
 
367
            imp_error.proc := "";
-
 
368
            imp_error.lib  := libname;
-
 
369
            imp_error.error := 1
-
 
370
        END;
379
            imp_error(libname, "")
371
        IF (imp # 0) & ~fail THEN
380
        ELSE
372
            REPEAT
381
            REPEAT
373
                SYSTEM.GET(imp, proc);
382
                SYSTEM.GET(imp, proc);
374
                IF proc # 0 THEN
383
                IF proc # 0 THEN
375
                    GetStr(proc, 0, procname);
384
                    GetStr(proc, 0, procname);
376
                    proc := GetProcAdr(procname, exp);
385
                    proc := GetProcAdr(procname, exp);
377
                    IF proc # 0 THEN
-
 
378
                        SYSTEM.PUT(imp, proc);
386
                    IF proc # 0 THEN
379
                        INC(imp, 4)
387
                        SYSTEM.PUT(imp, proc)
380
                    ELSE
388
                    ELSE
381
                        imp_error.proc  := procname;
389
                    	proc := 1;
382
                        imp_error.lib   := libname;
390
                        imp_error(libname, procname)
383
                        imp_error.error := 2
391
                    END;
384
                    END
392
                    INC(imp, 4)
385
                END
393
                END
386
            UNTIL proc = 0;
-
 
387
            init(exp);
-
 
388
            INC(import_table, 8)
-
 
389
        END
-
 
390
    UNTIL done;
-
 
391
    IF fail THEN
394
            UNTIL proc = 0;
392
        res := 1
395
            init(exp)
-
 
396
        END;
-
 
397
        INC(import_table, 8);
-
 
398
        SYSTEM.GET(import_table, imp);
393
    END;
399
    END;
394
    import_table := res;
400
 
395
    SYSTEM.CODE(061H) (* popa *)
401
    SYSTEM.CODE(061H) (* popa *)
Line 396... Line 402...
396
    RETURN import_table
402
    RETURN 0
397
END dll_Load;
403
END dll_Load;
Line 408... Line 414...
408
 
414
 
409
 
415
 
410
PROCEDURE LoadLib* (name: ARRAY OF CHAR): INTEGER;
416
PROCEDURE LoadLib* (name: ARRAY OF CHAR): INTEGER;
411
VAR
-
 
412
    Lib: INTEGER;
417
VAR
413
 
418
    Lib: INTEGER;
414
BEGIN
419
BEGIN
415
    DLL_INIT := dll_Init;
420
    DLL_INIT := dll_Init;
416
    Lib := sysfunc3(68, 19, SYSTEM.ADR(name[0]));
421
    Lib := sysfunc3(68, 19, SYSTEM.ADR(name[0]));
417
    IF Lib # 0 THEN
422
    IF Lib # 0 THEN
418
        init(Lib)
423
        init(Lib)
419
    END
424
    END
Line 420... Line 425...
420
    RETURN Lib
425
    RETURN Lib
421
END LoadLib;
426
END LoadLib;
422
 
427
 
423
 
-
 
424
PROCEDURE _init*;
428
 
425
BEGIN
-
 
426
    DLL_INIT := dll_Init;
429
PROCEDURE _init* (import_table: INTEGER);
Line 427... Line 430...
427
    imp_error.lib   := "";
430
BEGIN
428
    imp_error.proc  := "";
431
    DLL_INIT := dll_Init;