variant.inc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2001 by the Free Pascal development team
  5. This include file contains the implementation for variants
  6. support in FPC as far as it is part of the system unit
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. var
  14. variantmanager : tvariantmanager;
  15. procedure invalidvariantop;
  16. begin
  17. HandleErrorFrame(221,get_frame);
  18. end;
  19. procedure vardisperror;
  20. begin
  21. HandleErrorFrame(222,get_frame);
  22. end;
  23. { ---------------------------------------------------------------------
  24. Compiler helper routines.
  25. ---------------------------------------------------------------------}
  26. procedure varclear(var v : tvardata);
  27. begin
  28. if not(v.vtype in [varempty,varerror,varnull]) then
  29. invalidvariantop;
  30. end;
  31. procedure variant_init(var v : variant);[Public,Alias:'FPC_VARIANT_INIT'];
  32. begin
  33. variantmanager.varinit(v);
  34. end;
  35. procedure variant_clear(var v : variant);[Public,Alias:'FPC_VARIANT_CLEAR'];
  36. begin
  37. variantmanager.varclear(v);
  38. end;
  39. { ---------------------------------------------------------------------
  40. Overloaded operators.
  41. ---------------------------------------------------------------------}
  42. { Integer }
  43. operator :=(const source : byte) dest : variant;
  44. begin
  45. Variant_Init(Dest);
  46. Variantmanager.varfromInt(Dest,Source,1);
  47. end;
  48. operator :=(const source : shortint) dest : variant;
  49. begin
  50. Variant_Init(Dest);
  51. Variantmanager.varfromInt(Dest,Source,-1);
  52. end;
  53. operator :=(const source : word) dest : variant;
  54. begin
  55. Variant_Init(Dest);
  56. Variantmanager.varfromInt(Dest,Source,2);
  57. end;
  58. operator :=(const source : smallint) dest : variant;
  59. begin
  60. Variant_Init(Dest);
  61. Variantmanager.varfromInt(Dest,Source,-2);
  62. end;
  63. operator :=(const source : dword) dest : variant;
  64. begin
  65. Variant_Init(Dest);
  66. Variantmanager.varfromInt(Dest,Source,4);
  67. end;
  68. operator :=(const source : longint) dest : variant;
  69. begin
  70. // Variant_Init(Dest);
  71. Variantmanager.varfromInt(Dest,Source,-4);
  72. end;
  73. operator :=(const source : qword) dest : variant;
  74. begin
  75. Variant_Init(Dest);
  76. Variantmanager.varfromWord64(Dest,Source);
  77. end;
  78. operator :=(const source : int64) dest : variant;
  79. begin
  80. Variant_Init(Dest);
  81. Variantmanager.varfromInt64(Dest,Source);
  82. end;
  83. { Boolean }
  84. operator :=(const source : boolean) dest : variant;
  85. begin
  86. Variant_Init(Dest);
  87. Variantmanager.varfromBool(Dest,Source);
  88. end;
  89. operator :=(const source : wordbool) dest : variant;
  90. begin
  91. Variant_Init(Dest);
  92. Variantmanager.varfromBool(Dest,Boolean(Source));
  93. end;
  94. operator :=(const source : longbool) dest : variant;
  95. begin
  96. Variant_Init(Dest);
  97. Variantmanager.varfromBool(Dest,Boolean(Source));
  98. end;
  99. { Chars }
  100. operator :=(const source : char) dest : variant;
  101. begin
  102. Variant_Init(Dest);
  103. VariantManager.VarFromPStr(Dest,Source);
  104. end;
  105. operator :=(const source : widechar) dest : variant;
  106. begin
  107. Variant_Init(Dest);
  108. VariantManager.VarFromWStr(Dest,Source);
  109. end;
  110. { Strings }
  111. operator :=(const source : shortstring) dest : variant;
  112. begin
  113. Variant_Init(Dest);
  114. VariantManager.VarFromPStr(Dest,Source);
  115. end;
  116. operator :=(const source : ansistring) dest : variant;
  117. begin
  118. Variant_Init(Dest);
  119. VariantManager.VarFromLStr(Dest,Source);
  120. end;
  121. operator :=(const source : widestring) dest : variant;
  122. begin
  123. Variant_Init(Dest);
  124. VariantManager.VarFromWStr(Dest,Source);
  125. end;
  126. { Floats }
  127. operator :=(const source : single) dest : variant;
  128. begin
  129. Variant_Init(Dest);
  130. VariantManager.VarFromReal(Dest,Source);
  131. end;
  132. operator :=(const source : double) dest : variant;
  133. begin
  134. Variant_Init(Dest);
  135. VariantManager.VarFromReal(Dest,Source);
  136. end;
  137. operator :=(const source : extended) dest : variant;
  138. begin
  139. Variant_Init(Dest);
  140. VariantManager.VarFromReal(Dest,Source);
  141. end;
  142. Operator :=(const source : comp) dest : variant;
  143. begin
  144. Variant_Init(Dest);
  145. VariantManager.VarFromReal(Dest,Source);
  146. end;
  147. { Misc. }
  148. { Fixme!!!
  149. operator :=(const source : currency) dest : variant;
  150. begin
  151. end;
  152. operator :=(const source : tdatetime) dest : variant;
  153. begin
  154. end;
  155. }
  156. {**********************************************************************
  157. from Variant assignments
  158. **********************************************************************}
  159. { Integer }
  160. operator :=(const source : variant) dest : byte;
  161. begin
  162. dest:=variantmanager.vartoint(source);
  163. end;
  164. operator :=(const source : variant) dest : shortint;
  165. begin
  166. dest:=variantmanager.vartoint(source);
  167. end;
  168. operator :=(const source : variant) dest : word;
  169. begin
  170. dest:=variantmanager.vartoint(source);
  171. end;
  172. operator :=(const source : variant) dest : smallint;
  173. begin
  174. dest:=variantmanager.vartoint(source);
  175. end;
  176. operator :=(const source : variant) dest : dword;
  177. begin
  178. dest:=variantmanager.vartoint(source);
  179. end;
  180. operator :=(const source : variant) dest : longint;
  181. begin
  182. dest:=variantmanager.vartoint(source);
  183. end;
  184. operator :=(const source : variant) dest : qword;
  185. begin
  186. dest:=variantmanager.vartoword64(source);
  187. end;
  188. operator :=(const source : variant) dest : int64;
  189. begin
  190. dest:=variantmanager.vartoint64(source);
  191. end;
  192. { Boolean }
  193. operator :=(const source : variant) dest : boolean;
  194. begin
  195. dest:=variantmanager.vartobool(source);
  196. end;
  197. operator :=(const source : variant) dest : wordbool;
  198. begin
  199. dest:=variantmanager.vartobool(source);
  200. end;
  201. operator :=(const source : variant) dest : longbool;
  202. begin
  203. dest:=variantmanager.vartobool(source);
  204. end;
  205. { Chars }
  206. operator :=(const source : variant) dest : char;
  207. Var
  208. S : String;
  209. begin
  210. VariantManager.VarToPStr(S,Source);
  211. If Length(S)>0 then
  212. Dest:=S[1];
  213. end;
  214. operator :=(const source : variant) dest : widechar;
  215. Var
  216. WS : WideString;
  217. begin
  218. VariantManager.VarToWStr(WS,Source);
  219. If Length(WS)>0 then
  220. Dest:=WS[1];
  221. end;
  222. { Strings }
  223. operator :=(const source : variant) dest : shortstring;
  224. begin
  225. VariantManager.VarToPStr(Dest,Source);
  226. end;
  227. operator :=(const source : variant) dest : ansistring;
  228. begin
  229. VariantManager.vartolstr(dest,source);
  230. end;
  231. operator :=(const source : variant) dest : widestring;
  232. begin
  233. variantmanager.vartowstr(dest,source);
  234. end;
  235. { Floats }
  236. operator :=(const source : variant) dest : single;
  237. begin
  238. dest:=variantmanager.vartoreal(source);
  239. end;
  240. operator :=(const source : variant) dest : double;
  241. begin
  242. dest:=variantmanager.vartoreal(source);
  243. end;
  244. operator :=(const source : variant) dest : extended;
  245. begin
  246. dest:=variantmanager.vartoreal(source);
  247. end;
  248. operator :=(const source : variant) dest : comp;
  249. begin
  250. dest:=comp(variantmanager.vartoreal(source));
  251. end;
  252. { Misc. }
  253. { FIXME !!!!!!!
  254. operator :=(const source : variant) dest : currency;
  255. begin
  256. dest:=variantmanager.vartocurr(source);
  257. end;
  258. operator :=(const source : variant) dest : tdatetime;
  259. begin
  260. end;
  261. }
  262. {**********************************************************************
  263. Operators
  264. **********************************************************************}
  265. operator or(const op1,op2 : variant) dest : variant;
  266. begin
  267. dest:=op1;
  268. variantmanager.varop(dest,op2,opor);
  269. end;
  270. operator and(const op1,op2 : variant) dest : variant;
  271. begin
  272. dest:=op1;
  273. variantmanager.varop(dest,op2,opand);
  274. end;
  275. operator xor(const op1,op2 : variant) dest : variant;
  276. begin
  277. dest:=op1;
  278. variantmanager.varop(dest,op2,opxor);
  279. end;
  280. operator not(const op : variant) dest : variant;
  281. begin
  282. dest:=op;
  283. variantmanager.varnot(dest);
  284. end;
  285. operator shl(const op1,op2 : variant) dest : variant;
  286. begin
  287. dest:=op1;
  288. variantmanager.varop(dest,op2,opshiftleft);
  289. end;
  290. operator shr(const op1,op2 : variant) dest : variant;
  291. begin
  292. dest:=op1;
  293. variantmanager.varop(dest,op2,opshiftright);
  294. end;
  295. operator +(const op1,op2 : variant) dest : variant;
  296. begin
  297. dest:=op1;
  298. variantmanager.varop(dest,op2,opadd);
  299. end;
  300. operator -(const op1,op2 : variant) dest : variant;
  301. begin
  302. dest:=op1;
  303. variantmanager.varop(dest,op2,opsubtract);
  304. end;
  305. operator *(const op1,op2 : variant) dest : variant;
  306. begin
  307. dest:=op1;
  308. variantmanager.varop(dest,op2,opmultiply);
  309. end;
  310. operator /(const op1,op2 : variant) dest : variant;
  311. begin
  312. dest:=op1;
  313. variantmanager.varop(dest,op2,opdivide);
  314. end;
  315. operator div(const op1,op2 : variant) dest : variant;
  316. begin
  317. dest:=op1;
  318. variantmanager.varop(dest,op2,opintdivide);
  319. end;
  320. operator mod(const op1,op2 : variant) dest : variant;
  321. begin
  322. dest:=op1;
  323. variantmanager.varop(dest,op2,opmodulus);
  324. end;
  325. operator -(const op : variant) dest : variant;
  326. begin
  327. dest:=op;
  328. variantmanager.varneg(dest);
  329. end;
  330. operator =(const op1,op2 : variant) dest : boolean;
  331. begin
  332. dest:=variantmanager.cmpop(op1,op2,opcmpeq);
  333. end;
  334. operator <(const op1,op2 : variant) dest : boolean;
  335. begin
  336. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  337. end;
  338. operator >(const op1,op2 : variant) dest : boolean;
  339. begin
  340. dest:=variantmanager.cmpop(op1,op2,opcmpgt);
  341. end;
  342. operator >=(const op1,op2 : variant) dest : boolean;
  343. begin
  344. dest:=variantmanager.cmpop(op1,op2,opcmpge);
  345. end;
  346. operator <=(const op1,op2 : variant) dest : boolean;
  347. begin
  348. dest:=variantmanager.cmpop(op1,op2,opcmplt);
  349. end;
  350. {**********************************************************************
  351. Variant manager functions
  352. **********************************************************************}
  353. procedure GetVariantManager(var VarMgr: TVariantManager);
  354. begin
  355. VarMgr:=VariantManager;
  356. end;
  357. procedure SetVariantManager(const VarMgr: TVariantManager);
  358. begin
  359. VariantManager:=VarMgr;
  360. end;
  361. function IsVariantManagerSet: Boolean;
  362. var
  363. i : longint;
  364. begin
  365. I:=0;
  366. Result:=True;
  367. While Result and (I<(sizeof(tvariantmanager) div sizeof(pointer))-1) do
  368. begin
  369. Result:=Pointer(ppointer(@variantmanager+i*sizeof(pointer))^)<>Pointer(@invalidvariantop);
  370. Inc(I);
  371. end;
  372. end;
  373. procedure initvariantmanager;
  374. var
  375. i : longint;
  376. begin
  377. VarDispProc:=@vardisperror;
  378. DispCallByIDProc:=@vardisperror;
  379. tvardata(Unassigned).VType:=varEmpty;
  380. tvardata(Null).VType:=varNull;
  381. for i:=0 to (sizeof(tvariantmanager) div sizeof(pointer))-1 do
  382. ppointer(@variantmanager+i*sizeof(pointer))^:=@invalidvariantop;
  383. pointer(variantmanager.varclear):=@varclear
  384. end;
  385. {
  386. $Log$
  387. Revision 1.9 2002-10-09 19:08:22 florian
  388. + Variant constants Unassigned and Null added
  389. Revision 1.8 2002/10/07 15:10:45 florian
  390. + variant wrappers for cmp operators added
  391. Revision 1.7 2002/10/07 10:27:45 florian
  392. + more variant wrappers added
  393. Revision 1.6 2002/10/06 22:13:55 florian
  394. * wrappers for xor, or and and operator with variants added
  395. Revision 1.5 2002/09/07 15:07:46 peter
  396. * old logs removed and tabs fixed
  397. }