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,1087 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 07/23/21 */
5
+ /* */
6
+ /* DEFGLOBAL MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides core routines for the creation and */
11
+ /* maintenance of the defglobal construct. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* Brian L. Dantes */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
22
+ /* */
23
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
24
+ /* */
25
+ /* Corrected code to remove run-time program */
26
+ /* compiler warning. */
27
+ /* */
28
+ /* 6.30: Removed conditional code for unsupported */
29
+ /* compilers/operating systems (IBM_MCW, */
30
+ /* MAC_MCW, and IBM_TBC). */
31
+ /* */
32
+ /* Changed garbage collection algorithm. */
33
+ /* */
34
+ /* Added const qualifiers to remove C++ */
35
+ /* deprecation warnings. */
36
+ /* */
37
+ /* Converted API macros to function calls. */
38
+ /* */
39
+ /* Fixed linkage issue when BLOAD_ONLY compiler */
40
+ /* flag is set to 1. */
41
+ /* */
42
+ /* Changed find construct functionality so that */
43
+ /* imported modules are search when locating a */
44
+ /* named construct. */
45
+ /* */
46
+ /* 6.32: Fixed issue with optimized join network */
47
+ /* expression evaluation. */
48
+ /* */
49
+ /* 6.40: Added Env prefix to GetEvaluationError and */
50
+ /* SetEvaluationError functions. */
51
+ /* */
52
+ /* Pragma once and other inclusion changes. */
53
+ /* */
54
+ /* Added support for booleans with <stdbool.h>. */
55
+ /* */
56
+ /* Removed use of void pointers for specific */
57
+ /* data structures. */
58
+ /* */
59
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
60
+ /* */
61
+ /* UDF redesign. */
62
+ /* */
63
+ /* Use of ?<var>, $?<var>, ?*<var>, and $?*var* */
64
+ /* by itself at the command prompt and within */
65
+ /* the eval function now consistently returns the */
66
+ /* value of the variable. */
67
+ /* */
68
+ /*************************************************************/
69
+
70
+ #include "setup.h"
71
+
72
+ #if DEFGLOBAL_CONSTRUCT
73
+
74
+ #include <stdio.h>
75
+
76
+ #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
77
+ #include "bload.h"
78
+ #include "globlbin.h"
79
+ #endif
80
+ #include "commline.h"
81
+ #include "envrnmnt.h"
82
+ #include "globlbsc.h"
83
+ #if CONSTRUCT_COMPILER && (! RUN_TIME)
84
+ #include "globlcmp.h"
85
+ #endif
86
+ #include "globlcom.h"
87
+ #include "globlpsr.h"
88
+ #include "memalloc.h"
89
+ #include "modulpsr.h"
90
+ #include "modulutl.h"
91
+ #include "multifld.h"
92
+ #include "prntutil.h"
93
+ #include "router.h"
94
+ #include "strngrtr.h"
95
+ #include "utility.h"
96
+
97
+ #include "globldef.h"
98
+
99
+ /***************************************/
100
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
101
+ /***************************************/
102
+
103
+ static void *AllocateModule(Environment *);
104
+ static void ReturnModule(Environment *,void *);
105
+ static void ReturnDefglobal(Environment *,Defglobal *);
106
+ static void InitializeDefglobalModules(Environment *);
107
+ static bool EntityGetDefglobalValue(Environment *,void *,UDFValue *);
108
+ static void IncrementDefglobalBusyCount(Environment *,Defglobal *);
109
+ static void DecrementDefglobalBusyCount(Environment *,Defglobal *);
110
+ static void DeallocateDefglobalData(Environment *);
111
+ static void DestroyDefglobalAction(Environment *,ConstructHeader *,void *);
112
+ #if (! BLOAD_ONLY)
113
+ static void DestroyDefglobal(Environment *,Defglobal *);
114
+ #endif
115
+ #if RUN_TIME
116
+ static void RuntimeDefglobalAction(Environment *,ConstructHeader *,void *);
117
+ #endif
118
+
119
+ /**************************************************************/
120
+ /* InitializeDefglobals: Initializes the defglobal construct. */
121
+ /**************************************************************/
122
+ void InitializeDefglobals(
123
+ Environment *theEnv)
124
+ {
125
+ struct entityRecord globalInfo = { "GBL_VARIABLE", GBL_VARIABLE,0,0,0,
126
+ NULL,
127
+ NULL,
128
+ NULL,
129
+ (EntityEvaluationFunction *) EntityGetDefglobalValue,
130
+ NULL,NULL,
131
+ NULL,NULL,NULL,NULL,NULL,NULL };
132
+
133
+ struct entityRecord defglobalPtrRecord = { "DEFGLOBAL_PTR", DEFGLOBAL_PTR,0,0,0,
134
+ NULL,NULL,NULL,
135
+ (EntityEvaluationFunction *) QGetDefglobalUDFValue,
136
+ NULL,
137
+ (EntityBusyCountFunction *) DecrementDefglobalBusyCount,
138
+ (EntityBusyCountFunction *) IncrementDefglobalBusyCount,
139
+ NULL,NULL,NULL,NULL,NULL };
140
+
141
+ AllocateEnvironmentData(theEnv,DEFGLOBAL_DATA,sizeof(struct defglobalData),DeallocateDefglobalData);
142
+
143
+ memcpy(&DefglobalData(theEnv)->GlobalInfo,&globalInfo,sizeof(struct entityRecord));
144
+ memcpy(&DefglobalData(theEnv)->DefglobalPtrRecord,&defglobalPtrRecord,sizeof(struct entityRecord));
145
+
146
+ DefglobalData(theEnv)->ResetGlobals = true;
147
+ DefglobalData(theEnv)->LastModuleIndex = -1;
148
+
149
+ InstallPrimitive(theEnv,&DefglobalData(theEnv)->GlobalInfo,GBL_VARIABLE);
150
+ InstallPrimitive(theEnv,&DefglobalData(theEnv)->GlobalInfo,MF_GBL_VARIABLE);
151
+ InstallPrimitive(theEnv,&DefglobalData(theEnv)->DefglobalPtrRecord,DEFGLOBAL_PTR);
152
+
153
+ InitializeDefglobalModules(theEnv);
154
+
155
+ DefglobalBasicCommands(theEnv);
156
+ DefglobalCommandDefinitions(theEnv);
157
+
158
+ DefglobalData(theEnv)->DefglobalConstruct =
159
+ AddConstruct(theEnv,"defglobal","defglobals",ParseDefglobal,
160
+ (FindConstructFunction *) FindDefglobal,
161
+ GetConstructNamePointer,GetConstructPPForm,
162
+ GetConstructModuleItem,
163
+ (GetNextConstructFunction *) GetNextDefglobal,
164
+ SetNextConstruct,
165
+ (IsConstructDeletableFunction *) DefglobalIsDeletable,
166
+ (DeleteConstructFunction *) Undefglobal,
167
+ (FreeConstructFunction *) ReturnDefglobal);
168
+ }
169
+
170
+ /****************************************************/
171
+ /* DeallocateDefglobalData: Deallocates environment */
172
+ /* data for the defglobal construct. */
173
+ /****************************************************/
174
+ static void DeallocateDefglobalData(
175
+ Environment *theEnv)
176
+ {
177
+ #if ! RUN_TIME
178
+ struct defglobalModule *theModuleItem;
179
+ Defmodule *theModule;
180
+
181
+ #if BLOAD || BLOAD_AND_BSAVE
182
+ if (Bloaded(theEnv)) return;
183
+ #endif
184
+
185
+ DoForAllConstructs(theEnv,DestroyDefglobalAction,
186
+ DefglobalData(theEnv)->DefglobalModuleIndex,false,NULL);
187
+
188
+ for (theModule = GetNextDefmodule(theEnv,NULL);
189
+ theModule != NULL;
190
+ theModule = GetNextDefmodule(theEnv,theModule))
191
+ {
192
+ theModuleItem = (struct defglobalModule *)
193
+ GetModuleItem(theEnv,theModule,
194
+ DefglobalData(theEnv)->DefglobalModuleIndex);
195
+ rtn_struct(theEnv,defglobalModule,theModuleItem);
196
+ }
197
+ #else
198
+ DoForAllConstructs(theEnv,DestroyDefglobalAction,DefglobalData(theEnv)->DefglobalModuleIndex,false,NULL);
199
+ #endif
200
+ }
201
+
202
+ /***************************************************/
203
+ /* DestroyDefglobalAction: Action used to remove */
204
+ /* defglobals as a result of DestroyEnvironment. */
205
+ /***************************************************/
206
+ static void DestroyDefglobalAction(
207
+ Environment *theEnv,
208
+ ConstructHeader *theConstruct,
209
+ void *buffer)
210
+ {
211
+ #if MAC_XCD
212
+ #pragma unused(buffer)
213
+ #endif
214
+ #if (! BLOAD_ONLY)
215
+ Defglobal *theDefglobal = (Defglobal *) theConstruct;
216
+
217
+ if (theDefglobal == NULL) return;
218
+
219
+ DestroyDefglobal(theEnv,theDefglobal);
220
+ #else
221
+ #if MAC_XCD
222
+ #pragma unused(theEnv,theConstruct)
223
+ #endif
224
+ #endif
225
+ }
226
+
227
+ /*********************************************************/
228
+ /* InitializeDefglobalModules: Initializes the defglobal */
229
+ /* construct for use with the defmodule construct. */
230
+ /*********************************************************/
231
+ static void InitializeDefglobalModules(
232
+ Environment *theEnv)
233
+ {
234
+ DefglobalData(theEnv)->DefglobalModuleIndex = RegisterModuleItem(theEnv,"defglobal",
235
+ AllocateModule,
236
+ ReturnModule,
237
+ #if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY
238
+ BloadDefglobalModuleReference,
239
+ #else
240
+ NULL,
241
+ #endif
242
+ #if CONSTRUCT_COMPILER && (! RUN_TIME)
243
+ DefglobalCModuleReference,
244
+ #else
245
+ NULL,
246
+ #endif
247
+ (FindConstructFunction *) FindDefglobalInModule);
248
+
249
+ #if (! BLOAD_ONLY) && (! RUN_TIME) && DEFMODULE_CONSTRUCT
250
+ AddPortConstructItem(theEnv,"defglobal",SYMBOL_TOKEN);
251
+ #endif
252
+ }
253
+
254
+ /*************************************************/
255
+ /* AllocateModule: Allocates a defglobal module. */
256
+ /*************************************************/
257
+ static void *AllocateModule(
258
+ Environment *theEnv)
259
+ {
260
+ return (void *) get_struct(theEnv,defglobalModule);
261
+ }
262
+
263
+ /*************************************************/
264
+ /* ReturnModule: Deallocates a defglobal module. */
265
+ /*************************************************/
266
+ static void ReturnModule(
267
+ Environment *theEnv,
268
+ void *theItem)
269
+ {
270
+ FreeConstructHeaderModule(theEnv,(struct defmoduleItemHeader *) theItem,DefglobalData(theEnv)->DefglobalConstruct);
271
+ rtn_struct(theEnv,defglobalModule,theItem);
272
+ }
273
+
274
+ /**************************************************************/
275
+ /* GetDefglobalModuleItem: Returns a pointer to the defmodule */
276
+ /* item for the specified defglobal or defmodule. */
277
+ /**************************************************************/
278
+ struct defglobalModule *GetDefglobalModuleItem(
279
+ Environment *theEnv,
280
+ Defmodule *theModule)
281
+ {
282
+ return((struct defglobalModule *) GetConstructModuleItemByIndex(theEnv,theModule,DefglobalData(theEnv)->DefglobalModuleIndex));
283
+ }
284
+
285
+ /**************************************************/
286
+ /* FindDefglobal: Searches for a defglobal in the */
287
+ /* list of defglobals. Returns a pointer to the */
288
+ /* defglobal if found, otherwise NULL. */
289
+ /**************************************************/
290
+ Defglobal *FindDefglobal(
291
+ Environment *theEnv,
292
+ const char *defglobalName)
293
+ {
294
+ return (Defglobal *) FindNamedConstructInModuleOrImports(theEnv,defglobalName,DefglobalData(theEnv)->DefglobalConstruct);
295
+ }
296
+
297
+ /******************************************************/
298
+ /* FindDefglobalInModule: Searches for a defglobal in */
299
+ /* the list of defglobals. Returns a pointer to the */
300
+ /* defglobal if found, otherwise NULL. */
301
+ /******************************************************/
302
+ Defglobal *FindDefglobalInModule(
303
+ Environment *theEnv,
304
+ const char *defglobalName)
305
+ {
306
+ return (Defglobal *) FindNamedConstructInModule(theEnv,defglobalName,DefglobalData(theEnv)->DefglobalConstruct);
307
+ }
308
+
309
+ /*****************************************************************/
310
+ /* GetNextDefglobal: If passed a NULL pointer, returns the first */
311
+ /* defglobal in the defglobal list. Otherwise returns the next */
312
+ /* defglobal following the defglobal passed as an argument. */
313
+ /*****************************************************************/
314
+ Defglobal *GetNextDefglobal(
315
+ Environment *theEnv,
316
+ Defglobal *defglobalPtr)
317
+ {
318
+ return (Defglobal *) GetNextConstructItem(theEnv,&defglobalPtr->header,DefglobalData(theEnv)->DefglobalModuleIndex);
319
+ }
320
+
321
+ /********************************************************/
322
+ /* DefglobalIsDeletable: Returns true if a particular */
323
+ /* defglobal can be deleted, otherwise returns false. */
324
+ /********************************************************/
325
+ bool DefglobalIsDeletable(
326
+ Defglobal *theDefglobal)
327
+ {
328
+ Environment *theEnv = theDefglobal->header.env;
329
+
330
+ if (! ConstructsDeletable(theEnv))
331
+ { return false; }
332
+
333
+ if (theDefglobal->busyCount) return false;
334
+
335
+ return true;
336
+ }
337
+
338
+ /************************************************************/
339
+ /* ReturnDefglobal: Returns the data structures associated */
340
+ /* with a defglobal construct to the pool of free memory. */
341
+ /************************************************************/
342
+ static void ReturnDefglobal(
343
+ Environment *theEnv,
344
+ Defglobal *theDefglobal)
345
+ {
346
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
347
+ if (theDefglobal == NULL) return;
348
+
349
+ /*====================================*/
350
+ /* Return the global's current value. */
351
+ /*====================================*/
352
+
353
+ Release(theEnv,theDefglobal->current.header);
354
+ if (theDefglobal->current.header->type == MULTIFIELD_TYPE)
355
+ {
356
+ if (theDefglobal->current.multifieldValue->busyCount == 0)
357
+ { ReturnMultifield(theEnv,theDefglobal->current.multifieldValue); }
358
+ else
359
+ { AddToMultifieldList(theEnv,theDefglobal->current.multifieldValue); }
360
+ }
361
+
362
+ /*================================================*/
363
+ /* Return the expression representing the initial */
364
+ /* value of the defglobal when it was defined. */
365
+ /*================================================*/
366
+
367
+ RemoveHashedExpression(theEnv,theDefglobal->initial);
368
+
369
+ /*===============================*/
370
+ /* Release items stored in the */
371
+ /* defglobal's construct header. */
372
+ /*===============================*/
373
+
374
+ DeinstallConstructHeader(theEnv,&theDefglobal->header);
375
+
376
+ /*======================================*/
377
+ /* Return the defglobal data structure. */
378
+ /*======================================*/
379
+
380
+ rtn_struct(theEnv,defglobal,theDefglobal);
381
+
382
+ /*===========================================*/
383
+ /* Set the variable indicating that a change */
384
+ /* has been made to a global variable. */
385
+ /*===========================================*/
386
+
387
+ DefglobalData(theEnv)->ChangeToGlobals = true;
388
+ #endif
389
+ }
390
+
391
+ /************************************************************/
392
+ /* DestroyDefglobal: Returns the data structures associated */
393
+ /* with a defglobal construct to the pool of free memory. */
394
+ /************************************************************/
395
+ #if (! BLOAD_ONLY)
396
+ static void DestroyDefglobal(
397
+ Environment *theEnv,
398
+ Defglobal *theDefglobal)
399
+ {
400
+ if (theDefglobal == NULL) return;
401
+
402
+ /*====================================*/
403
+ /* Return the global's current value. */
404
+ /*====================================*/
405
+
406
+ if (theDefglobal->current.header->type == MULTIFIELD_TYPE)
407
+ {
408
+ if (theDefglobal->current.multifieldValue->busyCount == 0)
409
+ { ReturnMultifield(theEnv,theDefglobal->current.multifieldValue); }
410
+ else
411
+ { AddToMultifieldList(theEnv,theDefglobal->current.multifieldValue); }
412
+ }
413
+
414
+ #if (! RUN_TIME)
415
+
416
+ /*===============================*/
417
+ /* Release items stored in the */
418
+ /* defglobal's construct header. */
419
+ /*===============================*/
420
+
421
+ DeinstallConstructHeader(theEnv,&theDefglobal->header);
422
+
423
+ /*======================================*/
424
+ /* Return the defglobal data structure. */
425
+ /*======================================*/
426
+
427
+ rtn_struct(theEnv,defglobal,theDefglobal);
428
+ #endif
429
+ }
430
+ #endif
431
+
432
+ /************************************************/
433
+ /* QSetDefglobalValue: Lowest level routine for */
434
+ /* setting a defglobal's value. */
435
+ /************************************************/
436
+ void QSetDefglobalValue(
437
+ Environment *theEnv,
438
+ Defglobal *theGlobal,
439
+ UDFValue *vPtr,
440
+ bool resetVar)
441
+ {
442
+ CLIPSValue newValue;
443
+
444
+ /*====================================================*/
445
+ /* If the new value passed for the defglobal is NULL, */
446
+ /* then reset the defglobal to the initial value it */
447
+ /* had when it was defined. */
448
+ /*====================================================*/
449
+
450
+ if (resetVar)
451
+ {
452
+ EvaluateExpression(theEnv,theGlobal->initial,vPtr);
453
+ if (EvaluationData(theEnv)->EvaluationError)
454
+ { vPtr->value = FalseSymbol(theEnv); }
455
+ }
456
+
457
+ /*==========================================*/
458
+ /* If globals are being watch, then display */
459
+ /* the change to the global variable. */
460
+ /*==========================================*/
461
+
462
+ #if DEBUGGING_FUNCTIONS
463
+ if (theGlobal->watch &&
464
+ (! ConstructData(theEnv)->ClearReadyInProgress) &&
465
+ (! ConstructData(theEnv)->ClearInProgress))
466
+ {
467
+ WriteString(theEnv,STDOUT,":== ?*");
468
+ WriteString(theEnv,STDOUT,theGlobal->header.name->contents);
469
+ WriteString(theEnv,STDOUT,"* ==> ");
470
+ WriteUDFValue(theEnv,STDOUT,vPtr);
471
+ WriteString(theEnv,STDOUT," <== ");
472
+ WriteCLIPSValue(theEnv,STDOUT,&theGlobal->current);
473
+ WriteString(theEnv,STDOUT,"\n");
474
+ }
475
+ #endif
476
+
477
+ /*==============================================*/
478
+ /* Retain the new value of the global variable. */
479
+ /*==============================================*/
480
+
481
+ NormalizeMultifield(theEnv,vPtr);
482
+ if (vPtr->header->type != MULTIFIELD_TYPE)
483
+ { newValue.value = vPtr->value; }
484
+ else
485
+ { newValue.value = CopyMultifield(theEnv,vPtr->multifieldValue); }
486
+ Retain(theEnv,newValue.header);
487
+
488
+ /*==============================================*/
489
+ /* Remove the old value of the global variable. */
490
+ /*==============================================*/
491
+
492
+ Release(theEnv,theGlobal->current.header);
493
+ if (theGlobal->current.header->type == MULTIFIELD_TYPE)
494
+ {
495
+ if (theGlobal->current.multifieldValue->busyCount == 0)
496
+ { ReturnMultifield(theEnv,theGlobal->current.multifieldValue); }
497
+ else
498
+ { AddToMultifieldList(theEnv,theGlobal->current.multifieldValue); }
499
+ }
500
+
501
+ /*===========================================*/
502
+ /* Set the new value of the global variable. */
503
+ /*===========================================*/
504
+
505
+ theGlobal->current.value = newValue.value;
506
+
507
+ /*===========================================*/
508
+ /* Set the variable indicating that a change */
509
+ /* has been made to a global variable. */
510
+ /*===========================================*/
511
+
512
+ DefglobalData(theEnv)->ChangeToGlobals = true;
513
+
514
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
515
+ {
516
+ CleanCurrentGarbageFrame(theEnv,NULL);
517
+ CallPeriodicTasks(theEnv);
518
+ }
519
+ }
520
+
521
+ /**************************************************************/
522
+ /* QFindDefglobal: Searches for a defglobal in the list of */
523
+ /* defglobals. Returns a pointer to the defglobal if found, */
524
+ /* otherwise NULL. */
525
+ /**************************************************************/
526
+ Defglobal *QFindDefglobal(
527
+ Environment *theEnv,
528
+ CLIPSLexeme *defglobalName)
529
+ {
530
+ Defglobal *theDefglobal;
531
+
532
+ for (theDefglobal = GetNextDefglobal(theEnv,NULL);
533
+ theDefglobal != NULL;
534
+ theDefglobal = GetNextDefglobal(theEnv,theDefglobal))
535
+ { if (defglobalName == theDefglobal->header.name) return theDefglobal; }
536
+
537
+ return NULL;
538
+ }
539
+
540
+ /*******************************************************************/
541
+ /* DefglobalValueForm: Returns the pretty print representation of */
542
+ /* the current value of the specified defglobal. For example, if */
543
+ /* the current value of ?*x* is 5, the string "?*x* = 5" would */
544
+ /* be returned. */
545
+ /*******************************************************************/
546
+ void DefglobalValueForm(
547
+ Defglobal *theGlobal,
548
+ StringBuilder *theSB)
549
+ {
550
+ Environment *theEnv = theGlobal->header.env;
551
+
552
+ OpenStringBuilderDestination(theEnv,"GlobalValueForm",theSB);
553
+ WriteString(theEnv,"GlobalValueForm","?*");
554
+ WriteString(theEnv,"GlobalValueForm",theGlobal->header.name->contents);
555
+ WriteString(theEnv,"GlobalValueForm","* = ");
556
+ WriteCLIPSValue(theEnv,"GlobalValueForm",&theGlobal->current);
557
+ CloseStringBuilderDestination(theEnv,"GlobalValueForm");
558
+ }
559
+
560
+ /*********************************************************/
561
+ /* GetGlobalsChanged: Returns the defglobal change flag. */
562
+ /*********************************************************/
563
+ bool GetGlobalsChanged(
564
+ Environment *theEnv)
565
+ {
566
+ return DefglobalData(theEnv)->ChangeToGlobals;
567
+ }
568
+
569
+ /******************************************************/
570
+ /* SetGlobalsChanged: Sets the defglobal change flag. */
571
+ /******************************************************/
572
+ void SetGlobalsChanged(
573
+ Environment *theEnv,
574
+ bool value)
575
+ {
576
+ DefglobalData(theEnv)->ChangeToGlobals = value;
577
+ }
578
+
579
+ /*********************************************************/
580
+ /* EntityGetDefglobalValue: Returns the value of the */
581
+ /* specified global variable in the supplied UDFValue. */
582
+ /*********************************************************/
583
+ static bool EntityGetDefglobalValue(
584
+ Environment *theEnv,
585
+ void *theValue,
586
+ UDFValue *vPtr)
587
+ {
588
+ Defglobal *theGlobal;
589
+ unsigned int count;
590
+
591
+ /*===========================================*/
592
+ /* Search for the specified defglobal in the */
593
+ /* modules visible to the current module. */
594
+ /*===========================================*/
595
+
596
+ theGlobal = (Defglobal *)
597
+ FindImportedConstruct(theEnv,"defglobal",NULL,((CLIPSLexeme *) theValue)->contents,
598
+ &count,true,NULL);
599
+
600
+ /*=============================================*/
601
+ /* If it wasn't found, print an error message. */
602
+ /*=============================================*/
603
+
604
+ if (theGlobal == NULL)
605
+ {
606
+ PrintErrorID(theEnv,"GLOBLDEF",1,false);
607
+ WriteString(theEnv,STDERR,"Global variable ?*");
608
+ WriteString(theEnv,STDERR,((CLIPSLexeme *) theValue)->contents);
609
+ WriteString(theEnv,STDERR,"* is unbound.\n");
610
+ vPtr->value = FalseSymbol(theEnv);
611
+ SetEvaluationError(theEnv,true);
612
+ return false;
613
+ }
614
+
615
+ /*========================================================*/
616
+ /* The current implementation of the defmodules shouldn't */
617
+ /* allow a construct to be defined which would cause an */
618
+ /* ambiguous reference, but we'll check for it anyway. */
619
+ /*========================================================*/
620
+
621
+ if (count > 1)
622
+ {
623
+ AmbiguousReferenceErrorMessage(theEnv,"defglobal",((CLIPSLexeme *) theValue)->contents);
624
+ vPtr->value = FalseSymbol(theEnv);
625
+ SetEvaluationError(theEnv,true);
626
+ return false;
627
+ }
628
+
629
+ /*=================================*/
630
+ /* Get the value of the defglobal. */
631
+ /*=================================*/
632
+
633
+ CLIPSToUDFValue(&theGlobal->current,vPtr);
634
+
635
+ if (vPtr->value == FalseSymbol(theEnv))
636
+ { return false; }
637
+
638
+ return true;
639
+ }
640
+
641
+ /******************************************************************/
642
+ /* QGetDefglobalUDFValue: Returns the value of a global variable. */
643
+ /******************************************************************/
644
+ bool QGetDefglobalUDFValue(
645
+ Environment *theEnv,
646
+ Defglobal *theGlobal,
647
+ UDFValue *vPtr)
648
+ {
649
+ vPtr->value = theGlobal->current.value;
650
+
651
+ /*===========================================================*/
652
+ /* If the global contains a multifield value, return a copy */
653
+ /* of the value so that routines which use this value are */
654
+ /* not affected if the value of the global is later changed. */
655
+ /*===========================================================*/
656
+
657
+ if (theGlobal->current.header->type == MULTIFIELD_TYPE)
658
+ {
659
+ vPtr->begin = 0;
660
+ vPtr->range = theGlobal->current.multifieldValue->length;
661
+ }
662
+
663
+ if (vPtr->value == FalseSymbol(theEnv))
664
+ { return false; }
665
+
666
+ return true;
667
+ }
668
+
669
+ /*********************************************************/
670
+ /* DefglobalGetValue: Returns the value of the specified */
671
+ /* global variable in the supplied UDFValue. */
672
+ /*********************************************************/
673
+ void DefglobalGetValue(
674
+ Defglobal *theDefglobal,
675
+ CLIPSValue *vPtr)
676
+ {
677
+ vPtr->value = theDefglobal->current.value;
678
+ }
679
+
680
+ /*************************************************************/
681
+ /* DefglobalSetValue: Sets the value of the specified global */
682
+ /* variable to the value stored in the supplied UDFValue. */
683
+ /*************************************************************/
684
+ void DefglobalSetValue(
685
+ Defglobal *theDefglobal,
686
+ CLIPSValue *vPtr)
687
+ {
688
+ UDFValue temp;
689
+ GCBlock gcb;
690
+ Environment *theEnv = theDefglobal->header.env;
691
+
692
+ /*=====================================*/
693
+ /* If embedded, clear the error flags. */
694
+ /*=====================================*/
695
+
696
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
697
+ { ResetErrorFlags(theEnv); }
698
+
699
+ GCBlockStart(theEnv,&gcb);
700
+ CLIPSToUDFValue(vPtr,&temp);
701
+ QSetDefglobalValue(theEnv,theDefglobal,&temp,false);
702
+ GCBlockEnd(theEnv,&gcb);
703
+ }
704
+
705
+ /************************/
706
+ /* DefglobalSetInteger: */
707
+ /************************/
708
+ void DefglobalSetInteger(
709
+ Defglobal *theDefglobal,
710
+ long long value)
711
+ {
712
+ CLIPSValue cv;
713
+
714
+ cv.integerValue = CreateInteger(theDefglobal->header.env,value);
715
+
716
+ DefglobalSetValue(theDefglobal,&cv);
717
+ }
718
+
719
+ /**********************/
720
+ /* DefglobalSetFloat: */
721
+ /**********************/
722
+ void DefglobalSetFloat(
723
+ Defglobal *theDefglobal,
724
+ double value)
725
+ {
726
+ CLIPSValue cv;
727
+
728
+ cv.floatValue = CreateFloat(theDefglobal->header.env,value);
729
+
730
+ DefglobalSetValue(theDefglobal,&cv);
731
+ }
732
+
733
+ /***********************/
734
+ /* DefglobalSetSymbol: */
735
+ /***********************/
736
+ void DefglobalSetSymbol(
737
+ Defglobal *theDefglobal,
738
+ const char *value)
739
+ {
740
+ CLIPSValue cv;
741
+
742
+ cv.lexemeValue = CreateSymbol(theDefglobal->header.env,value);
743
+
744
+ DefglobalSetValue(theDefglobal,&cv);
745
+ }
746
+
747
+ /***********************/
748
+ /* DefglobalSetString: */
749
+ /***********************/
750
+ void DefglobalSetString(
751
+ Defglobal *theDefglobal,
752
+ const char *value)
753
+ {
754
+ CLIPSValue cv;
755
+
756
+ cv.lexemeValue = CreateString(theDefglobal->header.env,value);
757
+
758
+ DefglobalSetValue(theDefglobal,&cv);
759
+ }
760
+
761
+ /*****************************/
762
+ /* DefglobalSetInstanceName: */
763
+ /*****************************/
764
+ void DefglobalSetInstanceName(
765
+ Defglobal *theDefglobal,
766
+ const char *value)
767
+ {
768
+ CLIPSValue cv;
769
+
770
+ cv.lexemeValue = CreateInstanceName(theDefglobal->header.env,value);
771
+
772
+ DefglobalSetValue(theDefglobal,&cv);
773
+ }
774
+
775
+ /*****************************/
776
+ /* DefglobalSetCLIPSInteger: */
777
+ /*****************************/
778
+ void DefglobalSetCLIPSInteger(
779
+ Defglobal *theDefglobal,
780
+ CLIPSInteger *value)
781
+ {
782
+ CLIPSValue cv;
783
+
784
+ cv.integerValue = value;
785
+
786
+ DefglobalSetValue(theDefglobal,&cv);
787
+ }
788
+
789
+ /***************************/
790
+ /* DefglobalSetCLIPSFloat: */
791
+ /***************************/
792
+ void DefglobalSetCLIPSFloat(
793
+ Defglobal *theDefglobal,
794
+ CLIPSFloat *value)
795
+ {
796
+ CLIPSValue cv;
797
+
798
+ cv.floatValue = value;
799
+
800
+ DefglobalSetValue(theDefglobal,&cv);
801
+ }
802
+
803
+ /****************************/
804
+ /* DefglobalSetCLIPSLexeme: */
805
+ /****************************/
806
+ void DefglobalSetCLIPSLexeme(
807
+ Defglobal *theDefglobal,
808
+ CLIPSLexeme *value)
809
+ {
810
+ CLIPSValue cv;
811
+
812
+ cv.lexemeValue = value;
813
+
814
+ DefglobalSetValue(theDefglobal,&cv);
815
+ }
816
+
817
+ /*********************/
818
+ /* DefglobalSetFact: */
819
+ /*********************/
820
+ void DefglobalSetFact(
821
+ Defglobal *theDefglobal,
822
+ Fact *value)
823
+ {
824
+ CLIPSValue cv;
825
+
826
+ cv.factValue = value;
827
+
828
+ DefglobalSetValue(theDefglobal,&cv);
829
+ }
830
+
831
+ /*************************/
832
+ /* DefglobalSetInstance: */
833
+ /*************************/
834
+ void DefglobalSetInstance(
835
+ Defglobal *theDefglobal,
836
+ Instance *value)
837
+ {
838
+ CLIPSValue cv;
839
+
840
+ cv.instanceValue = value;
841
+
842
+ DefglobalSetValue(theDefglobal,&cv);
843
+ }
844
+
845
+ /***************************/
846
+ /* DefglobalSetMultifield: */
847
+ /***************************/
848
+ void DefglobalSetMultifield(
849
+ Defglobal *theDefglobal,
850
+ Multifield *value)
851
+ {
852
+ CLIPSValue cv;
853
+
854
+ cv.multifieldValue = value;
855
+
856
+ DefglobalSetValue(theDefglobal,&cv);
857
+ }
858
+
859
+ /*************************************/
860
+ /* DefglobalSetCLIPSExternalAddress: */
861
+ /*************************************/
862
+ void DefglobalSetCLIPSExternalAddress(
863
+ Defglobal *theDefglobal,
864
+ CLIPSExternalAddress *value)
865
+ {
866
+ CLIPSValue cv;
867
+
868
+ cv.externalAddressValue = value;
869
+
870
+ DefglobalSetValue(theDefglobal,&cv);
871
+ }
872
+
873
+ /**********************************************************/
874
+ /* DecrementDefglobalBusyCount: Decrements the busy count */
875
+ /* of a defglobal data structure. */
876
+ /**********************************************************/
877
+ static void DecrementDefglobalBusyCount(
878
+ Environment *theEnv,
879
+ Defglobal *theGlobal)
880
+ {
881
+ if (! ConstructData(theEnv)->ClearInProgress) theGlobal->busyCount--;
882
+ }
883
+
884
+ /**********************************************************/
885
+ /* IncrementDefglobalBusyCount: Increments the busy count */
886
+ /* of a defglobal data structure. */
887
+ /**********************************************************/
888
+ static void IncrementDefglobalBusyCount(
889
+ Environment *theEnv,
890
+ Defglobal *theGlobal)
891
+ {
892
+ #if MAC_XCD
893
+ #pragma unused(theEnv)
894
+ #endif
895
+
896
+ theGlobal->busyCount++;
897
+ }
898
+
899
+ /***********************************************************************/
900
+ /* UpdateDefglobalScope: Updates the scope flag of all the defglobals. */
901
+ /***********************************************************************/
902
+ void UpdateDefglobalScope(
903
+ Environment *theEnv)
904
+ {
905
+ Defglobal *theDefglobal;
906
+ unsigned int moduleCount;
907
+ Defmodule *theModule;
908
+ struct defmoduleItemHeader *theItem;
909
+
910
+ /*============================*/
911
+ /* Loop through every module. */
912
+ /*============================*/
913
+
914
+ for (theModule = GetNextDefmodule(theEnv,NULL);
915
+ theModule != NULL;
916
+ theModule = GetNextDefmodule(theEnv,theModule))
917
+ {
918
+ /*============================================================*/
919
+ /* Loop through every defglobal in the module being examined. */
920
+ /*============================================================*/
921
+
922
+ theItem = (struct defmoduleItemHeader *)
923
+ GetModuleItem(theEnv,theModule,DefglobalData(theEnv)->DefglobalModuleIndex);
924
+
925
+ for (theDefglobal = (Defglobal *) theItem->firstItem;
926
+ theDefglobal != NULL ;
927
+ theDefglobal = GetNextDefglobal(theEnv,theDefglobal))
928
+ {
929
+ /*====================================================*/
930
+ /* If the defglobal is visible to the current module, */
931
+ /* then mark it as being in scope, otherwise mark it */
932
+ /* as being out of scope. */
933
+ /*====================================================*/
934
+
935
+ if (FindImportedConstruct(theEnv,"defglobal",theModule,
936
+ theDefglobal->header.name->contents,
937
+ &moduleCount,true,NULL) != NULL)
938
+ { theDefglobal->inScope = true; }
939
+ else
940
+ { theDefglobal->inScope = false; }
941
+ }
942
+ }
943
+ }
944
+
945
+ /*******************************************************/
946
+ /* GetNextDefglobalInScope: Returns the next defglobal */
947
+ /* that is scope of the current module. Works in a */
948
+ /* similar fashion to GetNextDefglobal, but skips */
949
+ /* defglobals that are out of scope. */
950
+ /*******************************************************/
951
+ Defglobal *GetNextDefglobalInScope(
952
+ Environment *theEnv,
953
+ Defglobal *theGlobal)
954
+ {
955
+ struct defmoduleItemHeader *theItem;
956
+
957
+ /*=======================================*/
958
+ /* If we're beginning the search for the */
959
+ /* first defglobal in scope, then ... */
960
+ /*=======================================*/
961
+
962
+ if (theGlobal == NULL)
963
+ {
964
+ /*==============================================*/
965
+ /* If the current module has been changed since */
966
+ /* the last time the scopes were computed, then */
967
+ /* recompute the scopes. */
968
+ /*==============================================*/
969
+
970
+ if (DefglobalData(theEnv)->LastModuleIndex != DefmoduleData(theEnv)->ModuleChangeIndex)
971
+ {
972
+ UpdateDefglobalScope(theEnv);
973
+ DefglobalData(theEnv)->LastModuleIndex = DefmoduleData(theEnv)->ModuleChangeIndex;
974
+ }
975
+
976
+ /*==========================================*/
977
+ /* Get the first module and first defglobal */
978
+ /* to start the search with. */
979
+ /*==========================================*/
980
+
981
+ DefglobalData(theEnv)->TheDefmodule = GetNextDefmodule(theEnv,NULL);
982
+ theItem = (struct defmoduleItemHeader *)
983
+ GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
984
+ theGlobal = (Defglobal *) theItem->firstItem;
985
+ }
986
+
987
+ /*==================================================*/
988
+ /* Otherwise, see if the last defglobal returned by */
989
+ /* this function has a defglobal following it. */
990
+ /*==================================================*/
991
+
992
+ else
993
+ { theGlobal = GetNextDefglobal(theEnv,theGlobal); }
994
+
995
+ /*======================================*/
996
+ /* Continue looping through the modules */
997
+ /* until a defglobal in scope is found. */
998
+ /*======================================*/
999
+
1000
+ while (DefglobalData(theEnv)->TheDefmodule != NULL)
1001
+ {
1002
+ /*=====================================================*/
1003
+ /* Loop through the defglobals in the module currently */
1004
+ /* being examined to see if one is in scope. */
1005
+ /*=====================================================*/
1006
+
1007
+ for (;
1008
+ theGlobal != NULL;
1009
+ theGlobal = GetNextDefglobal(theEnv,theGlobal))
1010
+ { if (theGlobal->inScope) return theGlobal; }
1011
+
1012
+ /*================================================*/
1013
+ /* If a global in scope couldn't be found in this */
1014
+ /* module, then move on to the next module. */
1015
+ /*================================================*/
1016
+
1017
+ DefglobalData(theEnv)->TheDefmodule = GetNextDefmodule(theEnv,DefglobalData(theEnv)->TheDefmodule);
1018
+ theItem = (struct defmoduleItemHeader *)
1019
+ GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
1020
+ theGlobal = (Defglobal *) theItem->firstItem;
1021
+ }
1022
+
1023
+ /*====================================*/
1024
+ /* All the globals in scope have been */
1025
+ /* traversed and there are none left. */
1026
+ /*====================================*/
1027
+
1028
+ return NULL;
1029
+ }
1030
+
1031
+ #if RUN_TIME
1032
+
1033
+ /************************************************/
1034
+ /* RuntimeDefglobalAction: Action to be applied */
1035
+ /* to each defglobal construct when a runtime */
1036
+ /* initialization occurs. */
1037
+ /************************************************/
1038
+ static void RuntimeDefglobalAction(
1039
+ Environment *theEnv,
1040
+ ConstructHeader *theConstruct,
1041
+ void *buffer)
1042
+ {
1043
+ #if MAC_XCD
1044
+ #pragma unused(buffer)
1045
+ #endif
1046
+ Defglobal *theDefglobal = (Defglobal *) theConstruct;
1047
+
1048
+ theDefglobal->header.env = theEnv;
1049
+ theDefglobal->current.value = VoidConstant(theEnv);
1050
+ }
1051
+
1052
+ /*******************************/
1053
+ /* DefglobalRunTimeInitialize: */
1054
+ /*******************************/
1055
+ void DefglobalRunTimeInitialize(
1056
+ Environment *theEnv)
1057
+ {
1058
+ DoForAllConstructs(theEnv,RuntimeDefglobalAction,DefglobalData(theEnv)->DefglobalModuleIndex,true,NULL);
1059
+ }
1060
+
1061
+ #endif
1062
+
1063
+ /*##################################*/
1064
+ /* Additional Environment Functions */
1065
+ /*##################################*/
1066
+
1067
+ const char *DefglobalModule(
1068
+ Defglobal *theDefglobal)
1069
+ {
1070
+ return GetConstructModuleName(&theDefglobal->header);
1071
+ }
1072
+
1073
+ const char *DefglobalName(
1074
+ Defglobal *theDefglobal)
1075
+ {
1076
+ return GetConstructNameString(&theDefglobal->header);
1077
+ }
1078
+
1079
+ const char *DefglobalPPForm(
1080
+ Defglobal *theDefglobal)
1081
+ {
1082
+ return GetConstructPPForm(&theDefglobal->header);
1083
+ }
1084
+
1085
+ #endif /* DEFGLOBAL_CONSTRUCT */
1086
+
1087
+