mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-23 22:00:45 +02:00
* endianfixes .mo reader.
git-svn-id: trunk@14626 -
This commit is contained in:
parent
b6a23de91e
commit
aad151b506
@ -26,7 +26,6 @@ const
|
|||||||
MOFileHeaderMagic = $950412de;
|
MOFileHeaderMagic = $950412de;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
TMOFileHeader = packed record
|
TMOFileHeader = packed record
|
||||||
magic: LongWord; // MOFileHeaderMagic
|
magic: LongWord; // MOFileHeaderMagic
|
||||||
revision: LongWord; // 0
|
revision: LongWord; // 0
|
||||||
@ -85,18 +84,55 @@ uses
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
|
procedure Endianfixmotable(p:PMOStringTable;n:integer);
|
||||||
|
var I:integer;
|
||||||
|
begin
|
||||||
|
if n>0 then
|
||||||
|
for i:=0 to n-1 do
|
||||||
|
begin
|
||||||
|
p^[i].length:=swapendian(p^[i].length);
|
||||||
|
p^[i].offset:=swapendian(p^[i].offset);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Endianfixhashtable(p:PLongwordArray;n:integer);
|
||||||
|
var I:integer;
|
||||||
|
begin
|
||||||
|
if n>0 then
|
||||||
|
for i:=0 to n-1 do
|
||||||
|
begin
|
||||||
|
p^[i]:=swapendian(p^[i]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TMOFile.Create(AStream: TStream);
|
constructor TMOFile.Create(AStream: TStream);
|
||||||
var
|
var
|
||||||
header: TMOFileHeader;
|
header: TMOFileHeader;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
endianswap : boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
|
|
||||||
AStream.Read(header, Sizeof(header));
|
AStream.Read(header, Sizeof(header));
|
||||||
|
|
||||||
if header.magic <> MOFileHeaderMagic then
|
if (header.magic <> MOFileHeaderMagic) and (swapendian(header.magic)<>MOFileHeaderMagic) then
|
||||||
raise EMOFileError.Create('Invalid magic - not a MO file?');
|
raise EMOFileError.Create('Invalid magic - not a MO file?');
|
||||||
|
|
||||||
|
endianswap:=header.magic<>MOFileHeaderMagic;
|
||||||
|
If EndianSwap then
|
||||||
|
begin
|
||||||
|
with header do
|
||||||
|
begin
|
||||||
|
revision :=SwapEndian(revision);
|
||||||
|
nstrings :=SwapEndian(nstrings);
|
||||||
|
OrigTabOffset :=SwapEndian(OrigTabOffset);
|
||||||
|
TransTabOffset:=SwapEndian(TransTabOffset);
|
||||||
|
HashTabSize :=SwapEndian(HashTabSize);
|
||||||
|
HashTabOffset :=SwapEndian(HashTabOffset);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
GetMem(OrigTable, header.nstrings * SizeOf(TMOStringInfo));
|
GetMem(OrigTable, header.nstrings * SizeOf(TMOStringInfo));
|
||||||
GetMem(TranslTable, header.nstrings * SizeOf(TMOStringInfo));
|
GetMem(TranslTable, header.nstrings * SizeOf(TMOStringInfo));
|
||||||
GetMem(OrigStrings, header.nstrings * SizeOf(PChar));
|
GetMem(OrigStrings, header.nstrings * SizeOf(PChar));
|
||||||
@ -105,9 +141,13 @@ begin
|
|||||||
|
|
||||||
AStream.Position := header.OrigTabOffset;
|
AStream.Position := header.OrigTabOffset;
|
||||||
AStream.Read(OrigTable^, header.nstrings * SizeOf(TMOStringInfo));
|
AStream.Read(OrigTable^, header.nstrings * SizeOf(TMOStringInfo));
|
||||||
|
if EndianSwap then
|
||||||
|
EndianFixmotable(OrigTable,Header.NStrings);
|
||||||
|
|
||||||
AStream.Position := header.TransTabOffset;
|
AStream.Position := header.TransTabOffset;
|
||||||
AStream.Read(TranslTable^, header.nstrings * SizeOf(TMOStringInfo));
|
AStream.Read(TranslTable^, header.nstrings * SizeOf(TMOStringInfo));
|
||||||
|
if EndianSwap then
|
||||||
|
EndianFixmotable(TranslTable,Header.NStrings);
|
||||||
|
|
||||||
StringCount := header.nstrings;
|
StringCount := header.nstrings;
|
||||||
|
|
||||||
@ -139,6 +179,8 @@ begin
|
|||||||
GetMem(HashTable, 4 * HashTableSize);
|
GetMem(HashTable, 4 * HashTableSize);
|
||||||
AStream.Position := header.HashTabOffset;
|
AStream.Position := header.HashTabOffset;
|
||||||
AStream.Read(HashTable^, 4 * HashTableSize);
|
AStream.Read(HashTable^, 4 * HashTableSize);
|
||||||
|
if EndianSwap then
|
||||||
|
EndianFixHashTable(hashtable,hashtablesize);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TMOFile.Create(const AFilename: String);
|
constructor TMOFile.Create(const AFilename: String);
|
||||||
|
Loading…
Reference in New Issue
Block a user