clipsruby 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/ext/clipsruby/agenda.c +1373 -0
  3. data/ext/clipsruby/agenda.h +169 -0
  4. data/ext/clipsruby/analysis.c +1142 -0
  5. data/ext/clipsruby/analysis.h +61 -0
  6. data/ext/clipsruby/argacces.c +526 -0
  7. data/ext/clipsruby/argacces.h +77 -0
  8. data/ext/clipsruby/bload.c +884 -0
  9. data/ext/clipsruby/bload.h +94 -0
  10. data/ext/clipsruby/bmathfun.c +557 -0
  11. data/ext/clipsruby/bmathfun.h +66 -0
  12. data/ext/clipsruby/bsave.c +634 -0
  13. data/ext/clipsruby/bsave.h +130 -0
  14. data/ext/clipsruby/classcom.c +976 -0
  15. data/ext/clipsruby/classcom.h +115 -0
  16. data/ext/clipsruby/classexm.c +1376 -0
  17. data/ext/clipsruby/classexm.h +97 -0
  18. data/ext/clipsruby/classfun.c +1392 -0
  19. data/ext/clipsruby/classfun.h +164 -0
  20. data/ext/clipsruby/classinf.c +1245 -0
  21. data/ext/clipsruby/classinf.h +94 -0
  22. data/ext/clipsruby/classini.c +843 -0
  23. data/ext/clipsruby/classini.h +75 -0
  24. data/ext/clipsruby/classpsr.c +957 -0
  25. data/ext/clipsruby/classpsr.h +73 -0
  26. data/ext/clipsruby/clips.h +133 -0
  27. data/ext/clipsruby/clipsruby.c +619 -0
  28. data/ext/clipsruby/clsltpsr.c +931 -0
  29. data/ext/clipsruby/clsltpsr.h +72 -0
  30. data/ext/clipsruby/commline.c +1217 -0
  31. data/ext/clipsruby/commline.h +131 -0
  32. data/ext/clipsruby/conscomp.c +1593 -0
  33. data/ext/clipsruby/conscomp.h +150 -0
  34. data/ext/clipsruby/constant.h +264 -0
  35. data/ext/clipsruby/constrct.c +1090 -0
  36. data/ext/clipsruby/constrct.h +216 -0
  37. data/ext/clipsruby/constrnt.c +554 -0
  38. data/ext/clipsruby/constrnt.h +132 -0
  39. data/ext/clipsruby/crstrtgy.c +1088 -0
  40. data/ext/clipsruby/crstrtgy.h +85 -0
  41. data/ext/clipsruby/cstrcbin.c +185 -0
  42. data/ext/clipsruby/cstrcbin.h +61 -0
  43. data/ext/clipsruby/cstrccmp.h +43 -0
  44. data/ext/clipsruby/cstrccom.c +1791 -0
  45. data/ext/clipsruby/cstrccom.h +115 -0
  46. data/ext/clipsruby/cstrcpsr.c +835 -0
  47. data/ext/clipsruby/cstrcpsr.h +97 -0
  48. data/ext/clipsruby/cstrnbin.c +282 -0
  49. data/ext/clipsruby/cstrnbin.h +55 -0
  50. data/ext/clipsruby/cstrnchk.c +826 -0
  51. data/ext/clipsruby/cstrnchk.h +91 -0
  52. data/ext/clipsruby/cstrncmp.c +238 -0
  53. data/ext/clipsruby/cstrncmp.h +57 -0
  54. data/ext/clipsruby/cstrnops.c +1176 -0
  55. data/ext/clipsruby/cstrnops.h +47 -0
  56. data/ext/clipsruby/cstrnpsr.c +1394 -0
  57. data/ext/clipsruby/cstrnpsr.h +88 -0
  58. data/ext/clipsruby/cstrnutl.c +564 -0
  59. data/ext/clipsruby/cstrnutl.h +54 -0
  60. data/ext/clipsruby/default.c +454 -0
  61. data/ext/clipsruby/default.h +57 -0
  62. data/ext/clipsruby/defins.c +971 -0
  63. data/ext/clipsruby/defins.h +127 -0
  64. data/ext/clipsruby/developr.c +677 -0
  65. data/ext/clipsruby/developr.h +69 -0
  66. data/ext/clipsruby/dffctbin.c +477 -0
  67. data/ext/clipsruby/dffctbin.h +76 -0
  68. data/ext/clipsruby/dffctbsc.c +308 -0
  69. data/ext/clipsruby/dffctbsc.h +72 -0
  70. data/ext/clipsruby/dffctcmp.c +297 -0
  71. data/ext/clipsruby/dffctcmp.h +44 -0
  72. data/ext/clipsruby/dffctdef.c +364 -0
  73. data/ext/clipsruby/dffctdef.h +104 -0
  74. data/ext/clipsruby/dffctpsr.c +179 -0
  75. data/ext/clipsruby/dffctpsr.h +49 -0
  76. data/ext/clipsruby/dffnxbin.c +520 -0
  77. data/ext/clipsruby/dffnxbin.h +67 -0
  78. data/ext/clipsruby/dffnxcmp.c +378 -0
  79. data/ext/clipsruby/dffnxcmp.h +54 -0
  80. data/ext/clipsruby/dffnxexe.c +241 -0
  81. data/ext/clipsruby/dffnxexe.h +58 -0
  82. data/ext/clipsruby/dffnxfun.c +1192 -0
  83. data/ext/clipsruby/dffnxfun.h +155 -0
  84. data/ext/clipsruby/dffnxpsr.c +514 -0
  85. data/ext/clipsruby/dffnxpsr.h +57 -0
  86. data/ext/clipsruby/dfinsbin.c +509 -0
  87. data/ext/clipsruby/dfinsbin.h +66 -0
  88. data/ext/clipsruby/dfinscmp.c +345 -0
  89. data/ext/clipsruby/dfinscmp.h +48 -0
  90. data/ext/clipsruby/drive.c +1191 -0
  91. data/ext/clipsruby/drive.h +65 -0
  92. data/ext/clipsruby/emathfun.c +1213 -0
  93. data/ext/clipsruby/emathfun.h +99 -0
  94. data/ext/clipsruby/engine.c +1568 -0
  95. data/ext/clipsruby/engine.h +203 -0
  96. data/ext/clipsruby/entities.h +276 -0
  97. data/ext/clipsruby/envrnbld.c +514 -0
  98. data/ext/clipsruby/envrnbld.h +40 -0
  99. data/ext/clipsruby/envrnmnt.c +257 -0
  100. data/ext/clipsruby/envrnmnt.h +112 -0
  101. data/ext/clipsruby/evaluatn.c +1736 -0
  102. data/ext/clipsruby/evaluatn.h +211 -0
  103. data/ext/clipsruby/expressn.c +494 -0
  104. data/ext/clipsruby/expressn.h +154 -0
  105. data/ext/clipsruby/exprnbin.c +538 -0
  106. data/ext/clipsruby/exprnbin.h +60 -0
  107. data/ext/clipsruby/exprnops.c +564 -0
  108. data/ext/clipsruby/exprnops.h +67 -0
  109. data/ext/clipsruby/exprnpsr.c +1112 -0
  110. data/ext/clipsruby/exprnpsr.h +98 -0
  111. data/ext/clipsruby/extconf.rb +2 -0
  112. data/ext/clipsruby/extnfunc.c +1015 -0
  113. data/ext/clipsruby/extnfunc.h +157 -0
  114. data/ext/clipsruby/factbin.c +447 -0
  115. data/ext/clipsruby/factbin.h +56 -0
  116. data/ext/clipsruby/factbld.c +1035 -0
  117. data/ext/clipsruby/factbld.h +63 -0
  118. data/ext/clipsruby/factcmp.c +386 -0
  119. data/ext/clipsruby/factcmp.h +46 -0
  120. data/ext/clipsruby/factcom.c +759 -0
  121. data/ext/clipsruby/factcom.h +80 -0
  122. data/ext/clipsruby/factfile.c +1761 -0
  123. data/ext/clipsruby/factfile.h +54 -0
  124. data/ext/clipsruby/factfun.c +682 -0
  125. data/ext/clipsruby/factfun.h +77 -0
  126. data/ext/clipsruby/factgen.c +1305 -0
  127. data/ext/clipsruby/factgen.h +229 -0
  128. data/ext/clipsruby/facthsh.c +438 -0
  129. data/ext/clipsruby/facthsh.h +81 -0
  130. data/ext/clipsruby/factlhs.c +250 -0
  131. data/ext/clipsruby/factlhs.h +54 -0
  132. data/ext/clipsruby/factmch.c +905 -0
  133. data/ext/clipsruby/factmch.h +68 -0
  134. data/ext/clipsruby/factmngr.c +3373 -0
  135. data/ext/clipsruby/factmngr.h +325 -0
  136. data/ext/clipsruby/factprt.c +498 -0
  137. data/ext/clipsruby/factprt.h +60 -0
  138. data/ext/clipsruby/factqpsr.c +796 -0
  139. data/ext/clipsruby/factqpsr.h +61 -0
  140. data/ext/clipsruby/factqury.c +1267 -0
  141. data/ext/clipsruby/factqury.h +112 -0
  142. data/ext/clipsruby/factrete.c +978 -0
  143. data/ext/clipsruby/factrete.h +70 -0
  144. data/ext/clipsruby/factrhs.c +667 -0
  145. data/ext/clipsruby/factrhs.h +55 -0
  146. data/ext/clipsruby/filecom.c +353 -0
  147. data/ext/clipsruby/filecom.h +137 -0
  148. data/ext/clipsruby/filertr.c +481 -0
  149. data/ext/clipsruby/filertr.h +94 -0
  150. data/ext/clipsruby/fileutil.c +1020 -0
  151. data/ext/clipsruby/fileutil.h +50 -0
  152. data/ext/clipsruby/generate.c +1079 -0
  153. data/ext/clipsruby/generate.h +57 -0
  154. data/ext/clipsruby/genrcbin.c +902 -0
  155. data/ext/clipsruby/genrcbin.h +69 -0
  156. data/ext/clipsruby/genrccmp.c +640 -0
  157. data/ext/clipsruby/genrccmp.h +59 -0
  158. data/ext/clipsruby/genrccom.c +2017 -0
  159. data/ext/clipsruby/genrccom.h +119 -0
  160. data/ext/clipsruby/genrcexe.c +737 -0
  161. data/ext/clipsruby/genrcexe.h +73 -0
  162. data/ext/clipsruby/genrcfun.c +890 -0
  163. data/ext/clipsruby/genrcfun.h +185 -0
  164. data/ext/clipsruby/genrcpsr.c +1618 -0
  165. data/ext/clipsruby/genrcpsr.h +80 -0
  166. data/ext/clipsruby/globlbin.c +458 -0
  167. data/ext/clipsruby/globlbin.h +71 -0
  168. data/ext/clipsruby/globlbsc.c +361 -0
  169. data/ext/clipsruby/globlbsc.h +83 -0
  170. data/ext/clipsruby/globlcmp.c +330 -0
  171. data/ext/clipsruby/globlcmp.h +52 -0
  172. data/ext/clipsruby/globlcom.c +289 -0
  173. data/ext/clipsruby/globlcom.h +63 -0
  174. data/ext/clipsruby/globldef.c +1087 -0
  175. data/ext/clipsruby/globldef.h +151 -0
  176. data/ext/clipsruby/globlpsr.c +530 -0
  177. data/ext/clipsruby/globlpsr.h +59 -0
  178. data/ext/clipsruby/immthpsr.c +431 -0
  179. data/ext/clipsruby/immthpsr.h +55 -0
  180. data/ext/clipsruby/incrrset.c +530 -0
  181. data/ext/clipsruby/incrrset.h +73 -0
  182. data/ext/clipsruby/inherpsr.c +850 -0
  183. data/ext/clipsruby/inherpsr.h +52 -0
  184. data/ext/clipsruby/inscom.c +2076 -0
  185. data/ext/clipsruby/inscom.h +182 -0
  186. data/ext/clipsruby/insfile.c +1764 -0
  187. data/ext/clipsruby/insfile.h +96 -0
  188. data/ext/clipsruby/insfun.c +1451 -0
  189. data/ext/clipsruby/insfun.h +134 -0
  190. data/ext/clipsruby/insmngr.c +2550 -0
  191. data/ext/clipsruby/insmngr.h +125 -0
  192. data/ext/clipsruby/insmoddp.c +1041 -0
  193. data/ext/clipsruby/insmoddp.h +91 -0
  194. data/ext/clipsruby/insmult.c +804 -0
  195. data/ext/clipsruby/insmult.h +62 -0
  196. data/ext/clipsruby/inspsr.c +602 -0
  197. data/ext/clipsruby/inspsr.h +60 -0
  198. data/ext/clipsruby/insquery.c +1278 -0
  199. data/ext/clipsruby/insquery.h +115 -0
  200. data/ext/clipsruby/insqypsr.c +729 -0
  201. data/ext/clipsruby/insqypsr.h +63 -0
  202. data/ext/clipsruby/iofun.c +2045 -0
  203. data/ext/clipsruby/iofun.h +116 -0
  204. data/ext/clipsruby/lgcldpnd.c +644 -0
  205. data/ext/clipsruby/lgcldpnd.h +75 -0
  206. data/ext/clipsruby/main.c +112 -0
  207. data/ext/clipsruby/match.h +142 -0
  208. data/ext/clipsruby/memalloc.c +481 -0
  209. data/ext/clipsruby/memalloc.h +197 -0
  210. data/ext/clipsruby/miscfun.c +1801 -0
  211. data/ext/clipsruby/miscfun.h +132 -0
  212. data/ext/clipsruby/modulbin.c +607 -0
  213. data/ext/clipsruby/modulbin.h +84 -0
  214. data/ext/clipsruby/modulbsc.c +347 -0
  215. data/ext/clipsruby/modulbsc.h +67 -0
  216. data/ext/clipsruby/modulcmp.c +499 -0
  217. data/ext/clipsruby/modulcmp.h +54 -0
  218. data/ext/clipsruby/moduldef.c +817 -0
  219. data/ext/clipsruby/moduldef.h +271 -0
  220. data/ext/clipsruby/modulpsr.c +1150 -0
  221. data/ext/clipsruby/modulpsr.h +69 -0
  222. data/ext/clipsruby/modulutl.c +1036 -0
  223. data/ext/clipsruby/modulutl.h +84 -0
  224. data/ext/clipsruby/msgcom.c +1221 -0
  225. data/ext/clipsruby/msgcom.h +125 -0
  226. data/ext/clipsruby/msgfun.c +1076 -0
  227. data/ext/clipsruby/msgfun.h +118 -0
  228. data/ext/clipsruby/msgpass.c +1441 -0
  229. data/ext/clipsruby/msgpass.h +103 -0
  230. data/ext/clipsruby/msgpsr.c +698 -0
  231. data/ext/clipsruby/msgpsr.h +73 -0
  232. data/ext/clipsruby/multifld.c +1404 -0
  233. data/ext/clipsruby/multifld.h +130 -0
  234. data/ext/clipsruby/multifun.c +2182 -0
  235. data/ext/clipsruby/multifun.h +102 -0
  236. data/ext/clipsruby/network.h +142 -0
  237. data/ext/clipsruby/objbin.c +1522 -0
  238. data/ext/clipsruby/objbin.h +79 -0
  239. data/ext/clipsruby/objcmp.c +1507 -0
  240. data/ext/clipsruby/objcmp.h +71 -0
  241. data/ext/clipsruby/object.h +260 -0
  242. data/ext/clipsruby/objrtbin.c +701 -0
  243. data/ext/clipsruby/objrtbin.h +79 -0
  244. data/ext/clipsruby/objrtbld.c +2393 -0
  245. data/ext/clipsruby/objrtbld.h +66 -0
  246. data/ext/clipsruby/objrtcmp.c +734 -0
  247. data/ext/clipsruby/objrtcmp.h +66 -0
  248. data/ext/clipsruby/objrtfnx.c +1330 -0
  249. data/ext/clipsruby/objrtfnx.h +222 -0
  250. data/ext/clipsruby/objrtgen.c +736 -0
  251. data/ext/clipsruby/objrtgen.h +63 -0
  252. data/ext/clipsruby/objrtmch.c +1524 -0
  253. data/ext/clipsruby/objrtmch.h +160 -0
  254. data/ext/clipsruby/parsefun.c +415 -0
  255. data/ext/clipsruby/parsefun.h +67 -0
  256. data/ext/clipsruby/pattern.c +1265 -0
  257. data/ext/clipsruby/pattern.h +163 -0
  258. data/ext/clipsruby/pprint.c +328 -0
  259. data/ext/clipsruby/pprint.h +79 -0
  260. data/ext/clipsruby/prccode.c +1478 -0
  261. data/ext/clipsruby/prccode.h +145 -0
  262. data/ext/clipsruby/prcdrfun.c +640 -0
  263. data/ext/clipsruby/prcdrfun.h +95 -0
  264. data/ext/clipsruby/prcdrpsr.c +1068 -0
  265. data/ext/clipsruby/prcdrpsr.h +79 -0
  266. data/ext/clipsruby/prdctfun.c +869 -0
  267. data/ext/clipsruby/prdctfun.h +77 -0
  268. data/ext/clipsruby/prntutil.c +878 -0
  269. data/ext/clipsruby/prntutil.h +125 -0
  270. data/ext/clipsruby/proflfun.c +827 -0
  271. data/ext/clipsruby/proflfun.h +118 -0
  272. data/ext/clipsruby/reorder.c +2082 -0
  273. data/ext/clipsruby/reorder.h +172 -0
  274. data/ext/clipsruby/reteutil.c +1732 -0
  275. data/ext/clipsruby/reteutil.h +111 -0
  276. data/ext/clipsruby/retract.c +710 -0
  277. data/ext/clipsruby/retract.h +74 -0
  278. data/ext/clipsruby/router.c +737 -0
  279. data/ext/clipsruby/router.h +147 -0
  280. data/ext/clipsruby/rulebin.c +1136 -0
  281. data/ext/clipsruby/rulebin.h +153 -0
  282. data/ext/clipsruby/rulebld.c +1328 -0
  283. data/ext/clipsruby/rulebld.h +62 -0
  284. data/ext/clipsruby/rulebsc.c +517 -0
  285. data/ext/clipsruby/rulebsc.h +91 -0
  286. data/ext/clipsruby/rulecmp.c +733 -0
  287. data/ext/clipsruby/rulecmp.h +63 -0
  288. data/ext/clipsruby/rulecom.c +1583 -0
  289. data/ext/clipsruby/rulecom.h +116 -0
  290. data/ext/clipsruby/rulecstr.c +892 -0
  291. data/ext/clipsruby/rulecstr.h +53 -0
  292. data/ext/clipsruby/ruledef.c +559 -0
  293. data/ext/clipsruby/ruledef.h +179 -0
  294. data/ext/clipsruby/ruledlt.c +599 -0
  295. data/ext/clipsruby/ruledlt.h +58 -0
  296. data/ext/clipsruby/rulelhs.c +1216 -0
  297. data/ext/clipsruby/rulelhs.h +52 -0
  298. data/ext/clipsruby/rulepsr.c +1073 -0
  299. data/ext/clipsruby/rulepsr.h +61 -0
  300. data/ext/clipsruby/scanner.c +856 -0
  301. data/ext/clipsruby/scanner.h +112 -0
  302. data/ext/clipsruby/setup.h +488 -0
  303. data/ext/clipsruby/sortfun.c +433 -0
  304. data/ext/clipsruby/sortfun.h +55 -0
  305. data/ext/clipsruby/strngfun.c +1173 -0
  306. data/ext/clipsruby/strngfun.h +96 -0
  307. data/ext/clipsruby/strngrtr.c +523 -0
  308. data/ext/clipsruby/strngrtr.h +97 -0
  309. data/ext/clipsruby/symblbin.c +648 -0
  310. data/ext/clipsruby/symblbin.h +64 -0
  311. data/ext/clipsruby/symblcmp.c +893 -0
  312. data/ext/clipsruby/symblcmp.h +61 -0
  313. data/ext/clipsruby/symbol.c +1961 -0
  314. data/ext/clipsruby/symbol.h +243 -0
  315. data/ext/clipsruby/sysdep.c +894 -0
  316. data/ext/clipsruby/sysdep.h +164 -0
  317. data/ext/clipsruby/textpro.c +1388 -0
  318. data/ext/clipsruby/textpro.h +77 -0
  319. data/ext/clipsruby/tmpltbin.c +609 -0
  320. data/ext/clipsruby/tmpltbin.h +108 -0
  321. data/ext/clipsruby/tmpltbsc.c +327 -0
  322. data/ext/clipsruby/tmpltbsc.h +87 -0
  323. data/ext/clipsruby/tmpltcmp.c +450 -0
  324. data/ext/clipsruby/tmpltcmp.h +57 -0
  325. data/ext/clipsruby/tmpltdef.c +584 -0
  326. data/ext/clipsruby/tmpltdef.h +155 -0
  327. data/ext/clipsruby/tmpltfun.c +2477 -0
  328. data/ext/clipsruby/tmpltfun.h +122 -0
  329. data/ext/clipsruby/tmpltlhs.c +379 -0
  330. data/ext/clipsruby/tmpltlhs.h +50 -0
  331. data/ext/clipsruby/tmpltpsr.c +819 -0
  332. data/ext/clipsruby/tmpltpsr.h +59 -0
  333. data/ext/clipsruby/tmpltrhs.c +595 -0
  334. data/ext/clipsruby/tmpltrhs.h +55 -0
  335. data/ext/clipsruby/tmpltutl.c +637 -0
  336. data/ext/clipsruby/tmpltutl.h +82 -0
  337. data/ext/clipsruby/userdata.c +156 -0
  338. data/ext/clipsruby/userdata.h +72 -0
  339. data/ext/clipsruby/userfunctions.c +70 -0
  340. data/ext/clipsruby/usrsetup.h +7 -0
  341. data/ext/clipsruby/utility.c +1594 -0
  342. data/ext/clipsruby/utility.h +250 -0
  343. data/ext/clipsruby/watch.c +865 -0
  344. data/ext/clipsruby/watch.h +124 -0
  345. data/lib/clipsruby.rb +1 -0
  346. metadata +388 -0
@@ -0,0 +1,62 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/18/16 */
5
+ /* */
6
+ /* */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
20
+ /* */
21
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
22
+ /* */
23
+ /* 6.30: Added const qualifiers to remove C++ */
24
+ /* deprecation warnings. */
25
+ /* */
26
+ /* Changed integer type/precision. */
27
+ /* */
28
+ /* 6.40: Removed LOCALE definition. */
29
+ /* */
30
+ /* Pragma once and other inclusion changes. */
31
+ /* */
32
+ /* Added support for booleans with <stdbool.h>. */
33
+ /* */
34
+ /* Removed use of void pointers for specific */
35
+ /* data structures. */
36
+ /* */
37
+ /* UDF redesign. */
38
+ /* */
39
+ /* Eval support for run time and bload only. */
40
+ /* */
41
+ /*************************************************************/
42
+
43
+ #ifndef _H_insmult
44
+
45
+ #pragma once
46
+
47
+ #define _H_insmult
48
+
49
+ #include "evaluatn.h"
50
+
51
+ void SetupInstanceMultifieldCommands(Environment *);
52
+ void MVSlotReplaceCommand(Environment *,UDFContext *,UDFValue *);
53
+ void MVSlotInsertCommand(Environment *,UDFContext *,UDFValue *);
54
+ void MVSlotDeleteCommand(Environment *,UDFContext *,UDFValue *);
55
+ void DirectMVReplaceCommand(Environment *,UDFContext *,UDFValue *);
56
+ void DirectMVInsertCommand(Environment *,UDFContext *,UDFValue *);
57
+ void DirectMVDeleteCommand(Environment *,UDFContext *,UDFValue *);
58
+
59
+ #endif /* _H_insmult */
60
+
61
+
62
+
@@ -0,0 +1,602 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 05/28/21 */
5
+ /* */
6
+ /* INSTANCE PARSER MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Instance Function Parsing Routines */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
20
+ /* */
21
+ /* Changed name of variable exp to theExp */
22
+ /* because of Unix compiler warnings of shadowed */
23
+ /* definitions. */
24
+ /* */
25
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
26
+ /* */
27
+ /* 6.30: Added const qualifiers to remove C++ */
28
+ /* deprecation warnings. */
29
+ /* */
30
+ /* Fixed ParseSlotOverrides memory release issue. */
31
+ /* */
32
+ /* It's now possible to create an instance of a */
33
+ /* class that's not in scope if the module name */
34
+ /* is specified. */
35
+ /* */
36
+ /* Added code to keep track of pointers to */
37
+ /* constructs that are contained externally to */
38
+ /* to constructs, DanglingConstructs. */
39
+ /* */
40
+ /* 6.40: Added Env prefix to GetEvaluationError and */
41
+ /* SetEvaluationError functions. */
42
+ /* */
43
+ /* Pragma once and other inclusion changes. */
44
+ /* */
45
+ /* Added support for booleans with <stdbool.h>. */
46
+ /* */
47
+ /* Removed use of void pointers for specific */
48
+ /* data structures. */
49
+ /* */
50
+ /* Eval support for run time and bload only. */
51
+ /* */
52
+ /* 6.41: Disallowed creation of instances when their */
53
+ /* class is being redefined. */
54
+ /* */
55
+ /*************************************************************/
56
+
57
+ /* =========================================
58
+ *****************************************
59
+ EXTERNAL DEFINITIONS
60
+ =========================================
61
+ ***************************************** */
62
+ #include "setup.h"
63
+
64
+ #if OBJECT_SYSTEM
65
+
66
+ #include <stdio.h>
67
+ #include <string.h>
68
+
69
+ #include "classcom.h"
70
+ #include "classfun.h"
71
+ #include "classinf.h"
72
+ #include "constant.h"
73
+ #include "envrnmnt.h"
74
+ #include "evaluatn.h"
75
+ #include "exprnpsr.h"
76
+ #include "moduldef.h"
77
+ #include "pprint.h"
78
+ #include "prntutil.h"
79
+ #include "router.h"
80
+
81
+ #include "inspsr.h"
82
+
83
+ /* =========================================
84
+ *****************************************
85
+ CONSTANTS
86
+ =========================================
87
+ ***************************************** */
88
+ #define MAKE_TYPE 0
89
+ #define INITIALIZE_TYPE 1
90
+ #define MODIFY_TYPE 2
91
+ #define DUPLICATE_TYPE 3
92
+
93
+ #define CLASS_RLN "of"
94
+ #define DUPLICATE_NAME_REF "to"
95
+
96
+ /***************************************/
97
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
98
+ /***************************************/
99
+
100
+ static bool ReplaceClassNameWithReference(Environment *,Expression *);
101
+
102
+ /* =========================================
103
+ *****************************************
104
+ EXTERNALLY VISIBLE FUNCTIONS
105
+ =========================================
106
+ ***************************************** */
107
+
108
+ /*************************************************************************************
109
+ NAME : ParseInitializeInstance
110
+ DESCRIPTION : Parses initialize-instance and make-instance function
111
+ calls into an Expression form that
112
+ can later be evaluated with EvaluateExpression(theEnv,)
113
+ INPUTS : 1) The address of the top node of the expression
114
+ containing the initialize-instance function call
115
+ 2) The logical name of the input source
116
+ RETURNS : The address of the modified expression, or NULL
117
+ if there is an error
118
+ SIDE EFFECTS : The expression is enhanced to include all
119
+ aspects of the initialize-instance call
120
+ (slot-overrides etc.)
121
+ The "top" expression is deleted on errors.
122
+ NOTES : This function parses a initialize-instance call into
123
+ an expression of the following form :
124
+
125
+ (initialize-instance <instance-name> <slot-override>*)
126
+ where <slot-override> ::= (<slot-name> <expression>+)
127
+
128
+ goes to -->
129
+
130
+ initialize-instance
131
+ |
132
+ V
133
+ <instance or name>-><slot-name>-><dummy-node>...
134
+ |
135
+ V
136
+ <value-expression>...
137
+
138
+ (make-instance <instance> of <class> <slot-override>*)
139
+ goes to -->
140
+
141
+ make-instance
142
+ |
143
+ V
144
+ <instance-name>-><class-name>-><slot-name>-><dummy-node>...
145
+ |
146
+ V
147
+ <value-expression>...
148
+
149
+ (make-instance of <class> <slot-override>*)
150
+ goes to -->
151
+
152
+ make-instance
153
+ |
154
+ V
155
+ (gensym*)-><class-name>-><slot-name>-><dummy-node>...
156
+ |
157
+ V
158
+ <value-expression>...
159
+
160
+ (modify-instance <instance> <slot-override>*)
161
+ goes to -->
162
+
163
+ modify-instance
164
+ |
165
+ V
166
+ <instance or name>-><slot-name>-><dummy-node>...
167
+ |
168
+ V
169
+ <value-expression>...
170
+
171
+ (duplicate-instance <instance> [to <new-name>] <slot-override>*)
172
+ goes to -->
173
+
174
+ duplicate-instance
175
+ |
176
+ V
177
+ <instance or name>-><new-name>-><slot-name>-><dummy-node>...
178
+ OR |
179
+ (gensym*) V
180
+ <value-expression>...
181
+
182
+ *************************************************************************************/
183
+ Expression *ParseInitializeInstance(
184
+ Environment *theEnv,
185
+ Expression *top,
186
+ const char *readSource)
187
+ {
188
+ bool error;
189
+ int fcalltype;
190
+ bool readclass;
191
+
192
+ if ((top->value == FindFunction(theEnv,"make-instance")) ||
193
+ (top->value == FindFunction(theEnv,"active-make-instance")))
194
+ fcalltype = MAKE_TYPE;
195
+ else if ((top->value == FindFunction(theEnv,"initialize-instance")) ||
196
+ (top->value == FindFunction(theEnv,"active-initialize-instance")))
197
+ fcalltype = INITIALIZE_TYPE;
198
+ else if ((top->value == FindFunction(theEnv,"modify-instance")) ||
199
+ (top->value == FindFunction(theEnv,"active-modify-instance")) ||
200
+ (top->value == FindFunction(theEnv,"message-modify-instance")) ||
201
+ (top->value == FindFunction(theEnv,"active-message-modify-instance")))
202
+ fcalltype = MODIFY_TYPE;
203
+ else
204
+ fcalltype = DUPLICATE_TYPE;
205
+ IncrementIndentDepth(theEnv,3);
206
+ error = false;
207
+ if (top->type == UNKNOWN_VALUE)
208
+ top->type = FCALL;
209
+ else
210
+ SavePPBuffer(theEnv," ");
211
+ top->argList = ArgumentParse(theEnv,readSource,&error);
212
+ if (error)
213
+ goto ParseInitializeInstanceError;
214
+ else if (top->argList == NULL)
215
+ {
216
+ SyntaxErrorMessage(theEnv,"instance");
217
+ goto ParseInitializeInstanceError;
218
+ }
219
+ SavePPBuffer(theEnv," ");
220
+
221
+ if (fcalltype == MAKE_TYPE)
222
+ {
223
+ /* ======================================
224
+ Handle the case of anonymous instances
225
+ where the name was not specified
226
+ ====================================== */
227
+ if ((top->argList->type != SYMBOL_TYPE) ? false :
228
+ (strcmp(top->argList->lexemeValue->contents,CLASS_RLN) == 0))
229
+ {
230
+ top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
231
+ if (error == true)
232
+ goto ParseInitializeInstanceError;
233
+ if (top->argList->nextArg == NULL)
234
+ {
235
+ SyntaxErrorMessage(theEnv,"instance class");
236
+ goto ParseInitializeInstanceError;
237
+ }
238
+ if ((top->argList->nextArg->type != SYMBOL_TYPE) ? true :
239
+ (strcmp(top->argList->nextArg->lexemeValue->contents,CLASS_RLN) != 0))
240
+ {
241
+ top->argList->type = FCALL;
242
+ top->argList->value = FindFunction(theEnv,"gensym*");
243
+ readclass = false;
244
+ }
245
+ else
246
+ readclass = true;
247
+ }
248
+ else
249
+ {
250
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
251
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
252
+ (strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) != 0))
253
+ {
254
+ SyntaxErrorMessage(theEnv,"make-instance");
255
+ goto ParseInitializeInstanceError;
256
+ }
257
+ SavePPBuffer(theEnv," ");
258
+ readclass = true;
259
+ }
260
+ if (readclass)
261
+ {
262
+ top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
263
+ if (error)
264
+ goto ParseInitializeInstanceError;
265
+ if (top->argList->nextArg == NULL)
266
+ {
267
+ SyntaxErrorMessage(theEnv,"instance class");
268
+ goto ParseInitializeInstanceError;
269
+ }
270
+ }
271
+
272
+ /* ==============================================
273
+ If the class name is a constant, go ahead and
274
+ look it up now and replace it with the pointer
275
+ ============================================== */
276
+ if (ReplaceClassNameWithReference(theEnv,top->argList->nextArg) == false)
277
+ goto ParseInitializeInstanceError;
278
+
279
+ PPCRAndIndent(theEnv);
280
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
281
+ top->argList->nextArg->nextArg =
282
+ ParseSlotOverrides(theEnv,readSource,&error);
283
+ }
284
+ else
285
+ {
286
+ PPCRAndIndent(theEnv);
287
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
288
+ if (fcalltype == DUPLICATE_TYPE)
289
+ {
290
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? false :
291
+ (strcmp(DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents,DUPLICATE_NAME_REF) == 0))
292
+ {
293
+ PPBackup(theEnv);
294
+ PPBackup(theEnv);
295
+ SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
296
+ SavePPBuffer(theEnv," ");
297
+ top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
298
+ if (error)
299
+ goto ParseInitializeInstanceError;
300
+ if (top->argList->nextArg == NULL)
301
+ {
302
+ SyntaxErrorMessage(theEnv,"instance name");
303
+ goto ParseInitializeInstanceError;
304
+ }
305
+ PPCRAndIndent(theEnv);
306
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
307
+ }
308
+ else
309
+ top->argList->nextArg = GenConstant(theEnv,FCALL,FindFunction(theEnv,"gensym*"));
310
+ top->argList->nextArg->nextArg = ParseSlotOverrides(theEnv,readSource,&error);
311
+ }
312
+ else
313
+ top->argList->nextArg = ParseSlotOverrides(theEnv,readSource,&error);
314
+ }
315
+ if (error)
316
+ goto ParseInitializeInstanceError;
317
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
318
+ {
319
+ SyntaxErrorMessage(theEnv,"slot-override");
320
+ goto ParseInitializeInstanceError;
321
+ }
322
+ DecrementIndentDepth(theEnv,3);
323
+ return(top);
324
+
325
+ ParseInitializeInstanceError:
326
+ SetEvaluationError(theEnv,true);
327
+ ReturnExpression(theEnv,top);
328
+ DecrementIndentDepth(theEnv,3);
329
+ return NULL;
330
+ }
331
+
332
+ /********************************************************************************
333
+ NAME : ParseSlotOverrides
334
+ DESCRIPTION : Forms expressions for slot-overrides
335
+ INPUTS : 1) The logical name of the input
336
+ 2) Caller's buffer for error flkag
337
+ RETURNS : Address override expressions, NULL
338
+ if none or error.
339
+ SIDE EFFECTS : Slot-expression built
340
+ Caller's error flag set
341
+ NOTES : <slot-override> ::= (<slot-name> <value>*)*
342
+
343
+ goes to
344
+
345
+ <slot-name> --> <dummy-node> --> <slot-name> --> <dummy-node>...
346
+ |
347
+ V
348
+ <value-expression> --> <value-expression> --> ...
349
+
350
+ Assumes first token has already been scanned
351
+ ********************************************************************************/
352
+ Expression *ParseSlotOverrides(
353
+ Environment *theEnv,
354
+ const char *readSource,
355
+ bool *error)
356
+ {
357
+ Expression *top = NULL,*bot = NULL,*theExp;
358
+ Expression *theExpNext;
359
+
360
+ while (DefclassData(theEnv)->ObjectParseToken.tknType == LEFT_PARENTHESIS_TOKEN)
361
+ {
362
+ *error = false;
363
+ theExp = ArgumentParse(theEnv,readSource,error);
364
+ if (*error == true)
365
+ {
366
+ ReturnExpression(theEnv,top);
367
+ return NULL;
368
+ }
369
+ else if (theExp == NULL)
370
+ {
371
+ SyntaxErrorMessage(theEnv,"slot-override");
372
+ *error = true;
373
+ ReturnExpression(theEnv,top);
374
+ SetEvaluationError(theEnv,true);
375
+ return NULL;
376
+ }
377
+ theExpNext = GenConstant(theEnv,SYMBOL_TYPE,TrueSymbol(theEnv));
378
+ if (CollectArguments(theEnv,theExpNext,readSource) == NULL)
379
+ {
380
+ *error = true;
381
+ ReturnExpression(theEnv,top);
382
+ ReturnExpression(theEnv,theExp);
383
+ return NULL;
384
+ }
385
+ theExp->nextArg = theExpNext;
386
+ if (top == NULL)
387
+ top = theExp;
388
+ else
389
+ bot->nextArg = theExp;
390
+ bot = theExp->nextArg;
391
+ PPCRAndIndent(theEnv);
392
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
393
+ }
394
+ PPBackup(theEnv);
395
+ PPBackup(theEnv);
396
+ SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
397
+ return(top);
398
+ }
399
+
400
+ /****************************************************************************
401
+ NAME : ParseSimpleInstance
402
+ DESCRIPTION : Parses instances from file for load-instances
403
+ into an Expression forms that
404
+ can later be evaluated with EvaluateExpression(theEnv,)
405
+ INPUTS : 1) The address of the top node of the expression
406
+ containing the make-instance function call
407
+ 2) The logical name of the input source
408
+ RETURNS : The address of the modified expression, or NULL
409
+ if there is an error
410
+ SIDE EFFECTS : The expression is enhanced to include all
411
+ aspects of the make-instance call
412
+ (slot-overrides etc.)
413
+ The "top" expression is deleted on errors.
414
+ NOTES : The name, class, values etc. must be constants.
415
+
416
+ This function parses a make-instance call into
417
+ an expression of the following form :
418
+
419
+ (make-instance <instance> of <class> <slot-override>*)
420
+ where <slot-override> ::= (<slot-name> <expression>+)
421
+
422
+ goes to -->
423
+
424
+ make-instance
425
+ |
426
+ V
427
+ <instance-name>-><class-name>-><slot-name>-><dummy-node>...
428
+ |
429
+ V
430
+ <value-expression>...
431
+
432
+ ****************************************************************************/
433
+ Expression *ParseSimpleInstance(
434
+ Environment *theEnv,
435
+ Expression *top,
436
+ const char *readSource)
437
+ {
438
+ Expression *theExp,*vals = NULL,*vbot,*tval;
439
+ TokenType type;
440
+
441
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
442
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType != INSTANCE_NAME_TOKEN) &&
443
+ (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN))
444
+ goto MakeInstanceError;
445
+
446
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType == SYMBOL_TOKEN) &&
447
+ (strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) == 0))
448
+ {
449
+ top->argList = GenConstant(theEnv,FCALL,
450
+ (void *) FindFunction(theEnv,"gensym*"));
451
+ }
452
+ else
453
+ {
454
+ top->argList = GenConstant(theEnv,INSTANCE_NAME_TYPE,
455
+ DefclassData(theEnv)->ObjectParseToken.value);
456
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
457
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
458
+ (strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) != 0))
459
+ goto MakeInstanceError;
460
+ }
461
+
462
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
463
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
464
+ goto MakeInstanceError;
465
+ top->argList->nextArg =
466
+ GenConstant(theEnv,SYMBOL_TYPE,DefclassData(theEnv)->ObjectParseToken.value);
467
+ theExp = top->argList->nextArg;
468
+ if (ReplaceClassNameWithReference(theEnv,theExp) == false)
469
+ goto MakeInstanceError;
470
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
471
+ while (DefclassData(theEnv)->ObjectParseToken.tknType == LEFT_PARENTHESIS_TOKEN)
472
+ {
473
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
474
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
475
+ goto SlotOverrideError;
476
+ theExp->nextArg = GenConstant(theEnv,SYMBOL_TYPE,DefclassData(theEnv)->ObjectParseToken.value);
477
+ theExp->nextArg->nextArg = GenConstant(theEnv,SYMBOL_TYPE,TrueSymbol(theEnv));
478
+ theExp = theExp->nextArg->nextArg;
479
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
480
+ vbot = NULL;
481
+ while (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
482
+ {
483
+ type = DefclassData(theEnv)->ObjectParseToken.tknType;
484
+ if (type == LEFT_PARENTHESIS_TOKEN)
485
+ {
486
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
487
+ if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
488
+ (strcmp(DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents,"create$") != 0))
489
+ goto SlotOverrideError;
490
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
491
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
492
+ goto SlotOverrideError;
493
+ tval = GenConstant(theEnv,FCALL,FindFunction(theEnv,"create$"));
494
+ }
495
+ else
496
+ {
497
+ if ((type != SYMBOL_TOKEN) && (type != STRING_TOKEN) &&
498
+ (type != FLOAT_TOKEN) && (type != INTEGER_TOKEN) && (type != INSTANCE_NAME_TOKEN))
499
+ goto SlotOverrideError;
500
+ tval = GenConstant(theEnv,TokenTypeToType(type),DefclassData(theEnv)->ObjectParseToken.value);
501
+ }
502
+ if (vals == NULL)
503
+ vals = tval;
504
+ else
505
+ vbot->nextArg = tval;
506
+ vbot = tval;
507
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
508
+ }
509
+ theExp->argList = vals;
510
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
511
+ vals = NULL;
512
+ }
513
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
514
+ goto SlotOverrideError;
515
+ return(top);
516
+
517
+ MakeInstanceError:
518
+ SyntaxErrorMessage(theEnv,"make-instance");
519
+ SetEvaluationError(theEnv,true);
520
+ ReturnExpression(theEnv,top);
521
+ return NULL;
522
+
523
+ SlotOverrideError:
524
+ SyntaxErrorMessage(theEnv,"slot-override");
525
+ SetEvaluationError(theEnv,true);
526
+ ReturnExpression(theEnv,top);
527
+ ReturnExpression(theEnv,vals);
528
+ return NULL;
529
+ }
530
+
531
+ /* =========================================
532
+ *****************************************
533
+ INTERNALLY VISIBLE FUNCTIONS
534
+ =========================================
535
+ ***************************************** */
536
+
537
+ /***************************************************
538
+ NAME : ReplaceClassNameWithReference
539
+ DESCRIPTION : In parsing a make instance call,
540
+ this function replaces a constant
541
+ class name with an actual pointer
542
+ to the class
543
+ INPUTS : The expression
544
+ RETURNS : True if all OK, false
545
+ if class cannot be found
546
+ SIDE EFFECTS : The expression type and value are
547
+ modified if class is found
548
+ NOTES : Searches current nd imported
549
+ modules for reference
550
+ CHANGES : It's now possible to create an instance of a
551
+ class that's not in scope if the module name
552
+ is specified.
553
+ ***************************************************/
554
+ static bool ReplaceClassNameWithReference(
555
+ Environment *theEnv,
556
+ Expression *theExp)
557
+ {
558
+ const char *theClassName;
559
+ Defclass *theDefclass;
560
+
561
+ if (theExp->type == SYMBOL_TYPE)
562
+ {
563
+ theClassName = theExp->lexemeValue->contents;
564
+ //theDefclass = (void *) LookupDefclassInScope(theEnv,theClassName);
565
+ theDefclass = LookupDefclassByMdlOrScope(theEnv,theClassName); // Module or scope is now allowed
566
+ if (theDefclass == NULL)
567
+ {
568
+ CantFindItemErrorMessage(theEnv,"class",theClassName,true);
569
+ return false;
570
+ }
571
+ if (ClassAbstractP(theDefclass))
572
+ {
573
+ PrintErrorID(theEnv,"INSMNGR",3,false);
574
+ WriteString(theEnv,STDERR,"Cannot create instances of abstract class '");
575
+ WriteString(theEnv,STDERR,theClassName);
576
+ WriteString(theEnv,STDERR,"'.\n");
577
+ return false;
578
+ }
579
+ if (theDefclass == DefclassData(theEnv)->RedefiningClass)
580
+ {
581
+ PrintErrorID(theEnv,"INSMNGR",17,false);
582
+ WriteString(theEnv,STDERR,"Cannot reference class '");
583
+ WriteString(theEnv,STDERR,theClassName);
584
+ WriteString(theEnv,STDERR,"' while it's being redefined.\n");
585
+ return false;
586
+ }
587
+
588
+ theExp->type = DEFCLASS_PTR;
589
+ theExp->value = theDefclass;
590
+
591
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
592
+ if (! ConstructData(theEnv)->ParsingConstruct)
593
+ { ConstructData(theEnv)->DanglingConstructs++; }
594
+ #endif
595
+ }
596
+ return true;
597
+ }
598
+
599
+ #endif
600
+
601
+
602
+