home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 11 / bonus / filter.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-10-05  |  5.7 KB  |  208 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     FILTER.PAS                         *)
  3. (*         Ersetzen von Zeichenketten in Dateien          *)
  4. (*           (c) 1990 R. Hensmann & TOOLBOX               *)
  5. (* ------------------------------------------------------ *)
  6. {$I-}
  7. PROGRAM Filter2;
  8.  
  9. USES Dos, LongReplace;
  10.  
  11. TYPE PReplace = ^TReplace;
  12.        (* Zeiger auf Ersetzungsrecord *)
  13.  
  14.      TReplace = RECORD
  15.                   OldString, NewString : STRING;
  16.                   Next                 : PReplace;
  17.                 END;
  18.        (* Zeigerliste für Ersetzkombinationen *)
  19.  
  20.      CharKomb = ARRAY [#0..#255] OF SET OF CHAR;
  21.        (* Alle Buchstabenkombinationen der Suchstrings *)
  22.  
  23. VAR  Wurzel   : PReplace;
  24.      ck       : CharKomb;
  25.      Buf      : BufArray;
  26.        (* Textpuffer *)
  27.  
  28. PROCEDURE ckString( VAR st : STRING);
  29. VAR i : WORD;
  30. BEGIN
  31.   (* Eintragen aller Buchstabenkombinationen *)
  32.   FOR i := 1 TO Length( st)-1 DO
  33.     ck[st[i]] := ck[st[i]] + [st[i+1]];
  34. END;
  35.  
  36. PROCEDURE Error( St : STRING);
  37. BEGIN
  38.   WriteLn(St);
  39.   Halt;
  40. END;
  41.  
  42. PROCEDURE ReadWhitespace(VAR s:STRING;ch:CHAR;VAR i:WORD);
  43. (* überliest Leerzeichen und TAB's *)
  44. CONST TAB = CHR(9);
  45. BEGIN
  46.   WHILE (s[i] <> ch) AND (i<=Length(s)) DO BEGIN
  47.     IF (s[i] <> ' ') AND (s[i] <> TAB) THEN BEGIN
  48.       WriteLn('Fehler : ',s);
  49.       WriteLn('':9-1+i,'^');
  50.       Error( 'Programm abgebrochen');
  51.     END;
  52.     INC( i);
  53.   END;
  54.   IF i<=Length(s) THEN INC(i);
  55. END; (* ReadWhitespace *)
  56.  
  57. PROCEDURE ReadStr(VAR s:STRING; ch:CHAR; VAR i:WORD;
  58.                   VAR new:STRING);
  59. BEGIN
  60.   new := '';
  61.   REPEAT
  62.     WHILE (i <= Length(s)) AND (s[i] <> ch) DO BEGIN
  63.       new := new+s[i];
  64.       INC( i);
  65.     END;
  66.     (* Wenn Delimiter doppelt angegeben, *)
  67.     (* wird er Pascal-like aufgenommen   *)
  68.     IF (i < Length(s)) AND (s[i+1] = ch) THEN BEGIN
  69.       new := new+ch;
  70.       INC( i,2);
  71.     END;
  72.   UNTIL (i>Length(s)) OR (s[i] = ch);
  73.   IF i<=Length(s) THEN INC( i);
  74. END; (* ReadStr *)
  75.  
  76. PROCEDURE LoadData( DatName : STRING);
  77. VAR t         : Text;
  78.     h         : PReplace;
  79.     Zeile     : STRING;
  80.     i         : WORD;
  81. BEGIN
  82.   Fillchar( ck, SIZEOF( ck), #0); (* ARRAY leeren *)
  83.   Assign( t, DatName);
  84.   Reset( t);
  85.   IF IOResult <> 0 THEN
  86.     Error('Steuerdatei nicht gefunden.');
  87.   New( Wurzel); (* Dummy-Element *)
  88.   h := Wurzel;  (* Hilfszeiger   *)
  89.   REPEAT
  90.     ReadLn( t, Zeile);
  91.     IF IOResult <> 0 THEN
  92.       Error('Lesefehler beim Lesen der Steuerdatei');
  93.     IF (Zeile <> '') AND (Zeile[1] <> ';') THEN BEGIN
  94.       New( h^.next);
  95.       h := h^.next;
  96.       i := 1; (* Laufzeiger des Strings *)
  97.       ReadWhitespace( Zeile, '"', i);
  98.       ReadStr( Zeile, '"', i, h^.OldString);
  99.       ReadWhiteSpace( Zeile, '=', i);
  100.       ReadWhiteSpace( Zeile, '"', i);
  101.       ReadStr( Zeile, '"', i, h^.NewString);
  102.       ckString( h^.OldString);
  103.       h^.next := NIL;
  104.       IF h^.OldString = '' THEN BEGIN
  105.         WriteLn( Zeile);
  106.         Error('Ein leerer String kann nicht ersetzt werden');
  107.       END;
  108.     END;
  109.   UNTIL EOF( t);
  110.   Wurzel := Wurzel^.Next;
  111.   Close( t);
  112.   IF IOResult <> 0 THEN
  113.     Error('Steuerdatei kann nicht geschlossen werden');
  114. END; (* LoadData *)
  115.  
  116. PROCEDURE ChangeText( VAR OldText, NewText : STRING);
  117. VAR fold, fnew : File;
  118.     sold       : LONGINT;
  119.     bufsize,
  120.     bufstart   : LONGINT;
  121.     h          : PReplace;
  122.  
  123. BEGIN
  124.   Assign( fold, OldText);
  125.   Assign( fnew, NewText);
  126.   Reset( fold, 1);
  127.   IF IOResult <> 0 THEN
  128.     Error('Originaldatei nicht gefunden');
  129.   Rewrite( fnew, 1);
  130.   IF IOResult <> 0 THEN
  131.     Error('Neue Datei kann nicht geöffnet werden. Schreibschutz?');
  132.   sold := FileSize( fold);
  133.   bufstart := 0;
  134.   WHILE sold > 0 DO BEGIN
  135.     IF sold > 10000 THEN bufsize := 10000
  136.                     ELSE bufsize := sold;
  137.     BlockRead(fold, Buf, bufsize);
  138.     Write('.');
  139.     IF IOResult <> 0 THEN
  140.       Error('Lesefehler');
  141.     WHILE (bufsize > 0) AND (bufsize <> sold) AND
  142.           (Buf[bufsize] IN ck[Buf[bufsize-1]])
  143.     DO Dec(bufsize);
  144.     IF bufsize = 0 THEN
  145.       Error('Interner Fehler: zu kompliziert');
  146.     Inc(bufstart,bufsize);
  147.     Dec(sold,bufsize);
  148.     Seek( fold, bufstart);
  149.  
  150.     h := wurzel;
  151.     WHILE h <> NIL DO BEGIN
  152.       LongReplaceAll( h^.OldString,
  153.                       h^.NewString,
  154.                       Buf,
  155.                       bufsize);
  156.       h := h^.next;
  157.       Write('.');
  158.     END;
  159.     BlockWrite(fnew,Buf,bufsize);
  160.     IF IOResult <> 0 THEN
  161.       Error('Schreibfehler');
  162.   END; (* WHILE *)
  163.   Close( fold);
  164.   Close( fnew);
  165.   IF IOResult <> 0 THEN
  166.     Error('Fehler beim Schließen der Dateien');
  167. END; (* ChangeText *)
  168.  
  169. VAR newtext, oldtext, steuer : STRING;
  170.     t, t2                    : Text;
  171.     same                     : BOOLEAN;
  172.     path, dummy              : STRING;
  173.  
  174. BEGIN
  175.   WriteLn('FILTER - Textdateifilter ');
  176.   Write('Steuerdatei                           : ');
  177.   ReadLn(steuer);
  178.   LoadData(steuer);
  179.   Write('Alte Datei                            : ');
  180.   ReadLn(oldtext);
  181.   Write('Neue Datei (RETURN für gleichen Namen): ');
  182.   ReadLn(newtext);
  183.   WriteLn;
  184.   same := newtext = '';
  185.   IF same THEN BEGIN
  186.     FSplit( FExpand(oldtext), path, oldtext, dummy);
  187.     oldtext := oldtext+dummy;
  188.     Assign(t, path+oldtext);
  189.     Rename(t, path+'FILTER.)$(');
  190.     IF IOResult <> 0 THEN BEGIN
  191.       Assign(t2, path+'FILTER.)$(');
  192.       Erase(t2);
  193.       IF IOResult <> 0 THEN
  194.         Error(path+'FILTER.)$( kann nicht gelöscht werden');
  195.     END;
  196.     newtext := path+oldtext;
  197.     oldtext := path+'FILTER.)$(';
  198.   END;
  199.   Write('Bin beschäftigt');
  200.   ChangeText( oldtext, newtext);
  201.   Writeln;
  202.   IF same THEN BEGIN
  203.     Erase( t);
  204.     IF IOResult <> 0 THEN
  205.       Error('Filter.)$( kann nicht gelöscht werden');
  206.   END;
  207. END.
  208.