- push ebp
- mov ebp, esp
-
- ; allocate vars
- sub esp, 12
- mov DWORD [ebp-CHAR_COUNT], 0x00
- mov DWORD [ebp-BLOCK_COUNT], 0x00
-
- push 64
- call malloc
- mov [ebp-STR_PTR], eax
-
- push DWORD [ebp-STR_PTR]
- push 0x00
- push 64
-
- _readLine_loop:
- ; if buffer is full
- cmp BYTE [ebp-CHAR_COUNT], 63 ; leave one byte for null byte
- jne _readLine_notfull
- jmp _readLine_exit
-
- _readLine_notfull:
- ; read a single character
- mov eax, 3
- mov ebx, [ebp+_FILE_HANDLE]
- mov ecx, [ebp-STR_PTR]
- add ecx, [ebp-CHAR_COUNT]
- mov edx, 1
- int 0x80
-
- ; mov eax, 4
- ; mov ebx, 1
- ; mov ecx, [ebp-STR_PTR]
- ; 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]
- add eax, [ebp-CHAR_COUNT]
- cmp DWORD [eax], 0x0a
- jne _readLine_not_newline
- mov ebx, 0
- jmp _readLine_exit
- _readLine_not_newline:
-
- add DWORD [ebp-CHAR_COUNT], 1
- jmp _readLine_loop
-
- _readLine_exit:
-
- mov eax, DWORD [ebp-STR_PTR]
-
- %undef _FILE_HANDLE
- %undef CHAR_COUNT
- %undef BLOCK_COUNT
- %undef STR_PTR