瀏覽代碼

Rebased with trunk to fix inadvertent revisions

Curtis Hamilton 1 周之前
父節點
當前提交
6b17f81e78

+ 1 - 1
packages/fcl-md/src/markdown.parser.pas

@@ -164,7 +164,7 @@ type
     // Helper to quickly parse a stringlist into a markdown document
     class function FastParse(aSource: TStrings; aOptions: TMarkDownOptions): TMarkDownDocument;
     // Helper to quickly parse a stringlist into a markdown document
-    class function FastParseFile(const aFileName : string; aOptions: TMarkDownOptions): TMarkDownDocument;
+    class function FastParseFile(const aFileName : string; aOptions: TMarkDownOptions = []): TMarkDownDocument;
     // State control in lazy continuation .
     property Lazy : Boolean Read FLazy Write FLazy;
     // HTML entities to convert

+ 11 - 5
packages/rtl-objpas/src/inc/variants.pp

@@ -2327,6 +2327,10 @@ begin
       Dest.vType := varOleStr;
       Dest.vOleStr := nil;
       WideString(Pointer(Dest.vOleStr)) := WideString(Pointer(vOleStr));
+    end else if vType = varUString then begin
+      Dest.vType := varUString;
+      Dest.vustring := Nil;
+      UnicodeString(Dest.vustring) := UnicodeString(vustring);
     end else if vType = varAny then begin
       Dest := Source;
       RefAnyProc(Dest);
@@ -2456,6 +2460,11 @@ begin
         varDate:     SysVarFromTDateTime(Variant(aDest), VariantToDate(aSource));
 {$endif}
         varOleStr:   DoVarCastWStr(aDest, aSource);
+        varUString:  begin
+          DoVarClearIfComplex(aDest);
+          aDest.vType := aVarType;
+          UnicodeString(aDest.vustring) := VariantToUnicodeString(aSource);
+        end;
         varBoolean:  SysVarFromBool(Variant(aDest), VariantToBoolean(aSource));
         varShortInt: SysVarFromInt(Variant(aDest), VariantToShortInt(aSource), -1);
         varByte:     SysVarFromInt(Variant(aDest), VariantToByte(aSource), 1);
@@ -2466,13 +2475,10 @@ begin
 
         varDispatch: DoVarCastDispatch(aDest, aSource);
         varUnknown:  DoVarCastInterface(aDest, aSource);
-      else
-        case aVarType of
-          varString: DoVarCastLStr(aDest, aSource);
-          varAny:    VarCastError(vType, varAny);
+        varString:   DoVarCastLStr(aDest, aSource);
+        varAny:      VarCastError(vType, varAny);
         else
           DoVarCastComplex(aDest, aSource, aVarType);
-        end;
       end;
     end;
 

+ 1 - 0
packages/rtl-objpas/src/inc/varutilh.inc

@@ -71,6 +71,7 @@ function VariantToInt64(const VargSrc : TVarData ) : Int64;
 function VariantToQWord(const VargSrc : TVarData ) : Qword;
 function VariantToWideString(const VargSrc : TVarData) : WideString;
 function VariantToAnsiString(const VargSrc : TVarData) : AnsiString;
+function VariantToUnicodeString(const VargSrc : TVarData) : UnicodeString;
 function VariantToShortString(const VargSrc : TVarData) : ShortString;
 
 {$ifdef USE_WINDOWS_OLE_FUNCTIONS}

+ 6 - 0
packages/rtl-objpas/src/inc/varutils.inc

@@ -77,6 +77,8 @@ begin
             ;
           varOleStr:
             WideString(Pointer(VOleStr)):='';
+          varUString:
+            UnicodeString(VUString):='';
           varDispatch,
           varUnknown:
             iinterface(vunknown):=nil;
@@ -115,6 +117,8 @@ begin
             Move(VBytes, VargDest.VBytes, SizeOf(VargDest.VBytes));
           varOleStr:
             CopyAsWideString(VargDest.VOleStr,VOleStr);
+          varUString:
+            UnicodeString(VargDest.vustring):=UnicodeString(vustring);
           varDispatch:
             IUnknown(VargDest.vdispatch):=IUnknown(VargSrc.vdispatch);
           varUnknown:
@@ -156,6 +160,7 @@ begin
       VarQWord    : VargDest.VQWord:=PQWord(VPointer)^;
       varVariant  : Variant(VargDest):=Variant(PVarData(VPointer)^);
       varOleStr   : CopyAsWideString(VargDest.VOleStr,PVarData(VPointer)^.VoleStr);
+      varUString  : UnicodeString(VargDest.vustring):=PUnicodeString(VPointer)^;
       varDispatch,
       varUnknown  : IInterface(VargDest.vUnknown):=IInterface(PInterface(VargSrc.VPointer)^);
       else
@@ -200,6 +205,7 @@ begin
           VarInt64    : VargDest.Vint64:=VariantToInt64(Tmp);
           VarLongWord : VargDest.VLongWord:=VariantToCardinal(Tmp);
           VarQWord    : VargDest.VQWord:=VariantToQword(tmp);
+          varUString  : UnicodeString(VargDest.vustring):=UnicodeString(tmp.vustring);
        else
           Result:=VAR_BADVARTYPE;
        end;

+ 61 - 0
packages/rtl-objpas/tests/tests.rtti.value.pas

@@ -130,6 +130,12 @@ Type
     Procedure TestFromVarRecQWord;
     Procedure TestFromVarRecUnicodeString;
     Procedure TestArrayOfConstToTValue;
+    procedure TestCastAnsiString;
+{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
+    procedure TestCastUnicodeString;
+{$endif}
+    procedure TestCastWideString;
+    procedure TestCastShortString;
   end;
 
   { TMyUNknown }
@@ -719,6 +725,61 @@ begin
   CheckEquals(1.23,S[2].AsDouble,0.01,'Value 3');
 end;
 
+procedure TTestValueVariant.TestCastAnsiString;
+var
+  s: AnsiString;
+  v: Variant;
+  vvar, vstr: TValue;
+begin
+  s := 'Test';
+  v := s;
+  vvar := TValue.{$ifdef fpc}specialize{$endif}From<Variant>(v);
+  CheckTrue(vvar.TryCast(TypeInfo(AnsiString), vstr));
+  CheckEquals(s, vstr.AsAnsiString);
+end;
+
+{$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
+procedure TTestValueVariant.TestCastUnicodeString;
+var
+  u: UnicodeString;
+  v: Variant;
+  vvar, vstr: TValue;
+begin
+  u := 'Test';
+  TVarData(v).vType := varUString;
+  TVarData(v).vuString := Pointer(u);
+  vvar := TValue.{$ifdef fpc}specialize{$endif}From<Variant>(v);
+  CheckTrue(vvar.TryCast(TypeInfo(UnicodeString), vstr));
+  CheckEquals(u, vstr.AsUnicodeString);
+end;
+{$endif}
+
+procedure TTestValueVariant.TestCastWideString;
+var
+  w: WideString;
+  v: Variant;
+  vvar, vstr: TValue;
+begin
+  w := 'Test';
+  v := w;
+  vvar := TValue.{$ifdef fpc}specialize{$endif}From<Variant>(v);
+  CheckTrue(vvar.TryCast(TypeInfo(WideString), vstr));
+  CheckEquals(w, vstr.AsUnicodeString);
+end;
+
+procedure TTestValueVariant.TestCastShortString;
+var
+  s: ShortString;
+  v: Variant;
+  vvar, vstr: TValue;
+begin
+  s := 'Test';
+  v := s;
+  vvar := TValue.{$ifdef fpc}specialize{$endif}From<Variant>(v);
+  CheckTrue(vvar.TryCast(TypeInfo(ShortString), vstr));
+  CheckEquals(s, vstr.AsAnsiString);
+end;
+
 { TMyUNknown }
 
 function TMyUNknown.GetTypeInfoCount(out count: longint): HResult; stdcall;