[fpc-pascal] Delphi-FPC portable code for endian conversion
Bo Berglund
bo.berglund at gmail.com
Sat Jun 4 00:39:50 CEST 2016
On Sat, 4 Jun 2016 00:05:21 +0200, Sven Barth
<pascaldragon at googlemail.com> wrote:
>FPC's NToBE and BEToN routines indeed only convert if necessary. I don't
>know about the Delphi's Swap routines, but alone from the name I'd say that
>they swap unconditionally (though considering that Delphi runs only on
>little endian CPUs that provably won't matter).
>
>> I have tried to figure out a set of {$IFDEF } statements but so far
>> with no success.
>
>I'd say that "ifdef fpc" should do the job.
>
Yes, but then I would also need to use the NToBE and BEToN functions
in the FPC code block and my existing code in the D2007 code in order
for it to work when I run on FPC but in Linux on x86...
Meanwhile I realized I could do as follows instead:
interface
...
var
IsLittleEndian: boolean;
implementation
var
_Tmp: array[0..1] of byte;
_Tst: word;
...
procedure Swap4 (var Source);
{Swap the byte order of a 4-byte variable}
type
Reverse = packed record
B1 : Byte;
I2 : Word;
B4 : Byte;
end;
var
Bsw : Byte;
begin
Bsw := Reverse(Source).B1;
Reverse(Source).B1 := Reverse(Source).B4;
Reverse(Source).B4 := Bsw;
Reverse(Source).I2 := Swap(Reverse(Source).I2);
end;
....
initialization
_Tmp[0] := 57;
_Tmp[1] := 48;
Move(_Tmp[0], _Tst, 2);
IsLittleEndian := (_Tst = 12345);
end.
Then in each endian conversion function I could do as the following
example:
procedure FileDirRecEndianConv(var FR: TSSFileDirRec);
begin
if IsLittleEndian then
begin
Swap4(FR.FileLen);
FR.StartBlock := Swap(FR.StartBlock);
FR.CmdNum := Swap(FR.CmdNum);
FR.Meascount := Swap(FR.Meascount);
Swap4(FR.Xloc);
Swap4(FR.Yloc);
Swap4(FR.Zloc);
Swap4(FR.ScaleFactor);
Swap4(FR.P_X);
Swap4(FR.P_Y);
Swap4(FR.P_Z);
Swap4(FR.InfiniteX);
Swap4(FR.InfiniteY);
Swap4(FR.InfiniteZ);
end;
end;
What this does is that it checks system endian on program startup
(once) and then uses this flag all through to either convert or not.
Still with my own Swap4() procedure and the built in Swap() function.
--
Bo Berglund
Developer in Sweden
More information about the fpc-pascal
mailing list