summaryrefslogtreecommitdiff
path: root/packages/fcl-base
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-12 14:05:51 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-12 14:05:51 +0000
commit5f8354a78052792afc1d839bcd43455b021feded (patch)
treeba1fa8ad397c95069e0604380626f56f9eed929f /packages/fcl-base
parent11d7db48b210c20b628bb7bab5d534969f2dbb49 (diff)
downloadfpc-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.pp46
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);