typinfo.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1998 by Florian Klaempfl
  5. member of the Free Pascal development team
  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. { This unit provides the same functionality as the TypInfo Unit }
  13. { of Delphi }
  14. unit typinfo;
  15. interface
  16. {$MODE objfpc}
  17. {$ifndef AUTOOBJPAS}
  18. uses
  19. objpas;
  20. {$endif}
  21. // temporary types:
  22. type
  23. PShortString =^ShortString;
  24. PByte =^Byte;
  25. PLongint =^Longint;
  26. PBoolean =^Boolean;
  27. Variant = Pointer;
  28. TMethod = Pointer;
  29. {$MINENUMSIZE 1 this saves a lot of memory }
  30. // if you change one of the following enumeration types
  31. // you have also to change the compiler in an appropriate way !
  32. TTypeKind = (tkUnknown,tkInteger,tkChar,tkEnumeration,
  33. tkFloat,tkSet,tkMethod,tkSString,tkLString,tkAString,
  34. tkWString,tkVariant,tkArray,tkRecord,tkInterface,
  35. tkClass,tkObject,tkWChar,tkBool);
  36. TTOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong);
  37. TFloatType = (ftSingle,ftDouble,ftExtended,ftComp,ftCurr,
  38. ftFixed16,ftFixed32);
  39. TMethodKind = (mkProcedure,mkFunction,mkSafeProcedure,mkSafeFunction);
  40. TParamFlags = set of (pfVar,pfConst,pfArray,pfAddress,pfReference,pfOut);
  41. TIntfFlags = set of (ifHasGuid,ifDispInterface,ifDispatch);
  42. {$MINENUMSIZE DEFAULT}
  43. const
  44. ptField = 0;
  45. ptStatic = 1;
  46. ptVirtual = 2;
  47. ptConst = 3;
  48. tkString = tkSString;
  49. type
  50. TTypeKinds = set of TTypeKind;
  51. TTypeInfo = record
  52. Kind : TTypeKind;
  53. Name : ShortString;
  54. // here the type data follows as TTypeData record
  55. end;
  56. PTypeInfo = ^TTypeInfo;
  57. PPTypeInfo = ^PTypeInfo;
  58. PTypeData = ^TTypeData;
  59. TTypeData = packed record
  60. case TTypeKind of
  61. tkUnKnown,tkLString,tkWString,tkAString,tkVariant:
  62. ();
  63. tkInteger,tkChar,tkEnumeration,tkWChar:
  64. (OrdType : TTOrdType;
  65. case TTypeKind of
  66. tkInteger,tkChar,tkEnumeration,tkBool,tkWChar : (
  67. MinValue,MaxValue : Longint;
  68. case TTypeKind of
  69. tkEnumeration:
  70. (
  71. BaseType : PTypeInfo;
  72. NameList : ShortString)
  73. );
  74. tkSet:
  75. (CompType : PTypeInfo)
  76. );
  77. tkFloat:
  78. (FloatType : TFloatType);
  79. tkSString:
  80. (MaxLength : Byte);
  81. tkClass:
  82. (ClassType : TClass;
  83. ParentInfo : PTypeInfo;
  84. PropCount : SmallInt;
  85. UnitName : ShortString
  86. // here the properties follow as array of TPropInfo
  87. );
  88. tkMethod:
  89. ({!!!!!!!}
  90. );
  91. tkInterface:
  92. ({!!!!!!!}
  93. );
  94. end;
  95. // unsed, just for completeness
  96. TPropData = packed record
  97. PropCount : Word;
  98. PropList : record end;
  99. end;
  100. PPropInfo = ^TPropInfo;
  101. TPropInfo = packed record
  102. PropType : PTypeInfo;
  103. GetProc : Pointer;
  104. SetProc : Pointer;
  105. StoredProc : Pointer;
  106. Index : Integer;
  107. Default : Longint;
  108. NameIndex : SmallInt;
  109. // contains the type of the Get/Set/Storedproc, see also ptxxx
  110. // bit 0..1 GetProc
  111. // 2..3 SetProc
  112. // 4..5 StoredProc
  113. // 6 : true, constant index property
  114. PropProcs : Byte;
  115. Name : ShortString;
  116. end;
  117. TProcInfoProc = procedure(PropInfo : PPropInfo) of object;
  118. PPropList = ^TPropList;
  119. TPropList = array[0..65535] of PPropInfo;
  120. const
  121. tkAny = [Low(TTypeKind)..High(TTypeKind)];
  122. tkMethods = [tkMethod];
  123. tkProperties = tkAny-tkMethods-[tkUnknown];
  124. { general property handling }
  125. // just skips the id and the name
  126. function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
  127. // searches in the property PropName
  128. function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
  129. procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
  130. function GetPropList(TypeInfo : PTypeInfo;TypeKinds : TTypeKinds;
  131. PropList : PPropList) : Integer;
  132. // returns true, if PropInfo is a stored property
  133. function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
  134. { subroutines to read/write properties }
  135. function GetOrdProp(Instance : TObject;PropInfo : PPropInfo) : Longint;
  136. procedure SetOrdProp(Instance : TObject;PropInfo : PPropInfo;
  137. Value : Longint);
  138. function GetStrProp(Instance : TObject;PropInfo : PPropInfo) : Ansistring;
  139. procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
  140. const Value : Ansistring);
  141. function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
  142. procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
  143. Value : Extended);
  144. function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
  145. procedure SetVariantProp(Instance : TObject;PropInfo : PPropInfo;
  146. const Value: Variant);
  147. function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
  148. procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
  149. const Value : TMethod);
  150. { misc. stuff }
  151. function GetEnumName(TypeInfo : PTypeInfo;Value : Integer) : string;
  152. function GetEnumValue(TypeInfo : PTypeInfo;const Name : string) : Integer;
  153. implementation
  154. {$ASMMODE ATT}
  155. function CallIntegerFunc(s : Pointer;Address : Pointer; INdex,IValue : Longint) : Integer;assembler;
  156. Label LINoPush;
  157. asm
  158. movl S,%esi
  159. movl Address,%edi
  160. // ? Indexed function
  161. movl Index,%eax
  162. xorl %eax,%eax
  163. jnz LINoPush
  164. movl IValue,%eax
  165. pushl %eax
  166. LINoPush:
  167. call (%edi)
  168. // now the result should be in EAX, untested yet (FK)
  169. end;
  170. function CallIntegerProc(s : Pointer;Address : Pointer;Value : Integer; INdex,IVAlue : Longint) : Integer;assembler;
  171. label LIPNoPush;
  172. asm
  173. movl S,%esi
  174. movl Address,%edi
  175. // Push value to set
  176. movl Value,%eax
  177. pushl %eax
  178. // ? Indexed procedure
  179. movl Index,%eax
  180. xorl %eax,%eax
  181. jnz LIPNoPush
  182. movl IValue,%eax
  183. pushl %eax
  184. LIPNoPush:
  185. call (%edi)
  186. // now the result should be in EAX, untested yet (FK)
  187. end;
  188. function CallBooleanFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Boolean;assembler;
  189. Label LBNoPush;
  190. asm
  191. movl S,%edi
  192. movl Address,%edi
  193. // ? Indexed function
  194. movl Index,%eax
  195. xorl %eax,%eax
  196. jnz LBNoPush
  197. movl IValue,%eax
  198. pushl %eax
  199. LBNoPush:
  200. call (%edi)
  201. // now the result should be in EAX, untested yet (FK)
  202. end;
  203. //!! Assembler functions can't have short stringreturn values.
  204. //!! So we make a procedure with var parameter.
  205. Procedure CallSStringFunc(s : Pointer;Address : Pointer; INdex,IValue : Longint;
  206. Var Res: Shortstring);assembler;
  207. Label LSSNoPush;
  208. asm
  209. movl S,%esi
  210. movl Address,%edi
  211. // ? Indexed function
  212. movl Index,%eax
  213. xorl %eax,%eax
  214. jnz LSSNoPush
  215. movl IValue,%eax
  216. pushl %eax
  217. LSSNoPush:
  218. call (%edi)
  219. //!! now what ?? MVC
  220. end;
  221. function CallSStringProc(s : Pointer;Address : Pointer;Value : ShortString; INdex,IVAlue : Longint);assembler;
  222. label LSSPNoPush;
  223. asm
  224. movl S,%esi
  225. movl Address,%edi
  226. // Push value to set
  227. //!! Is this correct for short strings ????
  228. movl Value,%eax
  229. pushl %eax
  230. // ? Indexed procedure
  231. movl Index,%eax
  232. xorl %eax,%eax
  233. jnz LSSPNoPush
  234. movl IValue,%eax
  235. pushl %eax
  236. LSSPNoPush:
  237. call (%edi)
  238. //!! now what ? MVC
  239. end;
  240. function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
  241. begin
  242. GetTypeData:=PTypeData(TypeInfo)+2+PByte(TypeInfo+1)^;
  243. end;
  244. function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
  245. var
  246. hp : PTypeData;
  247. i : longint;
  248. begin
  249. Result:=Nil;
  250. while Assigned(TypeInfo) do
  251. begin
  252. // skip the name
  253. hp:=GetTypeData(Typeinfo);
  254. // the class info rtti the property rtti follows
  255. // immediatly
  256. Result:=PPropInfo(@hp^.UnitName)+byte(hp^.UnitName[0])+1;
  257. for i:=1 to hp^.PropCount do
  258. begin
  259. // found a property of that name ?
  260. if Result^.Name=PropName then
  261. exit;
  262. // skip to next property
  263. Result:=PPropInfo(@Result^.Name)+byte(Result^.Name[0])+1;
  264. end;
  265. // parent class
  266. Typeinfo:=hp^.ParentInfo;
  267. end;
  268. end;
  269. function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
  270. begin
  271. case (PropInfo^.PropProcs shr 4) and 3 of
  272. ptfield:
  273. IsStoredProp:=PBoolean(Pointer(Instance)+Longint(PropInfo^.StoredProc))^;
  274. ptstatic:
  275. IsStoredProp:=CallBooleanFunc(Instance,PropInfo^.StoredProc,0,0);
  276. ptvirtual:
  277. IsStoredProp:=CallBooleanFunc(Instance,(PPointer(Instance.ClassType)+Longint(PropInfo^.StoredProc)),0,0);
  278. ptconst:
  279. IsStoredProp:=LongBool(PropInfo^.StoredProc);
  280. end;
  281. end;
  282. procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
  283. {
  284. Store Pointers to property information in the list pointed
  285. to by proplist. PRopList must contain enough space to hold ALL
  286. properties.
  287. }
  288. Type PWord = ^Word;
  289. Var TD : PTypeData;
  290. TP : PPropInfo;
  291. Count : Longint;
  292. begin
  293. TD:=GetTypeData(TypeInfo);
  294. // Get this objects TOTAL published properties count
  295. // Delphi uses propdata for this...
  296. // Writeln ('Getting total of ',TD^.PropCount,' infos');
  297. TP:=(@TD^.UnitName+Length(TD^.UnitName)+1);
  298. Count:=PWord(TP)^;
  299. // Writeln ('Getting ',Count,' LOCAL infos');
  300. // Now point TP to first propinfo record.
  301. Inc(Longint(TP),SizeOF(Word));
  302. While Count>0 do
  303. begin
  304. PropList^[0]:=TP;
  305. Inc(Longint(PropList),SizeOf(Pointer));
  306. // Point to TP next propinfo record.
  307. // Located at Name[Length(Name)+1] !
  308. TP:=PPropInfo((@TP^.Name)+PByte(@TP^.Name)^+1);
  309. Dec(Count);
  310. end;
  311. // recursive call for parent info.
  312. If TD^.Parentinfo<>Nil then
  313. GetPropInfos (TD^.ParentInfo,PropList);
  314. end;
  315. Procedure InsertProp (PL : PProplist;PI : PPropInfo; Count : longint);
  316. VAr I : Longint;
  317. begin
  318. I:=0;
  319. While (I<Count) and (PI^.Name>PL^[I]^.Name) do Inc(I);
  320. If I<Count then
  321. Move(PL^[I],PL[I+1],Count-I*SizeOf(Pointer));
  322. PL^[I]:=PI;
  323. end;
  324. function GetPropList(TypeInfo : PTypeInfo;TypeKinds : TTypeKinds;
  325. PropList : PPropList) : Integer;
  326. {
  327. Store Pointers to property information OF A CERTAIN KIND in the list pointed
  328. to by proplist. PRopList must contain enough space to hold ALL
  329. properties.
  330. }
  331. Var TempList : PPropList;
  332. PropInfo : PPropinfo;
  333. I,Count : longint;
  334. begin
  335. Result:=0;
  336. Count:=GetTypeData(TypeInfo)^.Propcount;
  337. If Count>0 then
  338. begin
  339. GetMem(TempList,Count*SizeOf(Pointer));
  340. Try
  341. GetPropInfos(TypeInfo,TempList);
  342. For I:=0 to Count-1 do
  343. begin
  344. PropInfo:=TempList^[i];
  345. If PropInfo^.PropType^.Kind in TypeKinds then
  346. begin
  347. InsertProp(PropList,PropInfo,Result);
  348. Inc(Result);
  349. end;
  350. end;
  351. finally
  352. FreeMem(TempList,Count*SizeOf(Pointer));
  353. end;
  354. end;
  355. end;
  356. Procedure SetIndexValues (P: PPRopInfo; Var Index,IValue : Longint);
  357. begin
  358. Index:=((P^.PropProcs shr 6) and 1);
  359. If Index=0 then
  360. IValue:=P^.Index
  361. else
  362. IValue:=0;
  363. end;
  364. function GetOrdProp(Instance : TObject;PropInfo : PPropInfo) : Longint;
  365. var
  366. value,Index,Ivalue : longint;
  367. begin
  368. SetIndexValues(PropInfo,Index,Ivalue);
  369. case (PropInfo^.PropProcs) and 3 of
  370. ptfield:
  371. Value:=PLongint(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
  372. ptstatic:
  373. Value:=CallIntegerFunc(Instance,PropInfo^.GetProc,Index,IValue);
  374. ptvirtual:
  375. Value:=CallIntegerFunc(Instance,
  376. (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
  377. Index,IValue);
  378. end;
  379. { cut off unnecessary stuff }
  380. case GetTypeData(PropInfo^.PropType)^.OrdType of
  381. otSWord,otUWord:
  382. Value:=Value and $ffff;
  383. otSByte,otUByte:
  384. Value:=Value and $ff;
  385. end;
  386. GetOrdProp:=Value;
  387. end;
  388. procedure SetOrdProp(Instance : TObject;PropInfo : PPropInfo;
  389. Value : Longint);
  390. Var Index,IValue : Longint;
  391. begin
  392. { cut off unnecessary stuff }
  393. case GetTypeData(PropInfo^.PropType)^.OrdType of
  394. otSWord,otUWord:
  395. Value:=Value and $ffff;
  396. otSByte,otUByte:
  397. Value:=Value and $ff;
  398. end;
  399. SetIndexValues(PropInfo,Index,Ivalue);
  400. case (PropInfo^.PropProcs) and 3 of
  401. ptfield:
  402. PLongint(Pointer(Instance)+Longint(PropInfo^.GetProc))^:=Value;
  403. ptstatic:
  404. CallIntegerProc(Instance,PropInfo^.GetProc,Value,Index,IValue);
  405. ptvirtual:
  406. CallIntegerProc(Instance,
  407. (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
  408. Value,Index,IValue);
  409. end;
  410. end;
  411. Function GetAStrProp(Instance : TObject;PropInfo : PPropInfo):Pointer;
  412. {
  413. Dirty trick based on fact that AnsiString is just a pointer,
  414. hence can be treated like an integer type.
  415. }
  416. var
  417. value : Pointer;
  418. Index,Ivalue : Longint;
  419. begin
  420. SetIndexValues(PropInfo,Index,IValue);
  421. case (PropInfo^.PropProcs) and 3 of
  422. ptfield:
  423. Value:=Pointer(PLongint(Pointer(Instance)+Longint(PropInfo^.GetProc))^);
  424. ptstatic:
  425. Value:=Pointer(CallIntegerFunc(Instance,PropInfo^.GetProc,Index,IValue));
  426. ptvirtual:
  427. Value:=Pointer(CallIntegerFunc(Instance,
  428. (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
  429. Index,IValue));
  430. end;
  431. GetAstrProp:=Value;
  432. end;
  433. Function GetSStrProp(Instance : TObject;PropInfo : PPropInfo):ShortString;
  434. var
  435. value : ShortString;
  436. Index,IValue : Longint;
  437. begin
  438. SetIndexValues(PropInfo,Index,IValue);
  439. case (PropInfo^.PropProcs) and 3 of
  440. ptfield:
  441. Value:=PShortString(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
  442. ptstatic:
  443. CallSStringFunc(Instance,PropInfo^.GetProc,Index,IValue,Value);
  444. ptvirtual:
  445. CallSSTringFunc(Instance,
  446. (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
  447. Index,Ivalue,Value);
  448. end;
  449. GetSStrProp:=Value;
  450. end;
  451. function GetStrProp(Instance : TObject;PropInfo : PPropInfo) : Ansistring;
  452. begin
  453. Case Propinfo^.PropType^.Kind of
  454. tkSString : Result:=GetSStrProp(Instance,PropInfo);
  455. tkAString : Pointer(Result):=GetAStrProp(Instance,Propinfo);
  456. else
  457. Result:='';
  458. end;
  459. end;
  460. procedure SetAStrProp(Instance : TObject;PropInfo : PPropInfo;
  461. const Value : AnsiString);
  462. begin
  463. end;
  464. procedure SetSStrProp(Instance : TObject;PropInfo : PPropInfo;
  465. const Value : AnsiString);
  466. begin
  467. end;
  468. procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
  469. const Value : AnsiString);
  470. begin
  471. Case Propinfo^.PropType^.Kind of
  472. tkSString : SetSStrProp(Instance,PropInfo,Value);
  473. tkAString : SetAStrProp(Instance,Propinfo,Value);
  474. end;
  475. end;
  476. function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
  477. begin
  478. {!!!!!!!!!!!}
  479. end;
  480. procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
  481. Value : Extended);
  482. begin
  483. {!!!!!!!!!!!}
  484. end;
  485. function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
  486. begin
  487. {!!!!!!!!!!!}
  488. end;
  489. procedure SetVariantProp(Instance : TObject;PropInfo : PPropInfo;
  490. const Value: Variant);
  491. begin
  492. {!!!!!!!!!!!}
  493. end;
  494. function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
  495. begin
  496. {!!!!!!!!!!!}
  497. end;
  498. procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
  499. const Value : TMethod);
  500. begin
  501. {!!!!!!!!!!!}
  502. end;
  503. function GetEnumName(TypeInfo : PTypeInfo;Value : Integer) : string;
  504. Var PS : PShortString;
  505. PT : PTypeData;
  506. begin
  507. PT:=GetTypeData(GetTypeData(TypeInfo)^.BaseType);
  508. If PT^.MinValue<0 then Value:=Ord(Value<>0); {map to 0/1}
  509. PS:=@PT^.NameList;
  510. While Value>0 Do
  511. begin
  512. PS:=PS+PByte(PS)^+1;
  513. Dec(Value);
  514. end;
  515. Result:=PS^;
  516. end;
  517. function GetEnumValue(TypeInfo : PTypeInfo;const Name : string) : Integer;
  518. Var PS : PShortString;
  519. PT : PTypeData;
  520. Count : longint;
  521. begin
  522. If Length(Name)=0 then exit(-1);
  523. PT:=GetTypeData(GetTypeData(TypeInfo)^.BaseType);
  524. Count:=0;
  525. Result:=-1;
  526. PS:=@PT^.NameList;
  527. While (Result=-1) and (PByte(PS)^<>0) do
  528. begin
  529. If PS^=Name then
  530. Result:=Count;
  531. PS:=PS+PByte(PS)^;
  532. Inc(Count);
  533. end;
  534. end;
  535. end.
  536. {
  537. $Log$
  538. Revision 1.14 1998-11-26 14:22:18 michael
  539. + Fixed Gettypeinfos
  540. Revision 1.11 1998/09/24 23:45:28 peter
  541. * updated for auto objpas loading
  542. Revision 1.10 1998/09/20 08:25:34 florian
  543. + description of tpropinfo.propprocs bit 6 added
  544. Revision 1.9 1998/09/19 15:25:45 florian
  545. * procedure GetOrdProp added
  546. Revision 1.8 1998/09/19 08:33:53 florian
  547. + some procedures added
  548. Revision 1.7 1998/09/08 09:52:31 florian
  549. * small problems fixed
  550. Revision 1.6 1998/09/08 00:08:36 michael
  551. Made it compilable
  552. Revision 1.5 1998/09/07 23:11:43 florian
  553. + more fields to TTypeInfo added
  554. Revision 1.4 1998/09/07 19:34:47 florian
  555. * constant value is now supported as stored condition
  556. Revision 1.3 1998/09/07 08:32:59 florian
  557. + procedure IsStoredProc added
  558. Revision 1.2 1998/09/06 21:27:05 florian
  559. + some methods and declarations added
  560. Revision 1.1 1998/08/25 22:30:00 florian
  561. + initial revision:
  562. o constants
  563. o basic type data record
  564. }