// That is, the Source consists ONLY of // aFindString, and we''''re going to replace // every one of them! ActualResultLen := SourceLen + (SourceLen * ReplaceLen div FindLen) + ReplaceLen; // Set the length of Result; this // will assign the memory, etc. SetLength(Result,ActualResultLen); CurrentPos := 1; ResultLen := 0; LastPos := 1; //Again, I’m eliminating an IF statement in a loop by repeating code–this ap //proach results in very slightly larger code, but if ever you can trade some //memory in exchange for speed, go for it! if ReplaceLen > 0 then begin repeat // Get the position of the first (or next) // aFindString in aSourceString. // Note that there''''s no If CaseSensitive, // I just call FastPOSProc, which is pointing // to the correct pre-determined routine. CurrentPos := FastPosProc(aSourceString, aFindString, SourceLen, FindLen, CurrentPos); // If 0, then we''''re finished. if CurrentPos = 0 then break; // Number of bytes to copy from the // source string is CurrentPos - lastPos, // i.e. " cat " in "the cat the". BytesToCopy := CurrentPos-LastPos; // Copy chars from aSourceString // to the end of Result. MyMove(aSourceString[LastPos], Result[ResultLen+1], BytesToCopy); // Copy chars from aReplaceString to // the end of Result. MyMove(aReplaceString[1], Result[ResultLen+1+BytesToCopy], ReplaceLen); // Remember, using COPY would copy all of // the data over and over again. // Never fall into this trap (like a certain // software company did). // Set the running length to ResultLen := ResultLen + BytesToCopy + ReplaceLen; // Set the position in aSourceString to where // we want to continue searching from. CurrentPos := CurrentPos + FindLen; LastPos := CurrentPos; until false; end else begin // You might have noticed If ReplaceLen > 0. // Well, if ReplaceLen = 0, then we''''re deleting the // substrings, rather than replacing them, so we // don''''t need the extra MyMove from aReplaceString. repeat CurrentPos := FastPos(aSourceString, aFindString, SourceLen, FindLen, CurrentPos); if CurrentPos = 0 then break; BytesToCopy := CurrentPos-LastPos; MyMove(aSourceString[LastPos], Result[ResultLen+1], BytesToCopy); ResultLen := ResultLen + BytesToCopy + ReplaceLen; CurrentPos := CurrentPos + FindLen; LastPos := CurrentPos; until false; end; //Now that we’ve finished doing all of the replaces, I just need to adjust th //e length of the final result: Dec(LastPOS); //Now I set the length to the Length plus the bit of string left. That is, " m //at" when replacing "the" in "sat on the mat". SetLength(Result, ResultLen + (SourceLen-LastPos)); // If there''''s a bit of string dangling, then // add it to the end of our string. if LastPOS+1 <= SourceLen then MyMove(aSourceString[LastPos+1], Result[ResultLen+1],SourceLen-LastPos); end;
end.
上一页 [1] [2] [3] |