home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 12 / tricks / patch.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-26  |  3.9 KB  |  142 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    PATCH.PAS                           *)
  3. (*          Utility zum Patchen von Dateien               *)
  4. (*     (c) 1988 by Chr. Diederichsen und TOOLBOX          *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM Patch;
  7. {$B+}
  8.  
  9. USES Dos, Crt;
  10.  
  11. CONST
  12.   MaxSearch = 80;
  13.  
  14. TYPE
  15.   ComFile   = FILE OF CHAR;
  16.   CharArray = ARRAY[1..MaxSearch] OF CHAR;
  17.   String80  = STRING[80];
  18.  
  19. VAR
  20.   TextSearch, Check                    : BOOLEAN;
  21.   IOByte, MaxByte                      : BYTE;
  22.   Search, Change, Save                 : CharArray;
  23.   Ch                                   : CHAR;
  24.   InFile, OutFile                      : ComFile;
  25.   IOError, i, j, found                 : INTEGER;
  26.   GesAnz                               : LongInt;
  27.   IOString, Name, FirstName            : String80;
  28.   hr, min, sec, hsec, second1, second2 : WORD;
  29.  
  30. FUNCTION CheckFile(Name: String80; Erase: BOOLEAN;
  31.                    VAR Datei: ComFile): BOOLEAN;
  32. BEGIN
  33.   {$I-}
  34.   Assign(Datei, Name);
  35.   Reset(Datei);
  36.   {$I+}
  37.   IOError := IOResult;
  38.   IF ((IOError = 2) OR Erase) THEN BEGIN
  39.     {$I-}
  40.     Assign(Datei, Name);
  41.     Rewrite(Datei);
  42.     {$I+}
  43.     IOError := IOResult;
  44.   END;
  45.   CheckFile := (IOError = 0);
  46. END;
  47.  
  48. FUNCTION GetFileNames: BOOLEAN;
  49. (* Übergabe der Input/Outputdatei nur über Kommandozeile! *)
  50. BEGIN
  51.   IF ParamCount = 0 THEN BEGIN
  52.     WriteLn('Aufruf mit PATCH InFile Outfile');
  53.     Halt;
  54.   END ELSE BEGIN
  55.     FirstName := ParamStr(1);
  56.     IF ParamStr(2) = '' THEN BEGIN
  57.       Name := FirstName;
  58.       Delete(Name, Pos('.', Name) + 1, 3);
  59.       Name := Name + 'NEW';
  60.     END ELSE Name := ParamStr(2);
  61.   END;
  62.   GetFileNames := ((CheckFile(FirstName, FALSE, InFile))
  63.                   AND (CheckFile(Name, TRUE, OutFile)));
  64. END;
  65.  
  66. PROCEDURE Initialize;
  67. BEGIN
  68.   WriteLn('Ändern von    ', FirstName, ' > ', Name);
  69.   WriteLn;
  70.   WriteLn('<B>yteweise oder <C>haracterweise ',
  71.           'Suchen/ Ändern? ');
  72.   REPEAT
  73.     Ch := UpCase(ReadKey);
  74.   UNTIL ((Ch = 'B') OR (Ch = 'C'));
  75.   TextSearch := (Ch = 'C');
  76.   GesAnz := 0;
  77.   found := 0;
  78.   Write('Nach Wieviel ');
  79.   IF TextSearch THEN Write('Buchstaben ')
  80.   ELSE Write('Bytes ');
  81.   Write('soll gesucht werden? ');
  82.   ReadLn(MaxByte);
  83.   WriteLn;
  84.   IF TextSearch THEN BEGIN
  85.     Write('Suche nach:      ');
  86.     ReadLn(IOString);
  87.     FOR i := 1 TO MaxByte DO Search[i] := IOString[i];
  88.   END ELSE BEGIN
  89.     Write('Suche Hex($)/Dez nach: ');
  90.     FOR i := 1 TO MaxByte DO BEGIN
  91.       Read(IOByte);
  92.       Search[i] := Chr(IOByte);
  93.     END;
  94.     ReadLn;
  95.   END;
  96.   WriteLn;
  97.   WriteLn('Dateigröße : ',FileSize(InFile):7, ' Bytes');
  98. END;
  99.  
  100. BEGIN
  101.   ClrScr;
  102.   CheckBreak := TRUE;
  103.   IF getFileNames THEN BEGIN
  104.     Initialize;
  105.     GetTime(hr, min, sec, hsec);
  106.     second1 := 3600*hr + 60*min + sec + (hsec DIV 100);
  107.     REPEAT
  108.       i := 1;
  109.       REPEAT
  110.         Read(InFile, Save[i]);
  111.         Inc(GesAnz, 1);
  112.         Check := (Save[i] = Search[i]);
  113.         IF Check THEN Inc(i, 1);
  114.       UNTIL NOT Check OR (i = MaxByte + 1);
  115.       IF CHECK THEN BEGIN
  116.         Inc(found, 1);
  117.         FOR j := 1 TO MaxByte DO Write(OutFile, Change[j]);
  118.       END ELSE BEGIN
  119.         Write(OutFile, Save[1]);
  120.         IF i > 1 THEN BEGIN
  121.           GesAnz := GesAnz - i + 1;
  122.           Seek(InFile, GesAnz);
  123.         END;
  124.       END;
  125.     UNTIL Eof(InFile);
  126.     GetTime(hr, min,sec, hsec);
  127.     WriteLn('gelesen  : ', GesAnz:7, ' passende Stellen: ',
  128.             found:5);
  129.     WriteLn;
  130.     second2 := (3600*hr + 60*min + sec + (hsec DIV 100)) -
  131.                second1;
  132.     WriteLn('  Dauer: ', (second2 DIV 60):4, ' min ',
  133.             second2 MOD 60:2, ' sec');
  134.     WriteLn('  Leserate: ', (GesAnz/second2):8:2,
  135.             ' Bytes pro sec');
  136.     Close(InFile);
  137.     Close(OutFile);
  138.   END ELSE BEGIN
  139.     WriteLn('Falscher Dateiname, Öffne nicht möglich! ');
  140.   END;
  141. END.
  142.