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,55 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* DEFTEMPLATE RHS PARSING HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Gary D. Riley */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.24: Added additional argument required for */
20
+ /* DeriveDefaultFromConstraints. */
21
+ /* */
22
+ /* Added additional argument required for */
23
+ /* InvalidDeftemplateSlotMessage. */
24
+ /* */
25
+ /* 6.30: Added const qualifiers to remove C++ */
26
+ /* deprecation warnings. */
27
+ /* */
28
+ /* 6.40: Removed LOCALE definition. */
29
+ /* */
30
+ /* Pragma once and other inclusion changes. */
31
+ /* */
32
+ /* Added support for booleans with <stdbool.h>. */
33
+ /* */
34
+ /* Removed use of void pointers for specific */
35
+ /* data structures. */
36
+ /* */
37
+ /*************************************************************/
38
+
39
+ #ifndef _H_tmpltrhs
40
+
41
+ #pragma once
42
+
43
+ #define _H_tmpltrhs
44
+
45
+ #include "expressn.h"
46
+ #include "scanner.h"
47
+ #include "tmpltdef.h"
48
+
49
+ struct expr *ParseAssertTemplate(Environment *,const char *,struct token *,bool *,
50
+ TokenType,bool,Deftemplate *);
51
+
52
+ #endif /* _H_tmpltrhs */
53
+
54
+
55
+
@@ -0,0 +1,637 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 12/04/22 */
5
+ /* */
6
+ /* DEFTEMPLATE UTILITIES MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides utility routines for deftemplates. */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Gary D. Riley */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* Brian L. Dantes */
17
+ /* */
18
+ /* Revision History: */
19
+ /* */
20
+ /* 6.23: Added support for templates maintaining their */
21
+ /* own list of facts. */
22
+ /* */
23
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
24
+ /* */
25
+ /* Added additional arguments to */
26
+ /* InvalidDeftemplateSlotMessage function. */
27
+ /* */
28
+ /* Added additional arguments to */
29
+ /* PrintTemplateFact function. */
30
+ /* */
31
+ /* 6.30: Support for long long integers. */
32
+ /* */
33
+ /* Used gensprintf instead of sprintf. */
34
+ /* */
35
+ /* Added const qualifiers to remove C++ */
36
+ /* deprecation warnings. */
37
+ /* */
38
+ /* 6.40: Added Env prefix to GetEvaluationError and */
39
+ /* SetEvaluationError functions. */
40
+ /* */
41
+ /* Added Env prefix to GetHaltExecution and */
42
+ /* SetHaltExecution functions. */
43
+ /* */
44
+ /* Pragma once and other inclusion changes. */
45
+ /* */
46
+ /* Added support for booleans with <stdbool.h>. */
47
+ /* */
48
+ /* Removed use of void pointers for specific */
49
+ /* data structures. */
50
+ /* */
51
+ /* Static constraint checking is always enabled. */
52
+ /* */
53
+ /* UDF redesign. */
54
+ /* */
55
+ /* Watch facts for modify command only prints */
56
+ /* changed slots. */
57
+ /* */
58
+ /* 6.41: Added error message for using ordered facts */
59
+ /* with functions expecting deftemplate facts. */
60
+ /* */
61
+ /* Used gensnprintf in place of gensprintf and. */
62
+ /* sprintf. */
63
+ /* */
64
+ /*************************************************************/
65
+
66
+ #include "setup.h"
67
+
68
+ #if DEFTEMPLATE_CONSTRUCT
69
+
70
+ #include <stdio.h>
71
+ #include <string.h>
72
+
73
+ #include "argacces.h"
74
+ #include "constrct.h"
75
+ #include "cstrnchk.h"
76
+ #include "envrnmnt.h"
77
+ #include "extnfunc.h"
78
+ #include "memalloc.h"
79
+ #include "modulutl.h"
80
+ #include "multifld.h"
81
+ #include "prntutil.h"
82
+ #include "router.h"
83
+ #include "sysdep.h"
84
+ #include "tmpltbsc.h"
85
+ #include "tmpltdef.h"
86
+ #include "tmpltfun.h"
87
+ #include "tmpltpsr.h"
88
+ #include "watch.h"
89
+
90
+ #include "tmpltutl.h"
91
+
92
+ /***************************************/
93
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
94
+ /***************************************/
95
+
96
+ static void PrintTemplateSlot(Environment *,const char *,struct templateSlot *,CLIPSValue *);
97
+ static struct templateSlot *GetNextTemplateSlotToPrint(Environment *,struct fact *,struct templateSlot *,int *,int,const char *);
98
+
99
+ /********************************************************/
100
+ /* InvalidDeftemplateSlotMessage: Generic error message */
101
+ /* for use when a specified slot name isn't defined */
102
+ /* in its corresponding deftemplate. */
103
+ /********************************************************/
104
+ void InvalidDeftemplateSlotMessage(
105
+ Environment *theEnv,
106
+ const char *slotName,
107
+ const char *deftemplateName,
108
+ bool printCR)
109
+ {
110
+ PrintErrorID(theEnv,"TMPLTDEF",1,printCR);
111
+ WriteString(theEnv,STDERR,"Invalid slot '");
112
+ WriteString(theEnv,STDERR,slotName);
113
+ WriteString(theEnv,STDERR,"' not defined in corresponding deftemplate '");
114
+ WriteString(theEnv,STDERR,deftemplateName);
115
+ WriteString(theEnv,STDERR,"'.\n");
116
+ }
117
+
118
+ /**********************************************************/
119
+ /* SingleFieldSlotCardinalityError: Generic error message */
120
+ /* used when an attempt is made to placed a multifield */
121
+ /* value into a single field slot. */
122
+ /**********************************************************/
123
+ void SingleFieldSlotCardinalityError(
124
+ Environment *theEnv,
125
+ const char *slotName)
126
+ {
127
+ PrintErrorID(theEnv,"TMPLTDEF",2,true);
128
+ WriteString(theEnv,STDERR,"The single field slot '");
129
+ WriteString(theEnv,STDERR,slotName);
130
+ WriteString(theEnv,STDERR,"' can only contain a single field value.\n");
131
+ }
132
+
133
+ /**********************************************************************/
134
+ /* MultiIntoSingleFieldSlotError: Determines if a multifield value is */
135
+ /* being placed into a single field slot of a deftemplate fact. */
136
+ /**********************************************************************/
137
+ void MultiIntoSingleFieldSlotError(
138
+ Environment *theEnv,
139
+ struct templateSlot *theSlot,
140
+ Deftemplate *theDeftemplate)
141
+ {
142
+ PrintErrorID(theEnv,"TMPLTFUN",1,true);
143
+ WriteString(theEnv,STDERR,"Attempted to assert a multifield value ");
144
+ WriteString(theEnv,STDERR,"into the single field slot ");
145
+ if (theSlot != NULL)
146
+ {
147
+ WriteString(theEnv,STDERR,"'");
148
+ WriteString(theEnv,STDERR,theSlot->slotName->contents);
149
+ WriteString(theEnv,STDERR,"'");
150
+ }
151
+ else
152
+ { WriteString(theEnv,STDERR,"<<unknown>>"); }
153
+ WriteString(theEnv,STDERR," of deftemplate ");
154
+ if (theDeftemplate != NULL)
155
+ {
156
+ WriteString(theEnv,STDERR,"'");
157
+ WriteString(theEnv,STDERR,theDeftemplate->header.name->contents);
158
+ WriteString(theEnv,STDERR,"'");
159
+ }
160
+ else
161
+ { WriteString(theEnv,STDERR,"<<unknown>>"); }
162
+ WriteString(theEnv,STDERR,".\n");
163
+
164
+ SetEvaluationError(theEnv,true);
165
+ }
166
+
167
+ /***************************************************/
168
+ /* OrderedFactFunctionError: Generic error message */
169
+ /* used when an ordered fact is used with a */
170
+ /* function expecting a deftemplate fact. */
171
+ /***************************************************/
172
+ void OrderedFactFunctionError(
173
+ Environment *theEnv,
174
+ const char *functionName)
175
+ {
176
+ PrintErrorID(theEnv,"TMPLTFUN",2,true);
177
+ WriteString(theEnv,STDERR,"Ordered facts cannot be used with the '");
178
+ WriteString(theEnv,STDERR,functionName);
179
+ WriteString(theEnv,STDERR,"' function.\n");
180
+ }
181
+
182
+ /**************************************************************/
183
+ /* CheckTemplateFact: Checks a fact to see if it violates any */
184
+ /* deftemplate type, allowed-..., or range specifications. */
185
+ /**************************************************************/
186
+ void CheckTemplateFact(
187
+ Environment *theEnv,
188
+ Fact *theFact)
189
+ {
190
+ CLIPSValue *sublist;
191
+ int i;
192
+ Deftemplate *theDeftemplate;
193
+ struct templateSlot *slotPtr;
194
+ UDFValue theData;
195
+ char thePlace[20];
196
+ ConstraintViolationType rv;
197
+
198
+ if (! GetDynamicConstraintChecking(theEnv)) return;
199
+
200
+ sublist = theFact->theProposition.contents;
201
+
202
+ /*========================================================*/
203
+ /* If the deftemplate corresponding to the first field of */
204
+ /* of the fact cannot be found, then the fact cannot be */
205
+ /* checked against the deftemplate format. */
206
+ /*========================================================*/
207
+
208
+ theDeftemplate = theFact->whichDeftemplate;
209
+ if (theDeftemplate == NULL) return;
210
+ if (theDeftemplate->implied) return;
211
+
212
+ /*=============================================*/
213
+ /* Check each of the slots of the deftemplate. */
214
+ /*=============================================*/
215
+
216
+ i = 0;
217
+ for (slotPtr = theDeftemplate->slotList;
218
+ slotPtr != NULL;
219
+ slotPtr = slotPtr->next)
220
+ {
221
+ /*================================================*/
222
+ /* Store the slot value in the appropriate format */
223
+ /* for a call to the constraint checking routine. */
224
+ /*================================================*/
225
+
226
+ if (slotPtr->multislot == false)
227
+ {
228
+ theData.value = sublist[i].value;
229
+ i++;
230
+ }
231
+ else
232
+ {
233
+ theData.value = (void *) sublist[i].value;
234
+ theData.begin = 0;
235
+ theData.range = sublist[i].multifieldValue->length;
236
+ i++;
237
+ }
238
+
239
+ /*=============================================*/
240
+ /* Call the constraint checking routine to see */
241
+ /* if a constraint violation occurred. */
242
+ /*=============================================*/
243
+
244
+ rv = ConstraintCheckDataObject(theEnv,&theData,slotPtr->constraints);
245
+ if (rv != NO_VIOLATION)
246
+ {
247
+ gensnprintf(thePlace,sizeof(thePlace),"fact f-%lld",theFact->factIndex);
248
+
249
+ PrintErrorID(theEnv,"CSTRNCHK",1,true);
250
+ WriteString(theEnv,STDERR,"Slot value ");
251
+ WriteUDFValue(theEnv,STDERR,&theData);
252
+ ConstraintViolationErrorMessage(theEnv,NULL,thePlace,false,0,slotPtr->slotName,
253
+ 0,rv,slotPtr->constraints,true);
254
+ SetHaltExecution(theEnv,true);
255
+ return;
256
+ }
257
+ }
258
+
259
+ return;
260
+ }
261
+
262
+ /***********************************************************************/
263
+ /* CheckRHSSlotTypes: Checks the validity of a change to a slot as the */
264
+ /* result of an assert, modify, or duplicate command. This checking */
265
+ /* is performed statically (i.e. when the command is being parsed). */
266
+ /***********************************************************************/
267
+ bool CheckRHSSlotTypes(
268
+ Environment *theEnv,
269
+ struct expr *rhsSlots,
270
+ struct templateSlot *slotPtr,
271
+ const char *thePlace)
272
+ {
273
+ ConstraintViolationType rv;
274
+ const char *theName;
275
+
276
+ rv = ConstraintCheckExpressionChain(theEnv,rhsSlots,slotPtr->constraints);
277
+ if (rv != NO_VIOLATION)
278
+ {
279
+ if (rv != CARDINALITY_VIOLATION) theName = "A literal slot value";
280
+ else theName = "Literal slot values";
281
+ ConstraintViolationErrorMessage(theEnv,theName,thePlace,true,0,
282
+ slotPtr->slotName,0,rv,slotPtr->constraints,true);
283
+ return false;
284
+ }
285
+
286
+ return true;
287
+ }
288
+
289
+ /*********************************************************/
290
+ /* GetNthSlot: Given a deftemplate and an integer index, */
291
+ /* returns the nth slot of a deftemplate. */
292
+ /*********************************************************/
293
+ struct templateSlot *GetNthSlot(
294
+ Deftemplate *theDeftemplate,
295
+ long long position)
296
+ {
297
+ struct templateSlot *slotPtr;
298
+ long long i = 0;
299
+
300
+ slotPtr = theDeftemplate->slotList;
301
+ while (slotPtr != NULL)
302
+ {
303
+ if (i == position) return slotPtr;
304
+ slotPtr = slotPtr->next;
305
+ i++;
306
+ }
307
+
308
+ return NULL;
309
+ }
310
+
311
+ /*******************************************************/
312
+ /* FindSlotPosition: Finds the position of a specified */
313
+ /* slot in a deftemplate structure. */
314
+ /*******************************************************/
315
+ int FindSlotPosition(
316
+ Deftemplate *theDeftemplate,
317
+ CLIPSLexeme *name)
318
+ {
319
+ struct templateSlot *slotPtr;
320
+ int position;
321
+
322
+ for (slotPtr = theDeftemplate->slotList, position = 1;
323
+ slotPtr != NULL;
324
+ slotPtr = slotPtr->next, position++)
325
+ {
326
+ if (slotPtr->slotName == name)
327
+ { return(position); }
328
+ }
329
+
330
+ return 0;
331
+ }
332
+
333
+ /**********************/
334
+ /* PrintTemplateSlot: */
335
+ /**********************/
336
+ static void PrintTemplateSlot(
337
+ Environment *theEnv,
338
+ const char *logicalName,
339
+ struct templateSlot *slotPtr,
340
+ CLIPSValue *slotValue)
341
+ {
342
+ WriteString(theEnv,logicalName,"(");
343
+ WriteString(theEnv,logicalName,slotPtr->slotName->contents);
344
+
345
+ /*======================================================*/
346
+ /* Print the value of the slot for a single field slot. */
347
+ /*======================================================*/
348
+
349
+ if (slotPtr->multislot == false)
350
+ {
351
+ WriteString(theEnv,logicalName," ");
352
+ PrintAtom(theEnv,logicalName,((TypeHeader *) slotValue->value)->type,slotValue->value);
353
+ }
354
+
355
+ /*==========================================================*/
356
+ /* Else print the value of the slot for a multi field slot. */
357
+ /*==========================================================*/
358
+
359
+ else
360
+ {
361
+ struct multifield *theSegment;
362
+
363
+ theSegment = (Multifield *) slotValue->value;
364
+ if (theSegment->length > 0)
365
+ {
366
+ WriteString(theEnv,logicalName," ");
367
+ PrintMultifieldDriver(theEnv,logicalName,theSegment,0,theSegment->length,false);
368
+ }
369
+ }
370
+
371
+ /*============================================*/
372
+ /* Print the closing parenthesis of the slot. */
373
+ /*============================================*/
374
+
375
+ WriteString(theEnv,logicalName,")");
376
+ }
377
+
378
+ /********************************/
379
+ /* GetNextTemplateSloteToPrint: */
380
+ /********************************/
381
+ static struct templateSlot *GetNextTemplateSlotToPrint(
382
+ Environment *theEnv,
383
+ struct fact *theFact,
384
+ struct templateSlot *slotPtr,
385
+ int *position,
386
+ int ignoreDefaults,
387
+ const char *changeMap)
388
+ {
389
+ UDFValue tempDO;
390
+ CLIPSValue *sublist;
391
+
392
+ sublist = theFact->theProposition.contents;
393
+ if (slotPtr == NULL)
394
+ { slotPtr = theFact->whichDeftemplate->slotList; }
395
+ else
396
+ {
397
+ slotPtr = slotPtr->next;
398
+ (*position)++;
399
+ }
400
+
401
+ while (slotPtr != NULL)
402
+ {
403
+ if ((changeMap != NULL) && (TestBitMap(changeMap,*position) == 0))
404
+ {
405
+ (*position)++;
406
+ slotPtr = slotPtr->next;
407
+ continue;
408
+ }
409
+
410
+ if (ignoreDefaults && (slotPtr->defaultDynamic == false))
411
+ {
412
+ DeftemplateSlotDefault(theEnv,theFact->whichDeftemplate,slotPtr,&tempDO,true);
413
+
414
+ if (slotPtr->multislot == false)
415
+ {
416
+ if (tempDO.value == sublist[*position].value)
417
+ {
418
+ (*position)++;
419
+ slotPtr = slotPtr->next;
420
+ continue;
421
+ }
422
+ }
423
+ else if (MultifieldsEqual((Multifield *) tempDO.value,
424
+ (Multifield *) sublist[*position].value))
425
+ {
426
+ (*position)++;
427
+ slotPtr = slotPtr->next;
428
+ continue;
429
+ }
430
+ }
431
+
432
+ return slotPtr;
433
+ }
434
+
435
+ return NULL;
436
+ }
437
+
438
+ /**********************************************************/
439
+ /* PrintTemplateFact: Prints a fact using the deftemplate */
440
+ /* format. Returns true if the fact was printed using */
441
+ /* this format, otherwise false. */
442
+ /**********************************************************/
443
+ void PrintTemplateFact(
444
+ Environment *theEnv,
445
+ const char *logicalName,
446
+ Fact *theFact,
447
+ bool separateLines,
448
+ bool ignoreDefaults,
449
+ const char *changeMap)
450
+ {
451
+ CLIPSValue *sublist;
452
+ int i;
453
+ Deftemplate *theDeftemplate;
454
+ struct templateSlot *slotPtr, *lastPtr = NULL;
455
+ bool slotPrinted = false;
456
+
457
+ /*==============================*/
458
+ /* Initialize some information. */
459
+ /*==============================*/
460
+
461
+ theDeftemplate = theFact->whichDeftemplate;
462
+ sublist = theFact->theProposition.contents;
463
+
464
+ /*=============================================*/
465
+ /* Print the relation name of the deftemplate. */
466
+ /*=============================================*/
467
+
468
+ WriteString(theEnv,logicalName,"(");
469
+ WriteString(theEnv,logicalName,theDeftemplate->header.name->contents);
470
+
471
+ /*===================================================*/
472
+ /* Print each of the field slots of the deftemplate. */
473
+ /*===================================================*/
474
+
475
+ i = 0;
476
+ slotPtr = GetNextTemplateSlotToPrint(theEnv,theFact,lastPtr,&i,
477
+ ignoreDefaults,changeMap);
478
+
479
+ if ((changeMap != NULL) &&
480
+ (theFact->whichDeftemplate->slotList != slotPtr))
481
+ { WriteString(theEnv,logicalName," ..."); }
482
+
483
+ while (slotPtr != NULL)
484
+ {
485
+ /*===========================================*/
486
+ /* Print the opening parenthesis of the slot */
487
+ /* and the slot name. */
488
+ /*===========================================*/
489
+
490
+ if (! slotPrinted)
491
+ {
492
+ slotPrinted = true;
493
+ WriteString(theEnv,logicalName," ");
494
+ }
495
+
496
+ if (separateLines)
497
+ { WriteString(theEnv,logicalName,"\n "); }
498
+
499
+ /*====================================*/
500
+ /* Print the slot name and its value. */
501
+ /*====================================*/
502
+
503
+ PrintTemplateSlot(theEnv,logicalName,slotPtr,&sublist[i]);
504
+
505
+ /*===========================*/
506
+ /* Move on to the next slot. */
507
+ /*===========================*/
508
+
509
+ lastPtr = slotPtr;
510
+ slotPtr = GetNextTemplateSlotToPrint(theEnv,theFact,lastPtr,&i,
511
+ ignoreDefaults,changeMap);
512
+
513
+ if ((changeMap != NULL) && (lastPtr->next != slotPtr))
514
+ { WriteString(theEnv,logicalName," ..."); }
515
+
516
+ if (slotPtr != NULL) WriteString(theEnv,logicalName," ");
517
+ }
518
+
519
+ WriteString(theEnv,logicalName,")");
520
+ }
521
+
522
+ /***************************************************************************/
523
+ /* UpdateDeftemplateScope: Updates the scope flag of all the deftemplates. */
524
+ /***************************************************************************/
525
+ void UpdateDeftemplateScope(
526
+ Environment *theEnv)
527
+ {
528
+ Deftemplate *theDeftemplate;
529
+ unsigned int moduleCount;
530
+ Defmodule *theModule;
531
+ struct defmoduleItemHeader *theItem;
532
+
533
+ /*==================================*/
534
+ /* Loop through all of the modules. */
535
+ /*==================================*/
536
+
537
+ for (theModule = GetNextDefmodule(theEnv,NULL);
538
+ theModule != NULL;
539
+ theModule = GetNextDefmodule(theEnv,theModule))
540
+ {
541
+ /*======================================================*/
542
+ /* Loop through each of the deftemplates in the module. */
543
+ /*======================================================*/
544
+
545
+ theItem = (struct defmoduleItemHeader *)
546
+ GetModuleItem(theEnv,theModule,DeftemplateData(theEnv)->DeftemplateModuleIndex);
547
+
548
+ for (theDeftemplate = (Deftemplate *) theItem->firstItem;
549
+ theDeftemplate != NULL ;
550
+ theDeftemplate = GetNextDeftemplate(theEnv,theDeftemplate))
551
+ {
552
+ /*=======================================*/
553
+ /* If the deftemplate can be seen by the */
554
+ /* current module, then it is in scope. */
555
+ /*=======================================*/
556
+
557
+ if (FindImportedConstruct(theEnv,"deftemplate",theModule,
558
+ theDeftemplate->header.name->contents,
559
+ &moduleCount,true,NULL) != NULL)
560
+ { theDeftemplate->inScope = true; }
561
+ else
562
+ { theDeftemplate->inScope = false; }
563
+ }
564
+ }
565
+ }
566
+
567
+ /****************************************************************/
568
+ /* FindSlot: Finds a specified slot in a deftemplate structure. */
569
+ /****************************************************************/
570
+ struct templateSlot *FindSlot(
571
+ Deftemplate *theDeftemplate,
572
+ CLIPSLexeme *name,
573
+ unsigned short *whichOne)
574
+ {
575
+ struct templateSlot *slotPtr;
576
+
577
+ if (whichOne != NULL) *whichOne = 0;
578
+ slotPtr = theDeftemplate->slotList;
579
+ while (slotPtr != NULL)
580
+ {
581
+ if (slotPtr->slotName == name)
582
+ { return(slotPtr); }
583
+ if (whichOne != NULL) (*whichOne)++;
584
+ slotPtr = slotPtr->next;
585
+ }
586
+
587
+ return NULL;
588
+ }
589
+
590
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
591
+
592
+ /************************************************************/
593
+ /* CreateImpliedDeftemplate: Creates an implied deftemplate */
594
+ /* and adds it to the list of deftemplates. */
595
+ /************************************************************/
596
+ Deftemplate *CreateImpliedDeftemplate(
597
+ Environment *theEnv,
598
+ CLIPSLexeme *deftemplateName,
599
+ bool setFlag)
600
+ {
601
+ Deftemplate *newDeftemplate;
602
+
603
+ newDeftemplate = get_struct(theEnv,deftemplate);
604
+ newDeftemplate->header.name = deftemplateName;
605
+ newDeftemplate->header.ppForm = NULL;
606
+ newDeftemplate->header.usrData = NULL;
607
+ newDeftemplate->header.constructType = DEFTEMPLATE;
608
+ newDeftemplate->header.env = theEnv;
609
+ newDeftemplate->slotList = NULL;
610
+ newDeftemplate->implied = setFlag;
611
+ newDeftemplate->numberOfSlots = 0;
612
+ newDeftemplate->inScope = 1;
613
+ newDeftemplate->patternNetwork = NULL;
614
+ newDeftemplate->factList = NULL;
615
+ newDeftemplate->lastFact = NULL;
616
+ newDeftemplate->busyCount = 0;
617
+ newDeftemplate->watch = false;
618
+ newDeftemplate->header.next = NULL;
619
+
620
+ #if DEBUGGING_FUNCTIONS
621
+ if (GetWatchItem(theEnv,"facts") == 1)
622
+ { DeftemplateSetWatch(newDeftemplate,true); }
623
+ #endif
624
+
625
+ newDeftemplate->header.whichModule = (struct defmoduleItemHeader *)
626
+ GetModuleItem(theEnv,NULL,DeftemplateData(theEnv)->DeftemplateModuleIndex);
627
+
628
+ AddConstructToModule(&newDeftemplate->header);
629
+ InstallDeftemplate(theEnv,newDeftemplate);
630
+
631
+ return(newDeftemplate);
632
+ }
633
+
634
+ #endif
635
+
636
+ #endif /* DEFTEMPLATE_CONSTRUCT */
637
+