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,599 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* RULE DELETION MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides routines for deleting a rule including */
11
+ /* freeing the defrule data structures and removing the */
12
+ /* appropriate joins from the join network. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.24: Removed DYNAMIC_SALIENCE compilation flag. */
22
+ /* */
23
+ /* Renamed BOOLEAN macro type to intBool. */
24
+ /* */
25
+ /* 6.30: Removed conditional code for unsupported */
26
+ /* compilers/operating systems (IBM_MCW and */
27
+ /* MAC_MCW). */
28
+ /* */
29
+ /* Added support for hashed memories. */
30
+ /* */
31
+ /* Fixed linkage issue when BLOAD_ONLY compiler */
32
+ /* flag is set to 1. */
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
46
+
47
+ #include <stdio.h>
48
+ #include <string.h>
49
+
50
+ #include "agenda.h"
51
+ #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
52
+ #include "bload.h"
53
+ #endif
54
+ #include "constrct.h"
55
+ #include "drive.h"
56
+ #include "engine.h"
57
+ #include "envrnmnt.h"
58
+ #include "memalloc.h"
59
+ #include "pattern.h"
60
+ #include "reteutil.h"
61
+ #include "retract.h"
62
+
63
+ #include "ruledlt.h"
64
+
65
+ /***************************************/
66
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
67
+ /***************************************/
68
+
69
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
70
+ static void RemoveIntranetworkLink(Environment *,struct joinNode *);
71
+ #endif
72
+ static void DetachJoins(Environment *,struct joinNode *,bool);
73
+ static void DetachJoinsDriver(Environment *,Defrule *,bool);
74
+
75
+ /**********************************************************************/
76
+ /* ReturnDefrule: Returns a defrule data structure and its associated */
77
+ /* data structures to the memory manager. Note that the first */
78
+ /* disjunct of a rule is the only disjunct which allocates storage */
79
+ /* for the rule's dynamic salience and pretty print form (so these */
80
+ /* are only deallocated for the first disjunct). */
81
+ /**********************************************************************/
82
+ void ReturnDefrule(
83
+ Environment *theEnv,
84
+ Defrule *theDefrule)
85
+ {
86
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
87
+ bool first = true;
88
+ Defrule *nextPtr, *tmpPtr;
89
+
90
+ if (theDefrule == NULL) return;
91
+
92
+ /*======================================*/
93
+ /* If a rule is redefined, then we want */
94
+ /* to save its breakpoint status. */
95
+ /*======================================*/
96
+
97
+ #if DEBUGGING_FUNCTIONS
98
+ DefruleData(theEnv)->DeletedRuleDebugFlags = 0;
99
+ if (theDefrule->afterBreakpoint) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,0);
100
+ if (theDefrule->watchActivation) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,1);
101
+ if (theDefrule->watchFiring) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,2);
102
+ #endif
103
+
104
+ /*================================*/
105
+ /* Clear the agenda of all the */
106
+ /* activations added by the rule. */
107
+ /*================================*/
108
+
109
+ ClearRuleFromAgenda(theEnv,theDefrule);
110
+
111
+ /*======================*/
112
+ /* Get rid of the rule. */
113
+ /*======================*/
114
+
115
+ while (theDefrule != NULL)
116
+ {
117
+ /*================================================*/
118
+ /* Remove the rule's joins from the join network. */
119
+ /*================================================*/
120
+
121
+ DetachJoinsDriver(theEnv,theDefrule,false);
122
+
123
+ /*=============================================*/
124
+ /* If this is the first disjunct, get rid of */
125
+ /* the dynamic salience and pretty print form. */
126
+ /*=============================================*/
127
+
128
+ if (first)
129
+ {
130
+ if (theDefrule->dynamicSalience != NULL)
131
+ {
132
+ ExpressionDeinstall(theEnv,theDefrule->dynamicSalience);
133
+ ReturnPackedExpression(theEnv,theDefrule->dynamicSalience);
134
+ theDefrule->dynamicSalience = NULL;
135
+ }
136
+ if (theDefrule->header.ppForm != NULL)
137
+ {
138
+ rm(theEnv,(void *) theDefrule->header.ppForm,strlen(theDefrule->header.ppForm) + 1);
139
+ theDefrule->header.ppForm = NULL;
140
+
141
+ /*=======================================================*/
142
+ /* All of the rule disjuncts share the same pretty print */
143
+ /* form, so we want to avoid deleting it again. */
144
+ /*=======================================================*/
145
+
146
+ for (tmpPtr = theDefrule->disjunct; tmpPtr != NULL; tmpPtr = tmpPtr->disjunct)
147
+ { tmpPtr->header.ppForm = NULL; }
148
+ }
149
+
150
+ first = false;
151
+ }
152
+
153
+ /*===========================*/
154
+ /* Get rid of any user data. */
155
+ /*===========================*/
156
+
157
+ if (theDefrule->header.usrData != NULL)
158
+ { ClearUserDataList(theEnv,theDefrule->header.usrData); }
159
+
160
+ /*===========================================*/
161
+ /* Decrement the count for the defrule name. */
162
+ /*===========================================*/
163
+
164
+ ReleaseLexeme(theEnv,theDefrule->header.name);
165
+
166
+ /*========================================*/
167
+ /* Get rid of the the rule's RHS actions. */
168
+ /*========================================*/
169
+
170
+ if (theDefrule->actions != NULL)
171
+ {
172
+ ExpressionDeinstall(theEnv,theDefrule->actions);
173
+ ReturnPackedExpression(theEnv,theDefrule->actions);
174
+ }
175
+
176
+ /*===============================*/
177
+ /* Move on to the next disjunct. */
178
+ /*===============================*/
179
+
180
+ nextPtr = theDefrule->disjunct;
181
+ rtn_struct(theEnv,defrule,theDefrule);
182
+ theDefrule = nextPtr;
183
+ }
184
+
185
+ /*==========================*/
186
+ /* Free up partial matches. */
187
+ /*==========================*/
188
+
189
+ if (EngineData(theEnv)->ExecutingRule == NULL) FlushGarbagePartialMatches(theEnv);
190
+ #endif
191
+ }
192
+
193
+ /********************************************************/
194
+ /* DestroyDefrule: Action used to remove defrules */
195
+ /* as a result of DestroyEnvironment. */
196
+ /********************************************************/
197
+ void DestroyDefrule(
198
+ Environment *theEnv,
199
+ Defrule *theDefrule)
200
+ {
201
+ Defrule *nextDisjunct;
202
+ bool first = true;
203
+
204
+ if (theDefrule == NULL) return;
205
+
206
+ while (theDefrule != NULL)
207
+ {
208
+ DetachJoinsDriver(theEnv,theDefrule,true);
209
+
210
+ if (first)
211
+ {
212
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
213
+ if (theDefrule->dynamicSalience != NULL)
214
+ { ReturnPackedExpression(theEnv,theDefrule->dynamicSalience); }
215
+
216
+ if (theDefrule->header.ppForm != NULL)
217
+ {
218
+ Defrule *tmpPtr;
219
+
220
+ rm(theEnv,(void *) theDefrule->header.ppForm,strlen(theDefrule->header.ppForm) + 1);
221
+
222
+ /*=======================================================*/
223
+ /* All of the rule disjuncts share the same pretty print */
224
+ /* form, so we want to avoid deleting it again. */
225
+ /*=======================================================*/
226
+
227
+ for (tmpPtr = theDefrule->disjunct; tmpPtr != NULL; tmpPtr = tmpPtr->disjunct)
228
+ { tmpPtr->header.ppForm = NULL; }
229
+ }
230
+ #endif
231
+
232
+ first = false;
233
+ }
234
+
235
+ if (theDefrule->header.usrData != NULL)
236
+ { ClearUserDataList(theEnv,theDefrule->header.usrData); }
237
+
238
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
239
+ if (theDefrule->actions != NULL)
240
+ { ReturnPackedExpression(theEnv,theDefrule->actions); }
241
+ #endif
242
+
243
+ nextDisjunct = theDefrule->disjunct;
244
+
245
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
246
+ rtn_struct(theEnv,defrule,theDefrule);
247
+ #endif
248
+
249
+ theDefrule = nextDisjunct;
250
+ }
251
+ }
252
+
253
+ /**********************/
254
+ /* DetachJoinsDriver: */
255
+ /**********************/
256
+ static void DetachJoinsDriver(
257
+ Environment *theEnv,
258
+ Defrule *theRule,
259
+ bool destroy)
260
+ {
261
+ struct joinNode *join;
262
+
263
+ /*==================================*/
264
+ /* Find the last join for the rule. */
265
+ /*==================================*/
266
+
267
+ join = theRule->lastJoin;
268
+ theRule->lastJoin = NULL;
269
+ if (join == NULL) return;
270
+
271
+ /*===================================================*/
272
+ /* Remove the activation link from the last join. If */
273
+ /* there are joins below this join, then all of the */
274
+ /* joins for this rule were shared with another rule */
275
+ /* and thus no joins can be deleted. */
276
+ /*===================================================*/
277
+
278
+ join->ruleToActivate = NULL;
279
+ if (join->nextLinks != NULL) return;
280
+
281
+ DetachJoins(theEnv,join,destroy);
282
+ }
283
+
284
+ /**********************************************************************/
285
+ /* DetachJoins: Removes a join node and all of its parent nodes from */
286
+ /* the join network. Nodes are only removed if they are no required */
287
+ /* by other rules (the same join can be shared by multiple rules). */
288
+ /* Any partial matches associated with the join are also removed. */
289
+ /* A rule's joins are typically removed by removing the bottom most */
290
+ /* join used by the rule and then removing any parent joins which */
291
+ /* are not shared by other rules. */
292
+ /**********************************************************************/
293
+ static void DetachJoins(
294
+ Environment *theEnv,
295
+ struct joinNode *join,
296
+ bool destroy)
297
+ {
298
+ struct joinNode *prevJoin, *rightJoin;
299
+ struct joinLink *lastLink, *theLink;
300
+ unsigned lastMark;
301
+
302
+ /*===========================*/
303
+ /* Begin removing the joins. */
304
+ /*===========================*/
305
+
306
+ while (join != NULL)
307
+ {
308
+ if (join->marked) return;
309
+
310
+ /*==========================================================*/
311
+ /* Remember the join "above" this join (the one that enters */
312
+ /* from the left). If the join is entered from the right by */
313
+ /* another join, remember the right entering join as well. */
314
+ /*==========================================================*/
315
+
316
+ prevJoin = join->lastLevel;
317
+ if (join->joinFromTheRight)
318
+ { rightJoin = (struct joinNode *) join->rightSideEntryStructure; }
319
+ else
320
+ { rightJoin = NULL; }
321
+
322
+ /*=================================================*/
323
+ /* If the join was attached to a pattern, remove */
324
+ /* any structures associated with the pattern that */
325
+ /* are no longer needed. */
326
+ /*=================================================*/
327
+
328
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
329
+ if (! destroy)
330
+ {
331
+ if ((join->rightSideEntryStructure != NULL) && (join->joinFromTheRight == false))
332
+ { RemoveIntranetworkLink(theEnv,join); }
333
+ }
334
+ #endif
335
+
336
+ /*======================================*/
337
+ /* Remove any partial matches contained */
338
+ /* in the beta memory of the join. */
339
+ /*======================================*/
340
+
341
+ if (destroy)
342
+ {
343
+ DestroyBetaMemory(theEnv,join,LHS);
344
+ DestroyBetaMemory(theEnv,join,RHS);
345
+ }
346
+ else
347
+ {
348
+ FlushBetaMemory(theEnv,join,LHS);
349
+ FlushBetaMemory(theEnv,join,RHS);
350
+ }
351
+
352
+ ReturnLeftMemory(theEnv,join);
353
+ ReturnRightMemory(theEnv,join);
354
+
355
+ /*===================================*/
356
+ /* Remove the expressions associated */
357
+ /* with the join. */
358
+ /*===================================*/
359
+
360
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
361
+ if (! destroy)
362
+ {
363
+ RemoveHashedExpression(theEnv,join->networkTest);
364
+ RemoveHashedExpression(theEnv,join->secondaryNetworkTest);
365
+ RemoveHashedExpression(theEnv,join->leftHash);
366
+ RemoveHashedExpression(theEnv,join->rightHash);
367
+ }
368
+ #endif
369
+
370
+ /*============================*/
371
+ /* Fix the right prime links. */
372
+ /*============================*/
373
+
374
+ if (join->firstJoin && (join->rightSideEntryStructure == NULL))
375
+ {
376
+ lastLink = NULL;
377
+
378
+ theLink = DefruleData(theEnv)->RightPrimeJoins;
379
+ while (theLink != NULL)
380
+ {
381
+ if (theLink->join == join)
382
+ {
383
+ if (lastLink == NULL)
384
+ { DefruleData(theEnv)->RightPrimeJoins = theLink->next; }
385
+ else
386
+ { lastLink->next = theLink->next; }
387
+
388
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
389
+ rtn_struct(theEnv,joinLink,theLink);
390
+ #endif
391
+
392
+ theLink = NULL;
393
+ }
394
+ else
395
+ {
396
+ lastLink = theLink;
397
+ theLink = lastLink->next;
398
+ }
399
+ }
400
+ }
401
+
402
+ /*===========================*/
403
+ /* Fix the left prime links. */
404
+ /*===========================*/
405
+
406
+ if (join->firstJoin && (join->patternIsNegated || join->joinFromTheRight) && (! join->patternIsExists))
407
+ {
408
+ lastLink = NULL;
409
+ theLink = DefruleData(theEnv)->LeftPrimeJoins;
410
+ while (theLink != NULL)
411
+ {
412
+ if (theLink->join == join)
413
+ {
414
+ if (lastLink == NULL)
415
+ { DefruleData(theEnv)->LeftPrimeJoins = theLink->next; }
416
+ else
417
+ { lastLink->next = theLink->next; }
418
+
419
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
420
+ rtn_struct(theEnv,joinLink,theLink);
421
+ #endif
422
+
423
+ theLink = NULL;
424
+ }
425
+ else
426
+ {
427
+ lastLink = theLink;
428
+ theLink = theLink->next;
429
+ }
430
+ }
431
+ }
432
+
433
+ /*==================================================*/
434
+ /* Remove the link to the join from the join above. */
435
+ /*==================================================*/
436
+
437
+ if (prevJoin != NULL)
438
+ {
439
+ lastLink = NULL;
440
+ theLink = prevJoin->nextLinks;
441
+ while (theLink != NULL)
442
+ {
443
+ if (theLink->join == join)
444
+ {
445
+ if (lastLink == NULL)
446
+ { prevJoin->nextLinks = theLink->next; }
447
+ else
448
+ { lastLink->next = theLink->next; }
449
+
450
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
451
+ rtn_struct(theEnv,joinLink,theLink);
452
+ #endif
453
+
454
+ theLink = NULL;
455
+ }
456
+ else
457
+ {
458
+ lastLink = theLink;
459
+ theLink = theLink->next;
460
+ }
461
+ }
462
+ }
463
+
464
+ /*==========================================*/
465
+ /* Remove the right join link if it exists. */
466
+ /*==========================================*/
467
+
468
+ if (rightJoin != NULL)
469
+ {
470
+ lastLink = NULL;
471
+ theLink = rightJoin->nextLinks;
472
+ while (theLink != NULL)
473
+ {
474
+ if (theLink->join == join)
475
+ {
476
+ if (lastLink == NULL)
477
+ { rightJoin->nextLinks = theLink->next; }
478
+ else
479
+ { lastLink->next = theLink->next; }
480
+
481
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
482
+ rtn_struct(theEnv,joinLink,theLink);
483
+ #endif
484
+ theLink = NULL;
485
+ }
486
+ else
487
+ {
488
+ lastLink = theLink;
489
+ theLink = theLink->next;
490
+ }
491
+ }
492
+
493
+ if ((rightJoin->nextLinks == NULL) &&
494
+ (rightJoin->ruleToActivate == NULL))
495
+ {
496
+ if (prevJoin != NULL)
497
+ {
498
+ lastMark = prevJoin->marked;
499
+ prevJoin->marked = true;
500
+ DetachJoins(theEnv,rightJoin,destroy);
501
+ prevJoin->marked = lastMark;
502
+ }
503
+ else
504
+ { DetachJoins(theEnv,rightJoin,destroy); }
505
+ }
506
+ }
507
+
508
+ /*==================*/
509
+ /* Delete the join. */
510
+ /*==================*/
511
+
512
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
513
+ rtn_struct(theEnv,joinNode,join);
514
+ #endif
515
+
516
+ /*===========================================================*/
517
+ /* Move on to the next join to be removed. All the joins of */
518
+ /* a rule can be deleted by following the right joins links */
519
+ /* (when these links exist) and then following the left join */
520
+ /* links. This works because if join A enters join B from */
521
+ /* the right, the right/left links of join A eventually lead */
522
+ /* to the join which enters join B from the left. */
523
+ /*===========================================================*/
524
+
525
+ if (prevJoin == NULL)
526
+ { return; }
527
+ else if (prevJoin->ruleToActivate != NULL)
528
+ { return; }
529
+ else if (prevJoin->nextLinks == NULL)
530
+ { join = prevJoin; }
531
+ else
532
+ { return; }
533
+ }
534
+ }
535
+
536
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
537
+
538
+ /***********************************************************************/
539
+ /* RemoveIntranetworkLink: Removes the link between a join node in the */
540
+ /* join network and its corresponding pattern node in the pattern */
541
+ /* network. If the pattern node is then no longer associated with */
542
+ /* any other joins, it is removed using the function DetachPattern. */
543
+ /***********************************************************************/
544
+ static void RemoveIntranetworkLink(
545
+ Environment *theEnv,
546
+ struct joinNode *join)
547
+ {
548
+ struct patternNodeHeader *patternPtr;
549
+ struct joinNode *joinPtr, *lastJoin;
550
+
551
+ /*================================================*/
552
+ /* Determine the pattern that enters this join. */
553
+ /* Determine the list of joins which this pattern */
554
+ /* enters from the right. */
555
+ /*================================================*/
556
+
557
+ patternPtr = (struct patternNodeHeader *) join->rightSideEntryStructure;
558
+ joinPtr = patternPtr->entryJoin;
559
+ lastJoin = NULL;
560
+
561
+ /*=================================================*/
562
+ /* Loop through the list of joins that the pattern */
563
+ /* enters until the join being removed is found. */
564
+ /* Remove this join from the list. */
565
+ /*=================================================*/
566
+
567
+ while (joinPtr != NULL)
568
+ {
569
+ if (joinPtr == join)
570
+ {
571
+ if (lastJoin == NULL)
572
+ { patternPtr->entryJoin = joinPtr->rightMatchNode; }
573
+ else
574
+ { lastJoin->rightMatchNode = joinPtr->rightMatchNode; }
575
+
576
+ joinPtr = NULL;
577
+ }
578
+ else
579
+ {
580
+ lastJoin = joinPtr;
581
+ joinPtr = joinPtr->rightMatchNode;
582
+ }
583
+ }
584
+
585
+ /*===================================================*/
586
+ /* If the terminal node of the pattern doesn't point */
587
+ /* to any joins, then start removing the pattern. */
588
+ /*===================================================*/
589
+
590
+ if (patternPtr->entryJoin == NULL)
591
+ { DetachPattern(theEnv,join->rhsType,patternPtr); }
592
+ }
593
+
594
+ #endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
595
+
596
+ #endif /* DEFRULE_CONSTRUCT */
597
+
598
+
599
+
@@ -0,0 +1,58 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* RULE DELETION MODULE HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides routines for deleting a rule including */
11
+ /* freeing the defrule data structures and removing the */
12
+ /* appropriate joins from the join network. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.24: Removed DYNAMIC_SALIENCE compilation flag. */
22
+ /* */
23
+ /* Renamed BOOLEAN macro type to intBool. */
24
+ /* */
25
+ /* 6.30: Removed conditional code for unsupported */
26
+ /* compilers/operating systems (IBM_MCW and */
27
+ /* MAC_MCW). */
28
+ /* */
29
+ /* Added support for hashed memories. */
30
+ /* */
31
+ /* Fixed linkage issue when BLOAD_ONLY compiler */
32
+ /* flag is set to 1. */
33
+ /* */
34
+ /* 6.40: Removed LOCALE definition. */
35
+ /* */
36
+ /* Pragma once and other inclusion changes. */
37
+ /* */
38
+ /* Removed use of void pointers for specific */
39
+ /* data structures. */
40
+ /* */
41
+ /*************************************************************/
42
+
43
+ #ifndef _H_ruledlt
44
+
45
+ #pragma once
46
+
47
+ #define _H_ruledlt
48
+
49
+ void ReturnDefrule(Environment *,Defrule *);
50
+ void DestroyDefrule(Environment *,Defrule *);
51
+
52
+ #endif /* _H_ruledlt */
53
+
54
+
55
+
56
+
57
+
58
+