Mega Code Archive

 
Categories / Delphi / Strings
 

How to split a string VERY fast using delimiters (function) (part2)

Title: How to split a string *VERY* fast using delimiters (function) (part2) procedure split5(const input: string; schar: Char; s: Byte); register; asm PUSH ECX PUSH EAX //registers : PUSH EDX //EAX = input PUSH EDI //DH = s TEST EAX, EAX //if input = '' then JZ @NoWords // goto @NoInput @WeHaveIt:MOV DH, CL //DL = schar MOV EDI, EAX //EDI := Addr(input); MOV ECX, [EDI-4] //ECX := length(input); @GoGo: MOV AL, DL //AL := Schar; CMP DH, 2 //IF DH = 2 then JE @StartCo // goto @StartCo MOV AH, 2 //AH (upper 8 bits of AX) will be our separator counter initial value is 2, max 256 @Lop: INC AH //AH := AH + 1 REPNE SCASB //while (EDI^AL) and (ECX0) begin INC EDI; DEC ECX; end; CMP AH, DH //if AH JB @Lop // goto @Lop TEST ECX, ECX //IF ECX 0 then JG @StartCo // goto @StartCp @NoWords: MOV EDI,[P_SplitResArray] //result := MOV BYTE PTR [EDI], $0 // '' JMP @TotalEnd @StartCo: PUSH ESI MOV ESI, EDI MOV EDI, [P_SplitResArray] @CopyLoop:MOV AH, BYTE PTR[ESI+0] //32 bit aligned loop.. hopefully :) CMP AH, DL //1. test, 8 bits JE @Endword MOV BYTE PTR [EDI+0], AH INC EDI MOV AH, BYTE PTR[ESI+1] CMP AH, DL //2. test, 8 bits - 16 bits.. JE @Endword MOV BYTE PTR [EDI+0], AH INC EDI MOV AH, BYTE PTR[ESI+2] CMP AH, DL //3. test, 8 bits - 24 bits.. JE @Endword MOV BYTE PTR [EDI+0], AH INC EDI MOV AH, BYTE PTR[ESI+3] CMP AH, DL //4. test, 8 bits - 32 bits.. JE @Endword MOV BYTE PTR [EDI+0], AH INC EDI ADD ESI, 4 SUB ECX, 4 CMP ECX, 0 JG @Copyloop @EndWord: MOV BYTE PTR [EDI], $0 //lis?? nolla POP ESI @TotalEnd:POP EDI POP EDX POP EAX POP ECX @Final: RET