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,1136 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* DEFRULE BSAVE/BLOAD MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Implements the binary save/load feature for the */
11
+ /* defrule construct. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* Brian L. Dantes */
18
+ /* Barry Cameron */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.24: Removed CONFLICT_RESOLUTION_STRATEGIES, */
23
+ /* DYNAMIC_SALIENCE, and LOGICAL_DEPENDENCIES */
24
+ /* compilation flags. */
25
+ /* */
26
+ /* 6.30: Changed integer type/precision. */
27
+ /* */
28
+ /* Added support for alpha memories. */
29
+ /* */
30
+ /* Added salience groups to improve performance */
31
+ /* with large numbers of activations of different */
32
+ /* saliences. */
33
+ /* */
34
+ /* 6.40: Pragma once and other inclusion changes. */
35
+ /* */
36
+ /* Added support for booleans with <stdbool.h>. */
37
+ /* */
38
+ /* Removed use of void pointers for specific */
39
+ /* data structures. */
40
+ /* */
41
+ /*************************************************************/
42
+
43
+ #include "setup.h"
44
+
45
+ #if DEFRULE_CONSTRUCT && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
46
+
47
+ #include <stdio.h>
48
+ #include <string.h>
49
+
50
+ #include "agenda.h"
51
+ #include "bload.h"
52
+ #include "bsave.h"
53
+ #include "engine.h"
54
+ #include "envrnmnt.h"
55
+ #include "memalloc.h"
56
+ #include "moduldef.h"
57
+ #include "pattern.h"
58
+ #include "reteutil.h"
59
+ #include "retract.h"
60
+ #include "rulebsc.h"
61
+
62
+ #include "rulebin.h"
63
+
64
+ /***************************************/
65
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
66
+ /***************************************/
67
+
68
+ #if BLOAD_AND_BSAVE
69
+ static void BsaveFind(Environment *);
70
+ static void BsaveExpressions(Environment *,FILE *);
71
+ static void BsaveStorage(Environment *,FILE *);
72
+ static void BsaveBinaryItem(Environment *,FILE *);
73
+ static void BsaveJoins(Environment *,FILE *);
74
+ static void BsaveJoin(Environment *,FILE *,struct joinNode *);
75
+ static void BsaveDisjuncts(Environment *,FILE *,Defrule *);
76
+ static void BsaveTraverseJoins(Environment *,FILE *,struct joinNode *);
77
+ static void BsaveLinks(Environment *,FILE *);
78
+ static void BsaveTraverseLinks(Environment *,FILE *,struct joinNode *);
79
+ static void BsaveLink(FILE *,struct joinLink *);
80
+ #endif
81
+ static void BloadStorage(Environment *);
82
+ static void BloadBinaryItem(Environment *);
83
+ static void UpdateDefruleModule(Environment *,void *,unsigned long);
84
+ static void UpdateDefrule(Environment *,void *,unsigned long);
85
+ static void UpdateJoin(Environment *,void *,unsigned long);
86
+ static void UpdateLink(Environment *,void *,unsigned long);
87
+ static void ClearBload(Environment *);
88
+ static void DeallocateDefruleBloadData(Environment *);
89
+
90
+ /*****************************************************/
91
+ /* DefruleBinarySetup: Installs the binary save/load */
92
+ /* feature for the defrule construct. */
93
+ /*****************************************************/
94
+ void DefruleBinarySetup(
95
+ Environment *theEnv)
96
+ {
97
+ AllocateEnvironmentData(theEnv,RULEBIN_DATA,sizeof(struct defruleBinaryData),DeallocateDefruleBloadData);
98
+
99
+ #if BLOAD_AND_BSAVE
100
+ AddBinaryItem(theEnv,"defrule",20,BsaveFind,BsaveExpressions,
101
+ BsaveStorage,BsaveBinaryItem,
102
+ BloadStorage,BloadBinaryItem,
103
+ ClearBload);
104
+ #endif
105
+ #if BLOAD || BLOAD_ONLY
106
+ AddBinaryItem(theEnv,"defrule",20,NULL,NULL,NULL,NULL,
107
+ BloadStorage,BloadBinaryItem,
108
+ ClearBload);
109
+ #endif
110
+ }
111
+
112
+ /*******************************************************/
113
+ /* DeallocateDefruleBloadData: Deallocates environment */
114
+ /* data for the defrule bsave functionality. */
115
+ /*******************************************************/
116
+ static void DeallocateDefruleBloadData(
117
+ Environment *theEnv)
118
+ {
119
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
120
+ size_t space;
121
+ unsigned long i;
122
+ struct defruleModule *theModuleItem;
123
+ struct activation *theActivation, *tmpActivation;
124
+ struct salienceGroup *theGroup, *tmpGroup;
125
+
126
+ for (i = 0; i < DefruleBinaryData(theEnv)->NumberOfJoins; i++)
127
+ {
128
+ DestroyBetaMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i],LHS);
129
+ DestroyBetaMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i],RHS);
130
+ ReturnLeftMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i]);
131
+ ReturnRightMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i]);
132
+ }
133
+
134
+ for (i = 0; i < DefruleBinaryData(theEnv)->NumberOfDefruleModules; i++)
135
+ {
136
+ theModuleItem = &DefruleBinaryData(theEnv)->ModuleArray[i];
137
+
138
+ theActivation = theModuleItem->agenda;
139
+ while (theActivation != NULL)
140
+ {
141
+ tmpActivation = theActivation->next;
142
+
143
+ rtn_struct(theEnv,activation,theActivation);
144
+
145
+ theActivation = tmpActivation;
146
+ }
147
+
148
+ theGroup = theModuleItem->groupings;
149
+ while (theGroup != NULL)
150
+ {
151
+ tmpGroup = theGroup->next;
152
+
153
+ rtn_struct(theEnv,salienceGroup,theGroup);
154
+
155
+ theGroup = tmpGroup;
156
+ }
157
+ }
158
+
159
+ space = DefruleBinaryData(theEnv)->NumberOfDefruleModules * sizeof(struct defruleModule);
160
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->ModuleArray,space);
161
+
162
+ space = DefruleBinaryData(theEnv)->NumberOfDefrules * sizeof(Defrule);
163
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->DefruleArray,space);
164
+
165
+ space = DefruleBinaryData(theEnv)->NumberOfJoins * sizeof(struct joinNode);
166
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->JoinArray,space);
167
+
168
+ space = DefruleBinaryData(theEnv)->NumberOfLinks * sizeof(struct joinLink);
169
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->LinkArray,space);
170
+
171
+ if (Bloaded(theEnv))
172
+ { rm(theEnv,DefruleData(theEnv)->AlphaMemoryTable,sizeof(ALPHA_MEMORY_HASH *) * ALPHA_MEMORY_HASH_SIZE); }
173
+ #endif
174
+ }
175
+
176
+ #if BLOAD_AND_BSAVE
177
+
178
+ /*************************************************************/
179
+ /* BsaveFind: Determines the amount of memory needed to save */
180
+ /* the defrule and joinNode data structures in addition to */
181
+ /* the memory needed for their associated expressions. */
182
+ /*************************************************************/
183
+ static void BsaveFind(
184
+ Environment *theEnv)
185
+ {
186
+ Defrule *theDefrule, *theDisjunct;
187
+ Defmodule *theModule;
188
+
189
+ /*=======================================================*/
190
+ /* If a binary image is already loaded, then temporarily */
191
+ /* save the count values since these will be overwritten */
192
+ /* in the process of saving the binary image. */
193
+ /*=======================================================*/
194
+
195
+ SaveBloadCount(theEnv,DefruleBinaryData(theEnv)->NumberOfDefruleModules);
196
+ SaveBloadCount(theEnv,DefruleBinaryData(theEnv)->NumberOfDefrules);
197
+ SaveBloadCount(theEnv,DefruleBinaryData(theEnv)->NumberOfJoins);
198
+ SaveBloadCount(theEnv,DefruleBinaryData(theEnv)->NumberOfLinks);
199
+
200
+ /*====================================================*/
201
+ /* Set the binary save ID for defrule data structures */
202
+ /* and count the number of each type. */
203
+ /*====================================================*/
204
+
205
+ TagRuleNetwork(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefruleModules,
206
+ &DefruleBinaryData(theEnv)->NumberOfDefrules,
207
+ &DefruleBinaryData(theEnv)->NumberOfJoins,
208
+ &DefruleBinaryData(theEnv)->NumberOfLinks);
209
+
210
+ /*===========================*/
211
+ /* Loop through each module. */
212
+ /*===========================*/
213
+
214
+ for (theModule = GetNextDefmodule(theEnv,NULL);
215
+ theModule != NULL;
216
+ theModule = GetNextDefmodule(theEnv,theModule))
217
+ {
218
+ /*============================*/
219
+ /* Set the current module to */
220
+ /* the module being examined. */
221
+ /*============================*/
222
+
223
+ SetCurrentModule(theEnv,theModule);
224
+
225
+ /*==================================================*/
226
+ /* Loop through each defrule in the current module. */
227
+ /*==================================================*/
228
+
229
+ for (theDefrule = GetNextDefrule(theEnv,NULL);
230
+ theDefrule != NULL;
231
+ theDefrule = GetNextDefrule(theEnv,theDefrule))
232
+ {
233
+ /*================================================*/
234
+ /* Initialize the construct header for the binary */
235
+ /* save. The binary save ID has already been set. */
236
+ /*================================================*/
237
+
238
+ MarkConstructHeaderNeededItems(&theDefrule->header,theDefrule->header.bsaveID);
239
+
240
+ /*===========================================*/
241
+ /* Count and mark data structures associated */
242
+ /* with dynamic salience. */
243
+ /*===========================================*/
244
+
245
+ ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDefrule->dynamicSalience);
246
+ MarkNeededItems(theEnv,theDefrule->dynamicSalience);
247
+
248
+ /*==========================================*/
249
+ /* Loop through each disjunct of the rule */
250
+ /* counting and marking the data structures */
251
+ /* associated with RHS actions. */
252
+ /*==========================================*/
253
+
254
+ for (theDisjunct = theDefrule;
255
+ theDisjunct != NULL;
256
+ theDisjunct = theDisjunct->disjunct)
257
+ {
258
+ ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDisjunct->actions);
259
+ MarkNeededItems(theEnv,theDisjunct->actions);
260
+ }
261
+ }
262
+ }
263
+
264
+ /*===============================*/
265
+ /* Reset the bsave tags assigned */
266
+ /* to defrule data structures. */
267
+ /*===============================*/
268
+
269
+ MarkRuleNetwork(theEnv,1);
270
+ }
271
+
272
+ /************************************************/
273
+ /* BsaveExpressions: Saves the expressions used */
274
+ /* by defrules to the binary save file. */
275
+ /************************************************/
276
+ static void BsaveExpressions(
277
+ Environment *theEnv,
278
+ FILE *fp)
279
+ {
280
+ Defrule *theDefrule, *theDisjunct;
281
+ Defmodule *theModule;
282
+
283
+ /*===========================*/
284
+ /* Loop through each module. */
285
+ /*===========================*/
286
+
287
+ for (theModule = GetNextDefmodule(theEnv,NULL);
288
+ theModule != NULL;
289
+ theModule = GetNextDefmodule(theEnv,theModule))
290
+ {
291
+ /*======================================================*/
292
+ /* Set the current module to the module being examined. */
293
+ /*======================================================*/
294
+
295
+ SetCurrentModule(theEnv,theModule);
296
+
297
+ /*==================================================*/
298
+ /* Loop through each defrule in the current module. */
299
+ /*==================================================*/
300
+
301
+ for (theDefrule = GetNextDefrule(theEnv,NULL);
302
+ theDefrule != NULL;
303
+ theDefrule = GetNextDefrule(theEnv,theDefrule))
304
+ {
305
+ /*===========================================*/
306
+ /* Save the dynamic salience of the defrule. */
307
+ /*===========================================*/
308
+
309
+ BsaveExpression(theEnv,theDefrule->dynamicSalience,fp);
310
+
311
+ /*===================================*/
312
+ /* Loop through each disjunct of the */
313
+ /* defrule and save its RHS actions. */
314
+ /*===================================*/
315
+
316
+ for (theDisjunct = theDefrule;
317
+ theDisjunct != NULL;
318
+ theDisjunct = theDisjunct->disjunct)
319
+ { BsaveExpression(theEnv,theDisjunct->actions,fp); }
320
+ }
321
+ }
322
+
323
+ /*==============================*/
324
+ /* Set the marked flag for each */
325
+ /* join in the join network. */
326
+ /*==============================*/
327
+
328
+ MarkRuleNetwork(theEnv,1);
329
+ }
330
+
331
+ /*****************************************************/
332
+ /* BsaveStorage: Writes out storage requirements for */
333
+ /* all defrule structures to the binary file */
334
+ /*****************************************************/
335
+ static void BsaveStorage(
336
+ Environment *theEnv,
337
+ FILE *fp)
338
+ {
339
+ size_t space;
340
+ unsigned long value;
341
+
342
+ space = sizeof(long) * 5;
343
+ GenWrite(&space,sizeof(size_t),fp);
344
+ GenWrite(&DefruleBinaryData(theEnv)->NumberOfDefruleModules,sizeof(long),fp);
345
+ GenWrite(&DefruleBinaryData(theEnv)->NumberOfDefrules,sizeof(long),fp);
346
+ GenWrite(&DefruleBinaryData(theEnv)->NumberOfJoins,sizeof(long),fp);
347
+ GenWrite(&DefruleBinaryData(theEnv)->NumberOfLinks,sizeof(long),fp);
348
+
349
+ if (DefruleData(theEnv)->RightPrimeJoins == NULL)
350
+ { value = ULONG_MAX; }
351
+ else
352
+ { value = DefruleData(theEnv)->RightPrimeJoins->bsaveID; }
353
+
354
+ GenWrite(&value,sizeof(unsigned long),fp);
355
+
356
+ if (DefruleData(theEnv)->LeftPrimeJoins == NULL)
357
+ { value = ULONG_MAX; }
358
+ else
359
+ { value = DefruleData(theEnv)->LeftPrimeJoins->bsaveID; }
360
+
361
+ GenWrite(&value,sizeof(unsigned long),fp);
362
+ }
363
+
364
+ /*******************************************/
365
+ /* BsaveBinaryItem: Writes out all defrule */
366
+ /* structures to the binary file. */
367
+ /*******************************************/
368
+ static void BsaveBinaryItem(
369
+ Environment *theEnv,
370
+ FILE *fp)
371
+ {
372
+ size_t space;
373
+ Defrule *theDefrule;
374
+ Defmodule *theModule;
375
+ struct defruleModule *theModuleItem;
376
+ struct bsaveDefruleModule tempDefruleModule;
377
+
378
+ /*===============================================*/
379
+ /* Write out the space required by the defrules. */
380
+ /*===============================================*/
381
+
382
+ space = (DefruleBinaryData(theEnv)->NumberOfDefrules * sizeof(struct bsaveDefrule)) +
383
+ (DefruleBinaryData(theEnv)->NumberOfJoins * sizeof(struct bsaveJoinNode)) +
384
+ (DefruleBinaryData(theEnv)->NumberOfLinks * sizeof(struct bsaveJoinLink)) +
385
+ (DefruleBinaryData(theEnv)->NumberOfDefruleModules * sizeof(struct bsaveDefruleModule));
386
+ GenWrite(&space,sizeof(size_t),fp);
387
+
388
+ /*===============================================*/
389
+ /* Write out each defrule module data structure. */
390
+ /*===============================================*/
391
+
392
+ DefruleBinaryData(theEnv)->NumberOfDefrules = 0;
393
+ for (theModule = GetNextDefmodule(theEnv,NULL);
394
+ theModule != NULL;
395
+ theModule = GetNextDefmodule(theEnv,theModule))
396
+ {
397
+ SetCurrentModule(theEnv,theModule);
398
+
399
+ theModuleItem = (struct defruleModule *)
400
+ GetModuleItem(theEnv,NULL,FindModuleItem(theEnv,"defrule")->moduleIndex);
401
+ AssignBsaveDefmdlItemHdrVals(&tempDefruleModule.header,
402
+ &theModuleItem->header);
403
+ GenWrite(&tempDefruleModule,sizeof(struct bsaveDefruleModule),fp);
404
+ }
405
+
406
+ /*========================================*/
407
+ /* Write out each defrule data structure. */
408
+ /*========================================*/
409
+
410
+ for (theModule = GetNextDefmodule(theEnv,NULL);
411
+ theModule != NULL;
412
+ theModule = GetNextDefmodule(theEnv,theModule))
413
+ {
414
+ SetCurrentModule(theEnv,theModule);
415
+
416
+ for (theDefrule = GetNextDefrule(theEnv,NULL);
417
+ theDefrule != NULL;
418
+ theDefrule = GetNextDefrule(theEnv,theDefrule))
419
+ { BsaveDisjuncts(theEnv,fp,theDefrule); }
420
+ }
421
+
422
+ /*=============================*/
423
+ /* Write out the Rete Network. */
424
+ /*=============================*/
425
+
426
+ MarkRuleNetwork(theEnv,1);
427
+ BsaveJoins(theEnv,fp);
428
+
429
+ /*===========================*/
430
+ /* Write out the join links. */
431
+ /*===========================*/
432
+
433
+ MarkRuleNetwork(theEnv,1);
434
+ BsaveLinks(theEnv,fp);
435
+
436
+ /*=============================================================*/
437
+ /* If a binary image was already loaded when the bsave command */
438
+ /* was issued, then restore the counts indicating the number */
439
+ /* of defrules, defrule modules, and joins in the binary image */
440
+ /* (these were overwritten by the binary save). */
441
+ /*=============================================================*/
442
+
443
+ RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefruleModules);
444
+ RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefrules);
445
+ RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfJoins);
446
+ RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfLinks);
447
+ }
448
+
449
+ /************************************************************/
450
+ /* BsaveDisjuncts: Writes out all the disjunct defrule data */
451
+ /* structures for a specific rule to the binary file. */
452
+ /************************************************************/
453
+ static void BsaveDisjuncts(
454
+ Environment *theEnv,
455
+ FILE *fp,
456
+ Defrule *theDefrule)
457
+ {
458
+ Defrule *theDisjunct;
459
+ struct bsaveDefrule tempDefrule;
460
+ unsigned long disjunctExpressionCount = 0;
461
+ bool first;
462
+
463
+ /*=========================================*/
464
+ /* Loop through each disjunct of the rule. */
465
+ /*=========================================*/
466
+
467
+ for (theDisjunct = theDefrule, first = true;
468
+ theDisjunct != NULL;
469
+ theDisjunct = theDisjunct->disjunct, first = false)
470
+ {
471
+ DefruleBinaryData(theEnv)->NumberOfDefrules++;
472
+
473
+ /*======================================*/
474
+ /* Set header and miscellaneous values. */
475
+ /*======================================*/
476
+
477
+ AssignBsaveConstructHeaderVals(&tempDefrule.header,
478
+ &theDisjunct->header);
479
+ tempDefrule.salience = theDisjunct->salience;
480
+ tempDefrule.localVarCnt = theDisjunct->localVarCnt;
481
+ tempDefrule.complexity = theDisjunct->complexity;
482
+ tempDefrule.autoFocus = theDisjunct->autoFocus;
483
+
484
+ /*=======================================*/
485
+ /* Set dynamic salience data structures. */
486
+ /*=======================================*/
487
+
488
+ if (theDisjunct->dynamicSalience != NULL)
489
+ {
490
+ if (first)
491
+ {
492
+ tempDefrule.dynamicSalience = ExpressionData(theEnv)->ExpressionCount;
493
+ disjunctExpressionCount = ExpressionData(theEnv)->ExpressionCount;
494
+ ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDisjunct->dynamicSalience);
495
+ }
496
+ else
497
+ { tempDefrule.dynamicSalience = disjunctExpressionCount; }
498
+ }
499
+ else
500
+ { tempDefrule.dynamicSalience = ULONG_MAX; }
501
+
502
+ /*==============================================*/
503
+ /* Set the index to the disjunct's RHS actions. */
504
+ /*==============================================*/
505
+
506
+ if (theDisjunct->actions != NULL)
507
+ {
508
+ tempDefrule.actions = ExpressionData(theEnv)->ExpressionCount;
509
+ ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDisjunct->actions);
510
+ }
511
+ else
512
+ { tempDefrule.actions = ULONG_MAX; }
513
+
514
+ /*=================================*/
515
+ /* Set the index to the disjunct's */
516
+ /* logical join and last join. */
517
+ /*=================================*/
518
+
519
+ tempDefrule.logicalJoin = BsaveJoinIndex(theDisjunct->logicalJoin);
520
+ tempDefrule.lastJoin = BsaveJoinIndex(theDisjunct->lastJoin);
521
+
522
+ /*=====================================*/
523
+ /* Set the index to the next disjunct. */
524
+ /*=====================================*/
525
+
526
+ if (theDisjunct->disjunct != NULL)
527
+ { tempDefrule.disjunct = DefruleBinaryData(theEnv)->NumberOfDefrules; }
528
+ else
529
+ { tempDefrule.disjunct = ULONG_MAX; }
530
+
531
+ /*=================================*/
532
+ /* Write the disjunct to the file. */
533
+ /*=================================*/
534
+
535
+ GenWrite(&tempDefrule,sizeof(struct bsaveDefrule),fp);
536
+ }
537
+ }
538
+
539
+ /********************************************/
540
+ /* BsaveJoins: Writes out all the join node */
541
+ /* data structures to the binary file. */
542
+ /********************************************/
543
+ static void BsaveJoins(
544
+ Environment *theEnv,
545
+ FILE *fp)
546
+ {
547
+ Defrule *rulePtr, *disjunctPtr;
548
+ Defmodule *theModule;
549
+
550
+ /*===========================*/
551
+ /* Loop through each module. */
552
+ /*===========================*/
553
+
554
+ for (theModule = GetNextDefmodule(theEnv,NULL);
555
+ theModule != NULL;
556
+ theModule = GetNextDefmodule(theEnv,theModule))
557
+ {
558
+ SetCurrentModule(theEnv,theModule);
559
+
560
+ /*===========================================*/
561
+ /* Loop through each rule and its disjuncts. */
562
+ /*===========================================*/
563
+
564
+ rulePtr = GetNextDefrule(theEnv,NULL);
565
+ while (rulePtr != NULL)
566
+ {
567
+ /*=========================================*/
568
+ /* Loop through each join of the disjunct. */
569
+ /*=========================================*/
570
+
571
+ for (disjunctPtr = rulePtr; disjunctPtr != NULL; disjunctPtr = disjunctPtr->disjunct)
572
+ { BsaveTraverseJoins(theEnv,fp,disjunctPtr->lastJoin); }
573
+
574
+ /*===========================*/
575
+ /* Move on to the next rule. */
576
+ /*===========================*/
577
+
578
+ rulePtr = GetNextDefrule(theEnv,rulePtr);
579
+ }
580
+ }
581
+ }
582
+
583
+ /**************************************************************/
584
+ /* BsaveTraverseJoins: Traverses the join network for a rule. */
585
+ /**************************************************************/
586
+ static void BsaveTraverseJoins(
587
+ Environment *theEnv,
588
+ FILE *fp,
589
+ struct joinNode *joinPtr)
590
+ {
591
+ for (;
592
+ joinPtr != NULL;
593
+ joinPtr = joinPtr->lastLevel)
594
+ {
595
+ if (joinPtr->marked) BsaveJoin(theEnv,fp,joinPtr);
596
+
597
+ if (joinPtr->joinFromTheRight)
598
+ { BsaveTraverseJoins(theEnv,fp,(struct joinNode *) joinPtr->rightSideEntryStructure); }
599
+ }
600
+ }
601
+
602
+ /********************************************/
603
+ /* BsaveJoin: Writes out a single join node */
604
+ /* data structure to the binary file. */
605
+ /********************************************/
606
+ static void BsaveJoin(
607
+ Environment *theEnv,
608
+ FILE *fp,
609
+ struct joinNode *joinPtr)
610
+ {
611
+ struct bsaveJoinNode tempJoin;
612
+
613
+ joinPtr->marked = 0;
614
+ tempJoin.depth = joinPtr->depth;
615
+ tempJoin.rhsType = joinPtr->rhsType;
616
+ tempJoin.firstJoin = joinPtr->firstJoin;
617
+ tempJoin.logicalJoin = joinPtr->logicalJoin;
618
+ tempJoin.joinFromTheRight = joinPtr->joinFromTheRight;
619
+ tempJoin.patternIsNegated = joinPtr->patternIsNegated;
620
+ tempJoin.patternIsExists = joinPtr->patternIsExists;
621
+
622
+ if (joinPtr->joinFromTheRight)
623
+ { tempJoin.rightSideEntryStructure = BsaveJoinIndex(joinPtr->rightSideEntryStructure); }
624
+ else
625
+ { tempJoin.rightSideEntryStructure = ULONG_MAX; }
626
+
627
+ tempJoin.lastLevel = BsaveJoinIndex(joinPtr->lastLevel);
628
+ tempJoin.nextLinks = BsaveJoinLinkIndex(joinPtr->nextLinks);
629
+ tempJoin.rightMatchNode = BsaveJoinIndex(joinPtr->rightMatchNode);
630
+ tempJoin.networkTest = HashedExpressionIndex(theEnv,joinPtr->networkTest);
631
+ tempJoin.secondaryNetworkTest = HashedExpressionIndex(theEnv,joinPtr->secondaryNetworkTest);
632
+ tempJoin.leftHash = HashedExpressionIndex(theEnv,joinPtr->leftHash);
633
+ tempJoin.rightHash = HashedExpressionIndex(theEnv,joinPtr->rightHash);
634
+
635
+ if (joinPtr->ruleToActivate != NULL)
636
+ {
637
+ tempJoin.ruleToActivate =
638
+ GetDisjunctIndex(joinPtr->ruleToActivate);
639
+ }
640
+ else
641
+ { tempJoin.ruleToActivate = ULONG_MAX; }
642
+
643
+ GenWrite(&tempJoin,sizeof(struct bsaveJoinNode),fp);
644
+ }
645
+
646
+ /********************************************/
647
+ /* BsaveLinks: Writes out all the join link */
648
+ /* data structures to the binary file. */
649
+ /********************************************/
650
+ static void BsaveLinks(
651
+ Environment *theEnv,
652
+ FILE *fp)
653
+ {
654
+ Defrule *rulePtr, *disjunctPtr;
655
+ Defmodule *theModule;
656
+ struct joinLink *theLink;
657
+
658
+ for (theLink = DefruleData(theEnv)->LeftPrimeJoins;
659
+ theLink != NULL;
660
+ theLink = theLink->next)
661
+ { BsaveLink(fp,theLink); }
662
+
663
+ for (theLink = DefruleData(theEnv)->RightPrimeJoins;
664
+ theLink != NULL;
665
+ theLink = theLink->next)
666
+ { BsaveLink(fp,theLink); }
667
+
668
+ /*===========================*/
669
+ /* Loop through each module. */
670
+ /*===========================*/
671
+
672
+ for (theModule = GetNextDefmodule(theEnv,NULL);
673
+ theModule != NULL;
674
+ theModule = GetNextDefmodule(theEnv,theModule))
675
+ {
676
+ SetCurrentModule(theEnv,theModule);
677
+
678
+ /*===========================================*/
679
+ /* Loop through each rule and its disjuncts. */
680
+ /*===========================================*/
681
+
682
+ rulePtr = GetNextDefrule(theEnv,NULL);
683
+ while (rulePtr != NULL)
684
+ {
685
+ /*=========================================*/
686
+ /* Loop through each join of the disjunct. */
687
+ /*=========================================*/
688
+
689
+ for (disjunctPtr = rulePtr; disjunctPtr != NULL; disjunctPtr = disjunctPtr->disjunct)
690
+ { BsaveTraverseLinks(theEnv,fp,disjunctPtr->lastJoin); }
691
+
692
+ /*=======================================*/
693
+ /* Move on to the next rule or disjunct. */
694
+ /*=======================================*/
695
+
696
+ rulePtr = GetNextDefrule(theEnv,rulePtr);
697
+ }
698
+ }
699
+ }
700
+
701
+ /***************************************************/
702
+ /* BsaveTraverseLinks: Traverses the join network */
703
+ /* for a rule saving the join links. */
704
+ /**************************************************/
705
+ static void BsaveTraverseLinks(
706
+ Environment *theEnv,
707
+ FILE *fp,
708
+ struct joinNode *joinPtr)
709
+ {
710
+ struct joinLink *theLink;
711
+
712
+ for (;
713
+ joinPtr != NULL;
714
+ joinPtr = joinPtr->lastLevel)
715
+ {
716
+ if (joinPtr->marked)
717
+ {
718
+ for (theLink = joinPtr->nextLinks;
719
+ theLink != NULL;
720
+ theLink = theLink->next)
721
+ { BsaveLink(fp,theLink); }
722
+
723
+ joinPtr->marked = 0;
724
+ }
725
+
726
+ if (joinPtr->joinFromTheRight)
727
+ { BsaveTraverseLinks(theEnv,fp,(struct joinNode *) joinPtr->rightSideEntryStructure); }
728
+ }
729
+ }
730
+
731
+ /********************************************/
732
+ /* BsaveLink: Writes out a single join link */
733
+ /* data structure to the binary file. */
734
+ /********************************************/
735
+ static void BsaveLink(
736
+ FILE *fp,
737
+ struct joinLink *linkPtr)
738
+ {
739
+ struct bsaveJoinLink tempLink;
740
+
741
+ tempLink.enterDirection = linkPtr->enterDirection;
742
+ tempLink.join = BsaveJoinIndex(linkPtr->join);
743
+ tempLink.next = BsaveJoinLinkIndex(linkPtr->next);
744
+
745
+ GenWrite(&tempLink,sizeof(struct bsaveJoinLink),fp);
746
+ }
747
+
748
+ /***********************************************************/
749
+ /* AssignBsavePatternHeaderValues: Assigns the appropriate */
750
+ /* values to a bsave pattern header record. */
751
+ /***********************************************************/
752
+ void AssignBsavePatternHeaderValues(
753
+ Environment *theEnv,
754
+ struct bsavePatternNodeHeader *theBsaveHeader,
755
+ struct patternNodeHeader *theHeader)
756
+ {
757
+ theBsaveHeader->multifieldNode = theHeader->multifieldNode;
758
+ theBsaveHeader->entryJoin = BsaveJoinIndex(theHeader->entryJoin);
759
+ theBsaveHeader->rightHash = HashedExpressionIndex(theEnv,theHeader->rightHash);
760
+ theBsaveHeader->singlefieldNode = theHeader->singlefieldNode;
761
+ theBsaveHeader->stopNode = theHeader->stopNode;
762
+ theBsaveHeader->beginSlot = theHeader->beginSlot;
763
+ theBsaveHeader->endSlot = theHeader->endSlot;
764
+ theBsaveHeader->selector = theHeader->selector;
765
+ }
766
+
767
+ #endif /* BLOAD_AND_BSAVE */
768
+
769
+ /************************************************/
770
+ /* BloadStorage: Loads storage requirements for */
771
+ /* the defrules used by this binary image. */
772
+ /************************************************/
773
+ static void BloadStorage(
774
+ Environment *theEnv)
775
+ {
776
+ size_t space;
777
+
778
+ /*=================================================*/
779
+ /* Determine the number of defrule, defruleModule, */
780
+ /* and joinNode data structures to be read. */
781
+ /*=================================================*/
782
+
783
+ GenReadBinary(theEnv,&space,sizeof(size_t));
784
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefruleModules,sizeof(long));
785
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefrules,sizeof(long));
786
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->NumberOfJoins,sizeof(long));
787
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->NumberOfLinks,sizeof(long));
788
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->RightPrimeIndex,sizeof(long));
789
+ GenReadBinary(theEnv,&DefruleBinaryData(theEnv)->LeftPrimeIndex,sizeof(long));
790
+
791
+ /*===================================*/
792
+ /* Allocate the space needed for the */
793
+ /* defruleModule data structures. */
794
+ /*===================================*/
795
+
796
+ if (DefruleBinaryData(theEnv)->NumberOfDefruleModules == 0)
797
+ {
798
+ DefruleBinaryData(theEnv)->ModuleArray = NULL;
799
+ DefruleBinaryData(theEnv)->DefruleArray = NULL;
800
+ DefruleBinaryData(theEnv)->JoinArray = NULL;
801
+ }
802
+
803
+ space = DefruleBinaryData(theEnv)->NumberOfDefruleModules * sizeof(struct defruleModule);
804
+ DefruleBinaryData(theEnv)->ModuleArray = (struct defruleModule *) genalloc(theEnv,space);
805
+
806
+ /*===============================*/
807
+ /* Allocate the space needed for */
808
+ /* the defrule data structures. */
809
+ /*===============================*/
810
+
811
+ if (DefruleBinaryData(theEnv)->NumberOfDefrules == 0)
812
+ {
813
+ DefruleBinaryData(theEnv)->DefruleArray = NULL;
814
+ DefruleBinaryData(theEnv)->JoinArray = NULL;
815
+ return;
816
+ }
817
+
818
+ space = DefruleBinaryData(theEnv)->NumberOfDefrules * sizeof(Defrule);
819
+ DefruleBinaryData(theEnv)->DefruleArray = (Defrule *) genalloc(theEnv,space);
820
+
821
+ /*===============================*/
822
+ /* Allocate the space needed for */
823
+ /* the joinNode data structures. */
824
+ /*===============================*/
825
+
826
+ space = DefruleBinaryData(theEnv)->NumberOfJoins * sizeof(struct joinNode);
827
+ DefruleBinaryData(theEnv)->JoinArray = (struct joinNode *) genalloc(theEnv,space);
828
+
829
+ /*===============================*/
830
+ /* Allocate the space needed for */
831
+ /* the joinNode data structures. */
832
+ /*===============================*/
833
+
834
+ space = DefruleBinaryData(theEnv)->NumberOfLinks * sizeof(struct joinLink);
835
+ DefruleBinaryData(theEnv)->LinkArray = (struct joinLink *) genalloc(theEnv,space);
836
+ }
837
+
838
+ /****************************************************/
839
+ /* BloadBinaryItem: Loads and refreshes the defrule */
840
+ /* constructs used by this binary image. */
841
+ /****************************************************/
842
+ static void BloadBinaryItem(
843
+ Environment *theEnv)
844
+ {
845
+ size_t space;
846
+
847
+ /*======================================================*/
848
+ /* Read in the amount of space used by the binary image */
849
+ /* (this is used to skip the construct in the event it */
850
+ /* is not available in the version being run). */
851
+ /*======================================================*/
852
+
853
+ GenReadBinary(theEnv,&space,sizeof(size_t));
854
+
855
+ /*===========================================*/
856
+ /* Read in the defruleModule data structures */
857
+ /* and refresh the pointers. */
858
+ /*===========================================*/
859
+
860
+ BloadandRefresh(theEnv,DefruleBinaryData(theEnv)->NumberOfDefruleModules,
861
+ sizeof(struct bsaveDefruleModule),UpdateDefruleModule);
862
+
863
+ /*=====================================*/
864
+ /* Read in the defrule data structures */
865
+ /* and refresh the pointers. */
866
+ /*=====================================*/
867
+
868
+ BloadandRefresh(theEnv,DefruleBinaryData(theEnv)->NumberOfDefrules,
869
+ sizeof(struct bsaveDefrule),UpdateDefrule);
870
+
871
+ /*======================================*/
872
+ /* Read in the joinNode data structures */
873
+ /* and refresh the pointers. */
874
+ /*======================================*/
875
+
876
+ BloadandRefresh(theEnv,DefruleBinaryData(theEnv)->NumberOfJoins,
877
+ sizeof(struct bsaveJoinNode),UpdateJoin);
878
+
879
+ /*======================================*/
880
+ /* Read in the joinLink data structures */
881
+ /* and refresh the pointers. */
882
+ /*======================================*/
883
+
884
+ BloadandRefresh(theEnv,DefruleBinaryData(theEnv)->NumberOfLinks,
885
+ sizeof(struct bsaveJoinLink),UpdateLink);
886
+
887
+ DefruleData(theEnv)->RightPrimeJoins = BloadJoinLinkPointer(DefruleBinaryData(theEnv)->RightPrimeIndex);
888
+ DefruleData(theEnv)->LeftPrimeJoins = BloadJoinLinkPointer(DefruleBinaryData(theEnv)->LeftPrimeIndex);
889
+ }
890
+
891
+ /**********************************************/
892
+ /* UpdateDefruleModule: Bload refresh routine */
893
+ /* for defrule module data structures. */
894
+ /**********************************************/
895
+ static void UpdateDefruleModule(
896
+ Environment *theEnv,
897
+ void *buf,
898
+ unsigned long obji)
899
+ {
900
+ struct bsaveDefruleModule *bdmPtr;
901
+
902
+ bdmPtr = (struct bsaveDefruleModule *) buf;
903
+ UpdateDefmoduleItemHeader(theEnv,&bdmPtr->header,&DefruleBinaryData(theEnv)->ModuleArray[obji].header,
904
+ sizeof(Defrule),
905
+ (void *) DefruleBinaryData(theEnv)->DefruleArray);
906
+ DefruleBinaryData(theEnv)->ModuleArray[obji].agenda = NULL;
907
+ DefruleBinaryData(theEnv)->ModuleArray[obji].groupings = NULL;
908
+
909
+ }
910
+
911
+ /****************************************/
912
+ /* UpdateDefrule: Bload refresh routine */
913
+ /* for defrule data structures. */
914
+ /****************************************/
915
+ static void UpdateDefrule(
916
+ Environment *theEnv,
917
+ void *buf,
918
+ unsigned long obji)
919
+ {
920
+ struct bsaveDefrule *br;
921
+
922
+ br = (struct bsaveDefrule *) buf;
923
+ UpdateConstructHeader(theEnv,&br->header,&DefruleBinaryData(theEnv)->DefruleArray[obji].header,DEFRULE,
924
+ sizeof(struct defruleModule),(void *) DefruleBinaryData(theEnv)->ModuleArray,
925
+ sizeof(Defrule),(void *) DefruleBinaryData(theEnv)->DefruleArray);
926
+
927
+ DefruleBinaryData(theEnv)->DefruleArray[obji].dynamicSalience = ExpressionPointer(br->dynamicSalience);
928
+
929
+ DefruleBinaryData(theEnv)->DefruleArray[obji].actions = ExpressionPointer(br->actions);
930
+ DefruleBinaryData(theEnv)->DefruleArray[obji].logicalJoin = BloadJoinPointer(br->logicalJoin);
931
+ DefruleBinaryData(theEnv)->DefruleArray[obji].lastJoin = BloadJoinPointer(br->lastJoin);
932
+ DefruleBinaryData(theEnv)->DefruleArray[obji].disjunct = BloadDefrulePointer(DefruleBinaryData(theEnv)->DefruleArray,br->disjunct);
933
+ DefruleBinaryData(theEnv)->DefruleArray[obji].salience = br->salience;
934
+ DefruleBinaryData(theEnv)->DefruleArray[obji].localVarCnt = br->localVarCnt;
935
+ DefruleBinaryData(theEnv)->DefruleArray[obji].complexity = br->complexity;
936
+ DefruleBinaryData(theEnv)->DefruleArray[obji].autoFocus = br->autoFocus;
937
+ DefruleBinaryData(theEnv)->DefruleArray[obji].executing = 0;
938
+ DefruleBinaryData(theEnv)->DefruleArray[obji].afterBreakpoint = 0;
939
+ #if DEBUGGING_FUNCTIONS
940
+ DefruleBinaryData(theEnv)->DefruleArray[obji].watchActivation = AgendaData(theEnv)->WatchActivations;
941
+ DefruleBinaryData(theEnv)->DefruleArray[obji].watchFiring = DefruleData(theEnv)->WatchRules;
942
+ #endif
943
+ }
944
+
945
+ /*************************************/
946
+ /* UpdateJoin: Bload refresh routine */
947
+ /* for joinNode data structures. */
948
+ /*************************************/
949
+ static void UpdateJoin(
950
+ Environment *theEnv,
951
+ void *buf,
952
+ unsigned long obji)
953
+ {
954
+ struct bsaveJoinNode *bj;
955
+
956
+ bj = (struct bsaveJoinNode *) buf;
957
+ DefruleBinaryData(theEnv)->JoinArray[obji].firstJoin = bj->firstJoin;
958
+ DefruleBinaryData(theEnv)->JoinArray[obji].logicalJoin = bj->logicalJoin;
959
+ DefruleBinaryData(theEnv)->JoinArray[obji].joinFromTheRight = bj->joinFromTheRight;
960
+ DefruleBinaryData(theEnv)->JoinArray[obji].patternIsNegated = bj->patternIsNegated;
961
+ DefruleBinaryData(theEnv)->JoinArray[obji].patternIsExists = bj->patternIsExists;
962
+ DefruleBinaryData(theEnv)->JoinArray[obji].depth = bj->depth;
963
+ DefruleBinaryData(theEnv)->JoinArray[obji].rhsType = bj->rhsType;
964
+ DefruleBinaryData(theEnv)->JoinArray[obji].networkTest = HashedExpressionPointer(bj->networkTest);
965
+ DefruleBinaryData(theEnv)->JoinArray[obji].secondaryNetworkTest = HashedExpressionPointer(bj->secondaryNetworkTest);
966
+ DefruleBinaryData(theEnv)->JoinArray[obji].leftHash = HashedExpressionPointer(bj->leftHash);
967
+ DefruleBinaryData(theEnv)->JoinArray[obji].rightHash = HashedExpressionPointer(bj->rightHash);
968
+ DefruleBinaryData(theEnv)->JoinArray[obji].nextLinks = BloadJoinLinkPointer(bj->nextLinks);
969
+ DefruleBinaryData(theEnv)->JoinArray[obji].lastLevel = BloadJoinPointer(bj->lastLevel);
970
+
971
+ if (bj->joinFromTheRight == true)
972
+ { DefruleBinaryData(theEnv)->JoinArray[obji].rightSideEntryStructure = (void *) BloadJoinPointer(bj->rightSideEntryStructure); }
973
+ else
974
+ { DefruleBinaryData(theEnv)->JoinArray[obji].rightSideEntryStructure = NULL; }
975
+
976
+ DefruleBinaryData(theEnv)->JoinArray[obji].rightMatchNode = BloadJoinPointer(bj->rightMatchNode);
977
+ DefruleBinaryData(theEnv)->JoinArray[obji].ruleToActivate = BloadDefrulePointer(DefruleBinaryData(theEnv)->DefruleArray,bj->ruleToActivate);
978
+ DefruleBinaryData(theEnv)->JoinArray[obji].initialize = 0;
979
+ DefruleBinaryData(theEnv)->JoinArray[obji].marked = 0;
980
+ DefruleBinaryData(theEnv)->JoinArray[obji].bsaveID = 0L;
981
+ DefruleBinaryData(theEnv)->JoinArray[obji].leftMemory = NULL;
982
+ DefruleBinaryData(theEnv)->JoinArray[obji].rightMemory = NULL;
983
+
984
+ AddBetaMemoriesToJoin(theEnv,&DefruleBinaryData(theEnv)->JoinArray[obji]);
985
+ }
986
+
987
+ /*************************************/
988
+ /* UpdateLink: Bload refresh routine */
989
+ /* for joinLink data structures. */
990
+ /*************************************/
991
+ static void UpdateLink(
992
+ Environment *theEnv,
993
+ void *buf,
994
+ unsigned long obji)
995
+ {
996
+ struct bsaveJoinLink *bj;
997
+
998
+ bj = (struct bsaveJoinLink *) buf;
999
+ DefruleBinaryData(theEnv)->LinkArray[obji].enterDirection = bj->enterDirection;
1000
+ DefruleBinaryData(theEnv)->LinkArray[obji].next = BloadJoinLinkPointer(bj->next);
1001
+ DefruleBinaryData(theEnv)->LinkArray[obji].join = BloadJoinPointer(bj->join);
1002
+ }
1003
+
1004
+ /************************************************************/
1005
+ /* UpdatePatternNodeHeader: Refreshes the values in pattern */
1006
+ /* node headers from the loaded binary image. */
1007
+ /************************************************************/
1008
+ void UpdatePatternNodeHeader(
1009
+ Environment *theEnv,
1010
+ struct patternNodeHeader *theHeader,
1011
+ struct bsavePatternNodeHeader *theBsaveHeader)
1012
+ {
1013
+ struct joinNode *theJoin;
1014
+
1015
+ theHeader->singlefieldNode = theBsaveHeader->singlefieldNode;
1016
+ theHeader->multifieldNode = theBsaveHeader->multifieldNode;
1017
+ theHeader->stopNode = theBsaveHeader->stopNode;
1018
+ theHeader->beginSlot = theBsaveHeader->beginSlot;
1019
+ theHeader->endSlot = theBsaveHeader->endSlot;
1020
+ theHeader->selector = theBsaveHeader->selector;
1021
+ theHeader->initialize = 0;
1022
+ theHeader->marked = 0;
1023
+ theHeader->firstHash = NULL;
1024
+ theHeader->lastHash = NULL;
1025
+ theHeader->rightHash = HashedExpressionPointer(theBsaveHeader->rightHash);
1026
+
1027
+ theJoin = BloadJoinPointer(theBsaveHeader->entryJoin);
1028
+ theHeader->entryJoin = theJoin;
1029
+
1030
+ while (theJoin != NULL)
1031
+ {
1032
+ theJoin->rightSideEntryStructure = (void *) theHeader;
1033
+ theJoin = theJoin->rightMatchNode;
1034
+ }
1035
+ }
1036
+
1037
+ /**************************************/
1038
+ /* ClearBload: Defrule clear routine */
1039
+ /* when a binary load is in effect. */
1040
+ /**************************************/
1041
+ static void ClearBload(
1042
+ Environment *theEnv)
1043
+ {
1044
+ size_t space;
1045
+ unsigned long i;
1046
+ struct patternParser *theParser = NULL;
1047
+ struct patternEntity *theEntity = NULL;
1048
+ Defmodule *theModule;
1049
+
1050
+ /*===========================================*/
1051
+ /* Delete all known entities before removing */
1052
+ /* the defrule data structures. */
1053
+ /*===========================================*/
1054
+
1055
+ GetNextPatternEntity(theEnv,&theParser,&theEntity);
1056
+ while (theEntity != NULL)
1057
+ {
1058
+ (*theEntity->theInfo->base.deleteFunction)(theEntity,theEnv);
1059
+ theEntity = NULL;
1060
+ GetNextPatternEntity(theEnv,&theParser,&theEntity);
1061
+ }
1062
+
1063
+ /*=========================================*/
1064
+ /* Remove all activations from the agenda. */
1065
+ /*=========================================*/
1066
+
1067
+ SaveCurrentModule(theEnv);
1068
+ for (theModule = GetNextDefmodule(theEnv,NULL);
1069
+ theModule != NULL;
1070
+ theModule = GetNextDefmodule(theEnv,theModule))
1071
+ {
1072
+ SetCurrentModule(theEnv,theModule);
1073
+ RemoveAllActivations(theEnv);
1074
+ }
1075
+ RestoreCurrentModule(theEnv);
1076
+ ClearFocusStack(theEnv);
1077
+
1078
+ /*==========================================================*/
1079
+ /* Remove all partial matches from the beta memories in the */
1080
+ /* join network. Alpha memories do not need to be examined */
1081
+ /* since all pattern entities have been deleted by now. */
1082
+ /*==========================================================*/
1083
+
1084
+ for (i = 0; i < DefruleBinaryData(theEnv)->NumberOfJoins; i++)
1085
+ {
1086
+ FlushBetaMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i],LHS);
1087
+ ReturnLeftMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i]);
1088
+ FlushBetaMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i],RHS);
1089
+ ReturnRightMemory(theEnv,&DefruleBinaryData(theEnv)->JoinArray[i]);
1090
+ }
1091
+
1092
+ /*================================================*/
1093
+ /* Decrement the symbol count for each rule name. */
1094
+ /*================================================*/
1095
+
1096
+ for (i = 0; i < DefruleBinaryData(theEnv)->NumberOfDefrules; i++)
1097
+ { UnmarkConstructHeader(theEnv,&DefruleBinaryData(theEnv)->DefruleArray[i].header); }
1098
+
1099
+ /*==================================================*/
1100
+ /* Return the space allocated for the bload arrays. */
1101
+ /*==================================================*/
1102
+
1103
+ space = DefruleBinaryData(theEnv)->NumberOfDefruleModules * sizeof(struct defruleModule);
1104
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->ModuleArray,space);
1105
+ DefruleBinaryData(theEnv)->NumberOfDefruleModules = 0;
1106
+
1107
+ space = DefruleBinaryData(theEnv)->NumberOfDefrules * sizeof(Defrule);
1108
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->DefruleArray,space);
1109
+ DefruleBinaryData(theEnv)->NumberOfDefrules = 0;
1110
+
1111
+ space = DefruleBinaryData(theEnv)->NumberOfJoins * sizeof(struct joinNode);
1112
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->JoinArray,space);
1113
+ DefruleBinaryData(theEnv)->NumberOfJoins = 0;
1114
+
1115
+ space = DefruleBinaryData(theEnv)->NumberOfLinks * sizeof(struct joinLink);
1116
+ if (space != 0) genfree(theEnv,DefruleBinaryData(theEnv)->LinkArray,space);
1117
+ DefruleBinaryData(theEnv)->NumberOfLinks = 0;
1118
+
1119
+ DefruleData(theEnv)->RightPrimeJoins = NULL;
1120
+ DefruleData(theEnv)->LeftPrimeJoins = NULL;
1121
+ }
1122
+
1123
+ /*******************************************************/
1124
+ /* BloadDefruleModuleReference: Returns the defrule */
1125
+ /* module pointer for using with the bload function. */
1126
+ /*******************************************************/
1127
+ void *BloadDefruleModuleReference(
1128
+ Environment *theEnv,
1129
+ unsigned long theIndex)
1130
+ {
1131
+ return ((void *) &DefruleBinaryData(theEnv)->ModuleArray[theIndex]);
1132
+ }
1133
+
1134
+ #endif /* DEFRULE_CONSTRUCT && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME) */
1135
+
1136
+