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,59 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/30/16 */
5
+ /* */
6
+ /* DEFTEMPLATE PARSER 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.23: Added support for templates maintaining their */
20
+ /* own list of facts. */
21
+ /* */
22
+ /* 6.30: Removed conditional code for unsupported */
23
+ /* compilers/operating systems (IBM_MCW and */
24
+ /* MAC_MCW). */
25
+ /* */
26
+ /* GetConstructNameAndComment API change. */
27
+ /* */
28
+ /* Support for deftemplate slot facets. */
29
+ /* */
30
+ /* Added const qualifiers to remove C++ */
31
+ /* deprecation warnings. */
32
+ /* */
33
+ /* 6.40: Removed LOCALE definition. */
34
+ /* */
35
+ /* Pragma once and other inclusion changes. */
36
+ /* */
37
+ /* Added support for booleans with <stdbool.h>. */
38
+ /* */
39
+ /* Removed use of void pointers for specific */
40
+ /* data structures. */
41
+ /* */
42
+ /*************************************************************/
43
+
44
+ #ifndef _H_tmpltpsr
45
+
46
+ #pragma once
47
+
48
+ #define _H_tmpltpsr
49
+
50
+ #include "symbol.h"
51
+ #include "tmpltdef.h"
52
+
53
+ bool ParseDeftemplate(Environment *,const char *);
54
+ void InstallDeftemplate(Environment *,Deftemplate *);
55
+
56
+ #endif /* _H_tmpltpsr */
57
+
58
+
59
+
@@ -0,0 +1,595 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 11/11/22 */
5
+ /* */
6
+ /* DEFTEMPLATE RHS PARSING HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Parses deftemplate fact patterns used with the */
11
+ /* assert function. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* */
18
+ /* Revision History: */
19
+ /* */
20
+ /* 6.24: Added additional argument required for */
21
+ /* DeriveDefaultFromConstraints. */
22
+ /* */
23
+ /* Added additional argument required for */
24
+ /* InvalidDeftemplateSlotMessage. */
25
+ /* */
26
+ /* 6.30: Added const qualifiers to remove C++ */
27
+ /* deprecation warnings. */
28
+ /* */
29
+ /* 6.40: Pragma once and other inclusion changes. */
30
+ /* */
31
+ /* Added support for booleans with <stdbool.h>. */
32
+ /* */
33
+ /* Removed use of void pointers for specific */
34
+ /* data structures. */
35
+ /* */
36
+ /* UDF redesign. */
37
+ /* */
38
+ /* 6.41: Fixed error message where a space was missing */
39
+ /* between tokens. */
40
+ /* */
41
+ /*************************************************************/
42
+
43
+ #include "setup.h"
44
+
45
+ #if DEFTEMPLATE_CONSTRUCT
46
+
47
+ #include <stdio.h>
48
+
49
+ #include "default.h"
50
+ #include "extnfunc.h"
51
+ #include "factrhs.h"
52
+ #include "memalloc.h"
53
+ #include "modulutl.h"
54
+ #include "pprint.h"
55
+ #include "prntutil.h"
56
+ #include "router.h"
57
+ #include "tmpltdef.h"
58
+ #include "tmpltfun.h"
59
+ #include "tmpltlhs.h"
60
+ #include "tmpltutl.h"
61
+
62
+ #include "tmpltrhs.h"
63
+
64
+ /***************************************/
65
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
66
+ /***************************************/
67
+
68
+ static struct expr *ParseAssertSlotValues(Environment *,const char *,struct token *,struct templateSlot *,bool *,bool);
69
+ static struct expr *ReorderAssertSlotValues(Environment *,struct templateSlot *,struct expr *,bool *);
70
+ static struct expr *GetSlotAssertValues(Environment *,struct templateSlot *,struct expr *,bool *);
71
+ static struct expr *FindAssertSlotItem(struct templateSlot *,struct expr *);
72
+ static struct templateSlot *ParseSlotLabel(Environment *,const char *,struct token *,Deftemplate *,bool *,TokenType);
73
+
74
+ /******************************************************************/
75
+ /* ParseAssertTemplate: Parses and builds the list of values that */
76
+ /* are used for an assert of a fact with a deftemplate. */
77
+ /******************************************************************/
78
+ struct expr *ParseAssertTemplate(
79
+ Environment *theEnv,
80
+ const char *readSource,
81
+ struct token *theToken,
82
+ bool *error,
83
+ TokenType endType,
84
+ bool constantsOnly,
85
+ Deftemplate *theDeftemplate)
86
+ {
87
+ struct expr *firstSlot, *lastSlot, *nextSlot = NULL;
88
+ struct expr *firstArg, *tempSlot;
89
+ struct templateSlot *slotPtr;
90
+
91
+ firstSlot = NULL;
92
+ lastSlot = NULL;
93
+
94
+ /*==============================================*/
95
+ /* Parse each of the slot fields in the assert. */
96
+ /*==============================================*/
97
+
98
+ while ((slotPtr = ParseSlotLabel(theEnv,readSource,theToken,theDeftemplate,error,endType)) != NULL)
99
+ {
100
+ /*========================================================*/
101
+ /* Check to see that the slot hasn't already been parsed. */
102
+ /*========================================================*/
103
+
104
+ for (tempSlot = firstSlot;
105
+ tempSlot != NULL;
106
+ tempSlot = tempSlot->nextArg)
107
+ {
108
+ if (tempSlot->value == (void *) slotPtr->slotName)
109
+ {
110
+ AlreadyParsedErrorMessage(theEnv,"slot ",slotPtr->slotName->contents);
111
+ *error = true;
112
+ ReturnExpression(theEnv,firstSlot);
113
+ return NULL;
114
+ }
115
+ }
116
+
117
+ /*============================================*/
118
+ /* Parse the values to be stored in the slot. */
119
+ /*============================================*/
120
+
121
+ nextSlot = ParseAssertSlotValues(theEnv,readSource,theToken,
122
+ slotPtr,error,constantsOnly);
123
+
124
+ if (*error)
125
+ {
126
+ ReturnExpression(theEnv,firstSlot);
127
+ return NULL;
128
+ }
129
+
130
+ /*============================================*/
131
+ /* Check to see if the values to be stored in */
132
+ /* the slot violate the slot's constraints. */
133
+ /*============================================*/
134
+
135
+ if (CheckRHSSlotTypes(theEnv,nextSlot->argList,slotPtr,"assert") == 0)
136
+ {
137
+ *error = true;
138
+ ReturnExpression(theEnv,firstSlot);
139
+ ReturnExpression(theEnv,nextSlot);
140
+ return NULL;
141
+ }
142
+
143
+ /*===================================================*/
144
+ /* Add the slot to the list of slots already parsed. */
145
+ /*===================================================*/
146
+
147
+ if (lastSlot == NULL)
148
+ { firstSlot = nextSlot; }
149
+ else
150
+ { lastSlot->nextArg = nextSlot; }
151
+
152
+ lastSlot = nextSlot;
153
+ }
154
+
155
+ /*=================================================*/
156
+ /* Return if an error occured parsing a slot name. */
157
+ /*=================================================*/
158
+
159
+ if (*error)
160
+ {
161
+ ReturnExpression(theEnv,firstSlot);
162
+ return NULL;
163
+ }
164
+
165
+ /*=============================================================*/
166
+ /* Reorder the arguments to the order used by the deftemplate. */
167
+ /*=============================================================*/
168
+
169
+ firstArg = ReorderAssertSlotValues(theEnv,theDeftemplate->slotList,firstSlot,error);
170
+ ReturnExpression(theEnv,firstSlot);
171
+
172
+ /*==============================*/
173
+ /* Return the assert arguments. */
174
+ /*==============================*/
175
+
176
+ return(firstArg);
177
+ }
178
+
179
+ /****************************************************************/
180
+ /* ParseSlotLabel: Parses the beginning of a slot definition. */
181
+ /* Checks for opening left parenthesis and a valid slot name. */
182
+ /****************************************************************/
183
+ static struct templateSlot *ParseSlotLabel(
184
+ Environment *theEnv,
185
+ const char *inputSource,
186
+ struct token *tempToken,
187
+ Deftemplate *theDeftemplate,
188
+ bool *error,
189
+ TokenType endType)
190
+ {
191
+ struct templateSlot *slotPtr;
192
+
193
+ /*========================*/
194
+ /* Initialize error flag. */
195
+ /*========================*/
196
+
197
+ *error = false;
198
+
199
+ /*============================================*/
200
+ /* If token is a right parenthesis, then fact */
201
+ /* template definition is complete. */
202
+ /*============================================*/
203
+
204
+ GetToken(theEnv,inputSource,tempToken);
205
+ if (tempToken->tknType == endType)
206
+ { return NULL; }
207
+
208
+ /*=======================================*/
209
+ /* Put a space between the template name */
210
+ /* and the first slot definition. */
211
+ /*=======================================*/
212
+
213
+ PPBackup(theEnv);
214
+ SavePPBuffer(theEnv," ");
215
+ SavePPBuffer(theEnv,tempToken->printForm);
216
+
217
+ /*=======================================================*/
218
+ /* Slot definition begins with opening left parenthesis. */
219
+ /*=======================================================*/
220
+
221
+ if (tempToken->tknType != LEFT_PARENTHESIS_TOKEN)
222
+ {
223
+ SyntaxErrorMessage(theEnv,"deftemplate pattern");
224
+ *error = true;
225
+ return NULL;
226
+ }
227
+
228
+ /*=============================*/
229
+ /* Slot name must be a symbol. */
230
+ /*=============================*/
231
+
232
+ GetToken(theEnv,inputSource,tempToken);
233
+ if (tempToken->tknType != SYMBOL_TOKEN)
234
+ {
235
+ SyntaxErrorMessage(theEnv,"deftemplate pattern");
236
+ *error = true;
237
+ return NULL;
238
+ }
239
+
240
+ /*======================================================*/
241
+ /* Check that the slot name is valid for this template. */
242
+ /*======================================================*/
243
+
244
+ if ((slotPtr = FindSlot(theDeftemplate,tempToken->lexemeValue,NULL)) == NULL)
245
+ {
246
+ InvalidDeftemplateSlotMessage(theEnv,tempToken->lexemeValue->contents,
247
+ theDeftemplate->header.name->contents,true);
248
+ *error = true;
249
+ return NULL;
250
+ }
251
+
252
+ /*====================================*/
253
+ /* Return a pointer to the slot name. */
254
+ /*====================================*/
255
+
256
+ return slotPtr;
257
+ }
258
+
259
+ /**************************************************************************/
260
+ /* ParseAssertSlotValues: Gets a single assert slot value for a template. */
261
+ /**************************************************************************/
262
+ static struct expr *ParseAssertSlotValues(
263
+ Environment *theEnv,
264
+ const char *inputSource,
265
+ struct token *tempToken,
266
+ struct templateSlot *slotPtr,
267
+ bool *error,
268
+ bool constantsOnly)
269
+ {
270
+ struct expr *nextSlot;
271
+ struct expr *newField, *valueList, *lastValue;
272
+ bool printError;
273
+
274
+ /*=============================*/
275
+ /* Handle a single field slot. */
276
+ /*=============================*/
277
+
278
+ if (slotPtr->multislot == false)
279
+ {
280
+ /*=====================*/
281
+ /* Get the slot value. */
282
+ /*=====================*/
283
+
284
+ SavePPBuffer(theEnv," ");
285
+
286
+ newField = GetAssertArgument(theEnv,inputSource,tempToken,error,
287
+ RIGHT_PARENTHESIS_TOKEN,constantsOnly,&printError);
288
+ if (*error)
289
+ {
290
+ if (printError) SyntaxErrorMessage(theEnv,"deftemplate pattern");
291
+ return NULL;
292
+ }
293
+
294
+ /*=================================================*/
295
+ /* A single field slot value must contain a value. */
296
+ /* Only a multifield slot can be empty. */
297
+ /*=================================================*/
298
+
299
+ if (newField == NULL)
300
+ {
301
+ *error = true;
302
+ SingleFieldSlotCardinalityError(theEnv,slotPtr->slotName->contents);
303
+ return NULL;
304
+ }
305
+
306
+ /*==============================================*/
307
+ /* A function returning a multifield value can */
308
+ /* not be called to get the value for the slot. */
309
+ /*==============================================*/
310
+
311
+ if (newField->type == MF_VARIABLE)
312
+ {
313
+ *error = true;
314
+ SingleFieldSlotCardinalityError(theEnv,slotPtr->slotName->contents);
315
+ ReturnExpression(theEnv,newField);
316
+ return NULL;
317
+ }
318
+ else if (newField->type == FCALL)
319
+ {
320
+ if ((ExpressionUnknownFunctionType(newField) & SINGLEFIELD_BITS) == 0)
321
+ {
322
+ *error = true;
323
+ SingleFieldSlotCardinalityError(theEnv,slotPtr->slotName->contents);
324
+ ReturnExpression(theEnv,newField);
325
+ return NULL;
326
+ }
327
+ }
328
+
329
+ /*============================*/
330
+ /* Move on to the next token. */
331
+ /*============================*/
332
+
333
+ GetToken(theEnv,inputSource,tempToken);
334
+ }
335
+
336
+ /*========================================*/
337
+ /* Handle a multifield slot. Build a list */
338
+ /* of the values stored in the slot. */
339
+ /*========================================*/
340
+
341
+ else
342
+ {
343
+ SavePPBuffer(theEnv," ");
344
+ valueList = GetAssertArgument(theEnv,inputSource,tempToken,error,
345
+ RIGHT_PARENTHESIS_TOKEN,constantsOnly,&printError);
346
+ if (*error)
347
+ {
348
+ if (printError) SyntaxErrorMessage(theEnv,"deftemplate pattern");
349
+ return NULL;
350
+ }
351
+
352
+ if (valueList == NULL)
353
+ {
354
+ PPBackup(theEnv);
355
+ PPBackup(theEnv);
356
+ SavePPBuffer(theEnv,")");
357
+ }
358
+
359
+ lastValue = valueList;
360
+
361
+ while (lastValue != NULL) /* (tempToken->tknType != RIGHT_PARENTHESIS_TOKEN) */
362
+ {
363
+ if (tempToken->tknType == RIGHT_PARENTHESIS_TOKEN)
364
+ { SavePPBuffer(theEnv," "); }
365
+ else
366
+ {
367
+ /* PPBackup(theEnv); */
368
+ SavePPBuffer(theEnv," ");
369
+ /* SavePPBuffer(theEnv,tempToken->printForm); */
370
+ }
371
+
372
+ newField = GetAssertArgument(theEnv,inputSource,tempToken,error,
373
+ RIGHT_PARENTHESIS_TOKEN,constantsOnly,&printError);
374
+ if (*error)
375
+ {
376
+ if (printError) SyntaxErrorMessage(theEnv,"deftemplate pattern");
377
+ ReturnExpression(theEnv,valueList);
378
+ return NULL;
379
+ }
380
+
381
+ if (newField == NULL)
382
+ {
383
+ PPBackup(theEnv);
384
+ PPBackup(theEnv);
385
+ SavePPBuffer(theEnv,")");
386
+ }
387
+
388
+ lastValue->nextArg = newField;
389
+ lastValue = newField;
390
+ }
391
+
392
+ newField = valueList;
393
+ }
394
+
395
+ /*==========================================================*/
396
+ /* Slot definition must be closed with a right parenthesis. */
397
+ /*==========================================================*/
398
+
399
+ if (tempToken->tknType != RIGHT_PARENTHESIS_TOKEN)
400
+ {
401
+ PPBackup(theEnv);
402
+ SavePPBuffer(theEnv," ");
403
+ SavePPBuffer(theEnv,tempToken->printForm);
404
+
405
+ SingleFieldSlotCardinalityError(theEnv,slotPtr->slotName->contents);
406
+ *error = true;
407
+ ReturnExpression(theEnv,newField);
408
+ return NULL;
409
+ }
410
+
411
+ /*=========================================================*/
412
+ /* Build and return a structure describing the slot value. */
413
+ /*=========================================================*/
414
+
415
+ nextSlot = GenConstant(theEnv,SYMBOL_TYPE,slotPtr->slotName);
416
+ nextSlot->argList = newField;
417
+
418
+ return(nextSlot);
419
+ }
420
+
421
+ /*************************************************************************/
422
+ /* ReorderAssertSlotValues: Rearranges the asserted values to correspond */
423
+ /* to the order of the values described by the deftemplate. */
424
+ /*************************************************************************/
425
+ static struct expr *ReorderAssertSlotValues(
426
+ Environment *theEnv,
427
+ struct templateSlot *slotPtr,
428
+ struct expr *firstSlot,
429
+ bool *error)
430
+ {
431
+ struct expr *firstArg = NULL;
432
+ struct expr *lastArg = NULL, *newArg;
433
+
434
+ /*=============================================*/
435
+ /* Loop through each of the slots in the order */
436
+ /* they're found in the deftemplate. */
437
+ /*=============================================*/
438
+
439
+ for (;
440
+ slotPtr != NULL;
441
+ slotPtr = slotPtr->next)
442
+ {
443
+ /*==============================================*/
444
+ /* Get either the value specified in the assert */
445
+ /* command or the default value for the slot. */
446
+ /*==============================================*/
447
+
448
+ newArg = GetSlotAssertValues(theEnv,slotPtr,firstSlot,error);
449
+
450
+ if (*error)
451
+ {
452
+ ReturnExpression(theEnv,firstArg);
453
+ return NULL;
454
+ }
455
+
456
+ /*=====================================*/
457
+ /* Add the value to the list of values */
458
+ /* for the assert command. */
459
+ /*=====================================*/
460
+
461
+ if (newArg != NULL)
462
+ {
463
+ if (lastArg == NULL)
464
+ { firstArg = newArg; }
465
+ else
466
+ { lastArg->nextArg = newArg; }
467
+
468
+ lastArg = newArg;
469
+ }
470
+ }
471
+
472
+ /*==============================*/
473
+ /* Return the list of arguments */
474
+ /* for the assert command. */
475
+ /*==============================*/
476
+
477
+ return(firstArg);
478
+ }
479
+
480
+ /***************************************************************/
481
+ /* GetSlotAssertValues: Gets the assert value for a given slot */
482
+ /* of a deftemplate. If the value was supplied by the user, */
483
+ /* it will be used. If not the default value or default */
484
+ /* default value will be used. */
485
+ /***************************************************************/
486
+ static struct expr *GetSlotAssertValues(
487
+ Environment *theEnv,
488
+ struct templateSlot *slotPtr,
489
+ struct expr *firstSlot,
490
+ bool *error)
491
+ {
492
+ struct expr *slotItem;
493
+ struct expr *newArg, *tempArg;
494
+ UDFValue theDefault;
495
+ const char *nullBitMap = "\0";
496
+
497
+ /*==================================================*/
498
+ /* Determine if the slot is assigned in the assert. */
499
+ /*==================================================*/
500
+
501
+ slotItem = FindAssertSlotItem(slotPtr,firstSlot);
502
+
503
+ /*==========================================*/
504
+ /* If the slot is assigned, use that value. */
505
+ /*==========================================*/
506
+
507
+ if (slotItem != NULL)
508
+ {
509
+ newArg = slotItem->argList;
510
+ slotItem->argList = NULL;
511
+ }
512
+
513
+ /*=================================*/
514
+ /* Otherwise, use a default value. */
515
+ /*=================================*/
516
+
517
+ else
518
+ {
519
+ /*================================================*/
520
+ /* If the (default ?NONE) attribute was specified */
521
+ /* for the slot, then a value must be supplied. */
522
+ /*================================================*/
523
+
524
+ if (slotPtr->noDefault)
525
+ {
526
+ PrintErrorID(theEnv,"TMPLTRHS",1,true);
527
+ WriteString(theEnv,STDERR,"Slot '");
528
+ WriteString(theEnv,STDERR,slotPtr->slotName->contents);
529
+ WriteString(theEnv,STDERR,"' requires a value because of its (default ?NONE) attribute.\n");
530
+ *error = true;
531
+ return NULL;
532
+ }
533
+
534
+ /*===================================================*/
535
+ /* If the (default ?DERIVE) attribute was specified */
536
+ /* (the default), then derive the default value from */
537
+ /* the slot's constraints. */
538
+ /*===================================================*/
539
+
540
+ else if ((slotPtr->defaultPresent == false) &&
541
+ (slotPtr->defaultDynamic == false))
542
+ {
543
+ DeriveDefaultFromConstraints(theEnv,slotPtr->constraints,&theDefault,
544
+ slotPtr->multislot,true);
545
+ newArg = ConvertValueToExpression(theEnv,&theDefault);
546
+ }
547
+
548
+ /*=========================================*/
549
+ /* Otherwise, use the expression contained */
550
+ /* in the default attribute. */
551
+ /*=========================================*/
552
+
553
+ else
554
+ { newArg = CopyExpression(theEnv,slotPtr->defaultList); }
555
+ }
556
+
557
+ /*=======================================================*/
558
+ /* Since a multifield slot default can contain a list of */
559
+ /* values, the values need to have a store-multifield */
560
+ /* function called wrapped around it to group all of the */
561
+ /* values into a single multifield value. */
562
+ /*=======================================================*/
563
+
564
+ if (slotPtr->multislot)
565
+ {
566
+ tempArg = GenConstant(theEnv,FACT_STORE_MULTIFIELD,AddBitMap(theEnv,(void *) nullBitMap,1));
567
+ tempArg->argList = newArg;
568
+ newArg = tempArg;
569
+ }
570
+
571
+ /*==============================================*/
572
+ /* Return the value to be asserted in the slot. */
573
+ /*==============================================*/
574
+
575
+ return(newArg);
576
+ }
577
+
578
+ /*******************************************************************/
579
+ /* FindAssertSlotItem: Finds a particular slot in a list of slots. */
580
+ /*******************************************************************/
581
+ static struct expr *FindAssertSlotItem(
582
+ struct templateSlot *slotPtr,
583
+ struct expr *listOfSlots)
584
+ {
585
+ while (listOfSlots != NULL)
586
+ {
587
+ if (listOfSlots->value == (void *) slotPtr->slotName) return (listOfSlots);
588
+ listOfSlots = listOfSlots->nextArg;
589
+ }
590
+
591
+ return NULL;
592
+ }
593
+
594
+ #endif /* DEFTEMPLATE_CONSTRUCT */
595
+