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,736 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 04/28/20 */
5
+ /* */
6
+ /* INFERENCE ENGINE OBJECT PARSING ROUTINES MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: RETE Network Parsing Interface for Objects */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.23: Changed name of variable exp to theExp */
20
+ /* because of Unix compiler warnings of shadowed */
21
+ /* definitions. */
22
+ /* */
23
+ /* 6.24: Converted INSTANCE_PATTERN_MATCHING to */
24
+ /* DEFRULE_CONSTRUCT. */
25
+ /* */
26
+ /* Renamed BOOLEAN macro type to intBool. */
27
+ /* */
28
+ /* 6.30: Added support for hashed memories and other */
29
+ /* join network changes. */
30
+ /* */
31
+ /* 6.32: Join network fix for variable comparisons */
32
+ /* where both variables are from the right */
33
+ /* memory. */
34
+ /* */
35
+ /* 6.40: Pragma once and other inclusion changes. */
36
+ /* */
37
+ /* Added support for booleans with <stdbool.h>. */
38
+ /* */
39
+ /* Removed use of void pointers for specific */
40
+ /* data structures. */
41
+ /* */
42
+ /*************************************************************/
43
+ /* =========================================
44
+ *****************************************
45
+ EXTERNAL DEFINITIONS
46
+ =========================================
47
+ ***************************************** */
48
+ #include "setup.h"
49
+
50
+ #if DEFRULE_CONSTRUCT && OBJECT_SYSTEM && (! RUN_TIME) && (! BLOAD_ONLY)
51
+
52
+ #include <stdio.h>
53
+
54
+ #include "classfun.h"
55
+ #include "envrnmnt.h"
56
+ #include "objrtfnx.h"
57
+
58
+ #include "objrtgen.h"
59
+
60
+ /***************************************/
61
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
62
+ /***************************************/
63
+
64
+ static void GenObjectGetVar(Environment *,bool,Expression *,struct lhsParseNode *,int);
65
+ static bool IsSimpleSlotVariable(struct lhsParseNode *);
66
+ static Expression *GenerateSlotComparisonTest(Environment *,bool,bool,struct lhsParseNode *,struct lhsParseNode *);
67
+
68
+ /* =========================================
69
+ *****************************************
70
+ EXTERNALLY VISIBLE FUNCTIONS
71
+ =========================================
72
+ ***************************************** */
73
+
74
+ /**********************************************
75
+ Build functions used by AddPatternParser() to
76
+ provide object access to the join nertwork
77
+ **********************************************/
78
+ void ReplaceGetJNObjectValue(
79
+ Environment *theEnv,
80
+ Expression *theItem,
81
+ struct lhsParseNode *theNode,
82
+ int side)
83
+ {
84
+ GenObjectGetVar(theEnv,true,theItem,theNode,side);
85
+ }
86
+
87
+ Expression *GenGetJNObjectValue(
88
+ Environment *theEnv,
89
+ struct lhsParseNode *theNode,
90
+ int side)
91
+ {
92
+ Expression *theItem;
93
+
94
+ theItem = GenConstant(theEnv,0,NULL);
95
+ GenObjectGetVar(theEnv,true,theItem,theNode,side);
96
+ return(theItem);
97
+ }
98
+
99
+ Expression *ObjectJNVariableComparison(
100
+ Environment *theEnv,
101
+ struct lhsParseNode *selfNode,
102
+ struct lhsParseNode *referringNode,
103
+ bool isNand)
104
+ {
105
+ return(GenerateSlotComparisonTest(theEnv,true,isNand,selfNode,referringNode));
106
+ }
107
+
108
+ /**********************************************
109
+ Build functions used by AddPatternParser() to
110
+ provide object access to the pattern network
111
+ **********************************************/
112
+ Expression *GenObjectPNConstantCompare(
113
+ Environment *theEnv,
114
+ struct lhsParseNode *theNode)
115
+ {
116
+ struct ObjectCmpPNConstant hack;
117
+ Expression *theExp;
118
+ ParseNodeType tmpType;
119
+
120
+ /* ===============================================================
121
+ If the value of a single field slot (or relation name) is being
122
+ compared against a constant, then use specialized routines for
123
+ doing the comparison.
124
+
125
+ If a constant comparison is being done within a multifield slot
126
+ and the constant's position has no multifields to the left or
127
+ no multifields to the right, then use the same routine used for
128
+ the single field slot case, but include the offset from either
129
+ the beginning or end of the slot.
130
+
131
+ Otherwise, use a general eq/neq test.
132
+ =============================================================== */
133
+ ClearBitString(&hack,sizeof(struct ObjectCmpPNConstant));
134
+ if (theNode->negated)
135
+ hack.fail = 1;
136
+ else
137
+ hack.pass = 1;
138
+ if (((theNode->withinMultifieldSlot == false) ||
139
+ (theNode->multiFieldsAfter == 0) ||
140
+ (theNode->multiFieldsBefore == 0)) &&
141
+ (theNode->slotNumber != ISA_ID) && (theNode->slotNumber != NAME_ID))
142
+ {
143
+ if (theNode->withinMultifieldSlot == false)
144
+ hack.fromBeginning = true;
145
+ else if (theNode->multiFieldsBefore == 0)
146
+ {
147
+ hack.fromBeginning = true;
148
+ hack.offset = theNode->singleFieldsBefore;
149
+ }
150
+ else
151
+ hack.offset = theNode->singleFieldsAfter;
152
+ theExp = GenConstant(theEnv,OBJ_PN_CONSTANT,AddBitMap(theEnv,&hack,
153
+ sizeof(struct ObjectCmpPNConstant)));
154
+ theExp->argList = GenConstant(theEnv,NodeTypeToType(theNode),theNode->value);
155
+ }
156
+ else
157
+ {
158
+ hack.general = 1;
159
+ theExp = GenConstant(theEnv,OBJ_PN_CONSTANT,AddBitMap(theEnv,&hack,
160
+ sizeof(struct ObjectCmpPNConstant)));
161
+ theExp->argList = GenConstant(theEnv,0,NULL);
162
+ tmpType = theNode->pnType;
163
+ theNode->pnType = SF_VARIABLE_NODE;
164
+ GenObjectGetVar(theEnv,false,theExp->argList,theNode,-1);
165
+ theNode->pnType = tmpType;
166
+ theExp->argList->nextArg = GenConstant(theEnv,NodeTypeToType(theNode),theNode->value);
167
+ }
168
+ return(theExp);
169
+ }
170
+
171
+ void ReplaceGetPNObjectValue(
172
+ Environment *theEnv,
173
+ Expression *theItem,
174
+ struct lhsParseNode *theNode)
175
+ {
176
+ GenObjectGetVar(theEnv,false,theItem,theNode,-1);
177
+ }
178
+
179
+ Expression *GenGetPNObjectValue(
180
+ Environment *theEnv,
181
+ struct lhsParseNode *theNode)
182
+ {
183
+ Expression *theItem;
184
+
185
+ theItem = GenConstant(theEnv,0,NULL);
186
+ GenObjectGetVar(theEnv,false,theItem,theNode,-1);
187
+ return(theItem);
188
+ }
189
+
190
+ Expression *ObjectPNVariableComparison(
191
+ Environment *theEnv,
192
+ struct lhsParseNode *selfNode,
193
+ struct lhsParseNode *referringNode)
194
+ {
195
+ return(GenerateSlotComparisonTest(theEnv,false,false,selfNode,referringNode));
196
+ }
197
+
198
+ /****************************************************
199
+ NAME : GenObjectLengthTest
200
+ DESCRIPTION : Generates a test on the cardinality
201
+ of a slot matching an object pattern
202
+ INPUTS : The first lhsParseNode for a slot
203
+ in an object pattern
204
+ RETURNS : Nothing useful
205
+ SIDE EFFECTS : The lhsParseNode network test is
206
+ modified to include the length test
207
+ NOTES : None
208
+ ****************************************************/
209
+ void GenObjectLengthTest(
210
+ Environment *theEnv,
211
+ struct lhsParseNode *theNode)
212
+ {
213
+ struct ObjectMatchLength hack;
214
+ Expression *theTest;
215
+
216
+ if ((theNode->singleFieldsAfter == 0) &&
217
+ (theNode->pnType != SF_VARIABLE_NODE) &&
218
+ (theNode->pnType != SF_WILDCARD_NODE))
219
+ return;
220
+
221
+ ClearBitString(&hack,sizeof(struct ObjectMatchLength));
222
+
223
+ if ((theNode->pnType != MF_VARIABLE_NODE) &&
224
+ (theNode->pnType != MF_WILDCARD_NODE) &&
225
+ (theNode->multiFieldsAfter == 0))
226
+ hack.exactly = 1;
227
+ else
228
+ hack.exactly = 0;
229
+
230
+ if ((theNode->pnType == SF_VARIABLE_NODE) || (theNode->pnType == SF_WILDCARD_NODE))
231
+ hack.minLength = 1 + theNode->singleFieldsAfter;
232
+ else
233
+ hack.minLength = theNode->singleFieldsAfter;
234
+
235
+ theTest = GenConstant(theEnv,OBJ_SLOT_LENGTH,AddBitMap(theEnv,&hack,
236
+ sizeof(struct ObjectMatchLength)));
237
+
238
+ if (theNode->constantSelector != NULL)
239
+ { theNode->constantSelector->nextArg = CopyExpression(theEnv,theTest); }
240
+
241
+ theNode->networkTest = CombineExpressions(theEnv,theTest,theNode->networkTest);
242
+ }
243
+
244
+ /****************************************************
245
+ NAME : GenObjectZeroLengthTest
246
+ DESCRIPTION : Generates a test on the cardinality
247
+ of a slot matching an object pattern
248
+ INPUTS : The first lhsParseNode for a slot
249
+ in an object pattern
250
+ RETURNS : Nothing useful
251
+ SIDE EFFECTS : The lhsParseNode network test is
252
+ modified to include the length test
253
+ NOTES : None
254
+ ****************************************************/
255
+ void GenObjectZeroLengthTest(
256
+ Environment *theEnv,
257
+ struct lhsParseNode *theNode)
258
+ {
259
+ struct ObjectMatchLength hack;
260
+ Expression *theTest;
261
+
262
+ ClearBitString(&hack,sizeof(struct ObjectMatchLength));
263
+ hack.exactly = 1;
264
+ hack.minLength = 0;
265
+ theTest = GenConstant(theEnv,OBJ_SLOT_LENGTH,
266
+ AddBitMap(theEnv,&hack,sizeof(struct ObjectMatchLength)));
267
+ theNode->networkTest = CombineExpressions(theEnv,theTest,theNode->networkTest);
268
+ }
269
+
270
+ /* =========================================
271
+ *****************************************
272
+ INTERNALLY VISIBLE FUNCTIONS
273
+ =========================================
274
+ ***************************************** */
275
+
276
+ /***************************************************
277
+ NAME : GenObjectGetVar
278
+ DESCRIPTION : Generates the expressions necessary
279
+ to access object pattern variables
280
+ INPUTS : 1) An integer code indicating if
281
+ this is a join network reference
282
+ or a pattern network reference
283
+ 2) The expression for which to set
284
+ the type and value
285
+ 3) The lhsParseNode for the
286
+ variable reference
287
+ 4) For a join reference, the side from
288
+ which the variable must be retrieved.
289
+ RETURNS : Nothing useful
290
+ SIDE EFFECTS : The value is a packed long holding
291
+ pattern index, slot number,
292
+ field index, etc.
293
+ NOTES : None
294
+ ***************************************************/
295
+ static void GenObjectGetVar(
296
+ Environment *theEnv,
297
+ bool joinReference,
298
+ Expression *theItem,
299
+ struct lhsParseNode *theNode,
300
+ int side)
301
+ {
302
+ struct ObjectMatchVar1 hack1;
303
+ struct ObjectMatchVar2 hack2;
304
+
305
+ ClearBitString(&hack1,sizeof(struct ObjectMatchVar1));
306
+ ClearBitString(&hack2,sizeof(struct ObjectMatchVar2));
307
+
308
+ if (joinReference)
309
+ {
310
+ if (side == LHS)
311
+ {
312
+ hack1.lhs = 1;
313
+ hack2.lhs = 1;
314
+ hack1.whichPattern = theNode->joinDepth;
315
+ hack2.whichPattern = theNode->joinDepth;
316
+ }
317
+ else if (side == RHS)
318
+ {
319
+ hack1.rhs = 1;
320
+ hack2.rhs = 1;
321
+ hack1.whichPattern = 0;
322
+ hack2.whichPattern = 0;
323
+ }
324
+ else if (side == NESTED_RHS)
325
+ {
326
+ hack1.rhs = 1;
327
+ hack2.rhs = 1;
328
+ hack1.whichPattern = theNode->joinDepth;
329
+ hack2.whichPattern = theNode->joinDepth;
330
+ }
331
+ else
332
+ {
333
+ hack1.whichPattern = theNode->joinDepth;
334
+ hack2.whichPattern = theNode->joinDepth;
335
+ }
336
+ }
337
+
338
+ /* ========================
339
+ Access an object address
340
+ ======================== */
341
+ if (theNode->slotNumber == UNSPECIFIED_SLOT)
342
+ {
343
+ hack1.objectAddress = 1;
344
+ if (joinReference)
345
+ { theItem->type = OBJ_GET_SLOT_JNVAR1; }
346
+ else
347
+ { theItem->type = OBJ_GET_SLOT_PNVAR1; }
348
+ theItem->value = AddBitMap(theEnv,&hack1,sizeof(struct ObjectMatchVar1));
349
+ return;
350
+ }
351
+
352
+ /* ======================================
353
+ Access the entire contents of the slot
354
+ ====================================== */
355
+ if ((theNode->singleFieldsBefore == 0) &&
356
+ (theNode->singleFieldsAfter == 0) &&
357
+ (theNode->multiFieldsBefore == 0) &&
358
+ (theNode->multiFieldsAfter == 0) &&
359
+ ((theNode->withinMultifieldSlot == false) ||
360
+ (theNode->pnType == MF_VARIABLE_NODE) ||
361
+ (theNode->pnType == MF_WILDCARD_NODE)))
362
+ {
363
+ hack1.allFields = 1;
364
+ hack1.whichSlot = theNode->slotNumber;
365
+ theItem->type = (joinReference ? OBJ_GET_SLOT_JNVAR1 : OBJ_GET_SLOT_PNVAR1);
366
+ theItem->value = AddBitMap(theEnv,&hack1,sizeof(struct ObjectMatchVar1));
367
+ return;
368
+ }
369
+
370
+ /* =============================================================
371
+ Access a particular field(s) in a multifield slot pattern
372
+ containing at most one multifield variable and at least
373
+ one (or two if no multifield variables) single-field variable
374
+ ============================================================= */
375
+ if (((theNode->pnType == SF_WILDCARD_NODE) || (theNode->pnType == SF_VARIABLE_NODE) || ConstantNode(theNode)) &&
376
+ ((theNode->multiFieldsBefore == 0) || (theNode->multiFieldsAfter == 0)))
377
+ {
378
+ hack2.whichSlot = theNode->slotNumber;
379
+ if (theNode->multiFieldsBefore == 0)
380
+ {
381
+ hack2.fromBeginning = 1;
382
+ hack2.beginningOffset = theNode->singleFieldsBefore;
383
+ }
384
+ else
385
+ {
386
+ hack2.fromEnd = 1;
387
+ hack2.endOffset = theNode->singleFieldsAfter;
388
+ }
389
+ theItem->type = (joinReference ? OBJ_GET_SLOT_JNVAR2 : OBJ_GET_SLOT_PNVAR2);
390
+ theItem->value = AddBitMap(theEnv,&hack2,sizeof(struct ObjectMatchVar2));
391
+ return;
392
+ }
393
+
394
+ if (((theNode->pnType == MF_WILDCARD_NODE) || (theNode->pnType == MF_VARIABLE_NODE) || ConstantNode(theNode)) &&
395
+ (theNode->multiFieldsBefore == 0) &&
396
+ (theNode->multiFieldsAfter == 0))
397
+ {
398
+ hack2.whichSlot = theNode->slotNumber;
399
+ hack2.fromBeginning = 1;
400
+ hack2.fromEnd = 1;
401
+ hack2.beginningOffset = theNode->singleFieldsBefore;
402
+ hack2.endOffset = theNode->singleFieldsAfter;
403
+ theItem->type = (joinReference ? OBJ_GET_SLOT_JNVAR2 : OBJ_GET_SLOT_PNVAR2);
404
+ theItem->value = AddBitMap(theEnv,&hack2,sizeof(struct ObjectMatchVar2));
405
+ return;
406
+ }
407
+
408
+ /* ==================================================
409
+ General slot field access using multifield markers
410
+ ================================================== */
411
+ hack1.whichSlot = theNode->slotNumber;
412
+ hack1.whichField = theNode->index;
413
+ theItem->type = (joinReference ? OBJ_GET_SLOT_JNVAR1 : OBJ_GET_SLOT_PNVAR1);
414
+ theItem->value = AddBitMap(theEnv,&hack1,sizeof(struct ObjectMatchVar1));
415
+ }
416
+
417
+ /****************************************************************
418
+ NAME : IsSimpleSlotVariable
419
+ DESCRIPTION : Determines if a slot pattern variable
420
+ references a single-field slot or a single-field
421
+ in a multifield slot which does not require
422
+ use of multifield markers
423
+ (Object addresses are not simple variables)
424
+ INPUTS : The intermediate parse node
425
+ RETURNS : True if the variable is simple,
426
+ false otherwise
427
+ SIDE EFFECTS : None
428
+ NOTES : None
429
+ ****************************************************************/
430
+ static bool IsSimpleSlotVariable(
431
+ struct lhsParseNode *node)
432
+ {
433
+ if ((node->pnType == MF_WILDCARD_NODE) || (node->pnType == MF_VARIABLE_NODE))
434
+ return false;
435
+ if ((node->slotNumber == UNSPECIFIED_SLOT) ||
436
+ (node->slotNumber == ISA_ID) ||
437
+ (node->slotNumber == NAME_ID))
438
+ return false;
439
+ if (node->withinMultifieldSlot == false)
440
+ return true;
441
+ if (node->multifieldSlot == true)
442
+ return false;
443
+ if ((node->multiFieldsBefore == 0) || (node->multiFieldsAfter == 0))
444
+ return true;
445
+ return false;
446
+ }
447
+
448
+ /***************************************************************
449
+ NAME : GenerateSlotComparisonTest
450
+ DESCRIPTION : Generates pattern and join network
451
+ expressions for comparing object
452
+ pattern variables
453
+ INPUTS : 1) A flag indicating if this is a
454
+ pattern or join network test
455
+ 2) For a join test, a flag indicating
456
+ if it is a nand join
457
+ 3) The intermediate parse node
458
+ for the first variable
459
+ 4) The intermediate parse node
460
+ for the second variable
461
+ RETURNS : An expression for comparing the
462
+ variables
463
+ SIDE EFFECTS : Expression and bitmaps generated
464
+ NOTES : The following tests are generated
465
+ for the following scenarios:
466
+
467
+ SF slot w/ SF slot: PN_1 or JN_1
468
+ Example: (foo ?x) with (bar ?xy)
469
+
470
+ SF slot w/ SF reference in MF slot: PN_2 or JN_2
471
+ Example: (foo ?x) (bar ? ?x ? ?)
472
+
473
+ SF reference w/ SF reference: PN_3 or JN_3
474
+ Example: (foo ? ?x ?) and (bar ? ? ? ?x)
475
+
476
+ All other cases: EQ/NEQ general test
477
+ Example: (foo $? ?x $?) and (bar ?x)
478
+ ***************************************************************/
479
+ static Expression *GenerateSlotComparisonTest(
480
+ Environment *theEnv,
481
+ bool joinTest,
482
+ bool isNand,
483
+ struct lhsParseNode *selfNode,
484
+ struct lhsParseNode *referringNode)
485
+ {
486
+ Expression *theExp;
487
+ struct ObjectCmpPNSingleSlotVars1 phack1;
488
+ struct ObjectCmpPNSingleSlotVars2 phack2;
489
+ struct ObjectCmpPNSingleSlotVars3 phack3;
490
+ struct ObjectCmpJoinSingleSlotVars1 jhack1;
491
+ struct ObjectCmpJoinSingleSlotVars2 jhack2;
492
+ struct ObjectCmpJoinSingleSlotVars3 jhack3;
493
+ struct lhsParseNode *firstNode;
494
+
495
+ if (isNand)
496
+ { firstNode = referringNode; }
497
+ else
498
+ { firstNode = selfNode; }
499
+
500
+ /* =========================================================
501
+ If we are comparing two single-field slot variables that
502
+ don't require multifield markers for lookup, use
503
+ a quick comparison. Otherwise, use a general eq/neq with
504
+ the pattern variable access routines
505
+ ========================================================= */
506
+ if (IsSimpleSlotVariable(firstNode) && IsSimpleSlotVariable(referringNode))
507
+ {
508
+ /* ==============================
509
+ Compare two single-field slots
510
+ ============================== */
511
+ if ((firstNode->withinMultifieldSlot == false) &&
512
+ (referringNode->withinMultifieldSlot == false))
513
+ {
514
+ ClearBitString(&phack1,sizeof(struct ObjectCmpPNSingleSlotVars1));
515
+ ClearBitString(&jhack1,sizeof(struct ObjectCmpJoinSingleSlotVars1));
516
+ if (selfNode->negated)
517
+ phack1.fail = jhack1.fail = 1;
518
+ else
519
+ phack1.pass = jhack1.pass = 1;
520
+
521
+ phack1.firstSlot = jhack1.firstSlot = firstNode->slotNumber;
522
+ phack1.secondSlot = jhack1.secondSlot = referringNode->slotNumber;
523
+ if (joinTest)
524
+ {
525
+ if (isNand)
526
+ { jhack1.firstPattern = referringNode->joinDepth; }
527
+ else
528
+ { jhack1.firstPattern = 0; }
529
+
530
+ jhack1.firstPatternRHS = true;
531
+
532
+ if ((! isNand) && (selfNode->joinDepth == referringNode->joinDepth))
533
+ {
534
+ jhack1.secondPatternRHS = true;
535
+ jhack1.secondPattern = 0;
536
+ }
537
+ else
538
+ {
539
+ jhack1.secondPatternLHS = true;
540
+ jhack1.secondPattern = referringNode->joinDepth;
541
+ }
542
+
543
+ theExp = GenConstant(theEnv,OBJ_JN_CMP1,AddBitMap(theEnv,&jhack1,
544
+ sizeof(struct ObjectCmpJoinSingleSlotVars1)));
545
+ }
546
+ else
547
+ theExp = GenConstant(theEnv,OBJ_PN_CMP1,AddBitMap(theEnv,&phack1,
548
+ sizeof(struct ObjectCmpPNSingleSlotVars1)));
549
+ }
550
+ /* ============================================
551
+ Compare a single-field slot with a
552
+ single-field in a multifield slot (make sure
553
+ the multifield slot reference is first
554
+ ============================================ */
555
+ else if ((firstNode->withinMultifieldSlot == false) ||
556
+ (referringNode->withinMultifieldSlot == false))
557
+ {
558
+ ClearBitString(&phack2,sizeof(struct ObjectCmpPNSingleSlotVars2));
559
+ ClearBitString(&jhack2,sizeof(struct ObjectCmpJoinSingleSlotVars2));
560
+
561
+ if (selfNode->negated)
562
+ phack2.fail = jhack2.fail = 1;
563
+ else
564
+ phack2.pass = jhack2.pass = 1;
565
+
566
+ if (firstNode->withinMultifieldSlot == true)
567
+ {
568
+ phack2.firstSlot = jhack2.firstSlot = firstNode->slotNumber;
569
+ phack2.secondSlot = jhack2.secondSlot = referringNode->slotNumber;
570
+ if (joinTest)
571
+ {
572
+ if (isNand)
573
+ { jhack2.firstPattern = referringNode->joinDepth; }
574
+ else
575
+ { jhack2.firstPattern = 0; }
576
+
577
+ jhack2.firstPatternRHS = true;
578
+
579
+ if ((! isNand) && (selfNode->joinDepth == referringNode->joinDepth))
580
+ {
581
+ jhack2.secondPatternRHS = true;
582
+ jhack2.secondPattern = 0;
583
+ }
584
+ else
585
+ {
586
+ jhack2.secondPatternLHS = true;
587
+ jhack2.secondPattern = referringNode->joinDepth;
588
+ }
589
+ }
590
+
591
+ if (firstNode->multiFieldsBefore == 0)
592
+ {
593
+ phack2.fromBeginning = jhack2.fromBeginning = 1;
594
+ phack2.offset = jhack2.offset = firstNode->singleFieldsBefore;
595
+ }
596
+ else
597
+ phack2.offset = jhack2.offset = firstNode->singleFieldsAfter;
598
+ }
599
+ else
600
+ {
601
+ phack2.firstSlot = jhack2.firstSlot = referringNode->slotNumber;
602
+ phack2.secondSlot = jhack2.secondSlot = firstNode->slotNumber;
603
+ if (joinTest)
604
+ {
605
+ if (isNand)
606
+ { jhack2.secondPattern = firstNode->joinDepth; }
607
+ else
608
+ { jhack2.secondPattern = 0; }
609
+
610
+ jhack2.secondPatternRHS = true;
611
+
612
+ if ((! isNand) && (selfNode->joinDepth == referringNode->joinDepth))
613
+ {
614
+ jhack2.firstPatternRHS = true;
615
+ jhack2.firstPattern = 0;
616
+ }
617
+ else
618
+ {
619
+ jhack2.firstPatternLHS = true;
620
+ jhack2.firstPattern = referringNode->joinDepth;
621
+ }
622
+ }
623
+
624
+ if (referringNode->multiFieldsBefore == 0)
625
+ {
626
+ phack2.fromBeginning = jhack2.fromBeginning = 1;
627
+ phack2.offset = jhack2.offset = referringNode->singleFieldsBefore;
628
+ }
629
+ else
630
+ phack2.offset = jhack2.offset = referringNode->singleFieldsAfter;
631
+ }
632
+ if (joinTest)
633
+ theExp = GenConstant(theEnv,OBJ_JN_CMP2,AddBitMap(theEnv,&jhack2,
634
+ sizeof(struct ObjectCmpJoinSingleSlotVars2)));
635
+ else
636
+ theExp = GenConstant(theEnv,OBJ_PN_CMP2,AddBitMap(theEnv,&phack2,
637
+ sizeof(struct ObjectCmpPNSingleSlotVars2)));
638
+ }
639
+
640
+ /* ===================================
641
+ Compare two single-field references
642
+ within multifield slots
643
+ =================================== */
644
+ else
645
+ {
646
+ ClearBitString(&phack3,sizeof(struct ObjectCmpPNSingleSlotVars3));
647
+ ClearBitString(&jhack3,sizeof(struct ObjectCmpJoinSingleSlotVars3));
648
+
649
+ if (selfNode->negated)
650
+ phack3.fail = jhack3.fail = 1;
651
+ else
652
+ phack3.pass = jhack3.pass = 1;
653
+
654
+ phack3.firstSlot = jhack3.firstSlot = firstNode->slotNumber;
655
+ phack3.secondSlot = jhack3.secondSlot = referringNode->slotNumber;
656
+
657
+ if (firstNode->multiFieldsBefore == 0)
658
+ {
659
+ phack3.firstFromBeginning = jhack3.firstFromBeginning = 1;
660
+ phack3.firstOffset = jhack3.firstOffset = firstNode->singleFieldsBefore;
661
+ }
662
+ else
663
+ phack3.firstOffset = jhack3.firstOffset = firstNode->singleFieldsAfter;
664
+
665
+ if (referringNode->multiFieldsBefore == 0)
666
+ {
667
+ phack3.secondFromBeginning = jhack3.secondFromBeginning = 1;
668
+ phack3.secondOffset = jhack3.secondOffset = referringNode->singleFieldsBefore;
669
+ }
670
+ else
671
+ phack3.secondOffset = jhack3.secondOffset = referringNode->singleFieldsAfter;
672
+
673
+ if (joinTest)
674
+ {
675
+ if (isNand)
676
+ { jhack3.firstPattern = referringNode->joinDepth; }
677
+ else
678
+ { jhack3.firstPattern = 0; }
679
+
680
+ jhack3.firstPatternRHS = true;
681
+
682
+ if ((! isNand) && (selfNode->joinDepth == referringNode->joinDepth))
683
+ {
684
+ jhack3.secondPatternRHS = true;
685
+ jhack3.secondPattern = 0;
686
+ }
687
+ else
688
+ {
689
+ jhack3.secondPatternLHS = true;
690
+ jhack3.secondPattern = referringNode->joinDepth;
691
+ }
692
+
693
+ theExp = GenConstant(theEnv,OBJ_JN_CMP3,AddBitMap(theEnv,&jhack3,
694
+ sizeof(struct ObjectCmpJoinSingleSlotVars3)));
695
+ }
696
+ else
697
+ theExp = GenConstant(theEnv,OBJ_PN_CMP3,AddBitMap(theEnv,&phack3,
698
+ sizeof(struct ObjectCmpPNSingleSlotVars3)));
699
+ }
700
+ }
701
+
702
+ /* ==================================================
703
+ General comparison for multifield slot references,
704
+ references which require multifield markers, and
705
+ object addresses
706
+ ================================================== */
707
+ else
708
+ {
709
+ theExp = GenConstant(theEnv,FCALL,selfNode->negated ? ExpressionData(theEnv)->PTR_NEQ : ExpressionData(theEnv)->PTR_EQ);
710
+ theExp->argList = GenConstant(theEnv,0,NULL);
711
+
712
+ if (isNand)
713
+ { GenObjectGetVar(theEnv,joinTest,theExp->argList,selfNode,NESTED_RHS); }
714
+ else
715
+ { GenObjectGetVar(theEnv,joinTest,theExp->argList,selfNode,RHS); }
716
+
717
+ theExp->argList->nextArg = GenConstant(theEnv,0,NULL);
718
+
719
+ if ((! isNand) && (selfNode->joinDepth == referringNode->joinDepth))
720
+ { GenObjectGetVar(theEnv,joinTest,theExp->argList->nextArg,referringNode,RHS); }
721
+ else
722
+ { GenObjectGetVar(theEnv,joinTest,theExp->argList->nextArg,referringNode,LHS); }
723
+ }
724
+ return(theExp);
725
+ }
726
+
727
+ #endif
728
+
729
+ /***************************************************
730
+ NAME :
731
+ DESCRIPTION :
732
+ INPUTS :
733
+ RETURNS :
734
+ SIDE EFFECTS :
735
+ NOTES :
736
+ ***************************************************/