Code: Select all
DataSection
!CountLinesPcf_eoli:
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
!db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EndDataSection
Procedure.l CountLinesPcf(filename.s)
Define fid.i, lcCR.i, lcLF.i, *mem, size.i
fid = ReadFile(#PB_Any, filename)
lcCR = 0
lcLF = 0
If IsFile(fid)
size = Lof(fid)
*mem = AllocateMemory(size)
size = ReadData(fid, *mem, size)
CompilerSelect #PB_Compiler_Processor
CompilerCase #PB_Processor_x86
;eax, ecx and edx are ok, save rest
Define.l old_esi
!MOV dword [p.v_old_esi], esi
!MOV esi, dword [p.p_mem]
!MOV ecx, dword [p.v_size]
!XOR eax, dword eax
!CountLinesPcf_loop:
!MOV al, byte [esi]
!CMP byte [eax+CountLinesPcf_eoli], byte 1
!JNE CountLinesPcf_noLFCR
!CMP eax, dword 13 ;CR
!JNE CountLinesPcf_noCR
!INC dword [p.v_lcCR]
!JMP CountLinesPcf_noLF
!CountLinesPcf_noCR:
!INC dword [p.v_lcLF]
!CountLinesPcf_noLF:
!CountLinesPcf_noLFCR:
!INC dword esi
!DEC dword ecx
!JNZ CountLinesPcf_loop
!MOV esi, dword [p.v_old_esi]
CompilerCase #PB_Processor_x64
;eax, ecx and edx are ok, save rest
Define.q old_esi
!MOV qword [p.v_old_esi], rsi
!MOV rsi, qword [p.p_mem]
!MOV rcx, qword [p.v_size]
!XOR rax, qword rax
!MOV rdx, qword CountLinesPcf_eoli
!CountLinesPcf_loop:
!MOV al, byte [rsi]
!CMP byte [rax+rdx], byte 1
!JNE CountLinesPcf_noLFCR
!CMP eax, dword 13 ;CR
!JNE CountLinesPcf_noCR
!INC qword [p.v_lcCR]
!JMP CountLinesPcf_noLF
!CountLinesPcf_noCR:
!INC qword [p.v_lcLF]
!CountLinesPcf_noLF:
!CountLinesPcf_noLFCR:
!INC qword rsi
!DEC qword rcx
!JNZ CountLinesPcf_loop
!MOV rsi, qword [p.v_old_esi]
CompilerDefault
CompilerError "unsupported CPU architecture"
CompilerEndSelect
FreeMemory(*mem)
CloseFile(fid)
EndIf
If lcLF > 0
ProcedureReturn lcLF
EndIf
ProcedureReturn lcCR
EndProcedure