|
@@ -26,7 +26,7 @@ unit ppu;
|
|
interface
|
|
interface
|
|
|
|
|
|
uses
|
|
uses
|
|
- globtype,constexp;
|
|
|
|
|
|
+ globtype,constexp,cstreams;
|
|
|
|
|
|
{ Also write the ppu if only crc if done, this can be used with ppudump to
|
|
{ Also write the ppu if only crc if done, this can be used with ppudump to
|
|
see the differences between the intf and implementation }
|
|
see the differences between the intf and implementation }
|
|
@@ -188,7 +188,7 @@ type
|
|
|
|
|
|
tppufile=class
|
|
tppufile=class
|
|
private
|
|
private
|
|
- f : file;
|
|
|
|
|
|
+ f : TCCustomFileStream;
|
|
mode : byte; {0 - Closed, 1 - Reading, 2 - Writing}
|
|
mode : byte; {0 - Closed, 1 - Reading, 2 - Writing}
|
|
fname : string;
|
|
fname : string;
|
|
fsize : integer;
|
|
fsize : integer;
|
|
@@ -282,8 +282,8 @@ type
|
|
procedure putstring(const s:string);
|
|
procedure putstring(const s:string);
|
|
procedure putnormalset(const b);
|
|
procedure putnormalset(const b);
|
|
procedure putsmallset(const b);
|
|
procedure putsmallset(const b);
|
|
- procedure tempclose;
|
|
|
|
- function tempopen:boolean;
|
|
|
|
|
|
+ procedure tempclose; // MG: not used, obsolete?
|
|
|
|
+ function tempopen:boolean; // MG: not used, obsolete?
|
|
end;
|
|
end;
|
|
|
|
|
|
implementation
|
|
implementation
|
|
@@ -356,10 +356,7 @@ begin
|
|
if Mode<>0 then
|
|
if Mode<>0 then
|
|
begin
|
|
begin
|
|
Flush;
|
|
Flush;
|
|
- {$I-}
|
|
|
|
- system.close(f);
|
|
|
|
- {$I+}
|
|
|
|
- if ioresult<>0 then;
|
|
|
|
|
|
+ f.Free;
|
|
Mode:=0;
|
|
Mode:=0;
|
|
closed:=true;
|
|
closed:=true;
|
|
end;
|
|
end;
|
|
@@ -415,21 +412,17 @@ var
|
|
i : integer;
|
|
i : integer;
|
|
begin
|
|
begin
|
|
openfile:=false;
|
|
openfile:=false;
|
|
- assign(f,fname);
|
|
|
|
- ofmode:=filemode;
|
|
|
|
- filemode:=$0;
|
|
|
|
- {$I-}
|
|
|
|
- reset(f,1);
|
|
|
|
- {$I+}
|
|
|
|
- filemode:=ofmode;
|
|
|
|
- if ioresult<>0 then
|
|
|
|
- exit;
|
|
|
|
|
|
+ try
|
|
|
|
+ f:=CFileStreamClass.Create(fname,fmOpenRead)
|
|
|
|
+ except
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
closed:=false;
|
|
closed:=false;
|
|
{read ppuheader}
|
|
{read ppuheader}
|
|
- fsize:=filesize(f);
|
|
|
|
|
|
+ fsize:=f.Size;
|
|
if fsize<sizeof(tppuheader) then
|
|
if fsize<sizeof(tppuheader) then
|
|
exit;
|
|
exit;
|
|
- blockread(f,header,sizeof(tppuheader),i);
|
|
|
|
|
|
+ i:=f.Read(header,sizeof(tppuheader));
|
|
{ The header is always stored in little endian order }
|
|
{ The header is always stored in little endian order }
|
|
{ therefore swap if on a big endian machine }
|
|
{ therefore swap if on a big endian machine }
|
|
{$IFDEF ENDIAN_BIG}
|
|
{$IFDEF ENDIAN_BIG}
|
|
@@ -478,7 +471,7 @@ end;
|
|
procedure tppufile.reloadbuf;
|
|
procedure tppufile.reloadbuf;
|
|
begin
|
|
begin
|
|
inc(bufstart,bufsize);
|
|
inc(bufstart,bufsize);
|
|
- blockread(f,buf^,ppubufsize,bufsize);
|
|
|
|
|
|
+ bufsize:=f.Read(buf^,ppubufsize);
|
|
bufidx:=0;
|
|
bufidx:=0;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -827,6 +820,8 @@ end;
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
|
|
function tppufile.createfile:boolean;
|
|
function tppufile.createfile:boolean;
|
|
|
|
+var
|
|
|
|
+ ok: boolean;
|
|
begin
|
|
begin
|
|
createfile:=false;
|
|
createfile:=false;
|
|
{$ifdef INTFPPU}
|
|
{$ifdef INTFPPU}
|
|
@@ -838,24 +833,26 @@ begin
|
|
{$endif}
|
|
{$endif}
|
|
if not crc_only then
|
|
if not crc_only then
|
|
begin
|
|
begin
|
|
- assign(f,fname);
|
|
|
|
{$ifdef MACOS}
|
|
{$ifdef MACOS}
|
|
{FPas is FreePascal's creator code on MacOS. See systems/mac_crea.txt}
|
|
{FPas is FreePascal's creator code on MacOS. See systems/mac_crea.txt}
|
|
SetDefaultMacOSCreator('FPas');
|
|
SetDefaultMacOSCreator('FPas');
|
|
SetDefaultMacOSFiletype('FPPU');
|
|
SetDefaultMacOSFiletype('FPPU');
|
|
{$endif}
|
|
{$endif}
|
|
- {$I-}
|
|
|
|
- rewrite(f,1);
|
|
|
|
- {$I+}
|
|
|
|
|
|
+ ok:=false;
|
|
|
|
+ try
|
|
|
|
+ f:=CFileStreamClass.Create(fname,fmCreate);
|
|
|
|
+ ok:=true;
|
|
|
|
+ except
|
|
|
|
+ end;
|
|
{$ifdef MACOS}
|
|
{$ifdef MACOS}
|
|
SetDefaultMacOSCreator('MPS ');
|
|
SetDefaultMacOSCreator('MPS ');
|
|
SetDefaultMacOSFiletype('TEXT');
|
|
SetDefaultMacOSFiletype('TEXT');
|
|
{$endif}
|
|
{$endif}
|
|
- if ioresult<>0 then
|
|
|
|
|
|
+ if not ok then
|
|
exit;
|
|
exit;
|
|
Mode:=2;
|
|
Mode:=2;
|
|
{write header for sure}
|
|
{write header for sure}
|
|
- blockwrite(f,header,sizeof(tppuheader));
|
|
|
|
|
|
+ f.Write(header,sizeof(tppuheader));
|
|
end;
|
|
end;
|
|
bufsize:=ppubufsize;
|
|
bufsize:=ppubufsize;
|
|
bufstart:=sizeof(tppuheader);
|
|
bufstart:=sizeof(tppuheader);
|
|
@@ -904,10 +901,10 @@ begin
|
|
header.symlistsize:=swapendian(header.symlistsize);
|
|
header.symlistsize:=swapendian(header.symlistsize);
|
|
{$endif not FPC_BIG_ENDIAN}
|
|
{$endif not FPC_BIG_ENDIAN}
|
|
{ write header and restore filepos after it }
|
|
{ write header and restore filepos after it }
|
|
- opos:=filepos(f);
|
|
|
|
- seek(f,0);
|
|
|
|
- blockwrite(f,header,sizeof(tppuheader));
|
|
|
|
- seek(f,opos);
|
|
|
|
|
|
+ opos:=f.Position;
|
|
|
|
+ f.Position:=0;
|
|
|
|
+ f.Write(header,sizeof(tppuheader));
|
|
|
|
+ f.Position:=opos;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -915,7 +912,7 @@ procedure tppufile.writebuf;
|
|
begin
|
|
begin
|
|
if not crc_only and
|
|
if not crc_only and
|
|
(bufidx <> 0) then
|
|
(bufidx <> 0) then
|
|
- blockwrite(f,buf^,bufidx);
|
|
|
|
|
|
+ f.Write(buf^,bufidx);
|
|
inc(bufstart,bufidx);
|
|
inc(bufstart,bufidx);
|
|
bufidx:=0;
|
|
bufidx:=0;
|
|
end;
|
|
end;
|
|
@@ -985,10 +982,10 @@ begin
|
|
{flush to be sure}
|
|
{flush to be sure}
|
|
WriteBuf;
|
|
WriteBuf;
|
|
{write entry}
|
|
{write entry}
|
|
- opos:=filepos(f);
|
|
|
|
- seek(f,entrystart);
|
|
|
|
- blockwrite(f,entry,sizeof(tppuentry));
|
|
|
|
- seek(f,opos);
|
|
|
|
|
|
+ opos:=f.Position;
|
|
|
|
+ f.Position:=entrystart;
|
|
|
|
+ f.write(entry,sizeof(tppuentry));
|
|
|
|
+ f.Position:=opos;
|
|
end;
|
|
end;
|
|
entrybufstart:=bufstart;
|
|
entrybufstart:=bufstart;
|
|
end
|
|
end
|
|
@@ -1152,11 +1149,8 @@ procedure tppufile.tempclose;
|
|
begin
|
|
begin
|
|
if not closed then
|
|
if not closed then
|
|
begin
|
|
begin
|
|
- closepos:=filepos(f);
|
|
|
|
- {$I-}
|
|
|
|
- system.close(f);
|
|
|
|
- {$I+}
|
|
|
|
- if ioresult<>0 then;
|
|
|
|
|
|
+ closepos:=f.Position;
|
|
|
|
+ f.Free;
|
|
closed:=true;
|
|
closed:=true;
|
|
tempclosed:=true;
|
|
tempclosed:=true;
|
|
end;
|
|
end;
|
|
@@ -1170,6 +1164,10 @@ function tppufile.tempopen:boolean;
|
|
tempopen:=false;
|
|
tempopen:=false;
|
|
if not closed or not tempclosed then
|
|
if not closed or not tempclosed then
|
|
exit;
|
|
exit;
|
|
|
|
+ // MG: not sure, if this is correct
|
|
|
|
+
|
|
|
|
+ f.Position:=0;
|
|
|
|
+ (*
|
|
ofm:=filemode;
|
|
ofm:=filemode;
|
|
filemode:=0;
|
|
filemode:=0;
|
|
{$I-}
|
|
{$I-}
|
|
@@ -1178,11 +1176,12 @@ function tppufile.tempopen:boolean;
|
|
filemode:=ofm;
|
|
filemode:=ofm;
|
|
if ioresult<>0 then
|
|
if ioresult<>0 then
|
|
exit;
|
|
exit;
|
|
|
|
+ *)
|
|
closed:=false;
|
|
closed:=false;
|
|
tempclosed:=false;
|
|
tempclosed:=false;
|
|
|
|
|
|
{ restore state }
|
|
{ restore state }
|
|
- seek(f,closepos);
|
|
|
|
|
|
+ f.Position:=closepos;
|
|
tempopen:=true;
|
|
tempopen:=true;
|
|
end;
|
|
end;
|
|
|
|
|