; eax - pointer to mem
; ecx - lines read
readFile:
- %define _FILE_NAME 8
+ %define _FILE_NAME 8
%define FILE_HANDLE 4
+ %define IS_EOF 8
+ %define LINES_READ 12
+ %define BUF_PTR 16 ; malloced array of strings
push ebp
mov ebp, esp
; allocate vars
- sub esp, 4
+ sub esp, 16
mov DWORD [ebp-FILE_HANDLE], 0x00
+ mov DWORD [ebp-IS_EOF], 0x00
+ mov DWORD [ebp-LINES_READ], 0x00
+
+ push 0
+ call malloc
+ mov [ebp-BUF_PTR], eax
; open existing file
mov eax, 5
; check if file was open successfully
cmp eax, 0
- jge _readFile_noerror
+ jge _readFile_loop
push eax
push wrongfile_str
call printf
jmp _readFile_exit
- _readFile_noerror:
+ _readFile_loop:
+
+ ; check if eof was reached
+ cmp DWORD [ebp-IS_EOF], 1
+ je _readFile_exit
+
push DWORD [ebp-FILE_HANDLE]
call readLine
- push eax
+ mov esi, eax
+ mov [ebp-IS_EOF], ebx
+
+ push esi
call printf
- jmp _readFile_exit
+ ; make string buffer bigger
+ mov eax, DWORD [ebp-LINES_READ]
+ add eax, 1
+ mov ecx, 4
+ mul ecx
+ push eax
+ push DWORD [ebp-BUF_PTR]
+ call realloc
+ mov DWORD [ebp-BUF_PTR], eax
+
+ ; write string to buffer
+ mov eax, DWORD [ebp-BUF_PTR]
+ mov ecx, 4
+ mul ecx
+ mov eax, esi
+
+ add DWORD [ebp-LINES_READ], 1
+
+ jmp _readFile_loop
_readFile_exit:
; close file
%undef _FILE_NAME
%undef FILE_HANDLE
+ %undef IS_EOF
+ %undef LINES_READ
+ %undef BUF_PTR
mov esp, ebp
pop ebp
mov ebp, esp
; allocate vars
- sub esp, 8
+ sub esp, 12
mov DWORD [ebp-CHAR_COUNT], 0x00
mov DWORD [ebp-BLOCK_COUNT], 0x00
; add ecx, [ebp-CHAR_COUNT]
; mov edx, 1
; int 0x80
+
+ ; check for eof
+ cmp eax, 0 ; eax has zero on eof
+ jne _readLine_not_eof
+ mov ebx, 1
+ jmp _readLine_exit
+ _readLine_not_eof:
; check for newline
mov eax, [ebp-STR_PTR]
mov ebx, 0
jmp _readLine_exit
_readLine_not_newline:
-
- ; check for eof
- mov eax, [ebp-STR_PTR]
- add eax, [ebp-CHAR_COUNT]
- cmp DWORD [eax], 0x05
- jne _readLine_not_eof
- mov ebx, 1
- jmp _readLine_exit
- _readLine_not_eof:
add DWORD [ebp-CHAR_COUNT], 1
jmp _readLine_loop