mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 09:46:12 +02:00
* Fixed Wide<->Ansi conversion for wince.
git-svn-id: trunk@10725 -
This commit is contained in:
parent
b64519162d
commit
10a286532f
@ -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;
|
function WideCharToMultiByte(CodePage:UINT; dwFlags:DWORD; lpWideCharStr:PWideChar; cchWideChar:longint; lpMultiByteStr:PChar;cchMultiByte:longint; lpDefaultChar:PChar; lpUsedDefaultChar:pointer):longint;
|
||||||
cdecl; external 'coredll' name 'WideCharToMultiByte';
|
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;
|
function AnsiToWideBuf(AnsiBuf: PChar; AnsiBufLen: longint; WideBuf: PWideChar; WideBufLen: longint): longint;
|
||||||
begin
|
begin
|
||||||
Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar));
|
Result := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, AnsiBuf, AnsiBufLen, WideBuf, WideBufLen div SizeOf(WideChar));
|
||||||
@ -328,12 +329,12 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
WideBuf[Result] := #0;
|
WideBuf[Result] := #0;
|
||||||
if (Result <> 0) or (AnsiBufLen = 0) then
|
|
||||||
Inc(Result);
|
|
||||||
end;
|
end;
|
||||||
Result:=Result*SizeOf(WideChar);
|
if (AnsiBufLen <> -1) and ((Result <> 0) or (AnsiBufLen = 0)) then
|
||||||
|
Inc(Result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ Returns number of characters stored to AnsiBuf, including null-terminator. }
|
||||||
function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint;
|
function WideToAnsiBuf(WideBuf: PWideChar; WideCharsLen: longint; AnsiBuf: PChar; AnsiBufLen: longint): longint;
|
||||||
begin
|
begin
|
||||||
Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil);
|
Result := WideCharToMultiByte(CP_ACP, 0, WideBuf, WideCharsLen, AnsiBuf, AnsiBufLen, nil, nil);
|
||||||
@ -346,18 +347,20 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
AnsiBuf[Result] := #0;
|
AnsiBuf[Result] := #0;
|
||||||
if (Result <> 0) or (WideCharsLen = 0) then
|
|
||||||
Inc(Result);
|
|
||||||
end;
|
end;
|
||||||
|
if (WideCharsLen <> -1) and ((Result <> 0) or (WideCharsLen = 0)) then
|
||||||
|
Inc(Result);
|
||||||
end;
|
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;
|
function PCharToPWideChar(str: PChar; strlen: longint = -1; outlen: PLongInt = nil): PWideChar;
|
||||||
var
|
var
|
||||||
len: longint;
|
len: longint;
|
||||||
begin
|
begin
|
||||||
while True do begin
|
while True do begin
|
||||||
if strlen <> -1 then
|
if strlen <> -1 then
|
||||||
len:=(strlen + 1)
|
len:=strlen + 1
|
||||||
else
|
else
|
||||||
len:=AnsiToWideBuf(str, -1, nil, 0);
|
len:=AnsiToWideBuf(str, -1, nil, 0);
|
||||||
if len > 0 then
|
if len > 0 then
|
||||||
@ -374,15 +377,17 @@ begin
|
|||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
GetMem(Result, SizeOf(WideChar));
|
GetMem(Result, SizeOf(WideChar));
|
||||||
Inc(len, 2);
|
len:=1;
|
||||||
Result^:=#0;
|
Result^:=#0;
|
||||||
end;
|
end;
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
if outlen <> nil then
|
if outlen <> nil then
|
||||||
outlen^:=len - SizeOf(WideChar);
|
outlen^:=len;
|
||||||
end;
|
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;
|
function StringToPWideChar(const s: AnsiString; outlen: PLongInt = nil): PWideChar;
|
||||||
var
|
var
|
||||||
len, wlen: longint;
|
len, wlen: longint;
|
||||||
@ -390,14 +395,14 @@ begin
|
|||||||
len:=Length(s);
|
len:=Length(s);
|
||||||
wlen:=(len + 1)*SizeOf(WideChar);
|
wlen:=(len + 1)*SizeOf(WideChar);
|
||||||
GetMem(Result, wlen);
|
GetMem(Result, wlen);
|
||||||
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen);
|
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
|
||||||
if wlen = 0 then
|
if wlen = 0 then
|
||||||
begin
|
begin
|
||||||
wlen:=AnsiToWideBuf(PChar(s), len, nil, 0);
|
wlen:=AnsiToWideBuf(PChar(s), len, nil, 0)*SizeOf(WideChar);
|
||||||
if wlen > 0 then
|
if wlen > 0 then
|
||||||
begin
|
begin
|
||||||
ReAllocMem(Result, wlen);
|
ReAllocMem(Result, wlen);
|
||||||
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen);
|
wlen:=AnsiToWideBuf(PChar(s), len, Result, wlen)*SizeOf(WideChar);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -406,7 +411,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if outlen <> nil then
|
if outlen <> nil then
|
||||||
outlen^:=(wlen - 1) div SizeOf(WideChar);
|
outlen^:=wlen div SizeOf(WideChar);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
|
@ -68,7 +68,7 @@ procedure PWideCharToString(const str: PWideChar; out Result: string; strlen: lo
|
|||||||
var
|
var
|
||||||
len: longint;
|
len: longint;
|
||||||
begin
|
begin
|
||||||
if str^ = #0 then
|
if (strlen < 1) and (str^ = #0) then
|
||||||
Result:=''
|
Result:=''
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -803,8 +803,8 @@ begin
|
|||||||
if s <> '' then
|
if s <> '' then
|
||||||
begin
|
begin
|
||||||
buf:=StringToPWideChar(s, @len);
|
buf:=StringToPWideChar(s, @len);
|
||||||
CharUpperBuff(buf, len);
|
CharUpperBuff(buf, len-1);
|
||||||
PWideCharToString(buf, Result, len);
|
PWideCharToString(buf, Result, len-1);
|
||||||
FreeMem(buf);
|
FreeMem(buf);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -820,8 +820,8 @@ begin
|
|||||||
if s <> '' then
|
if s <> '' then
|
||||||
begin
|
begin
|
||||||
buf:=StringToPWideChar(s, @len);
|
buf:=StringToPWideChar(s, @len);
|
||||||
CharLowerBuff(buf, len);
|
CharLowerBuff(buf, len-1);
|
||||||
PWideCharToString(buf, Result, len);
|
PWideCharToString(buf, Result, len-1);
|
||||||
FreeMem(buf);
|
FreeMem(buf);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -883,7 +883,7 @@ var
|
|||||||
begin
|
begin
|
||||||
ws1:=PCharToPWideChar(S1, MaxLen, @len1);
|
ws1:=PCharToPWideChar(S1, MaxLen, @len1);
|
||||||
ws2:=PCharToPWideChar(S2, MaxLen, @len2);
|
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(ws2);
|
||||||
FreeMem(ws1);
|
FreeMem(ws1);
|
||||||
end;
|
end;
|
||||||
@ -896,7 +896,7 @@ var
|
|||||||
begin
|
begin
|
||||||
ws1:=PCharToPWideChar(S1, MaxLen, @len1);
|
ws1:=PCharToPWideChar(S1, MaxLen, @len1);
|
||||||
ws2:=PCharToPWideChar(S2, MaxLen, @len2);
|
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(ws2);
|
||||||
FreeMem(ws1);
|
FreeMem(ws1);
|
||||||
end;
|
end;
|
||||||
@ -908,10 +908,9 @@ var
|
|||||||
len: longint;
|
len: longint;
|
||||||
begin
|
begin
|
||||||
buf:=PCharToPWideChar(Str, -1, @len);
|
buf:=PCharToPWideChar(Str, -1, @len);
|
||||||
len:=len div SizeOf(WideChar);
|
CharLowerBuff(buf, len - 1);
|
||||||
CharLowerBuff(buf, len);
|
|
||||||
Result:=Str;
|
Result:=Str;
|
||||||
WideToAnsiBuf(buf, -1, Result, len + 1);
|
WideToAnsiBuf(buf, -1, Result, StrLen(Str));
|
||||||
FreeMem(buf);
|
FreeMem(buf);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -922,10 +921,9 @@ var
|
|||||||
len: longint;
|
len: longint;
|
||||||
begin
|
begin
|
||||||
buf:=PCharToPWideChar(Str, -1, @len);
|
buf:=PCharToPWideChar(Str, -1, @len);
|
||||||
len:=len div SizeOf(WideChar);
|
CharUpperBuff(buf, len - 1);
|
||||||
CharUpperBuff(buf, len);
|
|
||||||
Result:=Str;
|
Result:=Str;
|
||||||
WideToAnsiBuf(buf, -1, Result, len + 1);
|
WideToAnsiBuf(buf, -1, Result, StrLen(Str));
|
||||||
FreeMem(buf);
|
FreeMem(buf);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -205,10 +205,10 @@ var
|
|||||||
begin
|
begin
|
||||||
lpwsValueName:=PCharToPWideChar(lpValueName);
|
lpwsValueName:=PCharToPWideChar(lpValueName);
|
||||||
if dwType in [REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ] then begin
|
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);
|
ws:=PCharToPWideChar(lpData, cbData, @sz);
|
||||||
if (cbData > 0) and (PChar(lpData)[cbData - 1] <> #0) then
|
cbData:=sz*SizeOf(WideChar);
|
||||||
Inc(sz, SizeOf(WideChar));
|
|
||||||
cbData:=sz;
|
|
||||||
DataBuf:=ws;
|
DataBuf:=ws;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
|
Loading…
Reference in New Issue
Block a user