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,978 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 07/23/21 */
5
+ /* */
6
+ /* FACT RETE ACCESS FUNCTIONS MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Rete access functions for fact pattern matching. */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Gary D. Riley */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
20
+ /* */
21
+ /* 6.24: Removed INCREMENTAL_RESET 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, */
27
+ /* MAC_MCW, and IBM_TBC). */
28
+ /* */
29
+ /* Support for hashing optimizations. */
30
+ /* */
31
+ /* 6.32: Fixed issue with optimized join network */
32
+ /* expression evaluation. */
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
+ /* UDF redesign. */
42
+ /* */
43
+ /*************************************************************/
44
+
45
+ #include <stdio.h>
46
+
47
+ #include "setup.h"
48
+
49
+ #if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT
50
+
51
+ #include "drive.h"
52
+ #include "engine.h"
53
+ #include "envrnmnt.h"
54
+ #include "extnfunc.h"
55
+ #include "factgen.h"
56
+ #include "factmch.h"
57
+ #include "incrrset.h"
58
+ #include "memalloc.h"
59
+ #include "multifld.h"
60
+ #include "reteutil.h"
61
+ #include "router.h"
62
+
63
+ #include "factrete.h"
64
+
65
+ /***************************************************************/
66
+ /* FactPNGetVar1: Fact pattern network function for extracting */
67
+ /* a variable's value. This is the most generalized routine. */
68
+ /***************************************************************/
69
+ bool FactPNGetVar1(
70
+ Environment *theEnv,
71
+ void *theValue,
72
+ UDFValue *returnValue)
73
+ {
74
+ size_t adjustedField;
75
+ unsigned short theField, theSlot;
76
+ Fact *factPtr;
77
+ CLIPSValue *fieldPtr;
78
+ struct multifieldMarker *marks;
79
+ Multifield *segmentPtr;
80
+ size_t extent;
81
+ const struct factGetVarPN1Call *hack;
82
+
83
+ /*==========================================*/
84
+ /* Retrieve the arguments for the function. */
85
+ /*==========================================*/
86
+
87
+ hack = (const struct factGetVarPN1Call *) ((CLIPSBitMap *) theValue)->contents;
88
+
89
+ /*=====================================================*/
90
+ /* Get the pointer to the fact from the partial match. */
91
+ /*=====================================================*/
92
+
93
+ factPtr = FactData(theEnv)->CurrentPatternFact;
94
+ marks = FactData(theEnv)->CurrentPatternMarks;
95
+
96
+ /*==========================================================*/
97
+ /* Determine if we want to retrieve the fact address of the */
98
+ /* fact, rather than retrieving a field from the fact. */
99
+ /*==========================================================*/
100
+
101
+ if (hack->factAddress)
102
+ {
103
+ returnValue->value = factPtr;
104
+ return true;
105
+ }
106
+
107
+ /*=========================================================*/
108
+ /* Determine if we want to retrieve the entire slot value. */
109
+ /*=========================================================*/
110
+
111
+ if (hack->allFields)
112
+ {
113
+ theSlot = hack->whichSlot;
114
+ fieldPtr = &factPtr->theProposition.contents[theSlot];
115
+ returnValue->value = fieldPtr->value;
116
+ if (returnValue->header->type == MULTIFIELD_TYPE)
117
+ {
118
+ returnValue->begin = 0;
119
+ returnValue->range = fieldPtr->multifieldValue->length;
120
+ return true;
121
+ }
122
+
123
+ if (returnValue->value == FalseSymbol(theEnv))
124
+ { return false; }
125
+
126
+ return true;
127
+ }
128
+
129
+ /*====================================================*/
130
+ /* If the slot being accessed is a single field slot, */
131
+ /* then just return the single value found in that */
132
+ /* slot. The multifieldMarker data structures do not */
133
+ /* have to be considered since access to a single */
134
+ /* field slot is not affected by variable bindings */
135
+ /* from multifield slots. */
136
+ /*====================================================*/
137
+
138
+ theField = hack->whichField;
139
+ theSlot = hack->whichSlot;
140
+ fieldPtr = &factPtr->theProposition.contents[theSlot];
141
+
142
+ /*==========================================================*/
143
+ /* Retrieve a value from a multifield slot. First determine */
144
+ /* the range of fields for the variable being retrieved. */
145
+ /*==========================================================*/
146
+
147
+ extent = SIZE_MAX;
148
+ adjustedField = AdjustFieldPosition(theEnv,marks,theField,theSlot,&extent);
149
+
150
+ /*=============================================================*/
151
+ /* If a range of values are being retrieved (i.e. a multifield */
152
+ /* variable), then return the values as a multifield. */
153
+ /*=============================================================*/
154
+
155
+ if (extent != SIZE_MAX)
156
+ {
157
+ returnValue->value = fieldPtr->value;
158
+ returnValue->begin = adjustedField;
159
+ returnValue->range = extent;
160
+ return true;
161
+ }
162
+
163
+ /*========================================================*/
164
+ /* Otherwise a single field value is being retrieved from */
165
+ /* a multifield slot. Just return the type and value. */
166
+ /*========================================================*/
167
+
168
+ segmentPtr = fieldPtr->multifieldValue;
169
+ fieldPtr = &segmentPtr->contents[adjustedField];
170
+
171
+ returnValue->value = fieldPtr->value;
172
+
173
+ if (returnValue->value == FalseSymbol(theEnv))
174
+ { return false; }
175
+
176
+ return true;
177
+ }
178
+
179
+ /**************************************************/
180
+ /* FactPNGetVar2: Fact pattern network function */
181
+ /* for extracting a variable's value. The value */
182
+ /* extracted is from a single field slot. */
183
+ /**************************************************/
184
+ bool FactPNGetVar2(
185
+ Environment *theEnv,
186
+ void *theValue,
187
+ UDFValue *returnValue)
188
+ {
189
+ Fact *factPtr;
190
+ const struct factGetVarPN2Call *hack;
191
+ CLIPSValue *fieldPtr;
192
+
193
+ /*==========================================*/
194
+ /* Retrieve the arguments for the function. */
195
+ /*==========================================*/
196
+
197
+ hack = (const struct factGetVarPN2Call *) ((CLIPSBitMap *) theValue)->contents;
198
+
199
+ /*==============================*/
200
+ /* Get the pointer to the fact. */
201
+ /*==============================*/
202
+
203
+ factPtr = FactData(theEnv)->CurrentPatternFact;
204
+
205
+ /*============================================*/
206
+ /* Extract the value from the specified slot. */
207
+ /*============================================*/
208
+
209
+ fieldPtr = &factPtr->theProposition.contents[hack->whichSlot];
210
+
211
+ returnValue->value = fieldPtr->value;
212
+
213
+ if (returnValue->value == FalseSymbol(theEnv))
214
+ { return false; }
215
+
216
+ return true;
217
+ }
218
+
219
+ /*****************************************************************/
220
+ /* FactPNGetVar3: Fact pattern network function for extracting a */
221
+ /* variable's value. The value extracted is from a multifield */
222
+ /* slot that contains at most one multifield variable. */
223
+ /*****************************************************************/
224
+ bool FactPNGetVar3(
225
+ Environment *theEnv,
226
+ void *theValue,
227
+ UDFValue *returnValue)
228
+ {
229
+ Fact *factPtr;
230
+ Multifield *segmentPtr;
231
+ CLIPSValue *fieldPtr;
232
+ const struct factGetVarPN3Call *hack;
233
+
234
+ /*==========================================*/
235
+ /* Retrieve the arguments for the function. */
236
+ /*==========================================*/
237
+
238
+ hack = (const struct factGetVarPN3Call *) ((CLIPSBitMap *) theValue)->contents;
239
+
240
+ /*==============================*/
241
+ /* Get the pointer to the fact. */
242
+ /*==============================*/
243
+
244
+ factPtr = FactData(theEnv)->CurrentPatternFact;
245
+
246
+ /*============================================================*/
247
+ /* Get the multifield value from which the data is retrieved. */
248
+ /*============================================================*/
249
+
250
+ segmentPtr = factPtr->theProposition.contents[hack->whichSlot].multifieldValue;
251
+
252
+ /*=========================================*/
253
+ /* If the beginning and end flags are set, */
254
+ /* then retrieve a multifield value. */
255
+ /*=========================================*/
256
+
257
+ if (hack->fromBeginning && hack->fromEnd)
258
+ {
259
+ returnValue->value = segmentPtr;
260
+ returnValue->begin = hack->beginOffset;
261
+ returnValue->range = segmentPtr->length - (hack->endOffset + hack->beginOffset);
262
+ return true;
263
+ }
264
+
265
+ /*=====================================================*/
266
+ /* Return a single field value from a multifield slot. */
267
+ /*=====================================================*/
268
+
269
+ if (hack->fromBeginning)
270
+ { fieldPtr = &segmentPtr->contents[hack->beginOffset]; }
271
+ else
272
+ { fieldPtr = &segmentPtr->contents[segmentPtr->length - (hack->endOffset + 1)]; }
273
+
274
+ returnValue->value = fieldPtr->value;
275
+
276
+ if (returnValue->value == FalseSymbol(theEnv))
277
+ { return false; }
278
+
279
+ return true;
280
+ }
281
+
282
+ /******************************************************/
283
+ /* FactPNConstant1: Fact pattern network function for */
284
+ /* comparing a value stored in a single field slot */
285
+ /* to a constant for either equality or inequality. */
286
+ /******************************************************/
287
+ bool FactPNConstant1(
288
+ Environment *theEnv,
289
+ void *theValue,
290
+ UDFValue *returnValue)
291
+ {
292
+ #if MAC_XCD
293
+ #pragma unused(returnValue)
294
+ #endif
295
+ const struct factConstantPN1Call *hack;
296
+ CLIPSValue *fieldPtr;
297
+ struct expr *theConstant;
298
+
299
+ /*==========================================*/
300
+ /* Retrieve the arguments for the function. */
301
+ /*==========================================*/
302
+
303
+ hack = (const struct factConstantPN1Call *) ((CLIPSBitMap *) theValue)->contents;
304
+
305
+ /*============================================*/
306
+ /* Extract the value from the specified slot. */
307
+ /*============================================*/
308
+
309
+ fieldPtr = &FactData(theEnv)->CurrentPatternFact->theProposition.contents[hack->whichSlot];
310
+
311
+ /*====================================*/
312
+ /* Compare the value to the constant. */
313
+ /*====================================*/
314
+
315
+ theConstant = GetFirstArgument();
316
+ if (theConstant->value != fieldPtr->value)
317
+ {
318
+ if (1 - hack->testForEquality)
319
+ { return true; }
320
+ else
321
+ { return false; }
322
+ }
323
+
324
+ if (hack->testForEquality)
325
+ { return true; }
326
+ else
327
+ { return false; }
328
+ }
329
+
330
+ /****************************************************************/
331
+ /* FactPNConstant2: Fact pattern network function for comparing */
332
+ /* a value stored in a slot to a constant for either equality */
333
+ /* or inequality. The value being retrieved from the slot has */
334
+ /* no multifields to its right (thus it can be retrieved */
335
+ /* relative to the beginning). */
336
+ /****************************************************************/
337
+ bool FactPNConstant2(
338
+ Environment *theEnv,
339
+ void *theValue,
340
+ UDFValue *returnValue)
341
+ {
342
+ #if MAC_XCD
343
+ #pragma unused(returnValue)
344
+ #endif
345
+ const struct factConstantPN2Call *hack;
346
+ CLIPSValue *fieldPtr;
347
+ struct expr *theConstant;
348
+ Multifield *segmentPtr;
349
+
350
+ /*==========================================*/
351
+ /* Retrieve the arguments for the function. */
352
+ /*==========================================*/
353
+
354
+ hack = (const struct factConstantPN2Call *) ((CLIPSBitMap *) theValue)->contents;
355
+
356
+ /*==========================================================*/
357
+ /* Extract the value from the specified slot. Note that the */
358
+ /* test to determine the slot's type (multifield) should be */
359
+ /* unnecessary since this routine should only be used for */
360
+ /* multifield slots. */
361
+ /*==========================================================*/
362
+
363
+ fieldPtr = &FactData(theEnv)->CurrentPatternFact->theProposition.contents[hack->whichSlot];
364
+
365
+ if (fieldPtr->header->type == MULTIFIELD_TYPE)
366
+ {
367
+ segmentPtr = fieldPtr->multifieldValue;
368
+
369
+ if (hack->fromBeginning)
370
+ { fieldPtr = &segmentPtr->contents[hack->offset]; }
371
+ else
372
+ {
373
+ fieldPtr = &segmentPtr->contents[segmentPtr->length -
374
+ (hack->offset + 1)];
375
+ }
376
+ }
377
+
378
+ /*====================================*/
379
+ /* Compare the value to the constant. */
380
+ /*====================================*/
381
+
382
+ theConstant = GetFirstArgument();
383
+ if (theConstant->value != fieldPtr->value)
384
+ {
385
+ if (1 - hack->testForEquality)
386
+ { return true; }
387
+ else
388
+ { return false; }
389
+ }
390
+
391
+ if (hack->testForEquality)
392
+ { return true; }
393
+ else
394
+ { return false; }
395
+ }
396
+
397
+ /**************************************************************/
398
+ /* FactJNGetVar1: Fact join network function for extracting a */
399
+ /* variable's value. This is the most generalized routine. */
400
+ /**************************************************************/
401
+ bool FactJNGetVar1(
402
+ Environment *theEnv,
403
+ void *theValue,
404
+ UDFValue *returnValue)
405
+ {
406
+ size_t adjustedField;
407
+ unsigned short theField, theSlot;
408
+ Fact *factPtr;
409
+ CLIPSValue *fieldPtr;
410
+ struct multifieldMarker *marks;
411
+ Multifield *segmentPtr;
412
+ size_t extent;
413
+ const struct factGetVarJN1Call *hack;
414
+ Multifield *theSlots = NULL;
415
+
416
+ /*==========================================*/
417
+ /* Retrieve the arguments for the function. */
418
+ /*==========================================*/
419
+
420
+ hack = (const struct factGetVarJN1Call *) ((CLIPSBitMap *) theValue)->contents;
421
+
422
+ /*=====================================================*/
423
+ /* Get the pointer to the fact from the partial match. */
424
+ /*=====================================================*/
425
+
426
+ if (hack->lhs)
427
+ {
428
+ factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem;
429
+ marks = get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->markers;
430
+ }
431
+ else if (hack->rhs)
432
+ {
433
+ factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem;
434
+ marks = get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->markers;
435
+ }
436
+ else if (EngineData(theEnv)->GlobalRHSBinds == NULL)
437
+ {
438
+ factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem;
439
+ marks = get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->markers;
440
+ }
441
+ else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
442
+ {
443
+ factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem;
444
+ marks = get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->markers;
445
+ }
446
+ else
447
+ {
448
+ factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem;
449
+ marks = get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->markers;
450
+ }
451
+
452
+ /*==========================================================*/
453
+ /* Determine if we want to retrieve the fact address of the */
454
+ /* fact, rather than retrieving a field from the fact. */
455
+ /*==========================================================*/
456
+
457
+ if (hack->factAddress)
458
+ {
459
+ returnValue->value = factPtr;
460
+ return true;
461
+ }
462
+
463
+ if ((factPtr->basisSlots != NULL) &&
464
+ (! EngineData(theEnv)->JoinOperationInProgress))
465
+ { theSlots = factPtr->basisSlots; }
466
+ else
467
+ { theSlots = &factPtr->theProposition; }
468
+
469
+ /*=========================================================*/
470
+ /* Determine if we want to retrieve the entire slot value. */
471
+ /*=========================================================*/
472
+
473
+ if (hack->allFields)
474
+ {
475
+ theSlot = hack->whichSlot;
476
+ fieldPtr = &theSlots->contents[theSlot];
477
+ returnValue->value = fieldPtr->value;
478
+ if (returnValue->header->type == MULTIFIELD_TYPE)
479
+ {
480
+ returnValue->begin = 0;
481
+ returnValue->range = fieldPtr->multifieldValue->length;
482
+ return true;
483
+ }
484
+
485
+ if (returnValue->value == FalseSymbol(theEnv))
486
+ { return false; }
487
+
488
+ return true;
489
+ }
490
+
491
+ /*====================================================*/
492
+ /* If the slot being accessed is a single field slot, */
493
+ /* then just return the single value found in that */
494
+ /* slot. The multifieldMarker data structures do not */
495
+ /* have to be considered since access to a single */
496
+ /* field slot is not affected by variable bindings */
497
+ /* from multifield slots. */
498
+ /*====================================================*/
499
+
500
+ theField = hack->whichField;
501
+ theSlot = hack->whichSlot;
502
+ fieldPtr = &theSlots->contents[theSlot];
503
+
504
+ if (fieldPtr->header->type != MULTIFIELD_TYPE)
505
+ {
506
+ returnValue->value = fieldPtr->value;
507
+
508
+ if (returnValue->value == FalseSymbol(theEnv))
509
+ { return false; }
510
+
511
+ return true;
512
+ }
513
+
514
+ /*==========================================================*/
515
+ /* Retrieve a value from a multifield slot. First determine */
516
+ /* the range of fields for the variable being retrieved. */
517
+ /*==========================================================*/
518
+
519
+ extent = SIZE_MAX;
520
+ adjustedField = AdjustFieldPosition(theEnv,marks,theField,theSlot,&extent);
521
+
522
+ /*=============================================================*/
523
+ /* If a range of values are being retrieved (i.e. a multifield */
524
+ /* variable), then return the values as a multifield. */
525
+ /*=============================================================*/
526
+
527
+ if (extent != SIZE_MAX)
528
+ {
529
+ returnValue->value = fieldPtr->value;
530
+ returnValue->begin = adjustedField;
531
+ returnValue->range = extent;
532
+ return true;
533
+ }
534
+
535
+ /*========================================================*/
536
+ /* Otherwise a single field value is being retrieved from */
537
+ /* a multifield slot. Just return the type and value. */
538
+ /*========================================================*/
539
+
540
+ segmentPtr = theSlots->contents[theSlot].multifieldValue;
541
+ fieldPtr = &segmentPtr->contents[adjustedField];
542
+
543
+ returnValue->value = fieldPtr->value;
544
+
545
+ if (returnValue->value == FalseSymbol(theEnv))
546
+ { return false; }
547
+
548
+ return true;
549
+ }
550
+
551
+ /*************************************************/
552
+ /* FactJNGetVar2: Fact join network function for */
553
+ /* extracting a variable's value. The value */
554
+ /* extracted is from a single field slot. */
555
+ /*************************************************/
556
+ bool FactJNGetVar2(
557
+ Environment *theEnv,
558
+ void *theValue,
559
+ UDFValue *returnValue)
560
+ {
561
+ Fact *factPtr;
562
+ const struct factGetVarJN2Call *hack;
563
+ CLIPSValue *fieldPtr;
564
+
565
+ /*==========================================*/
566
+ /* Retrieve the arguments for the function. */
567
+ /*==========================================*/
568
+
569
+ hack = (const struct factGetVarJN2Call *) ((CLIPSBitMap *) theValue)->contents;
570
+
571
+ /*=====================================================*/
572
+ /* Get the pointer to the fact from the partial match. */
573
+ /*=====================================================*/
574
+
575
+ if (hack->lhs)
576
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
577
+ else if (hack->rhs)
578
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem; }
579
+ else if (EngineData(theEnv)->GlobalRHSBinds == NULL)
580
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
581
+ else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
582
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem; }
583
+ else
584
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
585
+
586
+ /*============================================*/
587
+ /* Extract the value from the specified slot. */
588
+ /*============================================*/
589
+
590
+ if ((factPtr->basisSlots != NULL) &&
591
+ (! EngineData(theEnv)->JoinOperationInProgress))
592
+ { fieldPtr = &factPtr->basisSlots->contents[hack->whichSlot]; }
593
+ else
594
+ { fieldPtr = &factPtr->theProposition.contents[hack->whichSlot]; }
595
+
596
+ returnValue->value = fieldPtr->value;
597
+
598
+ if (returnValue->value == FalseSymbol(theEnv))
599
+ { return false; }
600
+
601
+ return true;
602
+ }
603
+
604
+ /****************************************************************/
605
+ /* FactJNGetVar3: Fact join network function for extracting a */
606
+ /* variable's value. The value extracted is from a multifield */
607
+ /* slot that contains at most one multifield variable. */
608
+ /****************************************************************/
609
+ bool FactJNGetVar3(
610
+ Environment *theEnv,
611
+ void *theValue,
612
+ UDFValue *returnValue)
613
+ {
614
+ Fact *factPtr;
615
+ Multifield *segmentPtr;
616
+ CLIPSValue *fieldPtr;
617
+ const struct factGetVarJN3Call *hack;
618
+
619
+ /*==========================================*/
620
+ /* Retrieve the arguments for the function. */
621
+ /*==========================================*/
622
+
623
+ hack = (const struct factGetVarJN3Call *) ((CLIPSBitMap *) theValue)->contents;
624
+
625
+ /*=====================================================*/
626
+ /* Get the pointer to the fact from the partial match. */
627
+ /*=====================================================*/
628
+
629
+ if (hack->lhs)
630
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
631
+ else if (hack->rhs)
632
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem; }
633
+ else if (EngineData(theEnv)->GlobalRHSBinds == NULL)
634
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
635
+ else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
636
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem; }
637
+ else
638
+ { factPtr = (Fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
639
+
640
+ /*============================================================*/
641
+ /* Get the multifield value from which the data is retrieved. */
642
+ /*============================================================*/
643
+
644
+ if ((factPtr->basisSlots != NULL) &&
645
+ (! EngineData(theEnv)->JoinOperationInProgress))
646
+ { segmentPtr = factPtr->basisSlots->contents[hack->whichSlot].multifieldValue; }
647
+ else
648
+ { segmentPtr = factPtr->theProposition.contents[hack->whichSlot].multifieldValue; }
649
+
650
+ /*=========================================*/
651
+ /* If the beginning and end flags are set, */
652
+ /* then retrieve a multifield value. */
653
+ /*=========================================*/
654
+
655
+ if (hack->fromBeginning && hack->fromEnd)
656
+ {
657
+ returnValue->value = segmentPtr;
658
+ returnValue->begin = hack->beginOffset;
659
+ returnValue->range = segmentPtr->length - (hack->endOffset + hack->beginOffset);
660
+ return true;
661
+ }
662
+
663
+ /*=====================================================*/
664
+ /* Return a single field value from a multifield slot. */
665
+ /*=====================================================*/
666
+
667
+ if (hack->fromBeginning)
668
+ { fieldPtr = &segmentPtr->contents[hack->beginOffset]; }
669
+ else
670
+ { fieldPtr = &segmentPtr->contents[segmentPtr->length - (hack->endOffset + 1)]; }
671
+
672
+ returnValue->value = fieldPtr->value;
673
+
674
+ if (returnValue->value == FalseSymbol(theEnv))
675
+ { return false; }
676
+
677
+ return true;
678
+ }
679
+
680
+ /****************************************************/
681
+ /* FactSlotLength: Determines if the length of a */
682
+ /* multifield slot falls within a specified range. */
683
+ /****************************************************/
684
+ bool FactSlotLength(
685
+ Environment *theEnv,
686
+ void *theValue,
687
+ UDFValue *returnValue)
688
+ {
689
+ const struct factCheckLengthPNCall *hack;
690
+ Multifield *segmentPtr;
691
+ size_t extraOffset = 0;
692
+ struct multifieldMarker *tempMark;
693
+
694
+ returnValue->value = FalseSymbol(theEnv);
695
+
696
+ hack = (const struct factCheckLengthPNCall *) ((CLIPSBitMap *) theValue)->contents;
697
+
698
+ for (tempMark = FactData(theEnv)->CurrentPatternMarks;
699
+ tempMark != NULL;
700
+ tempMark = tempMark->next)
701
+ {
702
+ if (tempMark->where.whichSlotNumber != hack->whichSlot) continue;
703
+ extraOffset += tempMark->range;
704
+ }
705
+
706
+ segmentPtr = FactData(theEnv)->CurrentPatternFact->theProposition.contents[hack->whichSlot].multifieldValue;
707
+
708
+ if (segmentPtr->length < (hack->minLength + extraOffset))
709
+ { return false; }
710
+
711
+ if (hack->exactly && (segmentPtr->length > (hack->minLength + extraOffset)))
712
+ { return false; }
713
+
714
+ returnValue->value = TrueSymbol(theEnv);
715
+ return true;
716
+ }
717
+
718
+ /************************************************************/
719
+ /* FactJNCompVars1: Fact join network routine for comparing */
720
+ /* the values of two single field slots. */
721
+ /************************************************************/
722
+ bool FactJNCompVars1(
723
+ Environment *theEnv,
724
+ void *theValue,
725
+ UDFValue *theResult)
726
+ {
727
+ #if MAC_XCD
728
+ #pragma unused(theResult)
729
+ #endif
730
+ unsigned short p1, e1, p2, e2;
731
+ Fact *fact1, *fact2;
732
+ const struct factCompVarsJN1Call *hack;
733
+
734
+ /*=========================================*/
735
+ /* Retrieve the arguments to the function. */
736
+ /*=========================================*/
737
+
738
+ hack = (const struct factCompVarsJN1Call *) ((CLIPSBitMap *) theValue)->contents;
739
+
740
+ /*=================================================*/
741
+ /* Extract the fact pointers for the two patterns. */
742
+ /*=================================================*/
743
+
744
+ p1 = hack->pattern1;
745
+ p2 = hack->pattern2;
746
+
747
+ fact1 = (Fact *) EngineData(theEnv)->GlobalRHSBinds->binds[p1].gm.theMatch->matchingItem;
748
+
749
+ if (hack->p2rhs)
750
+ { fact2 = (Fact *) EngineData(theEnv)->GlobalRHSBinds->binds[p2].gm.theMatch->matchingItem; }
751
+ else
752
+ { fact2 = (Fact *) EngineData(theEnv)->GlobalLHSBinds->binds[p2].gm.theMatch->matchingItem; }
753
+
754
+ /*=====================*/
755
+ /* Compare the values. */
756
+ /*=====================*/
757
+
758
+ e1 = hack->slot1;
759
+ e2 = hack->slot2;
760
+
761
+ if (fact1->theProposition.contents[e1].value !=
762
+ fact2->theProposition.contents[e2].value)
763
+ { return hack->fail; }
764
+
765
+ return hack->pass;
766
+ }
767
+
768
+ /*****************************************************************/
769
+ /* FactJNCompVars2: Fact join network routine for comparing the */
770
+ /* two single field value that are found in the first slot */
771
+ /* (which must also be a multifield slot) of a deftemplate. */
772
+ /* This function is provided so that variable comparisons of */
773
+ /* implied deftemplates will be faster. */
774
+ /*****************************************************************/
775
+ bool FactJNCompVars2(
776
+ Environment *theEnv,
777
+ void *theValue,
778
+ UDFValue *theResult)
779
+ {
780
+ #if MAC_XCD
781
+ #pragma unused(theResult)
782
+ #endif
783
+ unsigned short p1, s1, p2, s2;
784
+ Fact *fact1, *fact2;
785
+ const struct factCompVarsJN2Call *hack;
786
+ Multifield *segment;
787
+ CLIPSValue *fieldPtr1, *fieldPtr2;
788
+
789
+ /*=========================================*/
790
+ /* Retrieve the arguments to the function. */
791
+ /*=========================================*/
792
+
793
+ hack = (const struct factCompVarsJN2Call *) ((CLIPSBitMap *) theValue)->contents;
794
+
795
+ /*=================================================*/
796
+ /* Extract the fact pointers for the two patterns. */
797
+ /*=================================================*/
798
+
799
+ p1 = hack->pattern1;
800
+ p2 = hack->pattern2;
801
+ s1 = hack->slot1;
802
+ s2 = hack->slot2;
803
+
804
+ fact1 = (Fact *) EngineData(theEnv)->GlobalRHSBinds->binds[p1].gm.theMatch->matchingItem;
805
+
806
+ if (hack->p2rhs)
807
+ { fact2 = (Fact *) EngineData(theEnv)->GlobalRHSBinds->binds[p2].gm.theMatch->matchingItem; }
808
+ else
809
+ { fact2 = (Fact *) EngineData(theEnv)->GlobalLHSBinds->binds[p2].gm.theMatch->matchingItem; }
810
+
811
+ /*======================*/
812
+ /* Retrieve the values. */
813
+ /*======================*/
814
+
815
+ if (fact1->theProposition.contents[s1].header->type != MULTIFIELD_TYPE)
816
+ { fieldPtr1 = &fact1->theProposition.contents[s1]; }
817
+ else
818
+ {
819
+ segment = fact1->theProposition.contents[s1].multifieldValue;
820
+
821
+ if (hack->fromBeginning1)
822
+ { fieldPtr1 = &segment->contents[hack->offset1]; }
823
+ else
824
+ { fieldPtr1 = &segment->contents[segment->length - (hack->offset1 + 1)]; }
825
+ }
826
+
827
+ if (fact2->theProposition.contents[s2].header->type != MULTIFIELD_TYPE)
828
+ { fieldPtr2 = &fact2->theProposition.contents[s2]; }
829
+ else
830
+ {
831
+ segment = fact2->theProposition.contents[s2].multifieldValue;
832
+
833
+ if (hack->fromBeginning2)
834
+ { fieldPtr2 = &segment->contents[hack->offset2]; }
835
+ else
836
+ { fieldPtr2 = &segment->contents[segment->length - (hack->offset2 + 1)]; }
837
+ }
838
+
839
+ /*=====================*/
840
+ /* Compare the values. */
841
+ /*=====================*/
842
+
843
+ if (fieldPtr1->value != fieldPtr2->value)
844
+ { return hack->fail; }
845
+
846
+ return hack->pass;
847
+ }
848
+
849
+ /*****************************************************/
850
+ /* FactPNCompVars1: Fact pattern network routine for */
851
+ /* comparing the values of two single field slots. */
852
+ /*****************************************************/
853
+ bool FactPNCompVars1(
854
+ Environment *theEnv,
855
+ void *theValue,
856
+ UDFValue *theResult)
857
+ {
858
+ bool rv;
859
+ CLIPSValue *fieldPtr1, *fieldPtr2;
860
+ const struct factCompVarsPN1Call *hack;
861
+
862
+ /*========================================*/
863
+ /* Extract the arguments to the function. */
864
+ /*========================================*/
865
+
866
+ hack = (const struct factCompVarsPN1Call *) ((CLIPSBitMap *) theValue)->contents;
867
+ fieldPtr1 = &FactData(theEnv)->CurrentPatternFact->theProposition.contents[hack->field1];
868
+ fieldPtr2 = &FactData(theEnv)->CurrentPatternFact->theProposition.contents[hack->field2];
869
+
870
+ /*=====================*/
871
+ /* Compare the values. */
872
+ /*=====================*/
873
+
874
+ if (fieldPtr1->value != fieldPtr2->value) rv = (bool) hack->fail;
875
+ else rv = (bool) hack->pass;
876
+
877
+ if (rv) theResult->value = TrueSymbol(theEnv);
878
+ else theResult->value = FalseSymbol(theEnv);
879
+
880
+ return rv;
881
+ }
882
+
883
+ /*************************************************************************/
884
+ /* AdjustFieldPosition: Given a list of multifield markers and the index */
885
+ /* to a variable in a slot, this function computes the index to the */
886
+ /* field in the slot where the variable begins. In the case of */
887
+ /* multifield variables, it also computes the extent (or length) of */
888
+ /* the multifield. Note that the extent should be given a default */
889
+ /* value of either -1 or 1 for variables other than multifield */
890
+ /* variables before calling this routine. An extent of -1 for these */
891
+ /* variables will distinguish their extent as being different when it */
892
+ /* is necessary to note their difference from a multifield variable */
893
+ /* with an extent of 1. For example, given the slot pattern */
894
+ /* (data $?x c $?y ?z) and the slot value (data a b c d e f x), the */
895
+ /* actual index in the fact for the 5th item in the pattern (the */
896
+ /* variable ?z) would be 8 since $?x binds to 2 fields and $?y binds */
897
+ /* to 3 fields. */
898
+ /*************************************************************************/
899
+ size_t AdjustFieldPosition(
900
+ Environment *theEnv,
901
+ struct multifieldMarker *markList,
902
+ unsigned short whichField,
903
+ unsigned short whichSlot,
904
+ size_t *extent)
905
+ {
906
+ size_t actualIndex;
907
+ #if MAC_XCD
908
+ #pragma unused(theEnv)
909
+ #endif
910
+
911
+ actualIndex = whichField;
912
+ for (;
913
+ markList != NULL;
914
+ markList = markList->next)
915
+ {
916
+ /*===============================================*/
917
+ /* Skip over multifield markers for other slots. */
918
+ /*===============================================*/
919
+
920
+ if (markList->where.whichSlotNumber != whichSlot) continue;
921
+
922
+ /*=========================================================*/
923
+ /* If the multifield marker occurs exactly at the field in */
924
+ /* question, then the actual index needs to be adjusted */
925
+ /* and the extent needs to be computed since the value is */
926
+ /* a multifield value. */
927
+ /*=========================================================*/
928
+
929
+ if (markList->whichField == whichField)
930
+ {
931
+ *extent = markList->range;
932
+ return actualIndex;
933
+ }
934
+
935
+ /*=====================================================*/
936
+ /* Otherwise if the multifield marker occurs after the */
937
+ /* field in question, then the actual index has been */
938
+ /* completely computed and can be returned. */
939
+ /*=====================================================*/
940
+
941
+ else if (markList->whichField > whichField)
942
+ { return actualIndex; }
943
+
944
+ /*==========================================================*/
945
+ /* Adjust the actual index to the field based on the number */
946
+ /* of fields taken up by the preceding multifield variable. */
947
+ /*==========================================================*/
948
+
949
+ actualIndex = actualIndex + markList->range - 1;
950
+ }
951
+
952
+ /*=======================================*/
953
+ /* Return the actual index to the field. */
954
+ /*=======================================*/
955
+
956
+ return actualIndex;
957
+ }
958
+
959
+ /*****************************************************/
960
+ /* FactStoreMultifield: This primitive is used by a */
961
+ /* number of multifield functions for grouping a */
962
+ /* series of valuesinto a single multifield value. */
963
+ /*****************************************************/
964
+ bool FactStoreMultifield(
965
+ Environment *theEnv,
966
+ void *theValue,
967
+ UDFValue *theResult)
968
+ {
969
+ #if MAC_XCD
970
+ #pragma unused(theValue)
971
+ #endif
972
+
973
+ StoreInMultifield(theEnv,theResult,GetFirstArgument(),false);
974
+ return true;
975
+ }
976
+
977
+ #endif /* DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT */
978
+