fpc/rtl/inc/variant.inc
2002-09-07 15:06:34 +00:00

464 lines
8.1 KiB
PHP

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 2001 by the Free Pascal development team
This include file contains the implementation for variants
support in FPC as far as it is part of the system unit
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
var
variantmanager : tvariantmanager;
procedure invalidvariantop;
begin
HandleErrorFrame(221,get_frame);
end;
procedure vardisperror;
begin
HandleErrorFrame(222,get_frame);
end;
{ ---------------------------------------------------------------------
Compiler helper routines.
---------------------------------------------------------------------}
procedure varclear(var v : tvardata);
begin
if not(v.vtype in [varempty,varerror,varnull]) then
invalidvariantop;
end;
procedure variant_init(var v : variant);[Public,Alias:'FPC_VARIANT_INIT'];
begin
variantmanager.varinit(v);
end;
procedure variant_clear(var v : variant);[Public,Alias:'FPC_VARIANT_CLEAR'];
begin
variantmanager.varclear(v);
end;
{ ---------------------------------------------------------------------
Overloaded operators.
---------------------------------------------------------------------}
{ Integer }
operator :=(const source : byte) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,1);
end;
operator :=(const source : shortint) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,-1);
end;
operator :=(const source : word) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,2);
end;
operator :=(const source : smallint) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,-2);
end;
operator :=(const source : dword) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,4);
end;
operator :=(const source : longint) dest : variant;
begin
// Variant_Init(Dest);
Variantmanager.varfromInt(Dest,Source,-4);
end;
operator :=(const source : qword) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromWord64(Dest,Source);
end;
operator :=(const source : int64) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromInt64(Dest,Source);
end;
{ Boolean }
operator :=(const source : boolean) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromBool(Dest,Source);
end;
operator :=(const source : wordbool) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromBool(Dest,Boolean(Source));
end;
operator :=(const source : longbool) dest : variant;
begin
Variant_Init(Dest);
Variantmanager.varfromBool(Dest,Boolean(Source));
end;
{ Chars }
operator :=(const source : char) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromPStr(Dest,Source);
end;
operator :=(const source : widechar) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromWStr(Dest,Source);
end;
{ Strings }
operator :=(const source : shortstring) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromPStr(Dest,Source);
end;
operator :=(const source : ansistring) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromLStr(Dest,Source);
end;
operator :=(const source : widestring) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromWStr(Dest,Source);
end;
{ Floats }
operator :=(const source : single) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromReal(Dest,Source);
end;
operator :=(const source : double) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromReal(Dest,Source);
end;
operator :=(const source : extended) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromReal(Dest,Source);
end;
Operator :=(const source : comp) dest : variant;
begin
Variant_Init(Dest);
VariantManager.VarFromReal(Dest,Source);
end;
{ Misc. }
{ Fixme!!!
operator :=(const source : currency) dest : variant;
begin
end;
operator :=(const source : tdatetime) dest : variant;
begin
end;
}
{**********************************************************************
from Variant assignments
**********************************************************************}
{ Integer }
operator :=(const source : variant) dest : byte;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : shortint;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : word;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : smallint;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : dword;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : longint;
begin
dest:=variantmanager.vartoint(source);
end;
operator :=(const source : variant) dest : qword;
begin
dest:=variantmanager.vartoword64(source);
end;
operator :=(const source : variant) dest : int64;
begin
dest:=variantmanager.vartoint64(source);
end;
{ Boolean }
operator :=(const source : variant) dest : boolean;
begin
dest:=variantmanager.vartobool(source);
end;
operator :=(const source : variant) dest : wordbool;
begin
dest:=variantmanager.vartobool(source);
end;
operator :=(const source : variant) dest : longbool;
begin
dest:=variantmanager.vartobool(source);
end;
{ Chars }
operator :=(const source : variant) dest : char;
Var
S : String;
begin
VariantManager.VarToPStr(S,Source);
If Length(S)>0 then
Dest:=S[1];
end;
operator :=(const source : variant) dest : widechar;
Var
WS : WideString;
begin
VariantManager.VarToWStr(WS,Source);
If Length(WS)>0 then
Dest:=WS[1];
end;
{ Strings }
operator :=(const source : variant) dest : shortstring;
begin
VariantManager.VarToPStr(Dest,Source);
end;
operator :=(const source : variant) dest : ansistring;
begin
VariantManager.vartolstr(dest,source);
end;
operator :=(const source : variant) dest : widestring;
begin
variantmanager.vartowstr(dest,source);
end;
{ Floats }
operator :=(const source : variant) dest : single;
begin
dest:=variantmanager.vartoreal(source);
end;
operator :=(const source : variant) dest : double;
begin
dest:=variantmanager.vartoreal(source);
end;
operator :=(const source : variant) dest : extended;
begin
dest:=variantmanager.vartoreal(source);
end;
operator :=(const source : variant) dest : comp;
begin
dest:=comp(variantmanager.vartoreal(source));
end;
{ Misc. }
{ FIXME !!!!!!!
operator :=(const source : variant) dest : currency;
begin
dest:=variantmanager.vartocurr(source);
end;
operator :=(const source : variant) dest : tdatetime;
begin
end;
}
{ ---------------------------------------------------------------------
Variant manager functions
---------------------------------------------------------------------}
procedure GetVariantManager(var VarMgr: TVariantManager);
begin
VarMgr:=VariantManager;
end;
procedure SetVariantManager(const VarMgr: TVariantManager);
begin
VariantManager:=VarMgr;
end;
function IsVariantManagerSet: Boolean;
var
i : longint;
begin
I:=0;
Result:=True;
While Result and (I<(sizeof(tvariantmanager) div sizeof(pointer))-1) do
begin
Result:=Pointer(ppointer(@variantmanager+i*sizeof(pointer))^)<>Pointer(@invalidvariantop);
Inc(I);
end;
end;
procedure initvariantmanager;
var
i : longint;
begin
VarDispProc:=@vardisperror;
DispCallByIDProc:=@vardisperror;
for i:=0 to (sizeof(tvariantmanager) div sizeof(pointer))-1 do
ppointer(@variantmanager+i*sizeof(pointer))^:=@invalidvariantop;
pointer(variantmanager.varclear):=@varclear
end;
{
$Log$
Revision 1.5 2002-09-07 15:07:46 peter
* old logs removed and tabs fixed
}