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,494 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 11/01/16 */
5
+ /* */
6
+ /* EXPRESSION MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Contains routines for creating, deleting, */
11
+ /* compacting, installing, and hashing expressions. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* Brian L. Dantes */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.23: Changed name of variable exp to theExp */
22
+ /* because of Unix compiler warnings of shadowed */
23
+ /* definitions. */
24
+ /* */
25
+ /* 6.24: Corrected link errors with non-default */
26
+ /* setup.h configuration settings. */
27
+ /* */
28
+ /* 6.30: Removed conditional code for unsupported */
29
+ /* compilers/operating systems (IBM_MCW and */
30
+ /* MAC_MCW). */
31
+ /* */
32
+ /* Changed integer type/precision. */
33
+ /* */
34
+ /* Changed expression hashing value. */
35
+ /* */
36
+ /* 6.40: Pragma once and other inclusion changes. */
37
+ /* */
38
+ /* Removed use of void pointers for specific */
39
+ /* data structures. */
40
+ /* */
41
+ /* Eval support for run time and bload only. */
42
+ /* */
43
+ /*************************************************************/
44
+
45
+ #include "setup.h"
46
+
47
+ #include <stdio.h>
48
+ #include <stdlib.h>
49
+ #include <string.h>
50
+ #include <ctype.h>
51
+
52
+ #include "bload.h"
53
+ #include "envrnmnt.h"
54
+ #include "evaluatn.h"
55
+ #include "exprnops.h"
56
+ #include "extnfunc.h"
57
+ #include "memalloc.h"
58
+ #include "prntutil.h"
59
+ #include "router.h"
60
+
61
+ #include "expressn.h"
62
+
63
+ #define PRIME_ONE 257
64
+ #define PRIME_TWO 263
65
+ #define PRIME_THREE 269
66
+
67
+ /****************************************/
68
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
69
+ /****************************************/
70
+
71
+ #if (! RUN_TIME)
72
+ static unsigned long ListToPacked(struct expr *,struct expr *,unsigned long);
73
+ #endif
74
+ static EXPRESSION_HN *FindHashedExpression(Environment *,Expression *,unsigned *,EXPRESSION_HN **);
75
+ static unsigned HashExpression(Expression *);
76
+ static void DeallocateExpressionData(Environment *);
77
+
78
+ /**************************************************/
79
+ /* InitExpressionData: Initializes the function */
80
+ /* pointers used in generating some expressions */
81
+ /* and the expression hash table. */
82
+ /**************************************************/
83
+ void InitExpressionData(
84
+ Environment *theEnv)
85
+ {
86
+ unsigned i;
87
+
88
+ AllocateEnvironmentData(theEnv,EXPRESSION_DATA,sizeof(struct expressionData),DeallocateExpressionData);
89
+
90
+ #if ! RUN_TIME
91
+ InitExpressionPointers(theEnv);
92
+ #endif
93
+
94
+ ExpressionData(theEnv)->ExpressionHashTable = (EXPRESSION_HN **)
95
+ gm2(theEnv,sizeof(EXPRESSION_HN *) * EXPRESSION_HASH_SIZE);
96
+ for (i = 0 ; i < EXPRESSION_HASH_SIZE ; i++)
97
+ ExpressionData(theEnv)->ExpressionHashTable[i] = NULL;
98
+ }
99
+
100
+ /*****************************************/
101
+ /* DeallocateExpressionData: Deallocates */
102
+ /* environment data for expressions. */
103
+ /*****************************************/
104
+ static void DeallocateExpressionData(
105
+ Environment *theEnv)
106
+ {
107
+ int i;
108
+ EXPRESSION_HN *tmpPtr, *nextPtr;
109
+
110
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
111
+ if (! Bloaded(theEnv))
112
+ #endif
113
+ {
114
+ for (i = 0; i < EXPRESSION_HASH_SIZE; i++)
115
+ {
116
+ tmpPtr = ExpressionData(theEnv)->ExpressionHashTable[i];
117
+ while (tmpPtr != NULL)
118
+ {
119
+ nextPtr = tmpPtr->next;
120
+ ReturnPackedExpression(theEnv,tmpPtr->exp);
121
+ rtn_struct(theEnv,exprHashNode,tmpPtr);
122
+ tmpPtr = nextPtr;
123
+ }
124
+ }
125
+ }
126
+
127
+ rm(theEnv,ExpressionData(theEnv)->ExpressionHashTable,
128
+ sizeof(EXPRESSION_HN *) * EXPRESSION_HASH_SIZE);
129
+
130
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
131
+ if ((ExpressionData(theEnv)->NumberOfExpressions != 0) && Bloaded(theEnv))
132
+ {
133
+ genfree(theEnv,ExpressionData(theEnv)->ExpressionArray,
134
+ ExpressionData(theEnv)->NumberOfExpressions * sizeof(struct expr));
135
+ }
136
+ #endif
137
+ }
138
+
139
+ /****************************************************/
140
+ /* InitExpressionPointers: Initializes the function */
141
+ /* pointers used in generating some expressions. */
142
+ /****************************************************/
143
+ void InitExpressionPointers(
144
+ Environment *theEnv)
145
+ {
146
+ ExpressionData(theEnv)->PTR_AND = FindFunction(theEnv,"and");
147
+ ExpressionData(theEnv)->PTR_OR = FindFunction(theEnv,"or");
148
+ ExpressionData(theEnv)->PTR_EQ = FindFunction(theEnv,"eq");
149
+ ExpressionData(theEnv)->PTR_NEQ = FindFunction(theEnv,"neq");
150
+ ExpressionData(theEnv)->PTR_NOT = FindFunction(theEnv,"not");
151
+
152
+ if ((ExpressionData(theEnv)->PTR_AND == NULL) || (ExpressionData(theEnv)->PTR_OR == NULL) ||
153
+ (ExpressionData(theEnv)->PTR_EQ == NULL) || (ExpressionData(theEnv)->PTR_NEQ == NULL) || (ExpressionData(theEnv)->PTR_NOT == NULL))
154
+ {
155
+ SystemError(theEnv,"EXPRESSN",1);
156
+ ExitRouter(theEnv,EXIT_FAILURE);
157
+ }
158
+ }
159
+
160
+ /***************************************************/
161
+ /* ExpressionInstall: Increments the busy count of */
162
+ /* atomic data values found in an expression. */
163
+ /***************************************************/
164
+ void ExpressionInstall(
165
+ Environment *theEnv,
166
+ struct expr *expression)
167
+ {
168
+ if (expression == NULL) return;
169
+
170
+ while (expression != NULL)
171
+ {
172
+ AtomInstall(theEnv,expression->type,expression->value);
173
+ ExpressionInstall(theEnv,expression->argList);
174
+ expression = expression->nextArg;
175
+ }
176
+ }
177
+
178
+ /*****************************************************/
179
+ /* ExpressionDeinstall: Decrements the busy count of */
180
+ /* atomic data values found in an expression. */
181
+ /*****************************************************/
182
+ void ExpressionDeinstall(
183
+ Environment *theEnv,
184
+ struct expr *expression)
185
+ {
186
+ if (expression == NULL) return;
187
+
188
+ while (expression != NULL)
189
+ {
190
+ AtomDeinstall(theEnv,expression->type,expression->value);
191
+ ExpressionDeinstall(theEnv,expression->argList);
192
+ expression = expression->nextArg;
193
+ }
194
+ }
195
+
196
+ #if (! RUN_TIME)
197
+
198
+ /***********************************************************************/
199
+ /* PackExpression: Copies an expression (created using multiple memory */
200
+ /* requests) into an array (created using a single memory request) */
201
+ /* while maintaining all appropriate links in the expression. A */
202
+ /* packed expression requires less total memory because it reduces */
203
+ /* the overhead required for multiple memory allocations. */
204
+ /***********************************************************************/
205
+ struct expr *PackExpression(
206
+ Environment *theEnv,
207
+ struct expr *original)
208
+ {
209
+ struct expr *packPtr;
210
+
211
+ if (original == NULL) return NULL;
212
+
213
+ packPtr = (struct expr *)
214
+ gm2(theEnv,sizeof (struct expr) * ExpressionSize(original));
215
+ ListToPacked(original,packPtr,0);
216
+
217
+ return packPtr;
218
+ }
219
+
220
+ /***********************************************************/
221
+ /* ListToPacked: Copies a list of expressions to an array. */
222
+ /***********************************************************/
223
+ static unsigned long ListToPacked(
224
+ struct expr *original,
225
+ struct expr *destination,
226
+ unsigned long count)
227
+ {
228
+ unsigned long i;
229
+
230
+ if (original == NULL) { return count; }
231
+
232
+ while (original != NULL)
233
+ {
234
+ i = count;
235
+ count++;
236
+
237
+ destination[i].type = original->type;
238
+ destination[i].value = original->value;
239
+
240
+ if (original->argList == NULL)
241
+ { destination[i].argList = NULL; }
242
+ else
243
+ {
244
+ destination[i].argList =
245
+ (struct expr *) &destination[count];
246
+ count = ListToPacked(original->argList,destination,count);
247
+ }
248
+
249
+ if (original->nextArg == NULL)
250
+ { destination[i].nextArg = NULL; }
251
+ else
252
+ {
253
+ destination[i].nextArg = &destination[count];
254
+ }
255
+
256
+ original = original->nextArg;
257
+ }
258
+
259
+ return count;
260
+ }
261
+
262
+ #endif /* (! RUN_TIME) */
263
+
264
+ /***************************************************************/
265
+ /* ReturnPackedExpression: Returns a packed expression created */
266
+ /* using PackExpression to the memory manager. */
267
+ /***************************************************************/
268
+ void ReturnPackedExpression(
269
+ Environment *theEnv,
270
+ struct expr *packPtr)
271
+ {
272
+ if (packPtr != NULL)
273
+ {
274
+ rm(theEnv,packPtr,sizeof (struct expr) * ExpressionSize(packPtr));
275
+ }
276
+ }
277
+
278
+ /***********************************************/
279
+ /* ReturnExpression: Returns a multiply linked */
280
+ /* list of expr data structures. */
281
+ /***********************************************/
282
+ void ReturnExpression(
283
+ Environment *theEnv,
284
+ struct expr *waste)
285
+ {
286
+ struct expr *tmp;
287
+
288
+ while (waste != NULL)
289
+ {
290
+ if (waste->argList != NULL) ReturnExpression(theEnv,waste->argList);
291
+ tmp = waste;
292
+ waste = waste->nextArg;
293
+ rtn_struct(theEnv,expr,tmp);
294
+ }
295
+ }
296
+
297
+ /***************************************************
298
+ NAME : FindHashedExpression
299
+ DESCRIPTION : Determines if a given expression
300
+ is in the expression hash table
301
+ INPUTS : 1) The expression
302
+ 2) A buffer to hold the hash
303
+ value
304
+ 3) A buffer to hold the previous
305
+ node in the hash chain
306
+ RETURNS : The expression hash table entry
307
+ (NULL if not found)
308
+ SIDE EFFECTS : None
309
+ NOTES : None
310
+ ***************************************************/
311
+ static EXPRESSION_HN *FindHashedExpression(
312
+ Environment *theEnv,
313
+ Expression *theExp,
314
+ unsigned *hashval,
315
+ EXPRESSION_HN **prv)
316
+ {
317
+ EXPRESSION_HN *exphash;
318
+
319
+ if (theExp == NULL)
320
+ return NULL;
321
+ *hashval = HashExpression(theExp);
322
+ *prv = NULL;
323
+ exphash = ExpressionData(theEnv)->ExpressionHashTable[*hashval];
324
+ while (exphash != NULL)
325
+ {
326
+ if (IdenticalExpression(exphash->exp,theExp))
327
+ return(exphash);
328
+ *prv = exphash;
329
+ exphash = exphash->next;
330
+ }
331
+ return NULL;
332
+ }
333
+
334
+ /***************************************************
335
+ NAME : HashExpression
336
+ DESCRIPTION : Assigns a deterministic number to
337
+ an expression
338
+ INPUTS : The expression
339
+ RETURNS : The "value" of the expression
340
+ SIDE EFFECTS : None
341
+ NOTES : None
342
+ ***************************************************/
343
+ static unsigned HashExpression(
344
+ Expression *theExp)
345
+ {
346
+ unsigned long tally = PRIME_THREE;
347
+ union
348
+ {
349
+ void *vv;
350
+ unsigned long uv;
351
+ } fis;
352
+
353
+ if (theExp->argList != NULL)
354
+ tally += HashExpression(theExp->argList) * PRIME_ONE;
355
+ while (theExp != NULL)
356
+ {
357
+ tally += theExp->type * PRIME_TWO;
358
+ fis.uv = 0;
359
+ fis.vv = theExp->value;
360
+ tally += fis.uv;
361
+ theExp = theExp->nextArg;
362
+ }
363
+ return (unsigned) (tally % EXPRESSION_HASH_SIZE);
364
+ }
365
+
366
+ /***************************************************
367
+ NAME : RemoveHashedExpression
368
+ DESCRIPTION : Removes a hashed expression from
369
+ the hash table
370
+ INPUTS : The expression
371
+ RETURNS : Nothing useful
372
+ SIDE EFFECTS : Hash node removed (or use count
373
+ decremented). If the hash node
374
+ is removed, the expression is
375
+ deinstalled and deleted
376
+ NOTES : If the expression is in use by
377
+ others, then the use count is
378
+ merely decremented
379
+ ***************************************************/
380
+ void RemoveHashedExpression(
381
+ Environment *theEnv,
382
+ Expression *theExp)
383
+ {
384
+ EXPRESSION_HN *exphash,*prv;
385
+ unsigned hashval;
386
+
387
+ exphash = FindHashedExpression(theEnv,theExp,&hashval,&prv);
388
+ if (exphash == NULL)
389
+ return;
390
+ if (--exphash->count != 0)
391
+ return;
392
+ if (prv == NULL)
393
+ ExpressionData(theEnv)->ExpressionHashTable[hashval] = exphash->next;
394
+ else
395
+ prv->next = exphash->next;
396
+ ExpressionDeinstall(theEnv,exphash->exp);
397
+ ReturnPackedExpression(theEnv,exphash->exp);
398
+ rtn_struct(theEnv,exprHashNode,exphash);
399
+ }
400
+
401
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
402
+
403
+ /*****************************************************
404
+ NAME : AddHashedExpression
405
+ DESCRIPTION : Adds a new expression to the
406
+ expression hash table (or increments
407
+ the use count if it is already there)
408
+ INPUTS : The (new) expression
409
+ RETURNS : A pointer to the (new) hash node
410
+ SIDE EFFECTS : Adds the new hash node or increments
411
+ the count of an existing one
412
+ NOTES : It is the caller's responsibility to
413
+ delete the passed expression. This
414
+ routine copies, packs and installs
415
+ the given expression
416
+ *****************************************************/
417
+ Expression *AddHashedExpression(
418
+ Environment *theEnv,
419
+ Expression *theExp)
420
+ {
421
+ EXPRESSION_HN *prv,*exphash;
422
+ unsigned hashval;
423
+
424
+ if (theExp == NULL) return NULL;
425
+ exphash = FindHashedExpression(theEnv,theExp,&hashval,&prv);
426
+ if (exphash != NULL)
427
+ {
428
+ exphash->count++;
429
+ return(exphash->exp);
430
+ }
431
+ exphash = get_struct(theEnv,exprHashNode);
432
+ exphash->hashval = hashval;
433
+ exphash->count = 1;
434
+ exphash->exp = PackExpression(theEnv,theExp);
435
+ ExpressionInstall(theEnv,exphash->exp);
436
+ exphash->next = ExpressionData(theEnv)->ExpressionHashTable[exphash->hashval];
437
+ ExpressionData(theEnv)->ExpressionHashTable[exphash->hashval] = exphash;
438
+ exphash->bsaveID = 0L;
439
+ return(exphash->exp);
440
+ }
441
+
442
+ #endif /* (! BLOAD_ONLY) && (! RUN_TIME) */
443
+
444
+ #if (BLOAD_AND_BSAVE || BLOAD_ONLY || BLOAD || CONSTRUCT_COMPILER) && (! RUN_TIME)
445
+
446
+ /***************************************************
447
+ NAME : HashedExpressionIndex
448
+ DESCRIPTION : Finds the expression bload array
449
+ index for a hashed expression
450
+ INPUTS : The expression
451
+ RETURNS : The bload index
452
+ SIDE EFFECTS : None
453
+ NOTES : None
454
+ ***************************************************/
455
+ unsigned long HashedExpressionIndex(
456
+ Environment *theEnv,
457
+ Expression *theExp)
458
+ {
459
+ EXPRESSION_HN *exphash,*prv;
460
+ unsigned hashval;
461
+
462
+ if (theExp == NULL)
463
+ return ULONG_MAX;
464
+ exphash = FindHashedExpression(theEnv,theExp,&hashval,&prv);
465
+ return((exphash != NULL) ? exphash->bsaveID : ULONG_MAX);
466
+ }
467
+
468
+ #endif /* (BLOAD_AND_BSAVE || BLOAD_ONLY || BLOAD || CONSTRUCT_COMPILER) && (! RUN_TIME) */
469
+
470
+ /********************************************************/
471
+ /* SetSequenceOperatorRecognition: C access routine */
472
+ /* for the set-sequence-operator-recognition function */
473
+ /********************************************************/
474
+ bool SetSequenceOperatorRecognition(
475
+ Environment *theEnv,
476
+ bool value)
477
+ {
478
+ bool ov;
479
+
480
+ ov = ExpressionData(theEnv)->SequenceOpMode;
481
+ ExpressionData(theEnv)->SequenceOpMode = value;
482
+ return ov;
483
+ }
484
+
485
+ /********************************************************/
486
+ /* GetSequenceOperatorRecognition: C access routine */
487
+ /* for the Get-sequence-operator-recognition function */
488
+ /********************************************************/
489
+ bool GetSequenceOperatorRecognition(
490
+ Environment *theEnv)
491
+ {
492
+ return ExpressionData(theEnv)->SequenceOpMode;
493
+ }
494
+
@@ -0,0 +1,154 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 02/02/21 */
5
+ /* */
6
+ /* EXPRESSION HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Contains routines for creating, deleting, */
11
+ /* compacting, installing, and hashing expressions. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* Brian L. Dantes */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
22
+ /* */
23
+ /* 6.30: Removed conditional code for unsupported */
24
+ /* compilers/operating systems (IBM_MCW and */
25
+ /* MAC_MCW). */
26
+ /* */
27
+ /* Changed integer type/precision. */
28
+ /* */
29
+ /* Changed expression hashing value. */
30
+ /* */
31
+ /* 6.40: Removed LOCALE definition. */
32
+ /* */
33
+ /* Pragma once and other inclusion changes. */
34
+ /* */
35
+ /* Added support for booleans with <stdbool.h>. */
36
+ /* */
37
+ /* Removed use of void pointers for specific */
38
+ /* data structures. */
39
+ /* */
40
+ /* Eval support for run time and bload only. */
41
+ /* */
42
+ /*************************************************************/
43
+
44
+ #ifndef _H_expressn
45
+
46
+ #pragma once
47
+
48
+ #define _H_expressn
49
+
50
+ struct exprHashNode;
51
+ typedef struct savedContexts SavedContexts;
52
+
53
+ #include "entities.h"
54
+ #include "exprnops.h"
55
+ #include "constrct.h"
56
+
57
+ /******************************/
58
+ /* Expression Data Structures */
59
+ /******************************/
60
+
61
+ struct expr
62
+ {
63
+ unsigned short type;
64
+ union
65
+ {
66
+ void *value;
67
+ CLIPSLexeme *lexemeValue;
68
+ CLIPSFloat *floatValue;
69
+ CLIPSInteger *integerValue;
70
+ CLIPSBitMap *bitMapValue;
71
+ ConstructHeader *constructValue;
72
+ FunctionDefinition *functionValue;
73
+ Fact *factValue;
74
+ Instance *instanceValue;
75
+ CLIPSExternalAddress *externalAddressValue;
76
+ };
77
+ Expression *argList;
78
+ Expression *nextArg;
79
+ };
80
+
81
+ #define arg_list argList
82
+ #define next_arg nextArg
83
+
84
+ typedef struct exprHashNode
85
+ {
86
+ unsigned hashval;
87
+ unsigned count;
88
+ Expression *exp;
89
+ struct exprHashNode *next;
90
+ unsigned long bsaveID;
91
+ } EXPRESSION_HN;
92
+
93
+ struct savedContexts
94
+ {
95
+ bool rtn;
96
+ bool brk;
97
+ struct savedContexts *nxt;
98
+ };
99
+
100
+ #define EXPRESSION_HASH_SIZE 503
101
+
102
+ /********************/
103
+ /* ENVIRONMENT DATA */
104
+ /********************/
105
+
106
+ #define EXPRESSION_DATA 45
107
+
108
+ struct expressionData
109
+ {
110
+ FunctionDefinition *PTR_AND;
111
+ FunctionDefinition *PTR_OR;
112
+ FunctionDefinition *PTR_EQ;
113
+ FunctionDefinition *PTR_NEQ;
114
+ FunctionDefinition *PTR_NOT;
115
+ EXPRESSION_HN **ExpressionHashTable;
116
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
117
+ unsigned long NumberOfExpressions;
118
+ Expression *ExpressionArray;
119
+ unsigned long ExpressionCount;
120
+ #endif
121
+ SavedContexts *svContexts;
122
+ bool ReturnContext;
123
+ bool BreakContext;
124
+ bool SequenceOpMode;
125
+ };
126
+
127
+ #define ExpressionData(theEnv) ((struct expressionData *) GetEnvironmentData(theEnv,EXPRESSION_DATA))
128
+
129
+ /********************/
130
+ /* Global Functions */
131
+ /********************/
132
+
133
+ void ReturnExpression(Environment *,Expression *);
134
+ void ExpressionInstall(Environment *,Expression *);
135
+ void ExpressionDeinstall(Environment *,Expression *);
136
+ Expression *PackExpression(Environment *,Expression *);
137
+ void ReturnPackedExpression(Environment *,Expression *);
138
+ void InitExpressionData(Environment *);
139
+ void InitExpressionPointers(Environment *);
140
+ bool SetSequenceOperatorRecognition(Environment *,bool);
141
+ bool GetSequenceOperatorRecognition(Environment *);
142
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
143
+ Expression *AddHashedExpression(Environment *,Expression *);
144
+ #endif
145
+ void RemoveHashedExpression(Environment *,Expression *);
146
+ #if BLOAD_AND_BSAVE || BLOAD_ONLY || BLOAD || CONSTRUCT_COMPILER
147
+ unsigned long HashedExpressionIndex(Environment *,Expression *);
148
+ #endif
149
+
150
+ #endif
151
+
152
+
153
+
154
+