Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1487 → Rev 1488

/programs/develop/libraries/box_lib/load_lib.mac
117,7 → 117,8
local lp1
local correction
local exit_
;/equ
 
library_fun_memory_alloc equ 0 ;íå èñïîëüçîâàòü â ìàêðîñàõ ïðîâåðêó íà ôóíêöèè 'lib_init'
err_message1 equ dword [esp+8]
head1 equ dword [esp+4]
 
325,6 → 326,16
 
 
 
macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
{
@use_library
library_fun_memory_alloc equ mem_alloc
library_fun_memory_free equ mem_free
library_fun_memory_realloc equ mem_realloc
library_fun_dll_load equ dll_load
}
 
 
macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__
{
local end_steep
589,6 → 600,9
}
 
 
;âõîäíûå ïàðàìåòðû:
;eax - àäðåñ áèáëèîòåêè â ïàìÿòè
;myimport - èìïîðòèðóåìûå ôóíêöèè
macro import_boxlib myimport, err_message_import__, head_f_i__
{
local import_loop
605,33 → 619,53
mov edx, eax
mov esi,myimport
import_loop:
lodsd
lodsd ;mov eax,dword[esi] ;add esi,4 ;ïîëó÷àåì â eax óêàçàòåëü íà èìÿ èìïîðòèðóåìîé ôóíêöèè
test eax, eax
jz import_done
push edx
jz import_done ;åñëè óêàçàòåëü íà èìÿ ôóíêöèè = 0 (â ïîëüçîâàòåëüñêîé ïðîãðàììå)
push edx ;ñîõðàíÿåì íà÷àëî áèáëèîòå÷íûõ óêàçàòåëåé íà ôóíêöèè
import_find:
mov ebx, [ds:edx]
test ebx, ebx
jz import_not_found
push eax
jz import_not_found ;åñëè óêàçàòåëü íà èìÿ ôóíêöèè = 0 (â áèáëèîòåêå)
push eax ;eax - óêàçàòåëü íà èìÿ ýêñïîðòèðóåìîé ôóíêöèè (â ïîëüçîâàòåëüñêîé ïðîãðàììå)
lp:
mov cl, [ds:eax]
cmp cl, [ds:ebx]
jnz import_find_next
cmp cl, [ds:ebx] ;ñðàâíèâàåì èìåíà ôóíêöèé â áèáëèîòåêå è â ïîëüçîâàòåëüñêîé ïðîãðàììå
jnz import_find_next ;åñëè íàçâàíèÿ íå ñîâïàëè
test cl, cl
jz import_found
jz import_found ;åñëè íàçâàíèÿ ñîâïàëè, è óæå êîíåö ñòðîêè (cl=0)
inc eax
inc ebx
jmp lp
import_find_next:
pop eax
add edx, 8
add edx, 8 ;8 = 4 áàéòà óêàçàòåëü íà íàçâàíèå è 4 áàéòà óêàçàòåëü íà ôóíêöèþ
jmp import_find
import_found:
pop eax
mov eax, [ds:edx+4]
mov [esi-4], eax
pop edx
pop ebx ;âîñòàíàâëèâàåì óêàçàòåëü íà èìÿ ôóíêöèè (êîòîðûé áûë â eax) è îñâîáîæäàåì ñòåê
mov eax, [ds:edx+4] ;eax = óêàçàòåëü íà ôóíêöèþ (â áèáëèîòåêå)
mov [esi-4], eax ;êîïèðóåì óêàçàòåëü (íà ôóíêöèþ) â ïðîãðàììó, -4 ñòàâèì ïîòîìó ÷òî esi áûëî ñäâèíóòî êîìàíäîé lodsd
pop edx ;óñòàíàâëèâàåì edx íà íà÷àëî áèáëèîòå÷íûõ ôóíêöèé
;--- ïðîâåðÿåì ñîâïàäàåò ëè èìÿ ýêñïîðòèðîâàííîé ôóíêöèè ñ 'lib_init'
if library_fun_memory_alloc eq 0
else
cmp dword[ebx],'lib_'
jne import_loop
cmp dword[ebx+4],'init'
jne import_loop
;--- åñëè èìÿ ôóíêöèè ñîâïàëî ñ 'lib_init' ïîïàäàåì ñþäà
;ïîäêëþ÷åíèå ôóíêöèé äëÿ ðàáîòû ñ ïàìÿòüþ
;push eax
;call dll.Init
pushad
mov esi,eax
mov eax,library_fun_memory_alloc
mov ebx,library_fun_memory_free
mov ecx,library_fun_memory_realloc
mov edx,library_fun_dll_load
call dword esi
popad
end if
jmp import_loop
import_not_found:
add esp,4
638,7 → 672,7
show_error_window err_message_import__, head_f_i__ ;show error message /create window
jmp e.exit
import_done:
xor eax,eax
xor eax,eax ;=0 âñå çàãðóçèëîñü óäà÷íî
e.exit:
;---------------------------------------------------------------------
}