diff options
| author | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-01-12 14:05:51 +0000 |
|---|---|---|
| committer | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-01-12 14:05:51 +0000 |
| commit | 5f8354a78052792afc1d839bcd43455b021feded (patch) | |
| tree | ba1fa8ad397c95069e0604380626f56f9eed929f /packages/fcl-base | |
| parent | 11d7db48b210c20b628bb7bab5d534969f2dbb49 (diff) | |
| download | fpc-5f8354a78052792afc1d839bcd43455b021feded.tar.gz | |
* endianfixes .mo reader.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@14626 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-base')
| -rw-r--r-- | packages/fcl-base/src/gettext.pp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/packages/fcl-base/src/gettext.pp b/packages/fcl-base/src/gettext.pp index 6c86c060b9..58fce69a46 100644 --- a/packages/fcl-base/src/gettext.pp +++ b/packages/fcl-base/src/gettext.pp @@ -26,7 +26,6 @@ const MOFileHeaderMagic = $950412de; type - TMOFileHeader = packed record magic: LongWord; // MOFileHeaderMagic revision: LongWord; // 0 @@ -85,18 +84,55 @@ uses {$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); var header: TMOFileHeader; i: Integer; + endianswap : boolean; + begin inherited Create; 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?'); + 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(TranslTable, header.nstrings * SizeOf(TMOStringInfo)); GetMem(OrigStrings, header.nstrings * SizeOf(PChar)); @@ -105,9 +141,13 @@ begin AStream.Position := header.OrigTabOffset; AStream.Read(OrigTable^, header.nstrings * SizeOf(TMOStringInfo)); + if EndianSwap then + EndianFixmotable(OrigTable,Header.NStrings); AStream.Position := header.TransTabOffset; AStream.Read(TranslTable^, header.nstrings * SizeOf(TMOStringInfo)); + if EndianSwap then + EndianFixmotable(TranslTable,Header.NStrings); StringCount := header.nstrings; @@ -139,6 +179,8 @@ begin GetMem(HashTable, 4 * HashTableSize); AStream.Position := header.HashTabOffset; AStream.Read(HashTable^, 4 * HashTableSize); + if EndianSwap then + EndianFixHashTable(hashtable,hashtablesize); end; constructor TMOFile.Create(const AFilename: String); |
