home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / tricks / tr.pas < prev    next >
Pascal/Delphi Source File  |  1991-02-21  |  9KB  |  365 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       TR.PAS                           *)
  3. (*    Löschen oder Ersetzen von Strings in ASCII-Files    *)
  4. (* ------------------------------------------------------ *)
  5. (*  Aufruf: TR [-g] -d IstString File(s)                  *)
  6. (*          TR [-g] -c IstString SollString Files(s)      *)
  7. (*                                                        *)
  8. (*   Option  -g Global (alle Strings)                     *)
  9. (*              ohne -g wird nur der erste gefundene      *)
  10. (*              String bearbeitet                         *)
  11. (*           -d der IstString wird gelöscht               *)
  12. (*           -c der IstString wird durch SollString       *)
  13. (*              ersetzt                                   *)
  14. (*                                                        *)
  15. (*     (c) 1991  Dipl.-Ing. Janus Niedoba  & TOOLBOX      *)
  16. (* ------------------------------------------------------ *)
  17. {$D-,I-,R-,S-,V-}
  18.  
  19. PROGRAM TR;
  20.  
  21. USES Crt, Dos;
  22.  
  23. CONST
  24.   MaxChBuf     = 16384;
  25.   MaxFiles     = 100;
  26.   ReadBufMax   = 8192;
  27.   CopyAnzahl   = 256;
  28.   MaxParam     = 10;
  29.  
  30. TYPE
  31.   BufTyp = RECORD
  32.              Buf      : ARRAY [1..MaxChBuf] OF CHAR;
  33.              Count    : WORD;
  34.            END;
  35.   PosTyp = RECORD
  36.              Position : ARRAY [1..ReadBufMax] OF WORD;
  37.              Idx      : WORD;
  38.            END;
  39.   DatStr = STRING [20];
  40.   ExtStr = STRING [3];
  41.  
  42. VAR
  43.   B            : BufTyp;
  44.   IstStr,
  45.   SollStr      : STRING;
  46.   All,
  47.   SchonDa,
  48.   FileDa,
  49.   Umbruch,
  50.   Chg          : BOOLEAN;
  51.   ParaS        : ARRAY [1..MaxParam] OF STRING [80];
  52.   Q, Z         : FILE;
  53.   P            : PosTyp;
  54.   DatName      : ARRAY [1..MaxFiles] OF DatStr;
  55.   AktAnzFiles  : BYTE;
  56.   i            : BYTE;
  57.   NeuDatName   : DatStr;
  58.   Akt          : WORD;
  59.   DirInfo      : SearchRec;
  60.  
  61.  
  62.   FUNCTION Cmp(s: STRING; L : WORD) : BOOLEAN;
  63.   VAR
  64.     Strg : STRING;
  65.   BEGIN
  66.     Delete(s, 1, 1);
  67.     Move(B.Buf[L+1], Strg[1], Length(s));
  68.     Strg[0] := Chr(Length(s));
  69.     Cmp := (Strg = s);
  70.   END;
  71.  
  72.   FUNCTION BufPos(s : STRING) : BOOLEAN;
  73.   VAR
  74.     Lauf      : WORD;
  75.     Gef,
  76.     IstDa,
  77.     Verlassen : BOOLEAN;
  78.   BEGIN
  79.     P.Idx      := 0;
  80.     Lauf       := 1;
  81.     Gef        := FALSE;
  82.     IstDa      := FALSE;
  83.     Verlassen  := FALSE;
  84.     Umbruch    := FALSE;
  85.     IF Length(s) <= B.Count THEN BEGIN
  86.       WHILE (Lauf <= B.Count) AND NOT Verlassen DO BEGIN
  87.         WHILE (B.Buf [Lauf] <> s[1]) AND
  88.               (Lauf <= B.Count) DO Inc(Lauf);
  89.         IF (Lauf <= B.Count) AND
  90.            (Length(s) - 1 <= B.Count - Lauf) THEN BEGIN
  91.           Gef := Cmp(s, Lauf);
  92.           IF Gef THEN BEGIN
  93.             Inc(P.Idx);
  94.             P.Position[P.Idx]  := Lauf;
  95.             Inc(Lauf);
  96.             IstDa := TRUE;
  97.           END ELSE Inc (Lauf);
  98.         END ELSE BEGIN
  99.           IF B.Count < ReadBufMax THEN
  100.             Verlassen := TRUE
  101.           ELSE BEGIN
  102.             IF Lauf <= B.Count THEN BEGIN
  103.               Umbruch   := TRUE;
  104.               Verlassen := TRUE;
  105.             END;
  106.           END;
  107.         END;
  108.       END;
  109.     END;
  110.     BufPos := IstDa;
  111.   END;
  112.  
  113.   PROCEDURE Ende;
  114.   BEGIN
  115.     WriteLn;
  116.     WriteLn('Aufruf: TR [-g] -d IstStr File(s)');
  117.     WriteLn('        TR [-g] -c IstStr SollStr File(s)');
  118.     Halt(1);
  119.   END;
  120.  
  121.   PROCEDURE SteuerZchn(VAR s : STRING);
  122.   VAR
  123.     Lauf  : BYTE;
  124.     Zahl,
  125.     Ctrl  : INTEGER;
  126.     Str,
  127.     Str2  : STRING [3];
  128.   BEGIN
  129.     Lauf := 1;
  130.     WHILE Lauf <= Length(s) DO BEGIN
  131.       IF s[Lauf] = '\' THEN BEGIN
  132.         Move(s[Lauf + 1], Str[1], 3);
  133.         Str[0] := #3;
  134.         Val(Str, Zahl, Ctrl);
  135.         IF Ctrl <> 0 THEN Ende;
  136.         Str2[1] := Chr(Zahl);
  137.         Str2[0] := #1;
  138.         Delete(s, Lauf, 4);
  139.         Insert(Str2, s, Lauf);
  140.       END ELSE Inc(Lauf);
  141.     END;
  142.   END;
  143.  
  144.   PROCEDURE MkParamStr(VAR s : STRING; Count : BYTE);
  145.   BEGIN
  146.     s := ParaS[Count];
  147.     SteuerZchn(s);
  148.   END;
  149.  
  150.   PROCEDURE MkDatNamen(x : BYTE);
  151.   VAR
  152.     L  : BYTE;
  153.   BEGIN
  154.     L := 1;
  155.     FindFirst(ParaS[x], Archive, DirInfo);
  156.     WHILE DosError = 0 DO BEGIN
  157.       DatName[L] := DirInfo.Name;
  158.       FindNext(DirInfo);
  159.       Inc(L);
  160.     END;
  161.     AktAnzFiles := (L - 1);
  162.   END;
  163.  
  164.   PROCEDURE MkParameter;
  165.   VAR
  166.     Lauf : BYTE;
  167.   BEGIN
  168.     IF ParaS[1] <> '-g' THEN BEGIN
  169.       IF ParaS[1] = '-d' THEN BEGIN
  170.         MkParamStr(IstStr, 2);
  171.         MkDatNamen(3);
  172.       END ELSE IF ParaS[1] = '-c' THEN BEGIN
  173.         MkParamStr(IstStr, 2);
  174.         MkParamStr(SollStr, 3);
  175.         MkDatNamen(4);
  176.         Chg := TRUE;
  177.       END ELSE BEGIN
  178.         Ende;
  179.       END;
  180.       All := FALSE;
  181.     END ELSE BEGIN
  182.       IF ParaS[2] = '-d' THEN BEGIN
  183.         MkParamStr(IstStr, 3);
  184.         MkDatNamen(4);
  185.       END ELSE IF ParaS[2] = '-c' THEN BEGIN
  186.         MkParamStr(IstStr, 3);
  187.         MkParamStr(SollStr, 4);
  188.         MkDatNamen(5);
  189.         Chg := TRUE;
  190.       END ELSE BEGIN
  191.         Ende;
  192.       END;
  193.       All := TRUE;
  194.     END;
  195.   END;
  196.  
  197.   PROCEDURE FileOpen(VAR f : FILE; DatName : DatStr;
  198.                      Neu : BOOLEAN);
  199.   BEGIN
  200.    Assign(f, DatName);
  201.    IF Neu THEN
  202.      Rewrite(f, 1)
  203.    ELSE
  204.    {$I-}
  205.      Reset(f, 1);
  206.    {$I+}
  207.    IF IOResult <> 0 THEN BEGIN
  208.      WriteLn('Datei ', DatName, ' existiert nicht');
  209.      FileDa := FALSE;
  210.    END ELSE
  211.      FileDa := TRUE;
  212.   END;
  213.  
  214.   PROCEDURE MkNeuName(AltName : DatStr; VAR NeuName: DatStr;
  215.                       Ext : ExtStr);
  216.   BEGIN
  217.     Delete(AltName, Length(AltName) - 2, 3);
  218.     NeuName := AltName + Ext;
  219.   END;
  220.  
  221.   PROCEDURE DelInBuf(s : STRING; Posi : WORD);
  222.   VAR
  223.     Laenge : INTEGER;
  224.     L      : WORD;
  225.   BEGIN
  226.     Laenge := Length(s);
  227.     Move(B.Buf[Posi + Laenge], B.Buf[Posi],
  228.          B.Count - Posi + Laenge + 1);
  229.     B.Count := B.Count - Laenge;
  230.   END;
  231.  
  232.   PROCEDURE InsInBuf(s : STRING; Posi : WORD);
  233.   VAR
  234.     Laenge : INTEGER;
  235.   BEGIN
  236.     Laenge := Length(s);
  237.     Move(B.Buf[Posi], B.Buf[Posi + Laenge],
  238.          B.Count - Posi + 1);
  239.     Move(s[1], B.Buf[Posi], Laenge);
  240.     B.Count := B.Count + Laenge;
  241.   END;
  242.  
  243.   PROCEDURE ChgPosition(s1, s2 : STRING; Lauf : WORD);
  244.   VAR
  245.     L      : WORD;
  246.     Lang1,
  247.     Lang2  : INTEGER;
  248.   BEGIN
  249.     Lang1 := Length(s1);
  250.     Lang2 := Length(s2);
  251.     FOR L := Lauf TO P.Idx DO
  252.       P.Position[L] := P.Position[L] + (Lang1 - Lang2);
  253.   END;
  254.  
  255.   PROCEDURE Change;
  256.   VAR
  257.     Lauf : WORD;
  258.   BEGIN
  259.     IF BufPos(IstStr) THEN BEGIN
  260.       IF All THEN BEGIN
  261.         FOR Lauf := 1 TO P.Idx DO BEGIN
  262.           DelInBuf(IstStr, P.Position[Lauf]);
  263.           IF Chg THEN
  264.             InsInBuf(SollStr, P.Position[Lauf]);
  265.           IF Length(IstStr) <> Length(SollStr) THEN
  266.             ChgPosition(SollStr, IstStr, Lauf + 1);
  267.         END;
  268.       END ELSE BEGIN
  269.         DelInBuf(IstStr, P.Position[1]);
  270.         InsInBuf(SollStr, P.Position[1]);
  271.         SchonDa := TRUE;
  272.       END;
  273.     END;
  274.   END;
  275.  
  276.   PROCEDURE ChgFile;
  277.   VAR
  278.     Gelesen : WORD;
  279.   BEGIN
  280.     Akt     := 1;
  281.     SchonDa := FALSE;
  282.     Umbruch := FALSE;
  283.     REPEAT
  284.       IF Umbruch THEN
  285.         BlockRead(Q, B.Buf[Akt], ReadBufMax - CopyAnzahl,
  286.                   B.Count)
  287.       ELSE
  288.         BlockRead(Q, B.Buf[Akt], ReadBufMax, B.Count);
  289.       Gelesen := B.Count;
  290.       IF NOT SchonDa THEN BEGIN
  291.         IF Umbruch THEN
  292.           B.Count := B.Count + CopyAnzahl;
  293.         Change;
  294.       END;
  295.       IF Umbruch THEN BEGIN
  296.         B.Count := B.Count - CopyAnzahl;
  297.         BlockWrite(Z, B.Buf, B.Count);
  298.         Move(B.Buf[B.Count + 1], B.Buf[1], CopyAnzahl);
  299.         Akt := CopyAnzahl + 1;
  300.       END ELSE BEGIN
  301.         BlockWrite(Z, B.Buf, B.Count);
  302.         Akt := 1;
  303.       END;
  304.     UNTIL Gelesen = 0;
  305.   END;
  306.  
  307.   PROCEDURE ChgFileName(DatNam1, DatNam2 : DatStr);
  308.   VAR
  309.     NeuNam : DatStr;
  310.     f      : FILE;
  311.     Ext    : ExtStr;
  312.     L      : BYTE;
  313.   BEGIN
  314.     MkNeuName(DatNam1, NeuNam, 'BAK');
  315.     Assign(f, NeuNam);
  316.     {$I-}
  317.     Reset(f);
  318.     {$I+}
  319.     IF IOResult <> 0 THEN BEGIN
  320.       Assign(f, DatNam1);
  321.       Rename(f, NeuNam);
  322.     END ELSE BEGIN
  323.       Close(f);
  324.       Erase(f);
  325.       Ext := Copy(DatNam1, Length(DatNam1) - 2, 3);
  326.       FOR L := 1 TO Length(Ext) DO
  327.         Ext[L] := UpCase(Ext[L]);
  328.       IF Ext <> 'BAK' THEN BEGIN
  329.         Assign(f, DatNam1);
  330.         Rename(f, NeuNam);
  331.       END;
  332.     END;
  333.     Assign(f, DatNam2);
  334.     Rename(f, DatNam1);
  335.   END;
  336.  
  337. BEGIN
  338.   Chg     := FALSE;
  339.   SollStr := '';
  340.   IF ParamCount < 3 THEN
  341.     Ende
  342.   ELSE BEGIN
  343.     FOR i := 1 TO ParamCount DO
  344.       ParaS[i] := ParamStr(i);
  345.     MkParameter;
  346.   END;
  347.   FOR i := 1 TO AktAnzFiles DO BEGIN
  348.     FileOpen(Q, DatName[i], FALSE);
  349.     IF FileDa THEN BEGIN
  350.       WriteLn('Datei ', DatName[i], ' wird bearbeitet...');
  351.       MkNeuName(DatName[i], NeuDatName, 'NEU');
  352.       FileOpen(Z, NeuDatName, TRUE);
  353.       ChgFile;
  354.       Close(Q);
  355.       Close(Z);
  356.       ChgFileName(DatName[i], NeuDatName);
  357.     END;
  358.   END;
  359.   WriteLn ('------------------------');
  360.   WriteLn ('Konvertierung beendet...');
  361. END.
  362. (* ------------------------------------------------------ *)
  363. (*                  Ende von TR.PAS                       *)
  364.  
  365.