Code: Select all
Procedure.s GETFILETXT(PATH.i)
sbuff.l
Filehwnd.l = CreateFile_(PATH, #GENERIC_READ, 0, 0, #OPEN_ALWAYS, #FILE_ATTRIBUTE_NORMAL, 0)
If Filehwnd
;MessageRequester("",Str(Filehwnd))
fsize.l = GetFileSize_(Filehwnd, #Null)
STRR.S = Space(fsize)
ReadFile_(Filehwnd, @STRR, fsize, @sbuff, 0)
CloseHandle_(Filehwnd)
EndIf
ProcedureReturn STRR
EndProcedure
;*************************************************
;SplitInMemory字符串切割函数
;参数1=Main字符串地址
;参数2=delim字符串地址
;参数3=返回字符串数组指针(用完必须手动FreeMemory)
;BY startbin@126.com
;*************************************************
Procedure.l SplitInMemory(Main.i, delim.i, *pAddr.String)
;!INT 3
!MOV ebx, [esp + $C]
*pAddr = AllocateMemory(4000000) ;申请内存用来存放切割后的指针,可以存放的下限为100w
!CMP eax, 0
!jnz Begin
!RET $C
!Begin :
!MOV [ebx], eax ;把内存地址放入paddr指向的地址
PokeL(*pAddr, Main.i)
!Start1 :
!MOV eax, [esp + $4]
!PUSH esi
!XOR esi, esi
!TEST eax, eax
!je short Exit1
!PUSH ebp
!MOV ebp, [esp + $10]
!TEST ebp, ebp
!je short Exit2
!MOV dh, [ebp]
!TEST dh, dh
!je short Exit2
!MOV cl, Byte [eax]
!TEST cl, cl
!je short Exit2
!PUSH ebx
!PUSH edi
!Six1 :
!INC eax
!CMP cl, dh
!jnz short First1
!MOV dl, Byte [eax]
!LEA ecx, [ebp + 1]
!MOV edi, eax
!TEST dl, dl
!je short Second1
!Four1 :
!MOV bl, byte [ecx]
!test bl, bl
!je short Three1
!CMP dl, dl
!jnz short Second1
!MOV dl, Byte [eax + 1]
!INC eax
!INC ecx
!TEST dl, dl
!jnz short Four1
!Second1 :
!CMP Byte [ecx], 0
!jnz short Five1
!Three1 :
!INC esi ;这里已经完整匹配到字符串,esi计数器 + 1
!PUSH eax
!PUSH ecx
!SUB ecx, ebp
!SUB eax, ecx
!AG :
!MOV Byte [eax], 0
!ADD eax, 1
!SUB ecx, 1
!jnz AG
!MOV ecx, [esp + $24]
!LEA ecx, [ecx + esi*4]
!MOV [ecx], eax
!POP ecx
!POP eax
;[esp+$1C]=参数3
!jmp short First1
!Five1 :
!MOV eax, edi
!First1 :
!MOV cl, [eax]
!TEST cl, cl
!jnz short Six1
!POP edi
!POP ebx
!POP ebp
!MOV eax, esi
!POP esi
!RET $C
!Exit2 :
!POP ebp
!MOV eax, esi
!POP esi
!RET $C
!Exit1 :
!MOV eax, esi
!POP esi
!RET $C
EndProcedure
c.s = GETFILETXT(@"C:\DEMO.TXT")
p.l = Len(c)
StartTime = timeGetTime_()
Define *pAddr.String, *ss.String
c1.s = #CRLF$ ;Segmentation symbol
pl.l = SplitInMemory(@c, @c1, @*pAddr)
ElapsedTime = timeGetTime_()-StartTime
If *pAddr
MessageRequester("", Hex(*pAddr))
;MessageRequester("", *pAddr\s)
*ss = *pAddr
For i.l = 0 To pl
;MessageRequester("", *pAddr\s)
c1 = *pAddr\s
*pAddr = *pAddr + 4
Next
*pAddr = *pAddr - 4
MessageRequester("", *pAddr\s)
FreeMemory(*ss)
EndIf ;用完要释放内存
MessageRequester(Str(ElapsedTime), Str(pl))