home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* LONGREPLACE.PAS *)
- (* Unit für FILTER.PAS *)
- (* (c) 1990 R. Hensmann & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT LongReplace;
-
- INTERFACE
-
- TYPE BufArray = ARRAY [0..50000] OF CHAR;
-
- PROCEDURE LongReplaceAll( VAR Search : STRING;
- VAR Replace: STRING;
- VAR Buffer;
- VAR Size : LONGINT);
-
- IMPLEMENTATION
-
-
- VAR Hilf : ^BufArray;
- HilfCmp : STRING;
-
- FUNCTION StringComp( VAR St1, St2 : STRING) : BOOLEAN;
- VAR Lauf : WORD;
- BEGIN
- HilfCmp := '';
- FOR Lauf := 1 TO Length( St1) DO BEGIN
- IF St1[Lauf] = '?' THEN
- HilfCmp := HilfCmp + St2[Lauf]
- ELSE
- IF (St1[Lauf] <> St2[Lauf]) THEN BEGIN
- StringComp := FALSE;
- Exit;
- END;
- END;
- StringComp := TRUE;
- END; (* StringComp *)
-
- PROCEDURE LongReplaceAll( VAR Search : STRING;
- VAR Replace: STRING;
- VAR Buffer;
- VAR Size : LONGINT);
- VAR b : BufArray ABSOLUTE Buffer;
- k,i,x : WORD;
- ch : CHAR;
- ps : ^STRING;
- BEGIN
- New( Hilf);
- k := 0; (* Zeiger auf neues Array *)
- i := 0;
- WHILE i < Size DO BEGIN
- ch := b[i];
- IF ch <> Search[1] THEN
- Hilf^[k] := b[i]
- ELSE BEGIN
- ps := @b[i-1];
- IF StringComp( Search, ps^) THEN BEGIN
- Move( Replace[1], Hilf^[k], Length( Replace));
- IF HilfCmp <> '' THEN BEGIN
- FOR x := k TO k+Length(Replace)-1 DO
- IF (Hilf^[x] = '?') AND (HilfCmp <> '') THEN BEGIN
- Hilf^[x] := HilfCmp[1];
- Delete( HilfCmp,1,1);
- END;
- END;
- INC( k, INTEGER(Length(Replace))-1);
- INC( i, INTEGER(Length(Search)) -1);
- END ELSE
- Hilf^[k] := b[i];
- END;
- INC( k);
- INC( i);
- IF k > 50000 THEN BEGIN
- WriteLn('Pufferüberlauf');
- HALT;
- END;
- END;
- Move( Hilf^, Buffer, k);
- Size := k;
- Dispose( Hilf);
- END;
-
- BEGIN
- END.
-
-
-
-
-