home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-09-08 | 6.9 KB | 238 lines | [TEXT/PJMM] |
- program CopyCat;
-
- const
- ENDLINE = chr(13);
- MaxChars = 10240;
- sleep = 10;
-
- type
- BufType = packed array[1..MaxChars] of char;
- BufPtr = ^BufType;
- BufHdl = ^BufPtr;
-
- var
- iType: integer;
- iHandle: handle;
- iBox: rect;
- err: OSErr;
- volName, inputName, outputName: str255;
- vRefNum, scriptRef, inputRef, outputRef: integer;
- charsToTransfer: longint;
- myBuffer: BufHdl;
- IgnoreBool: boolean; { These variables for WaitNextEvent calls }
- AnEventRec: EventRecord;
-
- {----------------------------------------------------------------- }
-
- function GetFileName (Input: str255): str255;
-
- begin
- while (pos(':', Input) > 0) & (length(Input) > 1) do
- Input := copy(Input, pos(':', Input) + 1, 255);
- GetFileName := Input
- end;
-
- {----------------------------------------------------------------- }
-
- var
- theDialog: DialogPtr;
- oldPort: grafPtr;
-
- procedure OpenDialog;
-
- begin
- GetPort(oldPort);
- theDialog := GetNewDialog(501, nil, Pointer(-1));
- DrawDialog(theDialog);
- SetPort(theDialog);
- ForeColor(RedColor);
- getDItem(theDialog, 2, iType, iHandle, iBox);
- SetIText(iHandle, 'CopyCat');
- ForeColor(BlueColor);
- end;
-
- {----------------------------------------------------------------- }
-
- procedure CloseDialog;
-
- begin
- DisposDialog(theDialog);
- SetPort(oldPort);
- end;
-
- {----------------------------------------------------------------- }
-
- function AtEOF (fRefNum: Integer): Boolean;
-
- var
- Err: OSErr;
- currPos, eofPos: LongInt;
-
- begin
- Err := GetFPos(fRefNum, currPos);
- Err := GetEOF(fRefNum, eofPos);
- AtEOF := currPos = eofPos
- end;
-
- {----------------------------------------------------------------- }
-
- function ReadALine (FileRefNum: integer; var TheMessage: string): OSErr;
-
- var
- myPB: ParamBlockRec;
- myString: Str255;
-
- begin
- myString := '';
- myPB.ioCompletion := nil;
- myPB.ioRefNum := FileRefNum;
- myPB.ioBuffer := Pointer(@myString[1]);
- myPB.ioReqCount := 255;
- myPB.ioPosMode := 3456; {ASCII 13*256+128}
- myPB.ioPosOffset := 0; {ignored}
- ReadALine := PBRead(@myPB, False);
- if (myString[myPB.ioActCount] = chr(13)) then
- myString[0] := char(myPB.ioActCount - 1) {Drop CR}
- else
- myString[0] := char(myPB.ioActCount);
- TheMessage := myString
- end;
-
- {----------------------------------------------------------------- }
-
- function Wr (FileRefNum: integer; TheMessage: string): OSErr;
-
- { Writes string (without length byte) to text file, returns error code }
-
- var
- TheLength: longint;
-
- begin
- TheLength := length(TheMessage);
- Wr := FSWrite(FileRefNum, TheLength, Pointer(ord(@TheMessage) + 1));
- end;
-
- {----------------------------------------------------------------- }
-
- function WrLn (FileRefNum: integer; TheMessage: string): OSErr;
-
- { Writes string (without length byte) to text file, returns error code }
-
- begin
- TheMessage := concat(TheMessage, ENDLINE);
- WrLn := Wr(FileRefNum, TheMessage);
- end;
-
- {----------------------------------------------------------------- }
-
- function CheckFileName (var FileName: str255): boolean;
-
- { returns true if FileName ends in ' [-]' and strips those characters, }
- { otherwise returns false and leaves FileName unchanged }
-
- begin
- CheckFileName := false;
- if pos(' [-]', FileName) = length(FileName) - 3 then
- begin
- FileName := copy(FileName, 1, length(FileName) - 4);
- CheckFileName := true;
- end;
- end;
-
- {----------------------------------------------------------------- }
-
- var
- counter, inResRefNum, outResRefNum: integer;
- ScriptName: str255;
- deleteFile: boolean;
- FileInfo: FInfo;
- myPB: paramBlockRec;
- ModTime, CreationTime: longint;
-
- begin
- ScriptName := GetString(501)^^;
- myBuffer := BufHdl(NewHandle(sizeOf(BufType)));
- err := GetVol(@volName, vRefNum);
- err := FSOpen(concat(':', ScriptName), vRefNum, scriptRef);
- OpenDialog;
- counter := 0;
- if (err = NoErr) then
- while (not AtEOF(scriptRef)) do
- begin
- deleteFile := false;
- if (err = NoErr) then
- err := ReadALine(scriptRef, inputName);
- deleteFile := CheckFileName(inputName);
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- if (err = NoErr) then
- err := ReadALine(scriptRef, outputName);
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- if (err = NoErr) then
- err := FSOpen(inputName, vRefNum, inputRef);
- if err = noErr then
- begin
- err := GetFInfo(inputName, vRefNum, FileInfo);
- myPB.ioNamePtr := @inputName;
- myPB.ioVRefNum := vRefNum;
- myPB.ioFDirIndex := 0;
- myPB.ioFVersNum := 0;
- err := PBGetFInfo(@myPB, false);
- CreationTime := myPB.ioFlCrDat;
- ModTime := myPB.ioFlMdDat;
- counter := succ(counter);
- getDItem(theDialog, 1, iType, iHandle, iBox);
- SetIText(iHandle, concat(stringOf(counter : 1), ' — ', GetFileName(inputName)));
- err := FSDelete(outputName, vRefNum);
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- Err := Create(outputName, vRefNum, FileInfo.fdCreator, FileInfo.fdType);
- err := FSOpen(outputName, vRefNum, outputRef);
- HLock(handle(myBuffer));
- charsToTransfer := MaxChars;
- while (not AtEOF(inputRef)) & (err = NoErr) & (charsToTransfer = MaxChars) do
- begin
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- err := FSRead(inputRef, charsToTransfer, Ptr(myBuffer^));
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- err := FSWrite(outputRef, charsToTransfer, Ptr(myBuffer^));
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil)
- end;
- HUnLock(handle(myBuffer));
- err := FSClose(outputRef);
- err := FSClose(inputRef);
- err := OpenRF(inputName, vRefNum, inResRefNum);
- if err = noErr then
- begin
- HLock(handle(myBuffer));
- charsToTransfer := MaxChars;
- err := OpenRF(outputName, vRefNum, outResRefNum);
- while (not AtEOF(inResRefNum)) & (err = NoErr) & (charsToTransfer = MaxChars) do
- begin
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- err := FSRead(inResRefNum, charsToTransfer, Ptr(myBuffer^));
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil);
- err := FSWrite(outResRefNum, charsToTransfer, Ptr(myBuffer^));
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil)
- end;
- HUnLock(handle(myBuffer));
- err := FSClose(outResRefNum);
- myPB.ioNamePtr := @outputName;
- myPB.ioVRefNum := vRefNum;
- myPB.ioFDirIndex := 0;
- myPB.ioFVersNum := 0;
- err := PBGetFInfo(@myPB, false);
- myPB.ioFlCrDat := CreationTime;
- myPB.ioFlMdDat := ModTime;
- err := PBSetFInfo(@myPB, false);
- end;
- err := FSClose(inResRefNum);
- if deleteFile then
- while err = noErr do
- err := FSDelete(inputName, vRefNum);
- end; {no error on input file}
- IgnoreBool := WaitNextEvent(EveryEvent, AnEventRec, sleep, nil)
- end;
- err := FSClose(scriptRef);
- CloseDialog;
- if myBuffer <> nil then
- DisposHandle(Handle(myBuffer))
- end.