-
-; reads file line by line
-; args: filename
-; return:
-; eax - pointer to mem
-; ecx - lines read
-readFile:
- %define _FILE_NAME 8
- %define FILE_HANDLE 4
-
- push ebp
- mov ebp, esp
-
- ; allocate vars
- sub esp, 4
- mov DWORD [ebp-FILE_HANDLE], 0x00
-
- ; open existing file
- mov eax, 5
- mov ebx, [ebp+_FILE_NAME]
- mov ecx, 0
- mov edx, 0777
- int 0x80
- mov [ebp-FILE_HANDLE], eax
-
- ; check if file was open successfully
- cmp eax, 0
- jge _readFile_noerror
- push eax
- push wrongfile_str
- call printf
- jmp _readFile_exit
-
- _readFile_noerror:
- push DWORD [ebp-FILE_HANDLE]
- call readLine
-
- jmp _readFile_exit
-
- _readFile_exit:
- ; close file
- mov eax, 6
- mov ebx, [ebp-FILE_HANDLE]
- int 0x80
-
- %undef _FILE_NAME
- %undef FILE_HANDLE
-
- mov esp, ebp
- pop ebp
- ret
-
-
-; reads a line until newline character is reached
-; args: file_handle
-; return:
-; location to buffer
-; contains eof
-readLine:
- %define _FILE_HANDLE 8
- %define CHAR_PTR 4
-
- push ebp
- mov ebp, esp
-
- sub esp, 4
- mov DWORD [ebp-CHAR_PTR], 0x00
-
- _readLine_loop:
- ; if buffer is full
- cmp BYTE [ebp-CHAR_PTR], 64
- jne _readLine_notfull
- jmp _readLine_exit
-
- _readLine_notfull:
- ; read a single character
- mov eax, 3
- mov ebx, [ebp+_FILE_HANDLE]
- mov ecx, read_buf
- add ecx, [ebp-CHAR_PTR]
- mov edx, 1
- int 0x80
-
- mov eax, 4
- mov ebx, 1
- mov ecx, read_buf
- add ecx, [ebp-CHAR_PTR]
- mov edx, 1
- int 0x80
-
- ; check for newline
- mov eax, read_buf
- add eax, [ebp-CHAR_PTR]
- cmp DWORD [eax], 0x0a
- je _readLine_exit
-
- ; check for eof
- mov eax, read_buf
- add eax, [ebp-CHAR_PTR]
- cmp DWORD [eax], 0x05
- je _readLine_exit
-
- add DWORD [ebp-CHAR_PTR], 1
-
- jmp _readLine_loop
-
- _readLine_exit:
-
- %undef _FILE_HANDLE
- %undef CHAR_PTR
-
- mov esp, ebp
- pop ebp
- ret
-