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))





