Browse Source

* Fixed Wide<->Ansi conversion for wince.

git-svn-id: trunk@10725 -
yury 17 years ago
parent
commit
10a286532f
3 changed files with 31 additions and 28 deletions
  1. 17 12
      rtl/wince/system.pp
  2. 11 13
      rtl/wince/sysutils.pp
  3. 3 3
      rtl/wince/wininc/cemiss.inc

+ 17 - 12
rtl/wince/system.pp

@@ -316,6 +316,7 @@ function MultiByteToWideChar(CodePage:UINT; dwFlags:DWORD; lpMultiByteStr:PChar;
 function WideCharToMultiByte(CodePage:UINT; dwFlags:DWORD; lpWideCharStr:PWideChar; cchWideChar:longint; lpMultiByteStr:PChar;cchMultiByte:longint; lpDefaultChar:PChar; lpUsedDefaultChar:pointer):longint;
      cdecl; external 'coredll' name 'WideCharToMultiByte';
 
+{ Returns number of characters stored to WideBuf, including null-terminator. }
 function AnsiToWideBuf(AnsiBuf: PChar; AnsiBufLen: longint; WideBuf: PWideChar; WideBufLen: longint): longint;
 begin
   Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar));
@@ -328,12 +329,12 @@ begin
         exit;
     end;
     WideBuf[Result] := #0;
-    if (Result <> 0) or (AnsiBufLen = 0) then
-      Inc(Result);
   end;
-  Result:=Result*SizeOf(WideChar);
+  if (AnsiBufLen <> -1) and ((Result <> 0) or (AnsiBufLen = 0)) then
+    Inc(Result);
 end;
 
+{ Returns number of characters stored to AnsiBuf, including null-terminator. }
 function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint;
 begin
   Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil);
@@ -346,18 +347,20 @@ begin
         exit;
     end;
     AnsiBuf[Result] := #0;
-    if (Result <> 0) or (WideCharsLen = 0) then
-      Inc(Result);
   end;
+  if (WideCharsLen <> -1) and ((Result <> 0) or (WideCharsLen = 0)) then
+    Inc(Result);
 end;
 
+{ Returns dynamic memory block, which contains wide string. This memory should be freed using FreeMem. }
+{ outlen will contain number of wide characters stored to result buffer, including null-terminator. }
 function PCharToPWideChar(str: PChar; strlen: longint = -1; outlen: PLongInt = nil): PWideChar;
 var
   len: longint;
 begin
   while True do begin
     if strlen <> -1 then
-      len:=(strlen + 1)
+      len:=strlen + 1
     else
       len:=AnsiToWideBuf(str, -1, nil, 0);
     if len > 0 then
@@ -374,15 +377,17 @@ begin
     end
     else begin
       GetMem(Result, SizeOf(WideChar));
-      Inc(len, 2);
+      len:=1;
       Result^:=#0;
     end;
     break;
   end;
   if outlen <> nil then
-    outlen^:=len - SizeOf(WideChar);
+    outlen^:=len;
 end;
 
+{ Returns dynamic memory block, which contains wide string. This memory should be freed using FreeMem. }
+{ outlen will contain number of wide characters stored to result buffer, including null-terminator. }
 function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar;
 var
   len, wlen: longint;
@@ -390,14 +395,14 @@ begin
   len:=Length(s);
   wlen:=(len + 1)*SizeOf(WideChar);
   GetMem(Result, wlen);
-  wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen);
+  wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
   if wlen = 0 then
   begin
-    wlen:=AnsiToWideBuf(PChar(s), len, nil, 0);
+    wlen:=AnsiToWideBuf(PChar(s), len, nil, 0)*SizeOf(WideChar);
     if wlen > 0 then
     begin
       ReAllocMem(Result, wlen);
-      wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen);
+      wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
     end
     else
     begin
@@ -406,7 +411,7 @@ begin
     end;
   end;
   if outlen <> nil then
-    outlen^:=(wlen - 1) div SizeOf(WideChar);
+    outlen^:=wlen div SizeOf(WideChar);
 end;
 
 {*****************************************************************************

+ 11 - 13
rtl/wince/sysutils.pp

@@ -68,7 +68,7 @@ procedure PWideCharToString(const str: PWideChar; out Result: string; strlen: lo
 var
   len: longint;
 begin
-  if str^ = #0 then
+  if (strlen < 1) and (str^ = #0) then
     Result:=''
   else
   begin
@@ -803,8 +803,8 @@ begin
   if s <> '' then
   begin
     buf:=StringToPWideChar(s, @len);
-    CharUpperBuff(buf, len);
-    PWideCharToString(buf, Result, len);
+    CharUpperBuff(buf, len-1);
+    PWideCharToString(buf, Result, len-1);
     FreeMem(buf);
   end
   else
@@ -820,8 +820,8 @@ begin
   if s <> '' then
   begin
     buf:=StringToPWideChar(s, @len);
-    CharLowerBuff(buf, len);
-    PWideCharToString(buf, Result, len);
+    CharLowerBuff(buf, len-1);
+    PWideCharToString(buf, Result, len-1);
     FreeMem(buf);
   end
   else
@@ -883,7 +883,7 @@ var
 begin
   ws1:=PCharToPWideChar(S1, MaxLen, @len1);
   ws2:=PCharToPWideChar(S2, MaxLen, @len2);
-  Result:=CompareString(LOCALE_USER_DEFAULT, 0, ws1, len1 div SizeOf(WideChar), ws2, len2 div SizeOf(WideChar)) - 2;
+  Result:=CompareString(LOCALE_USER_DEFAULT, 0, ws1, len1, ws2, len2) - 2;
   FreeMem(ws2);
   FreeMem(ws1);
 end;
@@ -896,7 +896,7 @@ var
 begin
   ws1:=PCharToPWideChar(S1, MaxLen, @len1);
   ws2:=PCharToPWideChar(S2, MaxLen, @len2);
-  Result:=CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, ws1, len1 div SizeOf(WideChar), ws2, len2 div SizeOf(WideChar)) - 2;
+  Result:=CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, ws1, len1, ws2, len2) - 2;
   FreeMem(ws2);
   FreeMem(ws1);
 end;
@@ -908,10 +908,9 @@ var
   len: longint;
 begin
   buf:=PCharToPWideChar(Str, -1, @len);
-  len:=len div SizeOf(WideChar);
-  CharLowerBuff(buf, len);
+  CharLowerBuff(buf, len - 1);
   Result:=Str;
-  WideToAnsiBuf(buf, -1, Result, len + 1);
+  WideToAnsiBuf(buf, -1, Result, StrLen(Str));
   FreeMem(buf);
 end;
 
@@ -922,10 +921,9 @@ var
   len: longint;
 begin
   buf:=PCharToPWideChar(Str, -1, @len);
-  len:=len div SizeOf(WideChar);
-  CharUpperBuff(buf, len);
+  CharUpperBuff(buf, len - 1);
   Result:=Str;
-  WideToAnsiBuf(buf, -1, Result, len + 1);
+  WideToAnsiBuf(buf, -1, Result, StrLen(Str));
   FreeMem(buf);
 end;
 

+ 3 - 3
rtl/wince/wininc/cemiss.inc

@@ -205,10 +205,10 @@ var
 begin
  lpwsValueName:=PCharToPWideChar(lpValueName);
  if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin
+   if (cbData > 0) and (PChar(lpData)[cbData - 1] = #0) then
+     Dec(cbData);
    ws:=PCharToPWideChar(lpData, cbData, @sz);
-   if (cbData > 0) and (PChar(lpData)[cbData - 1] <> #0) then
-     Inc(sz, SizeOf(WideChar));
-   cbData:=sz;
+   cbData:=sz*SizeOf(WideChar);
    DataBuf:=ws;
  end
  else begin