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
ProcedureDLL.i TicksHQ()
Static maxfreq.q
Protected t.q
If maxfreq=0
QueryPerformanceFrequency_(@maxfreq)
maxfreq=maxfreq/1000
EndIf
QueryPerformanceCounter_(@t)
ProcedureReturn t/maxfreq
EndProcedure
Procedure.i 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)
EnableASM
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]
DisableASM
CompilerDefault
CompilerError "unsupported CPU architecture"
CompilerEndSelect
FreeMemory(*mem)
CloseFile(fid)
EndIf
If lcLF > 0
ProcedureReturn lcLF
EndIf
ProcedureReturn lcCR
EndProcedure
If CreateFile(0, "c:\test.txt")
sline.s = "abcdefghijklmnopqrstuvwxyz and that is all the letters I can think of"
For i=1 To 31234
thislen = 20+Random(49)
WriteStringN(0, Left(sline, thislen))
Next
FlushFileBuffers(0)
filesize = Lof(0)
CloseFile(0)
EndIf
stime = TicksHQ()
count = CountLinesPcf("c:\test.txt")
etime = TicksHQ()
MessageRequester("", Str(count)+ " lines reported, time= " + Str(etime-stime) + " milliseconds")