home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 07 / tricks / patchen.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-03-21  |  5.3 KB  |  194 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    PATCHEN.PAS                         *)
  3. (*     Version 2.0 des allgemeinen Patch-Programms        *)
  4. (*        (c) 1989 Chr. Diederichsen & TOOLBOX            *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM Patchen;
  7.  
  8. USES Dos, Crt;
  9.  
  10. CONST
  11.   BufSize   = 32768;
  12.                     { muß komplett ins Datensegment passen }
  13.   MaxSearch = 80;
  14.  
  15. TYPE
  16.   String80 = STRING[80];
  17.  
  18. VAR
  19.   InF, OutF          : FILE;
  20.   OutFName, InFName  : String80;
  21.   InCnt, OutCnt      : Word;
  22.   FilePos            : LongInt;
  23.   Equal, FileEnd     : Boolean;
  24.   Buffer             : ARRAY[1..BufSize] OF Byte;
  25.   Search, Change     : ARRAY[1..MaxSearch] OF Byte;
  26.   MaxByte            : Byte;
  27.   i, found           : Integer;
  28.   hr, Min, Sec, hsec : Word;
  29.   Second1, Second2   : Real;
  30.  
  31.   PROCEDURE OpenFiles;       { und initialisiere die Suche }
  32.   BEGIN
  33.     IF ParamCount = 0 THEN BEGIN
  34.       WriteLn('Aufruf PATCH InFile [Outfile]');
  35.       WriteLn('mindestens ein Dateiname muß ',
  36.               'angegeben werden!');
  37.       WriteLn('Dateiname Input:  '); ReadLn(InFName);
  38.       WriteLn('Dateiname Output: '); ReadLn(OutFName);
  39.     END ELSE
  40.       IF ParamCount = 1 THEN BEGIN
  41.         InFName := ParamStr(1);
  42.         IF ParamStr(2) = '' THEN BEGIN
  43.           OutFName := InFName;
  44.           Delete(OutFName, Pos('.', OutFName) + 1, 3);
  45.           OutFName := OutFName + 'tmp';
  46.         END ELSE OutFName := ParamStr(2);
  47.       END ELSE
  48.         IF ParamCount = 2 THEN BEGIN
  49.           InFName := ParamStr(1);
  50.           OutFName := ParamStr(2);
  51.         END;
  52. {$i-} ;
  53.     Assign(InF, InFName);
  54.     Reset(InF, 1);
  55.     IF IOResult <> 0 THEN BEGIN
  56.       WriteLn('Fehler beim Öffnen von InF');
  57.       Halt(1);
  58.     END;
  59.     Assign(OutF, OutFName);
  60.     Rewrite(OutF, 1);
  61.     IF IOResult <> 0 THEN BEGIN
  62.       WriteLn('Fehler beim Öffnen von OutF');
  63.       Halt(1);
  64.     END;
  65. {$i+}
  66.   END;
  67.  
  68.   PROCEDURE Initialize;
  69.   VAR
  70.     TextSearch : Boolean;
  71.     IOByte     : Byte;
  72.     IOString   : String80;
  73.     CH         : Char;
  74.   BEGIN
  75.     WriteLn('Ändern von:    ', InFName, ' > ', OutFName);
  76.     WriteLn;
  77.     WriteLn('<b>yteweise oder <c>haracterweise ',
  78.             'Suchen/Ändern? ');
  79.     REPEAT
  80.       CH := UpCase(ReadKey);
  81.     UNTIL ((CH = 'B') OR (CH = 'C'));
  82.     TextSearch := (CH = 'C');
  83.     found := 0;
  84.     Write('Nach wieviel ');
  85.     IF TextSearch THEN Write('Buchstaben ')
  86.                   ELSE Write('Bytes ');
  87.     Write('soll gesucht werden ?  ');
  88.     ReadLn(MaxByte);
  89.     WriteLn;
  90.     IF TextSearch THEN BEGIN
  91.       Write('Suche nach:      ');
  92.       ReadLn(IOString);
  93.       FOR i := 1 TO MaxByte DO
  94.         Search[i] := Ord(IOString[i]);
  95.     END ELSE BEGIN
  96.       Write('Suche Hex<$>/Dec nach: ');
  97.       FOR i := 1 TO MaxByte DO BEGIN
  98.         Read(IOByte);
  99.         Search[i] := IOByte;
  100.       END;
  101.       ReadLn;
  102.     END;
  103.     IF TextSearch THEN BEGIN
  104.       Write('Austausch gegen: ');
  105.       ReadLn(IOString);
  106.       FOR i := 1 TO MaxByte DO
  107.         Change[i] := Ord(IOString[i]);
  108.     END ELSE BEGIN
  109.       Write('Hex<$>/Dec Tausch:     ');
  110.       FOR i := 1 TO MaxByte DO BEGIN
  111.         Read(IOByte);
  112.         Change[i] := IOByte;
  113.       END;
  114.       ReadLn;
  115.     END;
  116.     WriteLn;
  117.     WriteLn('Dateigröße : ', FileSize(InF) : 7, ' Bytes');
  118.   END;
  119.  
  120.   PROCEDURE ReadBuf(VAR FPos : LongInt; VAR Last : Word;
  121.                     VAR FileEnd : Boolean);
  122.   VAR Reading, ReadCnt : Word;
  123.   BEGIN
  124.     Reading := BufSize;
  125.     Seek(InF, FPos);
  126. {$i-}
  127.     BlockRead(InF, Buffer, Reading, ReadCnt);
  128. {$i+}
  129.     IF Reading <> ReadCnt THEN BEGIN
  130.       Last := ReadCnt;
  131.       FileEnd := True;
  132.       Exit;
  133.     END;
  134.     Last := BufSize - MaxByte;
  135.     FileEnd := False;
  136.   END;
  137.  
  138.   PROCEDURE WriteBuf(VAR Last : Word);
  139.   VAR  WriteCnt : Word;
  140.   BEGIN
  141. {$i-}
  142.     BlockWrite(OutF, Buffer, Last, WriteCnt);
  143. {$i+}
  144.     IF Last <> WriteCnt THEN BEGIN
  145.       WriteLn('Achtung; Datenträger ist voll');
  146.       Halt(1);
  147.     END;
  148.   END;
  149.  
  150. BEGIN
  151.   ClrScr;
  152.   CheckBreak := TRUE;
  153.   FileEnd    := FALSE;
  154.   OpenFiles;
  155.   Initialize;
  156.   GetTime(hr, Min, Sec, hsec); { ein bißchen Statistik ... }
  157.   Second1 := 3600*hr + 60*Min + Sec + hsec/100.0;
  158.   found := 0;
  159.   FilePos := 0;
  160.   WHILE NOT FileEnd DO BEGIN
  161.     OutCnt := 0;
  162.     ReadBuf(FilePos, OutCnt, FileEnd);
  163.     FOR InCnt := 1 TO OutCnt DO BEGIN
  164.       IF Buffer[InCnt] = Search[1] THEN BEGIN
  165.         i := 1;
  166.         REPEAT
  167.           Inc(i, 1);
  168.           Equal := (Buffer[InCnt + i - 1] = Search[i]);
  169.         UNTIL ((NOT Equal) OR (i = MaxByte));
  170.         IF Equal THEN BEGIN
  171.           FOR i := 1 TO MaxByte DO
  172.             Buffer[InCnt + i - 1] := Change[i];
  173.           InCnt := InCnt + MaxByte;
  174.           Inc(found, 1);
  175.         END;
  176.       END;
  177.       OutCnt := InCnt;
  178.     END;
  179.     WriteBuf(OutCnt);
  180.     Inc(FilePos, OutCnt);
  181.   END;
  182.   GetTime(hr, Min, Sec, hsec);
  183.   WriteLn('gelesen    : ', FileSize(InF) : 7,
  184.           ' passende Stellen: ', found : 5);
  185.   WriteLn;
  186.   Second2 := (3600*hr + 60*Min + Sec + (hsec/100))-Second1;
  187.   WriteLn('     Dauer : ', Second2 : 10 : 2, ' sec');
  188.   WriteLn('  Leserate : ', (FileSize(InF)/Second2) : 8 : 2,
  189.           ' Bytes pro sec');
  190.   Close(InF);
  191.   Close(OutF);
  192. END.
  193. (* ------------------------------------------------------ *)
  194. (*                   Ende von PATCHEN.PAS                 *)