variant.inc 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2001 by the Free Pascal development team
  4. This include file contains the implementation for variants
  5. support in FPC as far as it is part of the system unit
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. var
  13. variantmanager : tvariantmanager;
  14. { ---------------------------------------------------------------------
  15. Compiler helper routines.
  16. ---------------------------------------------------------------------}
  17. procedure fpc_variant_init(var v : tvardata);[Public,Alias:'FPC_VARIANT_INIT'];compilerproc;
  18. begin
  19. { calling the variant manager here is a problem because the static/global variants
  20. are initialized while the variant manager isn't assigned }
  21. fillchar(v,sizeof(variant),0);
  22. end;
  23. procedure fpc_variant_clear(var v : tvardata);[Public,Alias:'FPC_VARIANT_CLEAR'];compilerproc;
  24. begin
  25. if assigned(VarClearProc) then
  26. VarClearProc(v);
  27. end;
  28. { declare aliases for local use }
  29. procedure variant_init(var v: tvardata); external name 'FPC_VARIANT_INIT';
  30. procedure variant_clear(var v: tvardata); external name 'FPC_VARIANT_CLEAR';
  31. procedure variant_addref(var v : tvardata);[Public,Alias:'FPC_VARIANT_ADDREF'];
  32. begin
  33. if assigned(VarAddRefProc) then
  34. VarAddRefProc(v);
  35. end;
  36. { using pointers as argument here makes life for the compiler easier }
  37. procedure fpc_variant_copy(d,s : pointer);[Public,Alias:'FPC_VARIANT_COPY']; compilerproc;
  38. begin
  39. if assigned(VarCopyProc) then
  40. VarCopyProc(tvardata(d^),tvardata(s^));
  41. end;
  42. { using pointers as argument here makes life for the compiler easier, overwrites target without finalizing }
  43. procedure fpc_variant_copy_overwrite(source, dest : pointer);[Public,Alias:'FPC_VARIANT_COPY_OVERWRITE']; compilerproc;
  44. begin
  45. tvardata(dest^).VType := varEmpty;
  46. if assigned(VarCopyProc) then
  47. VarCopyProc(tvardata(dest^),tvardata(source^));
  48. end;
  49. Procedure fpc_write_text_variant(Len : Longint;var f : Text;const v : variant); iocheck; [Public,Alias:'FPC_WRITE_TEXT_VARIANT']; compilerproc;
  50. begin
  51. if (InOutRes<>0) then
  52. exit;
  53. case TextRec(f).mode of
  54. { fmAppend gets changed to fmOutPut in do_open (JM) }
  55. fmOutput:
  56. if len=-1 then
  57. variantmanager.write0variant(f,v)
  58. else
  59. variantmanager.writevariant(f,v,len);
  60. fmInput:
  61. InOutRes:=105
  62. else InOutRes:=103;
  63. end;
  64. end;
  65. procedure fpc_vararray_get(var d : variant;const s : variant;indices : plongint;len : sizeint);compilerproc;
  66. begin
  67. d:=variantmanager.vararrayget(s,len,indices);
  68. end;
  69. procedure fpc_vararray_put(var d : variant;const s : variant;indices : plongint;len : sizeint);compilerproc;
  70. begin
  71. variantmanager.vararrayput(d,s,len,indices);
  72. end;
  73. function fpc_variant_to_dynarray(const v : variant;typeinfo : pointer) : pointer;compilerproc;
  74. begin
  75. result:=nil;
  76. variantmanager.vartodynarray(result,v,typeinfo);
  77. end;
  78. function fpc_dynarray_to_variant(dynarr : pointer;typeinfo : pointer) : variant;compilerproc;
  79. begin
  80. variantmanager.varfromdynarray(result,dynarr,typeinfo);
  81. end;
  82. function fpc_variant_to_interface(const v : variant) : iinterface;compilerproc;
  83. begin
  84. variantmanager.vartointf(result,v);
  85. end;
  86. function fpc_interface_to_variant(const i : iinterface) : variant;compilerproc;
  87. begin
  88. variantmanager.varfromintf(result,i);
  89. end;
  90. function fpc_variant_to_idispatch(const v : variant) : idispatch;compilerproc;
  91. begin
  92. variantmanager.vartodisp(result,v);
  93. end;
  94. function fpc_idispatch_to_variant(const i : idispatch) : variant;compilerproc;
  95. begin
  96. variantmanager.varfromdisp(result,i);
  97. end;
  98. procedure fpc_dispinvoke_variant(dest : pvardata;const source : tvardata;
  99. calldesc : pcalldesc;params : pointer); compilerproc;
  100. begin
  101. variantmanager.dispinvoke(dest,source,calldesc,params);
  102. end;
  103. { ---------------------------------------------------------------------
  104. Overloaded operators.
  105. ---------------------------------------------------------------------}
  106. { Integer }
  107. operator :=(const source : byte) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  108. begin
  109. Variantmanager.varfromInt(Dest,Source,1);
  110. end;
  111. operator :=(const source : shortint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  112. begin
  113. Variantmanager.varfromInt(Dest,Source,-1);
  114. end;
  115. operator :=(const source : word) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  116. begin
  117. Variantmanager.varfromInt(Dest,Source,2);
  118. end;
  119. operator :=(const source : smallint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  120. begin
  121. Variantmanager.varfromInt(Dest,Source,-2);
  122. end;
  123. operator :=(const source : dword) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  124. begin
  125. Variantmanager.varfromInt(Dest,Source,4);
  126. end;
  127. operator :=(const source : longint) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  128. begin
  129. Variantmanager.varfromInt(Dest,Source,-4);
  130. end;
  131. operator :=(const source : qword) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  132. begin
  133. Variantmanager.varfromWord64(Dest,Source);
  134. end;
  135. operator :=(const source : int64) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  136. begin
  137. Variantmanager.varfromInt64(Dest,Source);
  138. end;
  139. { Boolean }
  140. operator :=(const source : boolean) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  141. begin
  142. Variantmanager.varfromBool(Dest,Source);
  143. end;
  144. operator :=(const source : wordbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  145. begin
  146. Variantmanager.varfromBool(Dest,Boolean(Source));
  147. end;
  148. operator :=(const source : longbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  149. begin
  150. Variantmanager.varfromBool(Dest,Boolean(Source));
  151. end;
  152. { Chars }
  153. operator :=(const source : char) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  154. begin
  155. VariantManager.VarFromPStr(Dest,Source);
  156. end;
  157. operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  158. begin
  159. Variantmanager.varfromInt(Dest,word(Source),2);
  160. end;
  161. { Strings }
  162. operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  163. begin
  164. VariantManager.VarFromPStr(Dest,Source);
  165. end;
  166. operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  167. begin
  168. VariantManager.VarFromLStr(Dest,Source);
  169. end;
  170. operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  171. begin
  172. VariantManager.VarFromWStr(Dest,Source);
  173. end;
  174. operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  175. begin
  176. VariantManager.VarFromWStr(Dest,UTF8Decode(Source));
  177. end;
  178. operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  179. begin
  180. VariantManager.VarFromWStr(Dest,UCS4StringToWideString(Source));
  181. end;
  182. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  183. operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  184. begin
  185. VariantManager.VarFromWStr(Dest,Source);
  186. end;
  187. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  188. { Floats }
  189. {$ifdef SUPPORT_SINGLE}
  190. operator :=(const source : single) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  191. begin
  192. VariantManager.VarFromReal(Dest,Source);
  193. end;
  194. {$endif SUPPORT_SINGLE}
  195. {$ifdef SUPPORT_DOUBLE}
  196. operator :=(const source : double) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  197. begin
  198. VariantManager.VarFromReal(Dest,Source);
  199. end;
  200. {$endif SUPPORT_DOUBLE}
  201. {$ifdef SUPPORT_EXTENDED}
  202. operator :=(const source : extended) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  203. begin
  204. VariantManager.VarFromReal(Dest,Source);
  205. end;
  206. {$endif SUPPORT_EXTENDED}
  207. {$ifdef SUPPORT_COMP}
  208. Operator :=(const source : comp) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  209. begin
  210. VariantManager.VarFromReal(Dest,Source);
  211. end;
  212. {$endif SUPPORT_COMP}
  213. {$ifndef FPUNONE}
  214. Operator :=(const source : real) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  215. begin
  216. VariantManager.VarFromReal(Dest,Source);
  217. end;
  218. {$endif}
  219. { Misc. }
  220. operator :=(const source : currency) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  221. begin
  222. VariantManager.VarFromCurr(Dest,Source);
  223. end;
  224. {$ifndef FPUNONE}
  225. operator :=(const source : tdatetime) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  226. begin
  227. VariantManager.VarFromTDateTime(Dest,Source);
  228. end;
  229. {$endif}
  230. operator :=(const source : terror) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  231. begin
  232. Variantmanager.varfromInt(Dest,Source,-sizeof(terror));
  233. end;
  234. {**********************************************************************
  235. from Variant assignments
  236. **********************************************************************}
  237. { Integer }
  238. operator :=(const source : variant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  239. begin
  240. dest:=variantmanager.vartoint(source);
  241. end;
  242. operator :=(const source : variant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  243. begin
  244. dest:=variantmanager.vartoint(source);
  245. end;
  246. operator :=(const source : variant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  247. begin
  248. dest:=variantmanager.vartoint(source);
  249. end;
  250. operator :=(const source : variant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  251. begin
  252. dest:=variantmanager.vartoint(source);
  253. end;
  254. operator :=(const source : variant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  255. begin
  256. dest:=variantmanager.vartoint(source);
  257. end;
  258. operator :=(const source : variant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  259. begin
  260. dest:=variantmanager.vartoint(source);
  261. end;
  262. operator :=(const source : variant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  263. begin
  264. dest:=variantmanager.vartoword64(source);
  265. end;
  266. operator :=(const source : variant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  267. begin
  268. dest:=variantmanager.vartoint64(source);
  269. end;
  270. { Boolean }
  271. operator :=(const source : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  272. begin
  273. dest:=variantmanager.vartobool(source);
  274. end;
  275. operator :=(const source : variant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  276. begin
  277. dest:=variantmanager.vartobool(source);
  278. end;
  279. operator :=(const source : variant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  280. begin
  281. dest:=variantmanager.vartobool(source);
  282. end;
  283. { Chars }
  284. operator :=(const source : variant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  285. Var
  286. S : String;
  287. begin
  288. VariantManager.VarToPStr(S,Source);
  289. If Length(S)>0 then
  290. Dest:=S[1];
  291. end;
  292. operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  293. begin
  294. dest:=widechar(variantmanager.vartoint(source));
  295. end;
  296. { Strings }
  297. operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  298. begin
  299. VariantManager.VarToPStr(Dest,Source);
  300. end;
  301. operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  302. begin
  303. VariantManager.vartolstr(dest,source);
  304. end;
  305. operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  306. begin
  307. variantmanager.vartowstr(dest,source);
  308. end;
  309. operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
  310. var
  311. temp : Widestring;
  312. begin
  313. VariantManager.VarToWStr(temp,Source);
  314. dest:=UTF8Encode(temp);
  315. end;
  316. {$ifdef dummy}
  317. operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif}
  318. var
  319. temp : Widestring;
  320. begin
  321. VariantManager.VarToWStr(temp,Source);
  322. dest:=WideStringToUCS4String(temp);
  323. end;
  324. {$endif dummy}
  325. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  326. operator :=(const source : variant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
  327. var
  328. res : WideString;
  329. begin
  330. variantmanager.vartowstr(res,source);
  331. dest:=res;
  332. end;
  333. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  334. { Floats }
  335. {$ifdef SUPPORT_SINGLE}
  336. operator :=(const source : variant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  337. begin
  338. dest:=variantmanager.vartoreal(source);
  339. end;
  340. {$endif SUPPORT_SINGLE}
  341. {$ifdef SUPPORT_DOUBLE}
  342. operator :=(const source : variant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  343. begin
  344. dest:=variantmanager.vartoreal(source);
  345. end;
  346. {$endif SUPPORT_DOUBLE}
  347. {$ifdef SUPPORT_EXTENDED}
  348. operator :=(const source : variant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  349. begin
  350. dest:=variantmanager.vartoreal(source);
  351. end;
  352. {$endif SUPPORT_EXTENDED}
  353. {$ifdef SUPPORT_COMP}
  354. operator :=(const source : variant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  355. begin
  356. dest:=comp(variantmanager.vartoreal(source));
  357. end;
  358. {$endif SUPPORT_COMP}
  359. {$ifndef FPUNONE}
  360. operator :=(const source : variant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  361. begin
  362. dest:=variantmanager.vartoreal(source);
  363. end;
  364. {$endif}
  365. { Misc. }
  366. operator :=(const source : variant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  367. begin
  368. dest:=variantmanager.vartocurr(source);
  369. end;
  370. {$ifndef FPUNONE}
  371. operator :=(const source : variant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  372. begin
  373. dest:=variantmanager.vartotdatetime(source);
  374. end;
  375. {$endif}
  376. {$ifndef FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  377. operator :=(const source : olevariant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  378. begin
  379. tvardata(result):=tvardata(source);
  380. end;
  381. {$endif FPC_HASINTERNALOLEVARIANT2VARIANTCAST}
  382. operator :=(const source : variant) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  383. begin
  384. variantmanager.olevarfromvar(dest,source);
  385. end;
  386. operator :=(const source : variant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  387. begin
  388. dest:=variantmanager.vartoint(source);
  389. end;
  390. {**********************************************************************
  391. Operators
  392. **********************************************************************}
  393. operator or(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  394. begin
  395. dest:=op1;
  396. variantmanager.varop(dest,op2,opor);
  397. end;
  398. operator and(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  399. begin
  400. dest:=op1;
  401. variantmanager.varop(dest,op2,opand);
  402. end;
  403. operator xor(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  404. begin
  405. dest:=op1;
  406. variantmanager.varop(dest,op2,opxor);
  407. end;
  408. operator not(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  409. begin
  410. dest:=op;
  411. variantmanager.varnot(dest);
  412. end;
  413. operator shl(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  414. begin
  415. dest:=op1;
  416. variantmanager.varop(dest,op2,opshiftleft);
  417. end;
  418. operator shr(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  419. begin
  420. dest:=op1;
  421. variantmanager.varop(dest,op2,opshiftright);
  422. end;
  423. operator +(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  424. begin
  425. dest:=op1;
  426. variantmanager.varop(dest,op2,opadd);
  427. end;
  428. operator -(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  429. begin
  430. dest:=op1;
  431. variantmanager.varop(dest,op2,opsubtract);
  432. end;
  433. operator *(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  434. begin
  435. dest:=op1;
  436. variantmanager.varop(dest,op2,opmultiply);
  437. end;
  438. operator /(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  439. begin
  440. dest:=op1;
  441. variantmanager.varop(dest,op2,opdivide);
  442. end;
  443. operator **(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  444. begin
  445. dest:=op1;
  446. variantmanager.varop(dest,op2,oppower);
  447. end;
  448. operator div(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  449. begin
  450. dest:=op1;
  451. variantmanager.varop(dest,op2,opintdivide);
  452. end;
  453. operator mod(const op1,op2 : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  454. begin
  455. dest:=op1;
  456. variantmanager.varop(dest,op2,opmodulus);
  457. end;
  458. operator -(const op : variant) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
  459. begin
  460. dest:=op;
  461. variantmanager.varneg(dest);
  462. end;
  463. operator =(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  464. begin
  465. dest:=variantmanager.cmpop(op1,op2,opcmpeq);
  466. end;
  467. operator <(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  468. begin
  469. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  470. end;
  471. operator >(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  472. begin
  473. dest:=variantmanager.cmpop(op1,op2,opcmpgt);
  474. end;
  475. operator >=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  476. begin
  477. dest:=variantmanager.cmpop(op1,op2,opcmpge);
  478. end;
  479. operator <=(const op1,op2 : variant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  480. begin
  481. dest:=variantmanager.cmpop(op1,op2,opcmple);
  482. end;
  483. procedure VarArrayRedim(var A: Variant; HighBound: SizeInt);
  484. begin
  485. variantmanager.vararrayredim(a,highbound);
  486. end;
  487. procedure VarArrayPut(var A: Variant; const Value: Variant; const Indices: array of Longint);
  488. begin
  489. if Length(Indices)>0 then
  490. variantmanager.vararrayput(A, Value, Length(Indices), @Indices[0])
  491. else
  492. variantmanager.vararrayput(A, Value, 0, nil);
  493. end;
  494. function VarArrayGet(const A: Variant; const Indices: array of Longint): Variant;
  495. begin
  496. if Length(Indices)>0 then
  497. Result:=variantmanager.vararrayget(A, Length(Indices), @Indices[0])
  498. else
  499. Result:=variantmanager.vararrayget(A, 0, nil);
  500. end;
  501. procedure VarCast(var dest : variant;const source : variant;vartype : longint);
  502. begin
  503. variantmanager.varcast(dest,source,vartype);
  504. end;
  505. {**********************************************************************
  506. from OLEVariant assignments
  507. **********************************************************************}
  508. { Integer }
  509. operator :=(const source : olevariant) dest : byte;{$ifdef SYSTEMINLINE}inline;{$endif}
  510. begin
  511. { cast away olevar to var conversion and avoid
  512. endless recursion }
  513. dest:=variantmanager.vartoint(variant(tvardata(source)));
  514. end;
  515. operator :=(const source : olevariant) dest : shortint;{$ifdef SYSTEMINLINE}inline;{$endif}
  516. begin
  517. dest:=variantmanager.vartoint(variant(tvardata(source)));
  518. end;
  519. operator :=(const source : olevariant) dest : word;{$ifdef SYSTEMINLINE}inline;{$endif}
  520. begin
  521. dest:=variantmanager.vartoint(variant(tvardata(source)));
  522. end;
  523. operator :=(const source : olevariant) dest : smallint;{$ifdef SYSTEMINLINE}inline;{$endif}
  524. begin
  525. dest:=variantmanager.vartoint(variant(tvardata(source)));
  526. end;
  527. operator :=(const source : olevariant) dest : dword;{$ifdef SYSTEMINLINE}inline;{$endif}
  528. begin
  529. dest:=variantmanager.vartoint(variant(tvardata(source)));
  530. end;
  531. operator :=(const source : olevariant) dest : longint;{$ifdef SYSTEMINLINE}inline;{$endif}
  532. begin
  533. dest:=variantmanager.vartoint(variant(tvardata(source)));
  534. end;
  535. operator :=(const source : olevariant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
  536. begin
  537. dest:=variantmanager.vartoint64(variant(tvardata(source)));
  538. end;
  539. operator :=(const source : olevariant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
  540. begin
  541. dest:=variantmanager.vartoword64(variant(tvardata(source)));
  542. end;
  543. { Boolean }
  544. operator :=(const source : olevariant) dest : boolean;{$ifdef SYSTEMINLINE}inline;{$endif}
  545. begin
  546. dest:=variantmanager.vartobool(variant(tvardata(source)));
  547. end;
  548. operator :=(const source : olevariant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  549. begin
  550. dest:=variantmanager.vartobool(variant(tvardata(source)));
  551. end;
  552. operator :=(const source : olevariant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
  553. begin
  554. dest:=variantmanager.vartobool(variant(tvardata(source)));
  555. end;
  556. { Chars }
  557. operator :=(const source : olevariant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
  558. var
  559. S : String;
  560. begin
  561. VariantManager.VarToPStr(S,Source);
  562. If Length(S)>0 then
  563. Dest:=S[1]
  564. else
  565. Dest:=#0;
  566. end;
  567. operator :=(const source : olevariant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
  568. Var
  569. WS : WideString;
  570. begin
  571. VariantManager.VarToWStr(WS,Source);
  572. If Length(WS)>0 then
  573. Dest:=WS[1]
  574. else
  575. Dest:=#0;
  576. end;
  577. { Strings }
  578. operator :=(const source : olevariant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
  579. begin
  580. variantmanager.vartopstr(dest,variant(tvardata(source)));
  581. end;
  582. operator :=(const source : olevariant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
  583. begin
  584. variantmanager.vartolstr(dest,variant(tvardata(source)));
  585. end;
  586. operator :=(const source : olevariant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
  587. begin
  588. variantmanager.vartowstr(dest,variant(tvardata(source)));
  589. end;
  590. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  591. operator :=(const source : olevariant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
  592. var
  593. res : WideString;
  594. begin
  595. variantmanager.vartowstr(res,variant(tvardata(source)));
  596. dest:=res;
  597. end;
  598. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  599. { Floats }
  600. {$ifdef SUPPORT_SINGLE}
  601. operator :=(const source : olevariant) dest : single;{$ifdef SYSTEMINLINE}inline;{$endif}
  602. begin
  603. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  604. end;
  605. {$endif SUPPORT_SINGLE}
  606. {$ifdef SUPPORT_DOUBLE}
  607. operator :=(const source : olevariant) dest : double;{$ifdef SYSTEMINLINE}inline;{$endif}
  608. begin
  609. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  610. end;
  611. {$endif SUPPORT_DOUBLE}
  612. {$ifdef SUPPORT_EXTENDED}
  613. operator :=(const source : olevariant) dest : extended;{$ifdef SYSTEMINLINE}inline;{$endif}
  614. begin
  615. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  616. end;
  617. {$endif SUPPORT_EXTENDED}
  618. {$ifdef SUPPORT_COMP}
  619. operator :=(const source : olevariant) dest : comp;{$ifdef SYSTEMINLINE}inline;{$endif}
  620. begin
  621. {$ifdef FPUNONE}
  622. dest:=comp(variantmanager.vartoint64(variant(tvardata(source))));
  623. {$else}
  624. dest:=comp(variantmanager.vartoreal(variant(tvardata(source))));
  625. {$endif}
  626. end;
  627. {$endif SUPPORT_COMP}
  628. {$ifndef FPUNONE}
  629. operator :=(const source : olevariant) dest : real;{$ifdef SYSTEMINLINE}inline;{$endif}
  630. begin
  631. dest:=variantmanager.vartoreal(variant(tvardata(source)));
  632. end;
  633. {$endif}
  634. { Misc. }
  635. operator :=(const source : olevariant) dest : currency;{$ifdef SYSTEMINLINE}inline;{$endif}
  636. begin
  637. dest:=variantmanager.vartocurr(variant(tvardata(source)));
  638. end;
  639. {$ifndef FPUNONE}
  640. operator :=(const source : olevariant) dest : tdatetime;{$ifdef SYSTEMINLINE}inline;{$endif}
  641. begin
  642. dest:=variantmanager.vartotdatetime(variant(tvardata(source)));
  643. end;
  644. {$endif}
  645. operator :=(const source : olevariant) dest : terror;{$ifdef SYSTEMINLINE}inline;{$endif}
  646. begin
  647. dest:=variantmanager.vartoint(variant(tvardata(source)));
  648. end;
  649. {**********************************************************************
  650. to OLEVariant assignments
  651. **********************************************************************}
  652. operator :=(const source : byte) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  653. begin
  654. variantmanager.olevarfromint(dest,source,1);
  655. end;
  656. operator :=(const source : shortint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  657. begin
  658. variantmanager.olevarfromint(dest,source,-1);
  659. end;
  660. operator :=(const source : word) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  661. begin
  662. variantmanager.olevarfromint(dest,source,2);
  663. end;
  664. operator :=(const source : smallint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  665. begin
  666. variantmanager.olevarfromint(dest,source,-2);
  667. end;
  668. operator :=(const source : dword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  669. begin
  670. variantmanager.olevarfromint(dest,source,4);
  671. end;
  672. operator :=(const source : longint) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  673. begin
  674. variantmanager.olevarfromint(dest,source,-4);
  675. end;
  676. operator :=(const source : qword) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  677. begin
  678. variantmanager.olevarfromint(dest,source,8);
  679. end;
  680. operator :=(const source : int64) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  681. begin
  682. variantmanager.olevarfromint(dest,source,-8);
  683. end;
  684. { Boolean }
  685. operator :=(const source : boolean) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  686. begin
  687. variantmanager.varfromBool(variant(tvardata(dest)),Source);
  688. end;
  689. operator :=(const source : wordbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  690. begin
  691. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  692. end;
  693. operator :=(const source : longbool) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  694. begin
  695. variantmanager.varfromBool(variant(tvardata(Dest)),Source);
  696. end;
  697. { Chars }
  698. operator :=(const source : char) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  699. begin
  700. variantmanager.olevarfrompstr(dest,source);
  701. end;
  702. operator :=(const source : widechar) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  703. begin
  704. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  705. end;
  706. { Strings }
  707. operator :=(const source : shortstring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  708. begin
  709. variantmanager.olevarfrompstr(dest,source);
  710. end;
  711. operator :=(const source : ansistring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  712. begin
  713. variantmanager.olevarfromlstr(dest,source);
  714. end;
  715. operator :=(const source : widestring) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  716. begin
  717. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  718. end;
  719. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  720. operator :=(const source : UnicodeString) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  721. begin
  722. variantmanager.varfromwstr(variant(tvardata(dest)),source);
  723. end;
  724. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  725. { Floats }
  726. {$ifdef SUPPORT_SINGLE}
  727. operator :=(const source : single) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  728. begin
  729. variantmanager.varfromreal(variant(tvardata(dest)),source);
  730. end;
  731. {$endif SUPPORT_SINGLE}
  732. {$ifdef SUPPORT_DOUBLE}
  733. operator :=(const source : double) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  734. begin
  735. variantmanager.varfromreal(variant(tvardata(dest)),source);
  736. end;
  737. {$endif SUPPORT_DOUBLE}
  738. {$ifdef SUPPORT_EXTENDED}
  739. operator :=(const source : extended) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  740. begin
  741. variantmanager.varfromreal(variant(tvardata(dest)),source);
  742. end;
  743. {$endif SUPPORT_EXTENDED}
  744. {$ifdef SUPPORT_COMP}
  745. operator :=(const source : comp) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  746. begin
  747. variantmanager.varfromreal(variant(tvardata(dest)),source);
  748. end;
  749. {$endif SUPPORT_COMP}
  750. {$ifndef FPUNONE}
  751. operator :=(const source : real) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  752. begin
  753. variantmanager.varfromreal(variant(tvardata(dest)),source);
  754. end;
  755. {$endif}
  756. { Misc. }
  757. operator :=(const source : currency) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  758. begin
  759. variantmanager.varfromcurr(variant(tvardata(dest)),source);
  760. end;
  761. {$ifndef FPUNONE}
  762. operator :=(const source : tdatetime) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  763. begin
  764. variantmanager.varfromtdatetime(variant(tvardata(dest)),source);
  765. end;
  766. {$endif}
  767. operator :=(const source : terror) dest : olevariant;{$ifdef SYSTEMINLINE}inline;{$endif}
  768. begin
  769. variantmanager.olevarfromint(dest,source,-sizeof(terror));
  770. end;
  771. function Unassigned: Variant; // Unassigned standard constant
  772. begin
  773. VarClearProc(TVarData(Result));
  774. TVarData(Result).VType := varempty;
  775. end;
  776. function Null: Variant; // Null standard constant
  777. begin
  778. VarClearProc(TVarData(Result));
  779. TVarData(Result).VType := varnull;
  780. end;
  781. {**********************************************************************
  782. Variant manager functions
  783. **********************************************************************}
  784. procedure GetVariantManager(var VarMgr: TVariantManager);
  785. begin
  786. VarMgr:=VariantManager;
  787. end;
  788. procedure SetVariantManager(const VarMgr: TVariantManager);
  789. begin
  790. VariantManager:=VarMgr;
  791. end;
  792. procedure initvariantmanager;
  793. begin
  794. end;
  795. Function Pos (c : Char; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  796. begin
  797. Result:=Pos(c,ShortString(v));
  798. end;
  799. Function Pos (s : ShortString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  800. begin
  801. Result:=Pos(s,ShortString(v));
  802. end;
  803. Function Pos (a : AnsiString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  804. begin
  805. Result:=Pos(a,AnsiString(v));
  806. end;
  807. Function Pos (w : WideString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  808. begin
  809. Result:=Pos(w,WideString(v));
  810. end;
  811. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  812. Function Pos (w : UnicodeString; Const v : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  813. begin
  814. Result:=Pos(w,UnicodeString(v));
  815. end;
  816. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  817. Function Pos (v : Variant; Const c : Char) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  818. begin
  819. Result:=Pos(ShortString(v),c);
  820. end;
  821. Function Pos (v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  822. begin
  823. Result:=Pos(ShortString(v),s);
  824. end;
  825. Function Pos (v : Variant; Const a : AnsiString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  826. begin
  827. Result:=Pos(AnsiString(v),a);
  828. end;
  829. Function Pos (v : Variant; Const w : WideString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  830. begin
  831. Result:=Pos(WideString(v),w);
  832. end;
  833. {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
  834. Function Pos (v : Variant; Const w : UnicodeString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  835. begin
  836. Result:=Pos(UnicodeString(v),w);
  837. end;
  838. {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
  839. Function Pos (v1 : Variant; Const v2 : Variant) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  840. begin
  841. Result:=Pos(WideString(v1),WideString(v2));
  842. end;