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,667 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/18/16 */
5
+ /* */
6
+ /* FACT RHS PATTERN PARSER MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides a number of routines for parsing fact */
11
+ /* patterns typically found on the RHS of a rule (such as */
12
+ /* the assert command). Also contains some functions for */
13
+ /* parsing RHS slot values (used by functions such as */
14
+ /* assert, modify, and duplicate). */
15
+ /* */
16
+ /* Principal Programmer(s): */
17
+ /* Gary D. Riley */
18
+ /* */
19
+ /* Contributing Programmer(s): */
20
+ /* Chris Culbert */
21
+ /* Brian L. Dantes */
22
+ /* */
23
+ /* Revision History: */
24
+ /* */
25
+ /* 6.30: Added const qualifiers to remove C++ */
26
+ /* deprecation warnings. */
27
+ /* */
28
+ /* Added code to prevent a clear command from */
29
+ /* being executed during fact assertions via */
30
+ /* Increment/DecrementClearReadyLocks API. */
31
+ /* */
32
+ /* Added code to keep track of pointers to */
33
+ /* constructs that are contained externally to */
34
+ /* to constructs, DanglingConstructs. */
35
+ /* */
36
+ /* 6.40: Added Env prefix to GetEvaluationError and */
37
+ /* SetEvaluationError functions. */
38
+ /* */
39
+ /* 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
+ /* UDF redesign. */
47
+ /* */
48
+ /* Eval support for run time and bload only. */
49
+ /* */
50
+ /*************************************************************/
51
+
52
+ #include <stdio.h>
53
+ #include <string.h>
54
+
55
+ #include "setup.h"
56
+
57
+ #if DEFTEMPLATE_CONSTRUCT
58
+
59
+ #if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY
60
+ #include "bload.h"
61
+ #endif
62
+
63
+ #include "constant.h"
64
+ #include "cstrcpsr.h"
65
+ #include "envrnmnt.h"
66
+ #include "exprnpsr.h"
67
+ #include "modulutl.h"
68
+ #include "modulpsr.h"
69
+ #include "pattern.h"
70
+ #include "pprint.h"
71
+ #include "prntutil.h"
72
+ #include "router.h"
73
+ #include "strngrtr.h"
74
+ #include "tmpltpsr.h"
75
+ #include "tmpltrhs.h"
76
+ #include "tmpltutl.h"
77
+
78
+ #include "factrhs.h"
79
+
80
+ /***************************************/
81
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
82
+ /***************************************/
83
+
84
+ #if RUN_TIME || BLOAD_ONLY || BLOAD || BLOAD_AND_BSAVE
85
+ static void NoSuchTemplateError(Environment *,const char *);
86
+ #endif
87
+
88
+ /**********************************************************************/
89
+ /* BuildRHSAssert: Parses zero or more RHS fact patterns (the format */
90
+ /* which is used by the assert command and the deffacts construct). */
91
+ /* Each of the RHS patterns is attached to an assert command and if */
92
+ /* there is more than one assert command, then a progn command is */
93
+ /* wrapped around all of the assert commands. */
94
+ /**********************************************************************/
95
+ struct expr *BuildRHSAssert(
96
+ Environment *theEnv,
97
+ const char *logicalName,
98
+ struct token *theToken,
99
+ bool *error,
100
+ bool atLeastOne,
101
+ bool readFirstParen,
102
+ const char *whereParsed)
103
+ {
104
+ struct expr *lastOne, *nextOne, *assertList, *stub;
105
+
106
+ *error = false;
107
+
108
+ /*===============================================================*/
109
+ /* If the first parenthesis of the RHS fact pattern has not been */
110
+ /* read yet, then get the next token. If a right parenthesis is */
111
+ /* encountered then exit (however, set the error return value if */
112
+ /* at least one fact was expected). */
113
+ /*===============================================================*/
114
+
115
+ if (readFirstParen == false)
116
+ {
117
+ if (theToken->tknType == RIGHT_PARENTHESIS_TOKEN)
118
+ {
119
+ if (atLeastOne)
120
+ {
121
+ *error = true;
122
+ SyntaxErrorMessage(theEnv,whereParsed);
123
+ }
124
+ return NULL;
125
+ }
126
+ }
127
+
128
+ /*================================================*/
129
+ /* Parse the facts until no more are encountered. */
130
+ /*================================================*/
131
+
132
+ lastOne = assertList = NULL;
133
+ while ((nextOne = GetRHSPattern(theEnv,logicalName,theToken,
134
+ error,false,readFirstParen,
135
+ true,RIGHT_PARENTHESIS_TOKEN)) != NULL)
136
+ {
137
+ PPCRAndIndent(theEnv);
138
+
139
+ stub = GenConstant(theEnv,FCALL,FindFunction(theEnv,"assert"));
140
+ stub->argList = nextOne;
141
+ nextOne = stub;
142
+
143
+ if (lastOne == NULL)
144
+ { assertList = nextOne; }
145
+ else
146
+ { lastOne->nextArg = nextOne; }
147
+ lastOne = nextOne;
148
+
149
+ readFirstParen = true;
150
+ }
151
+
152
+ /*======================================================*/
153
+ /* If an error was detected while parsing, then return. */
154
+ /*======================================================*/
155
+
156
+ if (*error)
157
+ {
158
+ ReturnExpression(theEnv,assertList);
159
+ return NULL;
160
+ }
161
+
162
+ /*======================================*/
163
+ /* Fix the pretty print representation. */
164
+ /*======================================*/
165
+
166
+ if (theToken->tknType == RIGHT_PARENTHESIS_TOKEN)
167
+ {
168
+ PPBackup(theEnv);
169
+ PPBackup(theEnv);
170
+ SavePPBuffer(theEnv,")");
171
+ }
172
+
173
+ /*==============================================================*/
174
+ /* If no facts are being asserted then return NULL. In addition */
175
+ /* if at least one fact was required, then signal an error. */
176
+ /*==============================================================*/
177
+
178
+ if (assertList == NULL)
179
+ {
180
+ if (atLeastOne)
181
+ {
182
+ *error = true;
183
+ SyntaxErrorMessage(theEnv,whereParsed);
184
+ }
185
+
186
+ return NULL;
187
+ }
188
+
189
+ /*===============================================*/
190
+ /* If more than one fact is being asserted, then */
191
+ /* wrap the assert commands within a progn call. */
192
+ /*===============================================*/
193
+
194
+ if (assertList->nextArg != NULL)
195
+ {
196
+ stub = GenConstant(theEnv,FCALL,FindFunction(theEnv,"progn"));
197
+ stub->argList = assertList;
198
+ assertList = stub;
199
+ }
200
+
201
+ /*==========================================================*/
202
+ /* Return the expression for asserting the specified facts. */
203
+ /*==========================================================*/
204
+
205
+ return assertList;
206
+ }
207
+
208
+ /***************************************************************/
209
+ /* GetRHSPattern: Parses a single RHS fact pattern. The return */
210
+ /* value is the fact just parsed (or NULL if the delimiter */
211
+ /* for no more facts is the first token parsed). If an error */
212
+ /* occurs, then the error flag passed as an argument is set. */
213
+ /***************************************************************/
214
+ struct expr *GetRHSPattern(
215
+ Environment *theEnv,
216
+ const char *readSource,
217
+ struct token *tempToken,
218
+ bool *error,
219
+ bool constantsOnly,
220
+ bool readFirstParen,
221
+ bool checkFirstParen,
222
+ TokenType endType)
223
+ {
224
+ struct expr *lastOne = NULL;
225
+ struct expr *nextOne, *firstOne, *argHead = NULL;
226
+ bool printError;
227
+ unsigned int count;
228
+ Deftemplate *theDeftemplate;
229
+ CLIPSLexeme *templateName;
230
+ const char *nullBitMap = "\0";
231
+
232
+ /*=================================================*/
233
+ /* Get the opening parenthesis of the RHS pattern. */
234
+ /*=================================================*/
235
+
236
+ *error = false;
237
+
238
+ if (readFirstParen) GetToken(theEnv,readSource,tempToken);
239
+
240
+ if (checkFirstParen)
241
+ {
242
+ if (tempToken->tknType == endType) return NULL;
243
+
244
+ if (tempToken->tknType != LEFT_PARENTHESIS_TOKEN)
245
+ {
246
+ SyntaxErrorMessage(theEnv,"RHS patterns");
247
+ *error = true;
248
+ return NULL;
249
+ }
250
+ }
251
+
252
+ /*======================================================*/
253
+ /* The first field of an asserted fact must be a symbol */
254
+ /* (but not = or : which have special significance). */
255
+ /*======================================================*/
256
+
257
+ GetToken(theEnv,readSource,tempToken);
258
+ if (tempToken->tknType != SYMBOL_TOKEN)
259
+ {
260
+ SyntaxErrorMessage(theEnv,"first field of a RHS pattern");
261
+ *error = true;
262
+ return NULL;
263
+ }
264
+ else if ((strcmp(tempToken->lexemeValue->contents,"=") == 0) ||
265
+ (strcmp(tempToken->lexemeValue->contents,":") == 0))
266
+ {
267
+ SyntaxErrorMessage(theEnv,"first field of a RHS pattern");
268
+ *error = true;
269
+ return NULL;
270
+ }
271
+
272
+ /*=========================================================*/
273
+ /* Check to see if the relation name is a reserved symbol. */
274
+ /*=========================================================*/
275
+
276
+ templateName = (CLIPSLexeme *) tempToken->value;
277
+
278
+ if (ReservedPatternSymbol(theEnv,templateName->contents,NULL))
279
+ {
280
+ ReservedPatternSymbolErrorMsg(theEnv,templateName->contents,"a relation name");
281
+ *error = true;
282
+ return NULL;
283
+ }
284
+
285
+ /*============================================================*/
286
+ /* A module separator in the name is illegal in this context. */
287
+ /*============================================================*/
288
+
289
+ if (FindModuleSeparator(templateName->contents))
290
+ {
291
+ IllegalModuleSpecifierMessage(theEnv);
292
+
293
+ *error = true;
294
+ return NULL;
295
+ }
296
+
297
+ /*=============================================================*/
298
+ /* Determine if there is an associated deftemplate. If so, let */
299
+ /* the deftemplate parsing functions parse the RHS pattern and */
300
+ /* then return the fact pattern that was parsed. */
301
+ /*=============================================================*/
302
+
303
+ theDeftemplate = (Deftemplate *)
304
+ FindImportedConstruct(theEnv,"deftemplate",NULL,templateName->contents,
305
+ &count,true,NULL);
306
+
307
+ if (count > 1)
308
+ {
309
+ AmbiguousReferenceErrorMessage(theEnv,"deftemplate",templateName->contents);
310
+ *error = true;
311
+ return NULL;
312
+ }
313
+
314
+ /*======================================================*/
315
+ /* If no deftemplate exists with the specified relation */
316
+ /* name, then create an implied deftemplate. */
317
+ /*======================================================*/
318
+
319
+ if (theDeftemplate == NULL)
320
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
321
+ {
322
+ #if BLOAD || BLOAD_AND_BSAVE
323
+ if ((Bloaded(theEnv)) && (! ConstructData(theEnv)->CheckSyntaxMode))
324
+ {
325
+ NoSuchTemplateError(theEnv,templateName->contents);
326
+ *error = true;
327
+ return NULL;
328
+ }
329
+ #endif
330
+ #if DEFMODULE_CONSTRUCT
331
+ if (FindImportExportConflict(theEnv,"deftemplate",GetCurrentModule(theEnv),templateName->contents))
332
+ {
333
+ ImportExportConflictMessage(theEnv,"implied deftemplate",templateName->contents,NULL,NULL);
334
+ *error = true;
335
+ return NULL;
336
+ }
337
+ #endif
338
+ if (! ConstructData(theEnv)->CheckSyntaxMode)
339
+ { theDeftemplate = CreateImpliedDeftemplate(theEnv,templateName,true); }
340
+ }
341
+ #else
342
+ {
343
+ NoSuchTemplateError(theEnv,templateName->contents);
344
+ *error = true;
345
+ return NULL;
346
+ }
347
+ #endif
348
+
349
+ /*=========================================*/
350
+ /* If an explicit deftemplate exists, then */
351
+ /* parse the fact as a deftemplate fact. */
352
+ /*=========================================*/
353
+
354
+ if ((theDeftemplate != NULL) && (theDeftemplate->implied == false))
355
+ {
356
+ firstOne = GenConstant(theEnv,DEFTEMPLATE_PTR,theDeftemplate);
357
+ firstOne->nextArg = ParseAssertTemplate(theEnv,readSource,tempToken,
358
+ error,endType,
359
+ constantsOnly,theDeftemplate);
360
+
361
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
362
+ if (! ConstructData(theEnv)->ParsingConstruct)
363
+ { ConstructData(theEnv)->DanglingConstructs++; }
364
+ #endif
365
+
366
+ if (*error)
367
+ {
368
+ ReturnExpression(theEnv,firstOne);
369
+ firstOne = NULL;
370
+ }
371
+
372
+ return(firstOne);
373
+ }
374
+
375
+ /*========================================*/
376
+ /* Parse the fact as an ordered RHS fact. */
377
+ /*========================================*/
378
+
379
+ firstOne = GenConstant(theEnv,DEFTEMPLATE_PTR,theDeftemplate);
380
+
381
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
382
+ if (! ConstructData(theEnv)->ParsingConstruct)
383
+ { ConstructData(theEnv)->DanglingConstructs++; }
384
+ #endif
385
+
386
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
387
+ SavePPBuffer(theEnv," ");
388
+ #endif
389
+
390
+ while ((nextOne = GetAssertArgument(theEnv,readSource,tempToken,
391
+ error,endType,constantsOnly,&printError)) != NULL)
392
+ {
393
+ if (argHead == NULL) argHead = nextOne;
394
+ else lastOne->nextArg = nextOne;
395
+ lastOne = nextOne;
396
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
397
+ SavePPBuffer(theEnv," ");
398
+ #endif
399
+ }
400
+
401
+ /*===========================================================*/
402
+ /* If an error occurred, set the error flag and return NULL. */
403
+ /*===========================================================*/
404
+
405
+ if (*error)
406
+ {
407
+ if (printError) SyntaxErrorMessage(theEnv,"RHS patterns");
408
+ ReturnExpression(theEnv,firstOne);
409
+ ReturnExpression(theEnv,argHead);
410
+ return NULL;
411
+ }
412
+
413
+ /*=====================================*/
414
+ /* Fix the pretty print representation */
415
+ /* of the RHS ordered fact. */
416
+ /*=====================================*/
417
+
418
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
419
+ PPBackup(theEnv);
420
+ PPBackup(theEnv);
421
+ SavePPBuffer(theEnv,tempToken->printForm);
422
+ #endif
423
+
424
+ /*==========================================================*/
425
+ /* Ordered fact assertions are processed by stuffing all of */
426
+ /* the fact's proposition (except the relation name) into a */
427
+ /* single multifield slot. */
428
+ /*==========================================================*/
429
+
430
+ firstOne->nextArg = GenConstant(theEnv,FACT_STORE_MULTIFIELD,AddBitMap(theEnv,(void *) nullBitMap,1));
431
+ firstOne->nextArg->argList = argHead;
432
+
433
+ /*==============================*/
434
+ /* Return the RHS ordered fact. */
435
+ /*==============================*/
436
+
437
+ return(firstOne);
438
+ }
439
+
440
+ /********************************************************************/
441
+ /* GetAssertArgument: Parses a single RHS slot value and returns an */
442
+ /* expression representing the value. When parsing a deftemplate */
443
+ /* slot, the slot name has already been parsed when this function */
444
+ /* is called. NULL is returned if a slot or fact delimiter is */
445
+ /* encountered. In the event of a parse error, the error flag */
446
+ /* passed as an argument is set. */
447
+ /********************************************************************/
448
+ struct expr *GetAssertArgument(
449
+ Environment *theEnv,
450
+ const char *logicalName,
451
+ struct token *theToken,
452
+ bool *error,
453
+ TokenType endType,
454
+ bool constantsOnly,
455
+ bool *printError)
456
+ {
457
+ #if ! RUN_TIME
458
+ struct expr *nextField;
459
+ #else
460
+ struct expr *nextField = NULL;
461
+ #endif
462
+
463
+ /*=================================================*/
464
+ /* Read in the first token of the slot's value. If */
465
+ /* the end delimiter is encountered, then return. */
466
+ /*=================================================*/
467
+
468
+ *printError = true;
469
+ GetToken(theEnv,logicalName,theToken);
470
+ if (theToken->tknType == endType) return NULL;
471
+
472
+ /*=============================================================*/
473
+ /* If an equal sign of left parenthesis was parsed, then parse */
474
+ /* a function which is to be evaluated to determine the slot's */
475
+ /* value. The equal sign corresponds to the return value */
476
+ /* constraint which can be used in LHS fact patterns. The */
477
+ /* equal sign is no longer necessary on either the LHS or RHS */
478
+ /* of a rule to indicate that a function is being evaluated to */
479
+ /* determine its value either for assignment or pattern */
480
+ /* matching. */
481
+ /*=============================================================*/
482
+
483
+ if ((theToken->tknType == SYMBOL_TOKEN) ?
484
+ (strcmp(theToken->lexemeValue->contents,"=") == 0) :
485
+ (theToken->tknType == LEFT_PARENTHESIS_TOKEN))
486
+ {
487
+ if (constantsOnly)
488
+ {
489
+ *error = true;
490
+ return NULL;
491
+ }
492
+
493
+ #if ! RUN_TIME
494
+ if (theToken->tknType == LEFT_PARENTHESIS_TOKEN) nextField = Function1Parse(theEnv,logicalName);
495
+ else nextField = Function0Parse(theEnv,logicalName);
496
+ if (nextField == NULL)
497
+ #endif
498
+ {
499
+ *printError = false;
500
+ *error = true;
501
+ }
502
+ #if ! RUN_TIME
503
+ else
504
+ {
505
+ theToken->tknType= RIGHT_PARENTHESIS_TOKEN;
506
+ theToken->value = CreateString(theEnv,")");
507
+ theToken->printForm = ")";
508
+ }
509
+ #endif
510
+
511
+ return(nextField);
512
+ }
513
+
514
+ /*==================================================*/
515
+ /* Constants are always allowed as RHS slot values. */
516
+ /*==================================================*/
517
+
518
+ if ((theToken->tknType == SYMBOL_TOKEN) || (theToken->tknType == STRING_TOKEN) ||
519
+ #if OBJECT_SYSTEM
520
+ (theToken->tknType == INSTANCE_NAME_TOKEN) ||
521
+ #endif
522
+ (theToken->tknType == FLOAT_TOKEN) || (theToken->tknType == INTEGER_TOKEN))
523
+ { return(GenConstant(theEnv,TokenTypeToType(theToken->tknType),theToken->value)); }
524
+
525
+ /*========================================*/
526
+ /* Variables are also allowed as RHS slot */
527
+ /* values under some circumstances. */
528
+ /*========================================*/
529
+
530
+ if ((theToken->tknType == SF_VARIABLE_TOKEN) ||
531
+ #if DEFGLOBAL_CONSTRUCT
532
+ (theToken->tknType == GBL_VARIABLE_TOKEN) ||
533
+ (theToken->tknType == MF_GBL_VARIABLE_TOKEN) ||
534
+ #endif
535
+ (theToken->tknType == MF_VARIABLE_TOKEN))
536
+ {
537
+ if (constantsOnly)
538
+ {
539
+ *error = true;
540
+ return NULL;
541
+ }
542
+
543
+ return(GenConstant(theEnv,TokenTypeToType(theToken->tknType),theToken->value));
544
+ }
545
+
546
+ /*==========================================================*/
547
+ /* If none of the other cases have been satisfied, then the */
548
+ /* token parsed is not appropriate for a RHS slot value. */
549
+ /*==========================================================*/
550
+
551
+ *error = true;
552
+ return NULL;
553
+ }
554
+
555
+ /****************************************************/
556
+ /* StringToFact: Converts the string representation */
557
+ /* of a fact to a fact data structure. */
558
+ /****************************************************/
559
+ Fact *StringToFact(
560
+ Environment *theEnv,
561
+ const char *str)
562
+ {
563
+ struct token theToken;
564
+ Fact *factPtr;
565
+ unsigned numberOfFields = 0, whichField;
566
+ struct expr *assertArgs, *tempPtr;
567
+ bool error = false;
568
+ UDFValue theResult;
569
+
570
+ /*=========================================*/
571
+ /* Open a string router and parse the fact */
572
+ /* using the router as an input source. */
573
+ /*=========================================*/
574
+
575
+ SetEvaluationError(theEnv,false);
576
+
577
+ OpenStringSource(theEnv,"assert_str",str,0);
578
+
579
+ assertArgs = GetRHSPattern(theEnv,"assert_str",&theToken,
580
+ &error,false,true,
581
+ true,RIGHT_PARENTHESIS_TOKEN);
582
+
583
+ CloseStringSource(theEnv,"assert_str");
584
+
585
+ /*===========================================*/
586
+ /* Check for errors or the use of variables. */
587
+ /*===========================================*/
588
+
589
+ if ((assertArgs == NULL) && (! error))
590
+ {
591
+ SyntaxErrorMessage(theEnv,"RHS patterns");
592
+ ReturnExpression(theEnv,assertArgs);
593
+ return NULL;
594
+ }
595
+
596
+ if (error)
597
+ {
598
+ ReturnExpression(theEnv,assertArgs);
599
+ return NULL;
600
+ }
601
+
602
+ if (ExpressionContainsVariables(assertArgs,false))
603
+ {
604
+ LocalVariableErrorMessage(theEnv,"the assert-string function");
605
+ SetEvaluationError(theEnv,true);
606
+ ReturnExpression(theEnv,assertArgs);
607
+ return NULL;
608
+ }
609
+
610
+ /*=======================================================*/
611
+ /* Count the number of fields needed for the fact and */
612
+ /* create a fact data structure of the appropriate size. */
613
+ /*=======================================================*/
614
+
615
+ for (tempPtr = assertArgs->nextArg; tempPtr != NULL; tempPtr = tempPtr->nextArg)
616
+ { numberOfFields++; }
617
+
618
+ factPtr = CreateFactBySize(theEnv,numberOfFields);
619
+ factPtr->whichDeftemplate = (Deftemplate *) assertArgs->value;
620
+
621
+ /*=============================================*/
622
+ /* Copy the fields to the fact data structure. */
623
+ /*=============================================*/
624
+
625
+ IncrementClearReadyLocks(theEnv);
626
+ ExpressionInstall(theEnv,assertArgs); /* DR0836 */
627
+ whichField = 0;
628
+ for (tempPtr = assertArgs->nextArg; tempPtr != NULL; tempPtr = tempPtr->nextArg)
629
+ {
630
+ EvaluateExpression(theEnv,tempPtr,&theResult);
631
+ factPtr->theProposition.contents[whichField].value = theResult.value;
632
+ whichField++;
633
+ }
634
+ ExpressionDeinstall(theEnv,assertArgs); /* DR0836 */
635
+ ReturnExpression(theEnv,assertArgs);
636
+ DecrementClearReadyLocks(theEnv);
637
+
638
+ /*==================*/
639
+ /* Return the fact. */
640
+ /*==================*/
641
+
642
+ return(factPtr);
643
+ }
644
+
645
+ #if RUN_TIME || BLOAD_ONLY || BLOAD || BLOAD_AND_BSAVE
646
+
647
+ /*********************************************************/
648
+ /* NoSuchTemplateError: Prints out an error message */
649
+ /* in a BLOAD_ONLY, RUN_TIME or bload active environment */
650
+ /* when an implied deftemplate cannot be created for */
651
+ /* an assert */
652
+ /*********************************************************/
653
+ static void NoSuchTemplateError(
654
+ Environment *theEnv,
655
+ const char *templateName)
656
+ {
657
+ PrintErrorID(theEnv,"FACTRHS",1,false);
658
+ WriteString(theEnv,STDERR,"Implied deftemplate '");
659
+ WriteString(theEnv,STDERR,templateName);
660
+ WriteString(theEnv,STDERR,"' cannot be created with binary load in effect.\n");
661
+ }
662
+
663
+ #endif /* RUN_TIME || BLOAD_ONLY || BLOAD || BLOAD_AND_BSAVE */
664
+
665
+ #endif /* DEFTEMPLATE_CONSTRUCT */
666
+
667
+