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,733 @@
1
+
2
+ /*******************************************************/
3
+ /* "C" Language Integrated Production System */
4
+ /* */
5
+ /* CLIPS Version 6.40 11/01/16 */
6
+ /* */
7
+ /* DEFRULE CONSTRUCTS-TO-C MODULE */
8
+ /*******************************************************/
9
+
10
+ /*************************************************************/
11
+ /* Purpose: Implements the constructs-to-c feature for the */
12
+ /* defrule construct. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* Brian L. Dantes */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.24: Removed DYNAMIC_SALIENCE and */
23
+ /* LOGICAL_DEPENDENCIES compilation flags. */
24
+ /* */
25
+ /* 6.30: Added support for path name argument to */
26
+ /* constructs-to-c. */
27
+ /* */
28
+ /* Removed conditional code for unsupported */
29
+ /* compilers/operating systems (IBM_MCW, */
30
+ /* MAC_MCW, and IBM_TBC). */
31
+ /* */
32
+ /* Support for join network changes. */
33
+ /* */
34
+ /* Added const qualifiers to remove C++ */
35
+ /* deprecation warnings. */
36
+ /* */
37
+ /* 6.31: Fixed disjunct bug in defrule iteration. */
38
+ /* */
39
+ /* 6.40: Pragma once and other inclusion changes. */
40
+ /* */
41
+ /* Added support for booleans with <stdbool.h>. */
42
+ /* */
43
+ /* Removed use of void pointers for specific */
44
+ /* data structures. */
45
+ /* */
46
+ /*************************************************************/
47
+
48
+ #include "setup.h"
49
+
50
+ #if DEFRULE_CONSTRUCT && (! RUN_TIME) && CONSTRUCT_COMPILER
51
+
52
+ #include <stdio.h>
53
+ #include <string.h>
54
+
55
+ #include "envrnmnt.h"
56
+ #include "factbld.h"
57
+ #include "pattern.h"
58
+ #include "reteutil.h"
59
+
60
+ #include "rulecmp.h"
61
+
62
+ /***************************************/
63
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
64
+ /***************************************/
65
+
66
+ static bool ConstructToCode(Environment *,const char *,const char *,char *,
67
+ unsigned int,FILE *,unsigned int,unsigned int);
68
+ static void JoinToCode(Environment *,FILE *,struct joinNode *,unsigned int,unsigned int);
69
+ static void LinkToCode(Environment *,FILE *,struct joinLink *,unsigned int,unsigned int);
70
+ static void DefruleModuleToCode(Environment *,FILE *,Defmodule *,unsigned int,unsigned int,unsigned int);
71
+ static void DefruleToCode(Environment *,FILE *,Defrule *,unsigned int,unsigned int,unsigned int);
72
+ static void CloseDefruleFiles(Environment *,FILE *,FILE *,FILE *,FILE*,unsigned int);
73
+ static void BeforeDefrulesCode(Environment *);
74
+ static void InitDefruleCode(Environment *,FILE *,unsigned int,unsigned int);
75
+ static bool RuleCompilerTraverseJoins(Environment *,struct joinNode *,const char *,
76
+ const char *,char *,unsigned int,FILE *,
77
+ unsigned int,unsigned int,FILE **,FILE **,
78
+ unsigned int *,unsigned int *,unsigned int *,unsigned int *,unsigned int *);
79
+ static bool TraverseJoinLinks(Environment *,struct joinLink *,const char *,const char *,
80
+ char *,unsigned int,FILE *,unsigned int,unsigned int,
81
+ FILE **,unsigned int *,unsigned int *,unsigned int *);
82
+
83
+ /***********************************************************/
84
+ /* DefruleCompilerSetup: Initializes the defrule construct */
85
+ /* for use with the constructs-to-c command. */
86
+ /***********************************************************/
87
+ void DefruleCompilerSetup(
88
+ Environment *theEnv)
89
+ {
90
+ DefruleData(theEnv)->DefruleCodeItem = AddCodeGeneratorItem(theEnv,"defrules",0,BeforeDefrulesCode,
91
+ InitDefruleCode,ConstructToCode,4);
92
+ }
93
+
94
+ /**************************************************************/
95
+ /* BeforeDefrulesCode: Assigns each defrule and join with a */
96
+ /* unique ID which will be used for pointer references when */
97
+ /* the data structures are written to a file as C code */
98
+ /**************************************************************/
99
+ static void BeforeDefrulesCode(
100
+ Environment *theEnv)
101
+ {
102
+ unsigned long moduleCount, ruleCount, joinCount, linkCount;
103
+
104
+ TagRuleNetwork(theEnv,&moduleCount,&ruleCount,&joinCount,&linkCount);
105
+ }
106
+
107
+ /*********************************************************/
108
+ /* ConstructToCode: Produces defrule code for a run-time */
109
+ /* module created using the constructs-to-c function. */
110
+ /*********************************************************/
111
+ static bool ConstructToCode(
112
+ Environment *theEnv,
113
+ const char *fileName,
114
+ const char *pathName,
115
+ char *fileNameBuffer,
116
+ unsigned int fileID,
117
+ FILE *headerFP,
118
+ unsigned int imageID,
119
+ unsigned int maxIndices)
120
+ {
121
+ unsigned int fileCount = 1;
122
+ Defmodule *theModule;
123
+ Defrule *theDefrule, *theDisjunct;
124
+ unsigned int joinArrayCount = 0, joinArrayVersion = 1;
125
+ unsigned int linkArrayCount = 0, linkArrayVersion = 1;
126
+ unsigned int moduleCount = 0, moduleArrayCount = 0, moduleArrayVersion = 1;
127
+ unsigned int defruleArrayCount = 0, defruleArrayVersion = 1;
128
+ FILE *joinFile = NULL, *moduleFile = NULL, *defruleFile = NULL, *linkFile = NULL;
129
+
130
+ /*==============================================*/
131
+ /* Include the appropriate defrule header file. */
132
+ /*==============================================*/
133
+
134
+ fprintf(headerFP,"#include \"ruledef.h\"\n");
135
+
136
+ /*======================================*/
137
+ /* Save the left and right prime links. */
138
+ /*======================================*/
139
+
140
+ if (! TraverseJoinLinks(theEnv,DefruleData(theEnv)->LeftPrimeJoins,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,
141
+ maxIndices,&linkFile,&fileCount,&linkArrayVersion,&linkArrayCount))
142
+ {
143
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
144
+ return false;
145
+ }
146
+
147
+ if (! TraverseJoinLinks(theEnv,DefruleData(theEnv)->RightPrimeJoins,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,
148
+ maxIndices,&linkFile,&fileCount,&linkArrayVersion,&linkArrayCount))
149
+ {
150
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
151
+ return false;
152
+ }
153
+
154
+ /*=========================================================*/
155
+ /* Loop through all the modules, all the defrules, and all */
156
+ /* the join nodes writing their C code representation to */
157
+ /* the file as they are traversed. */
158
+ /*=========================================================*/
159
+
160
+ for (theModule = GetNextDefmodule(theEnv,NULL);
161
+ theModule != NULL;
162
+ theModule = GetNextDefmodule(theEnv,theModule))
163
+ {
164
+ /*=========================*/
165
+ /* Set the current module. */
166
+ /*=========================*/
167
+
168
+ SetCurrentModule(theEnv,theModule);
169
+
170
+ /*==========================*/
171
+ /* Save the defrule module. */
172
+ /*==========================*/
173
+
174
+ moduleFile = OpenFileIfNeeded(theEnv,moduleFile,fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
175
+ moduleArrayVersion,headerFP,
176
+ "struct defruleModule",ModulePrefix(DefruleData(theEnv)->DefruleCodeItem),
177
+ false,NULL);
178
+
179
+ if (moduleFile == NULL)
180
+ {
181
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
182
+ return false;
183
+ }
184
+
185
+ DefruleModuleToCode(theEnv,moduleFile,theModule,imageID,maxIndices,moduleCount);
186
+ moduleFile = CloseFileIfNeeded(theEnv,moduleFile,&moduleArrayCount,&moduleArrayVersion,
187
+ maxIndices,NULL,NULL);
188
+
189
+ /*=========================================*/
190
+ /* Loop through all of the defrules (and */
191
+ /* their disjuncts) in the current module. */
192
+ /*=========================================*/
193
+
194
+ for (theDefrule = GetNextDefrule(theEnv,NULL);
195
+ theDefrule != NULL;
196
+ theDefrule = GetNextDefrule(theEnv,theDefrule))
197
+ {
198
+ for (theDisjunct = theDefrule;
199
+ theDisjunct != NULL;
200
+ theDisjunct = theDisjunct->disjunct)
201
+ {
202
+ /*===================================*/
203
+ /* Save the defrule data structures. */
204
+ /*===================================*/
205
+
206
+ defruleFile = OpenFileIfNeeded(theEnv,defruleFile,fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
207
+ defruleArrayVersion,headerFP,
208
+ "Defrule",ConstructPrefix(DefruleData(theEnv)->DefruleCodeItem),
209
+ false,NULL);
210
+ if (defruleFile == NULL)
211
+ {
212
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
213
+ return false;
214
+ }
215
+
216
+ DefruleToCode(theEnv,defruleFile,theDisjunct,imageID,maxIndices,
217
+ moduleCount);
218
+ defruleArrayCount++;
219
+ defruleFile = CloseFileIfNeeded(theEnv,defruleFile,&defruleArrayCount,&defruleArrayVersion,
220
+ maxIndices,NULL,NULL);
221
+
222
+ /*================================*/
223
+ /* Save the join data structures. */
224
+ /*================================*/
225
+
226
+ if (! RuleCompilerTraverseJoins(theEnv,theDisjunct->lastJoin,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,
227
+ maxIndices,&joinFile,&linkFile,&fileCount,&joinArrayVersion,&joinArrayCount,
228
+ &linkArrayVersion,&linkArrayCount))
229
+ {
230
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
231
+ return false;
232
+ }
233
+ }
234
+ }
235
+
236
+ moduleCount++;
237
+ moduleArrayCount++;
238
+ }
239
+
240
+ CloseDefruleFiles(theEnv,moduleFile,defruleFile,joinFile,linkFile,maxIndices);
241
+
242
+ return true;
243
+ }
244
+
245
+ /*********************************************************************/
246
+ /* RuleCompilerTraverseJoins: Traverses the join network for a rule. */
247
+ /*********************************************************************/
248
+ static bool RuleCompilerTraverseJoins(
249
+ Environment *theEnv,
250
+ struct joinNode *joinPtr,
251
+ const char *fileName,
252
+ const char *pathName,
253
+ char *fileNameBuffer,
254
+ unsigned int fileID,
255
+ FILE *headerFP,
256
+ unsigned int imageID,
257
+ unsigned int maxIndices,
258
+ FILE **joinFile,
259
+ FILE **linkFile,
260
+ unsigned int *fileCount,
261
+ unsigned int *joinArrayVersion,
262
+ unsigned int *joinArrayCount,
263
+ unsigned int *linkArrayVersion,
264
+ unsigned int *linkArrayCount)
265
+ {
266
+ for (;
267
+ joinPtr != NULL;
268
+ joinPtr = joinPtr->lastLevel)
269
+ {
270
+ if (joinPtr->marked)
271
+ {
272
+ *joinFile = OpenFileIfNeeded(theEnv,*joinFile,fileName,pathName,fileNameBuffer,fileID,imageID,fileCount,
273
+ *joinArrayVersion,headerFP,
274
+ "struct joinNode",JoinPrefix(),false,NULL);
275
+ if (*joinFile == NULL)
276
+ { return false; }
277
+
278
+ JoinToCode(theEnv,*joinFile,joinPtr,imageID,maxIndices);
279
+ (*joinArrayCount)++;
280
+ *joinFile = CloseFileIfNeeded(theEnv,*joinFile,joinArrayCount,joinArrayVersion,
281
+ maxIndices,NULL,NULL);
282
+
283
+
284
+ if (! TraverseJoinLinks(theEnv,joinPtr->nextLinks,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,
285
+ maxIndices,linkFile,fileCount,linkArrayVersion,linkArrayCount))
286
+ { return false; }
287
+ }
288
+
289
+ if (joinPtr->joinFromTheRight)
290
+ {
291
+ if (RuleCompilerTraverseJoins(theEnv,(struct joinNode *) joinPtr->rightSideEntryStructure,fileName,pathName,
292
+ fileNameBuffer,fileID,headerFP,imageID,maxIndices,joinFile,linkFile,fileCount,
293
+ joinArrayVersion,joinArrayCount,
294
+ linkArrayVersion,linkArrayCount) == false)
295
+ { return false; }
296
+ }
297
+ }
298
+
299
+ return true;
300
+ }
301
+
302
+ /*******************************************************/
303
+ /* TraverseJoinLinks: Writes out a list of join links. */
304
+ /*******************************************************/
305
+ static bool TraverseJoinLinks(
306
+ Environment *theEnv,
307
+ struct joinLink *linkPtr,
308
+ const char *fileName,
309
+ const char *pathName,
310
+ char *fileNameBuffer,
311
+ unsigned int fileID,
312
+ FILE *headerFP,
313
+ unsigned int imageID,
314
+ unsigned int maxIndices,
315
+ FILE **linkFile,
316
+ unsigned int *fileCount,
317
+ unsigned int *linkArrayVersion,
318
+ unsigned int *linkArrayCount)
319
+ {
320
+ for (;
321
+ linkPtr != NULL;
322
+ linkPtr = linkPtr->next)
323
+ {
324
+ *linkFile = OpenFileIfNeeded(theEnv,*linkFile,fileName,pathName,fileNameBuffer,fileID,imageID,fileCount,
325
+ *linkArrayVersion,headerFP,
326
+ "struct joinLink",LinkPrefix(),false,NULL);
327
+
328
+ if (*linkFile == NULL)
329
+ { return false; }
330
+
331
+ LinkToCode(theEnv,*linkFile,linkPtr,imageID,maxIndices);
332
+ (*linkArrayCount)++;
333
+ *linkFile = CloseFileIfNeeded(theEnv,*linkFile,linkArrayCount,linkArrayVersion,
334
+ maxIndices,NULL,NULL);
335
+ }
336
+
337
+ return true;
338
+ }
339
+
340
+ /********************************************************/
341
+ /* CloseDefruleFiles: Closes all of the C files created */
342
+ /* for defrule. Called when an error occurs or when */
343
+ /* the defrules have all been written to the files. */
344
+ /********************************************************/
345
+ static void CloseDefruleFiles(
346
+ Environment *theEnv,
347
+ FILE *moduleFile,
348
+ FILE *defruleFile,
349
+ FILE *joinFile,
350
+ FILE *linkFile,
351
+ unsigned int maxIndices)
352
+ {
353
+ unsigned int count = maxIndices;
354
+ unsigned int arrayVersion = 0;
355
+
356
+ if (linkFile != NULL)
357
+ {
358
+ count = maxIndices;
359
+ CloseFileIfNeeded(theEnv,linkFile,&count,&arrayVersion,maxIndices,NULL,NULL);
360
+ }
361
+
362
+ if (joinFile != NULL)
363
+ {
364
+ count = maxIndices;
365
+ CloseFileIfNeeded(theEnv,joinFile,&count,&arrayVersion,maxIndices,NULL,NULL);
366
+ }
367
+
368
+ if (defruleFile != NULL)
369
+ {
370
+ count = maxIndices;
371
+ CloseFileIfNeeded(theEnv,defruleFile,&count,&arrayVersion,maxIndices,NULL,NULL);
372
+ }
373
+
374
+ if (moduleFile != NULL)
375
+ {
376
+ count = maxIndices;
377
+ CloseFileIfNeeded(theEnv,moduleFile,&count,&arrayVersion,maxIndices,NULL,NULL);
378
+ }
379
+ }
380
+
381
+ /*********************************************************/
382
+ /* DefruleModuleToCode: Writes the C code representation */
383
+ /* of a single defrule module to the specified file. */
384
+ /*********************************************************/
385
+ static void DefruleModuleToCode(
386
+ Environment *theEnv,
387
+ FILE *theFile,
388
+ Defmodule *theModule,
389
+ unsigned int imageID,
390
+ unsigned int maxIndices,
391
+ unsigned int moduleCount)
392
+ {
393
+ #if MAC_XCD
394
+ #pragma unused(moduleCount)
395
+ #endif
396
+
397
+ fprintf(theFile,"{");
398
+
399
+ ConstructModuleToCode(theEnv,theFile,theModule,imageID,maxIndices,
400
+ DefruleData(theEnv)->DefruleModuleIndex,
401
+ ConstructPrefix(DefruleData(theEnv)->DefruleCodeItem));
402
+
403
+ fprintf(theFile,",NULL}");
404
+ }
405
+
406
+ /**********************************************************/
407
+ /* DefruleToCode: Writes the C code representation of a */
408
+ /* single defrule data structure to the specified file. */
409
+ /**********************************************************/
410
+ static void DefruleToCode(
411
+ Environment *theEnv,
412
+ FILE *theFile,
413
+ Defrule *theDefrule,
414
+ unsigned int imageID,
415
+ unsigned int maxIndices,
416
+ unsigned int moduleCount)
417
+ {
418
+ /*==================*/
419
+ /* Construct Header */
420
+ /*==================*/
421
+
422
+ fprintf(theFile,"{");
423
+
424
+ ConstructHeaderToCode(theEnv,theFile,&theDefrule->header,imageID,maxIndices,
425
+ moduleCount,ModulePrefix(DefruleData(theEnv)->DefruleCodeItem),
426
+ ConstructPrefix(DefruleData(theEnv)->DefruleCodeItem));
427
+
428
+ /*==========================*/
429
+ /* Flags and Integer Values */
430
+ /*==========================*/
431
+
432
+ fprintf(theFile,",%d,%d,%d,%d,%d,%d,%d,%d,",
433
+ theDefrule->salience,theDefrule->localVarCnt,
434
+ theDefrule->complexity,theDefrule->afterBreakpoint,
435
+ theDefrule->watchActivation,theDefrule->watchFiring,
436
+ theDefrule->autoFocus,theDefrule->executing);
437
+
438
+ /*==================*/
439
+ /* Dynamic Salience */
440
+ /*==================*/
441
+
442
+ ExpressionToCode(theEnv,theFile,theDefrule->dynamicSalience);
443
+ fprintf(theFile,",");
444
+
445
+ /*=============*/
446
+ /* RHS Actions */
447
+ /*=============*/
448
+
449
+ ExpressionToCode(theEnv,theFile,theDefrule->actions);
450
+ fprintf(theFile,",");
451
+
452
+ /*=========================*/
453
+ /* Logical Dependency Join */
454
+ /*=========================*/
455
+
456
+ if (theDefrule->logicalJoin != NULL)
457
+ {
458
+ fprintf(theFile,"&%s%d_%ld[%ld],",JoinPrefix(),
459
+ imageID,(theDefrule->logicalJoin->bsaveID / maxIndices) + 1,
460
+ theDefrule->logicalJoin->bsaveID % maxIndices);
461
+ }
462
+ else
463
+ { fprintf(theFile,"NULL,"); }
464
+
465
+ /*===========*/
466
+ /* Last Join */
467
+ /*===========*/
468
+
469
+ if (theDefrule->lastJoin != NULL)
470
+ {
471
+ fprintf(theFile,"&%s%d_%ld[%ld],",JoinPrefix(),
472
+ imageID,(theDefrule->lastJoin->bsaveID / maxIndices) + 1,
473
+ theDefrule->lastJoin->bsaveID % maxIndices);
474
+ }
475
+ else
476
+ { fprintf(theFile,"NULL,"); }
477
+
478
+ /*===============*/
479
+ /* Next Disjunct */
480
+ /*===============*/
481
+
482
+ if (theDefrule->disjunct != NULL)
483
+ {
484
+ fprintf(theFile,"&%s%d_%ld[%ld]}",ConstructPrefix(DefruleData(theEnv)->DefruleCodeItem),
485
+ imageID,(theDefrule->disjunct->header.bsaveID / maxIndices) + 1,
486
+ theDefrule->disjunct->header.bsaveID % maxIndices);
487
+ }
488
+ else
489
+ { fprintf(theFile,"NULL}"); }
490
+ }
491
+
492
+ /***************************************************/
493
+ /* JoinToCode: Writes the C code representation of */
494
+ /* a single join node to the specified file. */
495
+ /***************************************************/
496
+ static void JoinToCode(
497
+ Environment *theEnv,
498
+ FILE *joinFile,
499
+ struct joinNode *theJoin,
500
+ unsigned int imageID,
501
+ unsigned int maxIndices)
502
+ {
503
+ struct patternParser *theParser;
504
+
505
+ /*===========================*/
506
+ /* Mark the join as visited. */
507
+ /*===========================*/
508
+
509
+ theJoin->marked = 0;
510
+
511
+ /*===========================*/
512
+ /* Flags and Integer Values. */
513
+ /*===========================*/
514
+
515
+ fprintf(joinFile,"{%d,%d,%d,%d,%d,0,0,%d,%d,0,0,0,0,0,0,",
516
+ theJoin->firstJoin,theJoin->logicalJoin,
517
+ theJoin->joinFromTheRight,theJoin->patternIsNegated,
518
+ theJoin->patternIsExists,
519
+ // initialize,
520
+ // marked
521
+ theJoin->rhsType,theJoin->depth);
522
+ // bsaveID
523
+ // memoryLeftAdds
524
+ // memoryRightAdds
525
+ // memoryLeftDeletes
526
+ // memoryRightDeletes
527
+ // memoryCompares
528
+
529
+ /*==========================*/
530
+ /* Left and right Memories. */
531
+ /*==========================*/
532
+
533
+ fprintf(joinFile,"NULL,NULL,");
534
+
535
+ /*====================*/
536
+ /* Network Expression */
537
+ /*====================*/
538
+
539
+ PrintHashedExpressionReference(theEnv,joinFile,theJoin->networkTest,imageID,maxIndices);
540
+ fprintf(joinFile,",");
541
+
542
+ PrintHashedExpressionReference(theEnv,joinFile,theJoin->secondaryNetworkTest,imageID,maxIndices);
543
+ fprintf(joinFile,",");
544
+
545
+ PrintHashedExpressionReference(theEnv,joinFile,theJoin->leftHash,imageID,maxIndices);
546
+ fprintf(joinFile,",");
547
+
548
+ PrintHashedExpressionReference(theEnv,joinFile,theJoin->rightHash,imageID,maxIndices);
549
+ fprintf(joinFile,",");
550
+
551
+ /*============================*/
552
+ /* Right Side Entry Structure */
553
+ /*============================*/
554
+
555
+ if (theJoin->rightSideEntryStructure == NULL)
556
+ { fprintf(joinFile,"NULL,"); }
557
+ else if (theJoin->joinFromTheRight == false)
558
+ {
559
+ theParser = GetPatternParser(theEnv,theJoin->rhsType);
560
+ if (theParser->codeReferenceFunction == NULL) fprintf(joinFile,"NULL,");
561
+ else
562
+ {
563
+ fprintf(joinFile,"VS ");
564
+ (*theParser->codeReferenceFunction)(theEnv,theJoin->rightSideEntryStructure,
565
+ joinFile,imageID,maxIndices);
566
+ fprintf(joinFile,",");
567
+ }
568
+ }
569
+ else
570
+ {
571
+ fprintf(joinFile,"&%s%u_%lu[%lu],",JoinPrefix(),
572
+ imageID,(((struct joinNode *) theJoin->rightSideEntryStructure)->bsaveID / maxIndices) + 1,
573
+ ((struct joinNode *) theJoin->rightSideEntryStructure)->bsaveID % maxIndices);
574
+ }
575
+
576
+ /*=================*/
577
+ /* Next Join Level */
578
+ /*=================*/
579
+
580
+ if (theJoin->nextLinks == NULL)
581
+ { fprintf(joinFile,"NULL,"); }
582
+ else
583
+ {
584
+ fprintf(joinFile,"&%s%d_%ld[%ld],",LinkPrefix(),
585
+ imageID,(theJoin->nextLinks->bsaveID / maxIndices) + 1,
586
+ theJoin->nextLinks->bsaveID % maxIndices);
587
+ }
588
+
589
+ /*=================*/
590
+ /* Last Join Level */
591
+ /*=================*/
592
+
593
+ if (theJoin->lastLevel == NULL)
594
+ { fprintf(joinFile,"NULL,"); }
595
+ else
596
+ {
597
+ fprintf(joinFile,"&%s%d_%ld[%ld],",JoinPrefix(),
598
+ imageID,(theJoin->lastLevel->bsaveID / maxIndices) + 1,
599
+ theJoin->lastLevel->bsaveID % maxIndices);
600
+ }
601
+
602
+ /*==================*/
603
+ /* Right Match Node */
604
+ /*==================*/
605
+
606
+ if (theJoin->rightMatchNode == NULL)
607
+ { fprintf(joinFile,"NULL,"); }
608
+ else
609
+ {
610
+ fprintf(joinFile,"&%s%d_%ld[%ld],",JoinPrefix(),
611
+ imageID,(theJoin->rightMatchNode->bsaveID / maxIndices) + 1,
612
+ theJoin->rightMatchNode->bsaveID % maxIndices);
613
+ }
614
+
615
+ /*==================*/
616
+ /* Rule to Activate */
617
+ /*==================*/
618
+
619
+ if (theJoin->ruleToActivate == NULL)
620
+ { fprintf(joinFile,"NULL}"); }
621
+ else
622
+ {
623
+ fprintf(joinFile,"&%s%d_%ld[%ld]}",ConstructPrefix(DefruleData(theEnv)->DefruleCodeItem),imageID,
624
+ (theJoin->ruleToActivate->header.bsaveID / maxIndices) + 1,
625
+ theJoin->ruleToActivate->header.bsaveID % maxIndices);
626
+ }
627
+ }
628
+
629
+ /***************************************************/
630
+ /* LinkToCode: Writes the C code representation of */
631
+ /* a single join node to the specified file. */
632
+ /***************************************************/
633
+ static void LinkToCode(
634
+ Environment *theEnv,
635
+ FILE *theFile,
636
+ struct joinLink *theLink,
637
+ unsigned int imageID,
638
+ unsigned int maxIndices)
639
+ {
640
+ /*==================*/
641
+ /* Enter Direction. */
642
+ /*==================*/
643
+
644
+ fprintf(theFile,"{%d,",theLink->enterDirection);
645
+
646
+ /*======*/
647
+ /* Join */
648
+ /*======*/
649
+
650
+ if (theLink->join == NULL)
651
+ { fprintf(theFile,"NULL,"); }
652
+ else
653
+ {
654
+ fprintf(theFile,"&%s%d_%ld[%ld],",JoinPrefix(),
655
+ imageID,(theLink->join->bsaveID / maxIndices) + 1,
656
+ theLink->join->bsaveID % maxIndices);
657
+ }
658
+
659
+ /*======*/
660
+ /* Next */
661
+ /*======*/
662
+
663
+ if (theLink->next == NULL)
664
+ { fprintf(theFile,"NULL,"); }
665
+ else
666
+ {
667
+ fprintf(theFile,"&%s%d_%ld[%ld],",LinkPrefix(),
668
+ imageID,(theLink->next->bsaveID / maxIndices) + 1,
669
+ theLink->next->bsaveID % maxIndices);
670
+ }
671
+
672
+ /*===========*/
673
+ /* Bsave ID. */
674
+ /*===========*/
675
+
676
+ fprintf(theFile,"0}");
677
+ }
678
+
679
+ /*************************************************************/
680
+ /* DefruleCModuleReference: Writes the C code representation */
681
+ /* of a reference to a defrule module data structure. */
682
+ /*************************************************************/
683
+ void DefruleCModuleReference(
684
+ Environment *theEnv,
685
+ FILE *theFile,
686
+ unsigned long count,
687
+ unsigned int imageID,
688
+ unsigned int maxIndices)
689
+ {
690
+ fprintf(theFile,"MIHS &%s%u_%lu[%lu]",ModulePrefix(DefruleData(theEnv)->DefruleCodeItem),
691
+ imageID,
692
+ (count / maxIndices) + 1,
693
+ (count % maxIndices));
694
+ }
695
+
696
+
697
+ /*****************************************************************/
698
+ /* InitDefruleCode: Writes out initialization code for defrules. */
699
+ /*****************************************************************/
700
+ static void InitDefruleCode(
701
+ Environment *theEnv,
702
+ FILE *initFP,
703
+ unsigned int imageID,
704
+ unsigned int maxIndices)
705
+ {
706
+ #if MAC_XCD
707
+ #pragma unused(maxIndices)
708
+ #pragma unused(theEnv)
709
+ #pragma unused(imageID)
710
+ #endif
711
+
712
+ fprintf(initFP," DefruleRunTimeInitialize(theEnv,");
713
+
714
+ if (DefruleData(theEnv)->RightPrimeJoins == NULL)
715
+ { fprintf(initFP,"NULL,"); }
716
+ else
717
+ {
718
+ fprintf(initFP,"&%s%u_%lu[%lu],",LinkPrefix(),
719
+ imageID,(DefruleData(theEnv)->RightPrimeJoins->bsaveID / maxIndices) + 1,
720
+ DefruleData(theEnv)->RightPrimeJoins->bsaveID % maxIndices);
721
+ }
722
+
723
+ if (DefruleData(theEnv)->LeftPrimeJoins == NULL)
724
+ { fprintf(initFP,"NULL);\n"); }
725
+ else
726
+ {
727
+ fprintf(initFP,"&%s%u_%lu[%lu]);\n",LinkPrefix(),
728
+ imageID,(DefruleData(theEnv)->LeftPrimeJoins->bsaveID / maxIndices) + 1,
729
+ DefruleData(theEnv)->LeftPrimeJoins->bsaveID % maxIndices);
730
+ }
731
+ }
732
+
733
+ #endif /* DEFRULE_CONSTRUCT && (! RUN_TIME) && CONSTRUCT_COMPILER */