[fpc-pascal] Turbo Pascal/legacy data file issue.

Lowell C. Savage savage at lanl.gov
Mon Sep 19 20:56:13 CEST 2005


Has anyone come up with a set of routines for converting between Turbo 
Pascal's 6-byte "real" format and FPC's real number format?

I am trying to use FPC to update a legacy TP 5.5 program.  I've got most of 
the "major" issues solved and am now finding that I'm having trouble 
reading legacy data files.  Many of these data file are "file of XXXRec" 
where "XXXRec" is a rather large and complex Record containing strings, 
integers, bytes, enumerated types, and reals.

My problem is that I am going to need to be able to read these existing 
files (without modification) into the new version of the program.

I've been able to use the "{$PACKRECORDS 1}" and "{$PACKENUMS 1}" 
directives to take care of everything else.  But now I realize that Turbo 
Pascal used a 6-byte real representation while FPC uses either a 4 or 8-bit 
representation.

It appears that I'm going to need to make some kind of a special type, 
perhaps a packed record with a "byte", a "smallint" and a 4-byte 
"longword".  Then, I read this value from the existing file and convert it 
into a "real".  Then, when I want to write the file (or another file) I 
convert back to this record type when I fill the record I'm going to write.

Here's a simple program to demonstrate the issue.  In Turbo Pascal 5.5 
(Downloaded from http://bdn.borland.com/article/0,1410,20803,00.html) this 
code generates a 12-byte file.  FPC generates a 16-byte file.  (Actually, 
the preprocessor directives shown appear to have no effect on this 
code--not complaining since the docs don't make it appear that it should, 
just pointing it out.)

Program testrec;
{$IFDEF FPC}
{$MODE TP}
{$PACKRECORDS 1}
{$ENDIF}
type
      realrec = record
         t1 : real;
         t2 : real;
         end;

var
    realfile : file of realrec;
    r : realrec;
begin
    r.t1 := 1.0;
    r.t2 := 2.0;
    assign ( realfile, 'c:\r.rfl' );
    rewrite ( realfile );
    write ( realfile, r );
    close ( realfile );
end.

Any ideas appreciated!

Thanks,


Lowell C. Savage
savage at lanl.gov
505-667-6964 (office/msg)
360-961-8965 (cell/msg)
505-667-4341 (shared fax) 





More information about the fpc-pascal mailing list