|
@@ -102,6 +102,8 @@ function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'libico
|
|
|
{$endif}
|
|
|
|
|
|
var
|
|
|
+ iconv_ansi2ucs4,
|
|
|
+ iconv_ucs42ansi,
|
|
|
iconv_ansi2wide,
|
|
|
iconv_wide2ansi : iconv_t;
|
|
|
|
|
@@ -219,13 +221,60 @@ function UpperWideString(const s : WideString) : WideString;
|
|
|
end;
|
|
|
|
|
|
|
|
|
+procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt);
|
|
|
+ var
|
|
|
+ outlength,
|
|
|
+ outoffset,
|
|
|
+ outleft : size_t;
|
|
|
+ srcpos,
|
|
|
+ destpos: pchar;
|
|
|
+ mynil : pchar;
|
|
|
+ my0 : size_t;
|
|
|
+ begin
|
|
|
+ mynil:=nil;
|
|
|
+ my0:=0;
|
|
|
+ // extra space
|
|
|
+ outlength:=len+1;
|
|
|
+ setlength(dest,outlength);
|
|
|
+ outlength:=len+1;
|
|
|
+ srcpos:=source;
|
|
|
+ destpos:=pchar(dest);
|
|
|
+ outleft:=outlength*4;
|
|
|
+ while iconv(iconv_ansi2ucs4,@srcpos,@len,@destpos,@outleft)=size_t(-1) do
|
|
|
+ begin
|
|
|
+ case fpgetCerrno of
|
|
|
+ ESysE2BIG:
|
|
|
+ begin
|
|
|
+ outoffset:=destpos-pchar(dest);
|
|
|
+ { extend }
|
|
|
+ setlength(dest,outlength+len);
|
|
|
+ inc(outleft,len*4);
|
|
|
+ inc(outlength,len);
|
|
|
+ { string could have been moved }
|
|
|
+ destpos:=pchar(dest)+outoffset;
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ raise EConvertError.Create('iconv error');
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ // truncate string
|
|
|
+ setlength(dest,length(dest)-outleft div 4);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
function CompareWideString(const s1, s2 : WideString) : PtrInt;
|
|
|
+ var
|
|
|
+ hs1,hs2 : UCS4String;
|
|
|
begin
|
|
|
+ hs1:=WideStringToUCS4String(s1);
|
|
|
+ hs2:=WideStringToUCS4String(s2);
|
|
|
+ result:=wcscoll(pwchar_t(hs1),pwchar_t(hs2));
|
|
|
end;
|
|
|
|
|
|
|
|
|
function CompareTextWideString(const s1, s2 : WideString): PtrInt;
|
|
|
begin
|
|
|
+ result:=CompareWideString(UpperWideString(s1),UpperWideString(s2));
|
|
|
end;
|
|
|
|
|
|
|
|
@@ -247,9 +296,10 @@ begin
|
|
|
|
|
|
UpperWideStringProc:=@UpperWideString;
|
|
|
LowerWideStringProc:=@LowerWideString;
|
|
|
+
|
|
|
+ CompareWideStringProc:=@CompareWideString;
|
|
|
+ CompareTextWideStringProc:=@CompareTextWideString;
|
|
|
{
|
|
|
- CompareWideStringProc
|
|
|
- CompareTextWideStringProc
|
|
|
CharLengthPCharProc
|
|
|
|
|
|
UpperAnsiStringProc
|
|
@@ -275,6 +325,8 @@ initialization
|
|
|
{ init conversion tables }
|
|
|
iconv_wide2ansi:=iconv_open(nl_langinfo(CODESET),unicode_encoding);
|
|
|
iconv_ansi2wide:=iconv_open(unicode_encoding,nl_langinfo(CODESET));
|
|
|
+ iconv_ucs42ansi:=iconv_open(nl_langinfo(CODESET),'UCS4');
|
|
|
+ iconv_ansi2ucs4:=iconv_open('UCS4',nl_langinfo(CODESET));
|
|
|
finalization
|
|
|
iconv_close(iconv_ansi2wide);
|
|
|
end.
|