Browse Source

fcl-res: TStringTableResource: use UnicodeString

Reintegrate fpcres-rc branch by Martok

git-svn-id: trunk@46377 -
svenbarth 5 years ago
parent
commit
70d32c4c7e
1 changed files with 21 additions and 35 deletions
  1. 21 35
      packages/fcl-res/src/stringtableresource.pp

+ 21 - 35
packages/fcl-res/src/stringtableresource.pp

@@ -21,13 +21,13 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, resource;
   Classes, SysUtils, resource;
-  
+
 type
 type
   EStringTableResourceException = class(EResourceException);
   EStringTableResourceException = class(EResourceException);
   EStringTableNameNotAllowedException = class(EStringTableResourceException);
   EStringTableNameNotAllowedException = class(EStringTableResourceException);
   EStringTableIndexOutOfBoundsException = class(EStringTableResourceException);
   EStringTableIndexOutOfBoundsException = class(EStringTableResourceException);
 
 
-  
+
 resourcestring
 resourcestring
   SNameNotAllowed = 'Resource ID must be an ordinal in the range 1-4096';
   SNameNotAllowed = 'Resource ID must be an ordinal in the range 1-4096';
   SIndexOutOfBounds = 'String ID out of bounds: %d';
   SIndexOutOfBounds = 'String ID out of bounds: %d';
@@ -42,7 +42,7 @@ type
     fName : TResourceDesc;
     fName : TResourceDesc;
     fFirstID : word;
     fFirstID : word;
     fCount : integer;
     fCount : integer;
-    fList : TStringList;
+    fList : array of UnicodeString;
     fCanChangeDesc : boolean;
     fCanChangeDesc : boolean;
     function IDtoIndex(const aId : word) : integer;
     function IDtoIndex(const aId : word) : integer;
     procedure CheckListLoaded;
     procedure CheckListLoaded;
@@ -85,54 +85,47 @@ end;
 procedure TStringTableResource.CheckListLoaded;
 procedure TStringTableResource.CheckListLoaded;
 var i : integer;
 var i : integer;
 begin
 begin
-  if fList<>nil then exit;
-  fList:=TStringList.Create;
-  fList.Capacity:=16;
+  if Length(fList) <> 0 then exit;
+  SetLength(fList, fCount);
+  for i:=0 to high(fList) do
+    fList[i]:= '';
   if RawData.Size=0 then exit;
   if RawData.Size=0 then exit;
   RawData.Position:=0;
   RawData.Position:=0;
-  for i:=0 to 15 do
-    fList.Add(ReadWideString);
+  for i:=0 to high(fList) do
+    fList[i]:= ReadWideString;
 end;
 end;
 
 
 function TStringTableResource.ReadWideString: string;
 function TStringTableResource.ReadWideString: string;
-var ws : widestring;
+var ws : unicodestring;
     w : word;
     w : word;
     i : integer;
     i : integer;
 begin
 begin
   RawData.ReadBuffer(w,2);
   RawData.ReadBuffer(w,2);
-  {$IFDEF ENDIAN_BIG}
-  w:=SwapEndian(w);
-  {$ENDIF}
+  w:= LEtoN(w);
   setlength(ws,w);
   setlength(ws,w);
 
 
   for i:=1 to length(ws) do
   for i:=1 to length(ws) do
   begin
   begin
     RawData.ReadBuffer(w,2);
     RawData.ReadBuffer(w,2);
-    {$IFDEF ENDIAN_BIG}
-    w:=SwapEndian(w);
-    {$ENDIF}
+    w:= LEtoN(w);
     ws[i]:=widechar(w);
     ws[i]:=widechar(w);
   end;
   end;
   Result:=ws;
   Result:=ws;
 end;
 end;
 
 
 procedure TStringTableResource.WriteWideString(const aString: string);
 procedure TStringTableResource.WriteWideString(const aString: string);
-var ws : widestring;
+var ws : unicodestring;
     w : word;
     w : word;
     i : integer;
     i : integer;
 begin
 begin
   w:=length(aString);
   w:=length(aString);
-  {$IFDEF ENDIAN_BIG}
-  w:=SwapEndian(w);
-  {$ENDIF}
+  w:= NtoLE(w);
   RawData.WriteBuffer(w,2);
   RawData.WriteBuffer(w,2);
   ws:=aString;
   ws:=aString;
   for i:=1 to length(ws) do
   for i:=1 to length(ws) do
   begin
   begin
     w:=word(ws[i]);
     w:=word(ws[i]);
-    {$IFDEF ENDIAN_BIG}
-    w:=SwapEndian(w);
-    {$ENDIF}
+    w:= NtoLE(w);
     RawData.WriteBuffer(w,2);
     RawData.WriteBuffer(w,2);
   end;
   end;
 end;
 end;
@@ -157,8 +150,8 @@ begin
   CheckIndex(id);
   CheckIndex(id);
   CheckListLoaded;
   CheckListLoaded;
   idx:=IDtoIndex(id);
   idx:=IDtoIndex(id);
-  if idx>=fList.Count then Result:=''
-  else Result:=fList[idx];
+  if idx>high(fList) then Result:= ''
+  else Result:= fList[idx];
 end;
 end;
 
 
 procedure TStringTableResource.SetString(id: word; aString: string);
 procedure TStringTableResource.SetString(id: word; aString: string);
@@ -167,13 +160,7 @@ begin
   CheckIndex(id);
   CheckIndex(id);
   CheckListLoaded;
   CheckListLoaded;
   idx:=IDtoIndex(id);
   idx:=IDtoIndex(id);
-  if idx<fList.Count then fList[idx]:=aString
-  else if idx>=fList.Count then
-  begin
-    for i:=fList.Count to idx-1 do
-      fList.Add('');
-    fList.Add(aString);
-  end;
+  fList[idx]:= aString;
 end;
 end;
 
 
 procedure TStringTableResource.UpdateRawData;
 procedure TStringTableResource.UpdateRawData;
@@ -184,7 +171,7 @@ begin
   RawData.Position:=0;
   RawData.Position:=0;
   for i:=FirstID to LastID do
   for i:=FirstID to LastID do
     WriteWideString(Strings[i]);
     WriteWideString(Strings[i]);
-  FreeAndNil(fList);
+  fList:= nil;
 end;
 end;
 
 
 function TStringTableResource.GetType: TResourceDesc;
 function TStringTableResource.GetType: TResourceDesc;
@@ -223,7 +210,7 @@ constructor TStringTableResource.Create;
 begin
 begin
   inherited Create;
   inherited Create;
   fCanChangeDesc:=false;
   fCanChangeDesc:=false;
-  fList:=nil;
+  fList:= nil;
   fType:=TResourceDesc.Create(RT_STRING);
   fType:=TResourceDesc.Create(RT_STRING);
   fName:=TResourceDesc.Create(1);
   fName:=TResourceDesc.Create(1);
   fCount:=16;
   fCount:=16;
@@ -248,8 +235,7 @@ destructor TStringTableResource.Destroy;
 begin
 begin
   fType.Free;
   fType.Free;
   fName.Free;
   fName.Free;
-  if fList<>nil then
-    fList.Free;
+  SetLength(fList, 0);
   inherited Destroy;
   inherited Destroy;
 end;
 end;