From d38340c75399c3d8292d450b874718ace5d52bc3 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 26 Jul 2009 12:58:49 +0000 Subject: [PATCH] + utf-8 <-> variant type casts, resolves #11371 * ucs-4 -> variant type cast (variant -> ucs-4 is not possible due to overloading contraints of fpc and how ucs-4 is implemented) * some newlines fixed git-svn-id: trunk@13451 - --- .gitattributes | 1 + rtl/inc/variant.inc | 42 ++++++++++++++++++++++++++++++----------- rtl/inc/varianth.inc | 4 ++++ tests/webtbs/tw11371.pp | 26 +++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 tests/webtbs/tw11371.pp diff --git a/.gitattributes b/.gitattributes index 40622a12e5..aed05db0c5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9060,6 +9060,7 @@ tests/webtbs/tw1133.pp svneol=native#text/plain tests/webtbs/tw11349.pp svneol=native#text/plain tests/webtbs/tw11354.pp svneol=native#text/plain tests/webtbs/tw11369.pp svneol=native#text/plain +tests/webtbs/tw11371.pp svneol=native#text/plain tests/webtbs/tw11372.pp svneol=native#text/plain tests/webtbs/tw11392.pp svneol=native#text/plain tests/webtbs/tw11431.pp svneol=native#text/plain diff --git a/rtl/inc/variant.inc b/rtl/inc/variant.inc index dc22186b23..2a72a4136c 100644 --- a/rtl/inc/variant.inc +++ b/rtl/inc/variant.inc @@ -194,14 +194,12 @@ end; operator :=(const source : wordbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} - begin Variantmanager.varfromBool(Dest,Boolean(Source)); end; operator :=(const source : longbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} - begin Variantmanager.varfromBool(Dest,Boolean(Source)); end; @@ -210,14 +208,12 @@ end; { Chars } operator :=(const source : char) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} - begin VariantManager.VarFromPStr(Dest,Source); end; operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} - begin Variantmanager.varfromInt(Dest,word(Source),2); end; @@ -242,6 +238,18 @@ begin end; +operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} +begin + VariantManager.VarFromWStr(Dest,UTF8Encode(Source)); +end; + + +operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} +begin + VariantManager.VarFromWStr(Dest,UCS4StringToWideString(Source)); +end; + + {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING} operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} begin @@ -357,14 +365,12 @@ operator :=(const source : variant) dest : longint;{$ifdef SYSTEMINLINE}inline;{ operator :=(const source : variant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif} - begin dest:=variantmanager.vartoword64(source); end; operator :=(const source : variant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif} - begin dest:=variantmanager.vartoint64(source); end; @@ -380,14 +386,12 @@ end; operator :=(const source : variant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif} - begin dest:=variantmanager.vartobool(source); end; operator :=(const source : variant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif} - begin dest:=variantmanager.vartobool(source); end; @@ -396,10 +400,8 @@ end; { Chars } operator :=(const source : variant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif} - Var S : String; - begin VariantManager.VarToPStr(S,Source); If Length(S)>0 then @@ -408,7 +410,6 @@ end; operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif} - begin dest:=widechar(variantmanager.vartoint(source)); end; @@ -434,6 +435,25 @@ begin end; +operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif} +var + temp : Widestring; +begin + VariantManager.VarToWStr(temp,Source); + dest:=UTF8Encode(temp); +end; + + +{$ifdef dummy} +operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif} +var + temp : Widestring; +begin + VariantManager.VarToWStr(temp,Source); + dest:=WideStringToUCS4String(temp); +end; +{$endif dummy} + {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING} operator :=(const source : variant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif} var diff --git a/rtl/inc/varianth.inc b/rtl/inc/varianth.inc index 9b309c88c3..2e2cd4d65a 100644 --- a/rtl/inc/varianth.inc +++ b/rtl/inc/varianth.inc @@ -243,6 +243,8 @@ operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline; operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} +operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} +operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING} operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif} {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING} @@ -300,6 +302,8 @@ operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline; operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif} operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif} +operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif} +// operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif} {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING} operator :=(const source : variant) dest : unicodestring;{$ifdef SYSTEMINLINE}inline;{$endif} {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING} diff --git a/tests/webtbs/tw11371.pp b/tests/webtbs/tw11371.pp new file mode 100644 index 0000000000..f15e274fda --- /dev/null +++ b/tests/webtbs/tw11371.pp @@ -0,0 +1,26 @@ +program tw11371; + +{$mode delphi}{$H+} + +uses + Variants; + +procedure Test1(const s: string); +begin + // nothing +end; + +procedure Test2(const s: UTF8String); +begin + // nothing +end; + +var + V: Variant; + +begin + V := 'Test'; + Test1(V); + Test2(V); +end. +