home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* PATCH.PAS *)
- (* Utility zum Patchen von Dateien *)
- (* (c) 1988 by Chr. Diederichsen und TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Patch;
- {$B+}
-
- USES Dos, Crt;
-
- CONST
- MaxSearch = 80;
-
- TYPE
- ComFile = FILE OF CHAR;
- CharArray = ARRAY[1..MaxSearch] OF CHAR;
- String80 = STRING[80];
-
- VAR
- TextSearch, Check : BOOLEAN;
- IOByte, MaxByte : BYTE;
- Search, Change, Save : CharArray;
- Ch : CHAR;
- InFile, OutFile : ComFile;
- IOError, i, j, found : INTEGER;
- GesAnz : LongInt;
- IOString, Name, FirstName : String80;
- hr, min, sec, hsec, second1, second2 : WORD;
-
- FUNCTION CheckFile(Name: String80; Erase: BOOLEAN;
- VAR Datei: ComFile): BOOLEAN;
- BEGIN
- {$I-}
- Assign(Datei, Name);
- Reset(Datei);
- {$I+}
- IOError := IOResult;
- IF ((IOError = 2) OR Erase) THEN BEGIN
- {$I-}
- Assign(Datei, Name);
- Rewrite(Datei);
- {$I+}
- IOError := IOResult;
- END;
- CheckFile := (IOError = 0);
- END;
-
- FUNCTION GetFileNames: BOOLEAN;
- (* Übergabe der Input/Outputdatei nur über Kommandozeile! *)
- BEGIN
- IF ParamCount = 0 THEN BEGIN
- WriteLn('Aufruf mit PATCH InFile Outfile');
- Halt;
- END ELSE BEGIN
- FirstName := ParamStr(1);
- IF ParamStr(2) = '' THEN BEGIN
- Name := FirstName;
- Delete(Name, Pos('.', Name) + 1, 3);
- Name := Name + 'NEW';
- END ELSE Name := ParamStr(2);
- END;
- GetFileNames := ((CheckFile(FirstName, FALSE, InFile))
- AND (CheckFile(Name, TRUE, OutFile)));
- END;
-
- PROCEDURE Initialize;
- BEGIN
- WriteLn('Ändern von ', FirstName, ' > ', Name);
- WriteLn;
- WriteLn('<B>yteweise oder <C>haracterweise ',
- 'Suchen/ Ändern? ');
- REPEAT
- Ch := UpCase(ReadKey);
- UNTIL ((Ch = 'B') OR (Ch = 'C'));
- TextSearch := (Ch = 'C');
- GesAnz := 0;
- found := 0;
- Write('Nach Wieviel ');
- IF TextSearch THEN Write('Buchstaben ')
- ELSE Write('Bytes ');
- Write('soll gesucht werden? ');
- ReadLn(MaxByte);
- WriteLn;
- IF TextSearch THEN BEGIN
- Write('Suche nach: ');
- ReadLn(IOString);
- FOR i := 1 TO MaxByte DO Search[i] := IOString[i];
- END ELSE BEGIN
- Write('Suche Hex($)/Dez nach: ');
- FOR i := 1 TO MaxByte DO BEGIN
- Read(IOByte);
- Search[i] := Chr(IOByte);
- END;
- ReadLn;
- END;
- WriteLn;
- WriteLn('Dateigröße : ',FileSize(InFile):7, ' Bytes');
- END;
-
- BEGIN
- ClrScr;
- CheckBreak := TRUE;
- IF getFileNames THEN BEGIN
- Initialize;
- GetTime(hr, min, sec, hsec);
- second1 := 3600*hr + 60*min + sec + (hsec DIV 100);
- REPEAT
- i := 1;
- REPEAT
- Read(InFile, Save[i]);
- Inc(GesAnz, 1);
- Check := (Save[i] = Search[i]);
- IF Check THEN Inc(i, 1);
- UNTIL NOT Check OR (i = MaxByte + 1);
- IF CHECK THEN BEGIN
- Inc(found, 1);
- FOR j := 1 TO MaxByte DO Write(OutFile, Change[j]);
- END ELSE BEGIN
- Write(OutFile, Save[1]);
- IF i > 1 THEN BEGIN
- GesAnz := GesAnz - i + 1;
- Seek(InFile, GesAnz);
- END;
- END;
- UNTIL Eof(InFile);
- GetTime(hr, min,sec, hsec);
- WriteLn('gelesen : ', GesAnz:7, ' passende Stellen: ',
- found:5);
- WriteLn;
- second2 := (3600*hr + 60*min + sec + (hsec DIV 100)) -
- second1;
- WriteLn(' Dauer: ', (second2 DIV 60):4, ' min ',
- second2 MOD 60:2, ' sec');
- WriteLn(' Leserate: ', (GesAnz/second2):8:2,
- ' Bytes pro sec');
- Close(InFile);
- Close(OutFile);
- END ELSE BEGIN
- WriteLn('Falscher Dateiname, Öffne nicht möglich! ');
- END;
- END.