108 lines
1.5 KiB
Plaintext
108 lines
1.5 KiB
Plaintext
|
|
||
|
extrn malloc
|
||
|
extrn getenv
|
||
|
extrn fopen
|
||
|
extrn fclose
|
||
|
extrn fread
|
||
|
extrn fwrite
|
||
|
extrn fseek
|
||
|
extrn ftell
|
||
|
extrn time
|
||
|
extrn exit
|
||
|
extrn 'free' as libc_free
|
||
|
extrn 'write' as libc_write
|
||
|
|
||
|
alloc:
|
||
|
ccall malloc,eax
|
||
|
test eax,eax
|
||
|
jz allocation_failed
|
||
|
clc
|
||
|
ret
|
||
|
allocation_failed:
|
||
|
stc
|
||
|
ret
|
||
|
free:
|
||
|
ccall libc_free,eax
|
||
|
ret
|
||
|
display_string:
|
||
|
lodsb
|
||
|
or al,al
|
||
|
jz string_displayed
|
||
|
mov dl,al
|
||
|
call display_character
|
||
|
jmp display_string
|
||
|
string_displayed:
|
||
|
ret
|
||
|
display_character:
|
||
|
mov [character],dl
|
||
|
ccall libc_write,[display_handle],character,1
|
||
|
ret
|
||
|
open:
|
||
|
push esi edi ebp
|
||
|
call adapt_path
|
||
|
ccall fopen,buffer,open_mode
|
||
|
pop ebp edi esi
|
||
|
or eax,eax
|
||
|
jz file_error
|
||
|
mov ebx,eax
|
||
|
clc
|
||
|
ret
|
||
|
adapt_path:
|
||
|
mov esi,edx
|
||
|
mov edi,buffer
|
||
|
copy_path:
|
||
|
lods byte [esi]
|
||
|
cmp al,'\'
|
||
|
jne path_char_ok
|
||
|
mov al,'/'
|
||
|
path_char_ok:
|
||
|
stos byte [edi]
|
||
|
or al,al
|
||
|
jnz copy_path
|
||
|
cmp edi,buffer+1000h
|
||
|
ja not_enough_memory
|
||
|
ret
|
||
|
create:
|
||
|
push esi edi ebp
|
||
|
call adapt_path
|
||
|
ccall fopen,buffer,create_mode
|
||
|
pop ebp edi esi
|
||
|
or eax,eax
|
||
|
jz file_error
|
||
|
mov ebx,eax
|
||
|
clc
|
||
|
ret
|
||
|
close:
|
||
|
ccall fclose,ebx
|
||
|
ret
|
||
|
read:
|
||
|
push ebx ecx edx esi edi
|
||
|
ccall fread,edx,1,ecx,ebx
|
||
|
pop edi esi edx ecx ebx
|
||
|
cmp eax,ecx
|
||
|
jne file_error
|
||
|
clc
|
||
|
ret
|
||
|
file_error:
|
||
|
stc
|
||
|
ret
|
||
|
write:
|
||
|
push ebx ecx edx esi edi
|
||
|
ccall fwrite,edx,1,ecx,ebx
|
||
|
pop edi esi edx ecx ebx
|
||
|
cmp eax,ecx
|
||
|
jne file_error
|
||
|
clc
|
||
|
ret
|
||
|
lseek:
|
||
|
push ebx
|
||
|
movzx eax,al
|
||
|
ccall fseek,ebx,edx,eax
|
||
|
mov ebx,[esp]
|
||
|
ccall ftell,ebx
|
||
|
pop ebx
|
||
|
ret
|
||
|
|
||
|
open_mode db 'r',0
|
||
|
create_mode db 'w',0
|