mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-20 11:09:23 +02:00
* ucnv_open() must be called with some SSE exception masked on x86_64-android.
* Call u_init() during initialization. git-svn-id: trunk@39980 -
This commit is contained in:
parent
add131f030
commit
d021c8c699
@ -52,6 +52,7 @@ var
|
|||||||
u_strCaseCompare: function (s1: PUnicodeChar; length1: int32_t; s2: PUnicodeChar; length2: int32_t; options: uint32_t; var pErrorCode: UErrorCode): int32_t; cdecl;
|
u_strCaseCompare: function (s1: PUnicodeChar; length1: int32_t; s2: PUnicodeChar; length2: int32_t; options: uint32_t; var pErrorCode: UErrorCode): int32_t; cdecl;
|
||||||
u_getDataDirectory: function(): PAnsiChar; cdecl;
|
u_getDataDirectory: function(): PAnsiChar; cdecl;
|
||||||
u_setDataDirectory: procedure(directory: PAnsiChar); cdecl;
|
u_setDataDirectory: procedure(directory: PAnsiChar); cdecl;
|
||||||
|
u_init: procedure(var status: UErrorCode); cdecl;
|
||||||
|
|
||||||
ucol_open: function(loc: PAnsiChar; var status: UErrorCode): PUCollator; cdecl;
|
ucol_open: function(loc: PAnsiChar; var status: UErrorCode): PUCollator; cdecl;
|
||||||
ucol_close: procedure (coll: PUCollator); cdecl;
|
ucol_close: procedure (coll: PUCollator); cdecl;
|
||||||
@ -64,16 +65,37 @@ threadvar
|
|||||||
LastCP: TSystemCodePage;
|
LastCP: TSystemCodePage;
|
||||||
DefColl: PUCollator;
|
DefColl: PUCollator;
|
||||||
|
|
||||||
|
function MaskExceptions: dword;
|
||||||
|
begin
|
||||||
|
{$ifdef cpux86_64}
|
||||||
|
Result:=GetMXCSR;
|
||||||
|
SetMXCSR(Result or %0000000010000000 {MM_MaskInvalidOp} or %0001000000000000 {MM_MaskPrecision});
|
||||||
|
{$else}
|
||||||
|
Result:=0;
|
||||||
|
{$endif cpux86_64}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure UnmaskExceptions(oldmask: dword);
|
||||||
|
begin
|
||||||
|
{$ifdef cpux86_64}
|
||||||
|
SetMXCSR(oldmask);
|
||||||
|
{$endif cpux86_64}
|
||||||
|
end;
|
||||||
|
|
||||||
function OpenConverter(const name: ansistring): PUConverter;
|
function OpenConverter(const name: ansistring): PUConverter;
|
||||||
var
|
var
|
||||||
err: UErrorCode;
|
err: UErrorCode;
|
||||||
|
oldmask: dword;
|
||||||
begin
|
begin
|
||||||
|
{ ucnv_open() must be called with some SSE exception masked on x86_64-android. }
|
||||||
|
oldmask:=MaskExceptions;
|
||||||
err:=0;
|
err:=0;
|
||||||
Result:=ucnv_open(PAnsiChar(name), err);
|
Result:=ucnv_open(PAnsiChar(name), err);
|
||||||
if Result <> nil then begin
|
if Result <> nil then begin
|
||||||
ucnv_setSubstChars(Result, '?', 1, err);
|
ucnv_setSubstChars(Result, '?', 1, err);
|
||||||
ucnv_setFallback(Result, True);
|
ucnv_setFallback(Result, True);
|
||||||
end;
|
end;
|
||||||
|
UnmaskExceptions(oldmask);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure InitThreadData;
|
procedure InitThreadData;
|
||||||
@ -504,6 +526,7 @@ var
|
|||||||
i: longint;
|
i: longint;
|
||||||
s: ansistring;
|
s: ansistring;
|
||||||
dir: PAnsiChar;
|
dir: PAnsiChar;
|
||||||
|
err: UErrorCode;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
{$ifdef android}
|
{$ifdef android}
|
||||||
@ -563,6 +586,7 @@ begin
|
|||||||
if not GetIcuProc('u_strCaseCompare', u_strCaseCompare) then exit;
|
if not GetIcuProc('u_strCaseCompare', u_strCaseCompare) then exit;
|
||||||
if not GetIcuProc('u_getDataDirectory', u_getDataDirectory) then exit;
|
if not GetIcuProc('u_getDataDirectory', u_getDataDirectory) then exit;
|
||||||
if not GetIcuProc('u_setDataDirectory', u_setDataDirectory) then exit;
|
if not GetIcuProc('u_setDataDirectory', u_setDataDirectory) then exit;
|
||||||
|
if not GetIcuProc('u_init', u_init) then exit;
|
||||||
|
|
||||||
if not GetIcuProc('ucol_open', ucol_open, 1) then exit;
|
if not GetIcuProc('ucol_open', ucol_open, 1) then exit;
|
||||||
if not GetIcuProc('ucol_close', ucol_close, 1) then exit;
|
if not GetIcuProc('ucol_close', ucol_close, 1) then exit;
|
||||||
@ -574,6 +598,9 @@ begin
|
|||||||
if (dir = nil) or (dir^ = #0) then
|
if (dir = nil) or (dir^ = #0) then
|
||||||
u_setDataDirectory('/system/usr/icu');
|
u_setDataDirectory('/system/usr/icu');
|
||||||
|
|
||||||
|
err:=0;
|
||||||
|
u_init(err);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user