123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- var
- OldPat,Srch: SRstring; // Srch and Oldp can contain uppercase versions of S,OldPattern
- PatLength,NewPatLength,P,Cnt,PrevP: Integer;
- c,d: SRPChar ;
-
- begin
- aCount:=0;
- Result:='';
- c:= NIL; d:=NIL;
- OldPat:='';
- Srch:='';
- PatLength:=Length(OldPattern);
- if PatLength=0 then begin
- Result:=S;
- exit;
- end;
- if rfIgnoreCase in Flags then begin
- Srch:=SRUpperCase(S);
- OldPat:=SRUpperCase(OldPattern);
- end else begin
- Srch:=S;
- OldPat:=OldPattern;
- end;
- PatLength:=Length(OldPat);
- if Length(NewPattern)=PatLength then begin
- //Result length will not change
- Result:=S;
- P:=1;
- repeat
- P:=Pos(OldPat,Srch,P);
- if P>0 then begin
- inc(aCount);
- move(NewPattern[1],Result[P],PatLength*SizeOf(SRChar));
- if not (rfReplaceAll in Flags) then exit;
- inc(P,PatLength);
- end;
- until p=0;
- end else begin
- //Different pattern length -> Result length will change
- //To avoid creating a lot of temporary strings, we count how many
- //replacements we're going to make.
- P:=1;
- repeat
- P:=Pos(OldPat,Srch,P);
- if P>0 then begin
- inc(P,PatLength);
- inc(aCount);
- if not (rfReplaceAll in Flags) then break;
- end;
- until p=0;
- if aCount=0 then begin
- Result:=S;
- exit;
- end;
- NewPatLength:=Length(NewPattern);
- SetLength(Result,Length(S)+aCount*(NewPatLength-PatLength));
- P:=1; PrevP:=0;
- c:=SRPChar(Result); d:=SRPChar(S);
- repeat
- P:=Pos(OldPat,Srch,P);
- if P>0 then begin
- Cnt:=P-PrevP-1;
- if Cnt>0 then begin
- Move(d^,c^,Cnt*SizeOf(SRChar));
- inc(c,Cnt);
- inc(d,Cnt);
- end;
- if NewPatLength>0 then begin
- Move(NewPattern[1],c^,NewPatLength*SizeOf(SRChar));
- inc(c,NewPatLength);
- end;
- inc(P,PatLength);
- inc(d,PatLength);
- PrevP:=P-1;
- if not (rfReplaceAll in Flags) then break;
- end;
- until p=0;
- Cnt:=Length(S)-PrevP;
- if Cnt>0 then Move(d^,c^,Cnt*SizeOf(SRChar));
- end;
- end;
- (*
- var
- Srch,OldP,RemS: SRString; // Srch and Oldp can contain uppercase versions of S,OldPattern
- P : Integer;
- begin
- Srch:=S;
- OldP:=OldPattern;
- if rfIgnoreCase in Flags then
- begin
- Srch:=SRUpperCase(Srch);
- OldP:=SRUpperCase(OldP);
- end;
- RemS:=S;
- Result:='';
- while (Length(Srch)<>0) do
- begin
- P:=AnsiPos(OldP, Srch);
- if P=0 then
- begin
- Result:=Result+RemS;
- Srch:='';
- end
- else
- begin
- Result:=Result+Copy(RemS,1,P-1)+NewPattern;
- P:=P+Length(OldP);
- RemS:=Copy(RemS,P,Length(RemS)-P+1);
- if not (rfReplaceAll in Flags) then
- begin
- Result:=Result+RemS;
- Srch:='';
- end
- else
- Srch:=Copy(Srch,P,Length(Srch)-P+1);
- end;
- end;
- end;
- *)
|