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,619 @@
1
+ #include "clips.h"
2
+ #include "ruby.h"
3
+
4
+ size_t fact_size(const void *data)
5
+ {
6
+ return sizeof(Fact);
7
+ }
8
+
9
+ static const rb_data_type_t Fact_type = {
10
+ .function = {
11
+ .dsize = fact_size
12
+ },
13
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
14
+ };
15
+
16
+ static VALUE clips_environment_fact_deftemplate_name(VALUE self)
17
+ {
18
+ Fact *fact;
19
+
20
+ TypedData_Get_Struct(self, Fact, &Fact_type, fact);
21
+
22
+ return ID2SYM(rb_intern(DeftemplateName(FactDeftemplate(fact))));
23
+ }
24
+
25
+ static VALUE clips_environment_fact_static_deftemplate_name(VALUE self, VALUE rbFact)
26
+ {
27
+ return clips_environment_fact_deftemplate_name(rbFact);
28
+ }
29
+
30
+ void environment_free(void *data)
31
+ {
32
+ DestroyEnvironment((Environment*) data);
33
+ }
34
+
35
+ size_t environment_size(const void *data)
36
+ {
37
+ return MemUsed((Environment*) data);
38
+ }
39
+
40
+ static const rb_data_type_t Environment_type = {
41
+ .function = {
42
+ .dfree = environment_free,
43
+ .dsize = environment_size
44
+ },
45
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
46
+ };
47
+
48
+ static VALUE clips_environment_facts(VALUE self)
49
+ {
50
+ Environment *env;
51
+
52
+ TypedData_Get_Struct(self, Environment, &Environment_type, env);
53
+
54
+ Facts(env, "stdout", NULL, -1, -1, -1);
55
+
56
+ return self;
57
+ }
58
+
59
+ static VALUE clips_environment_static_facts(VALUE self, VALUE rbEnvironment)
60
+ {
61
+ return clips_environment_facts(rbEnvironment);
62
+ }
63
+
64
+ VALUE environment_alloc(VALUE self)
65
+ {
66
+ return TypedData_Wrap_Struct(self, &Environment_type, CreateEnvironment());
67
+ }
68
+
69
+ static VALUE create_environment(VALUE self)
70
+ {
71
+ return environment_alloc(rb_const_get(self, rb_intern("Environment")));
72
+ }
73
+
74
+ static VALUE clips_environment_assert_string(VALUE self, VALUE string)
75
+ {
76
+ Environment *env;
77
+
78
+ TypedData_Get_Struct(self, Environment, &Environment_type, env);
79
+
80
+ Fact *fact = AssertString(env, StringValueCStr(string));
81
+
82
+ VALUE rb_fact =
83
+ TypedData_Wrap_Struct(rb_const_get(CLASS_OF(self), rb_intern("Fact")), &Fact_type, fact);
84
+
85
+ rb_iv_set(rb_fact, "@environment", self);
86
+
87
+ return rb_fact;
88
+ }
89
+
90
+ static VALUE clips_environment_static_assert_string(VALUE self, VALUE rbEnvironment, VALUE string)
91
+ {
92
+ return clips_environment_assert_string(rbEnvironment, string);
93
+ }
94
+
95
+ static VALUE clips_environment_build(VALUE self, VALUE string)
96
+ {
97
+ Environment *env;
98
+
99
+ TypedData_Get_Struct(self, Environment, &Environment_type, env);
100
+
101
+ switch(Build(env, StringValueCStr(string)))
102
+ {
103
+ case BE_NO_ERROR:
104
+ break;
105
+ case BE_COULD_NOT_BUILD_ERROR:
106
+ rb_warn("`build` failed!");
107
+ break;
108
+ case BE_CONSTRUCT_NOT_FOUND_ERROR:
109
+ rb_warn("`build` failed! Construct not found.");
110
+ break;
111
+ case BE_PARSING_ERROR:
112
+ rb_warn("`build` failed! Could not parse string correctly.");
113
+ break;
114
+ }
115
+
116
+ return Qnil;
117
+ }
118
+
119
+ static VALUE clips_environment_static_build(VALUE self, VALUE rbEnvironment, VALUE string)
120
+ {
121
+ return clips_environment_build(rbEnvironment, string);
122
+ }
123
+
124
+ static CLIPSValue VALUE_to_CLIPSValue(VALUE from, Environment *env)
125
+ {
126
+ CLIPSValue to;
127
+ switch (TYPE(from))
128
+ {
129
+ case T_NIL:
130
+ to.lexemeValue = CreateSymbol(env, "nil");
131
+ break;
132
+ case T_OBJECT:
133
+ rb_warn("Ruby Object not supported as value in CLIPS!");
134
+ to.voidValue = VoidConstant(env);
135
+ break;
136
+ case T_CLASS:
137
+ rb_warn("Ruby Class not supported as value in CLIPS!");
138
+ to.voidValue = VoidConstant(env);
139
+ break;
140
+ case T_MODULE:
141
+ rb_warn("Ruby Module not supported as value in CLIPS!");
142
+ to.voidValue = VoidConstant(env);
143
+ break;
144
+ case T_FLOAT:
145
+ to.floatValue = CreateFloat(env, NUM2DBL(from));
146
+ break;
147
+ case T_STRING:
148
+ to.lexemeValue = CreateString(env, StringValueCStr(from));
149
+ break;
150
+ case T_REGEXP:
151
+ rb_warn("Ruby Regexp not supported as value in CLIPS!");
152
+ to.voidValue = VoidConstant(env);
153
+ break;
154
+ case T_ARRAY:
155
+ long length = RARRAY_LEN(from);
156
+
157
+ MultifieldBuilder *mb = CreateMultifieldBuilder(env, length);
158
+ CLIPSValue inner;
159
+ for (int i = 0; i < length; i++)
160
+ {
161
+ inner = VALUE_to_CLIPSValue(rb_ary_entry(from, i), env);
162
+ MBAppend(mb, &inner);
163
+ }
164
+ to.multifieldValue = MBCreate(mb);
165
+
166
+ MBDispose(mb);
167
+ break;
168
+ case T_HASH:
169
+ rb_warn("Ruby Hash not supported as value in CLIPS!");
170
+ to.voidValue = VoidConstant(env);
171
+ break;
172
+ case T_STRUCT:
173
+ rb_warn("Ruby Struct not supported as value in CLIPS!");
174
+ to.voidValue = VoidConstant(env);
175
+ break;
176
+ case T_BIGNUM:
177
+ to.floatValue = CreateFloat(env, NUM2LONG(from));
178
+ break;
179
+ case T_FIXNUM:
180
+ to.integerValue = CreateInteger(env, FIX2INT(from));
181
+ break;
182
+ case T_COMPLEX:
183
+ rb_warn("Ruby Complex not supported as value in CLIPS!");
184
+ to.voidValue = VoidConstant(env);
185
+ break;
186
+ case T_RATIONAL:
187
+ rb_warn("Ruby Rational not supported as value in CLIPS!");
188
+ to.voidValue = VoidConstant(env);
189
+ break;
190
+ case T_FILE:
191
+ rb_warn("Ruby File not supported as value in CLIPS!");
192
+ to.voidValue = VoidConstant(env);
193
+ break;
194
+ case T_TRUE:
195
+ to.lexemeValue = CreateBoolean(env, "TRUE");
196
+ break;
197
+ case T_FALSE:
198
+ to.lexemeValue = CreateBoolean(env, "FALSE");
199
+ break;
200
+ case T_DATA:
201
+ rb_warn("Ruby Data not supported as value in CLIPS!");
202
+ to.voidValue = VoidConstant(env);
203
+ break;
204
+ case T_SYMBOL:
205
+ to.lexemeValue = CreateSymbol(env, rb_id2name(SYM2ID(from)));
206
+ break;
207
+ default:
208
+ rb_warn("Trying to convert unknown Ruby data type to CLIPSValue");
209
+ to.voidValue = VoidConstant(env);
210
+ break;
211
+ }
212
+ return to;
213
+ }
214
+
215
+ void handle_pse_error(int error, const char *cslot)
216
+ {
217
+ switch (error)
218
+ {
219
+ case PSE_NO_ERROR:
220
+ break;
221
+ case PSE_CARDINALITY_ERROR:
222
+ rb_warn("Could not set slot %s: %s", cslot, "slot/multislot mismatch");
223
+ break;
224
+ case PSE_SLOT_NOT_FOUND_ERROR:
225
+ rb_warn("Could not set slot %s: %s", cslot, "slot not found");
226
+ break;
227
+ case PSE_TYPE_ERROR:
228
+ rb_warn("Could not set slot %s: %s", cslot, "value violates type constraint");
229
+ break;
230
+ case PSE_RANGE_ERROR:
231
+ rb_warn("Could not set slot %s: %s", cslot, "value violates range constraint");
232
+ break;
233
+ case PSE_ALLOWED_VALUES_ERROR:
234
+ rb_warn("Could not set slot %s: %s", cslot, "value violates allowed values constraint");
235
+ break;
236
+ case PSE_ALLOWED_CLASSES_ERROR:
237
+ rb_warn("Could not set slot %s: %s", cslot, "value violates allowed classes constraint");
238
+ break;
239
+ case PSE_NULL_POINTER_ERROR:
240
+ case PSE_INVALID_TARGET_ERROR:
241
+ case PSE_EVALUATION_ERROR:
242
+ case PSE_RULE_NETWORK_ERROR:
243
+ rb_warn("Could not set slot %s: %s", cslot, "possible bug in clipsruby!");
244
+ break;
245
+ };
246
+ }
247
+
248
+ static int _clips_environment_assert_hash(VALUE key, VALUE value, VALUE args)
249
+ {
250
+ const char *cslot_name;
251
+ switch(TYPE(key))
252
+ {
253
+ case T_SYMBOL:
254
+ cslot_name = rb_id2name(SYM2ID(key));
255
+ break;
256
+ case T_STRING:
257
+ cslot_name = StringValueCStr(key);
258
+ break;
259
+ default:
260
+ rb_raise(rb_eTypeError, "Slot name must be a String or a Symbol");
261
+ return ST_CONTINUE;
262
+ }
263
+
264
+ VALUE *fb_and_env = (VALUE*)args;
265
+ FactBuilder *fb = (FactBuilder*) fb_and_env[0];
266
+ Environment *env = (Environment*) fb_and_env[1];
267
+ CLIPSValue cv = VALUE_to_CLIPSValue(value, env);
268
+ handle_pse_error(FBPutSlot(fb, cslot_name, &cv), cslot_name);
269
+
270
+ return ST_CONTINUE;
271
+ }
272
+
273
+ static VALUE clips_environment_assert_hash(VALUE self, VALUE deftemplate_name, VALUE hash)
274
+ {
275
+ const char *cdeftemplate_name;
276
+ switch(TYPE(deftemplate_name))
277
+ {
278
+ case T_SYMBOL:
279
+ cdeftemplate_name = rb_id2name(SYM2ID(deftemplate_name));
280
+ break;
281
+ case T_STRING:
282
+ cdeftemplate_name = StringValueCStr(deftemplate_name);
283
+ break;
284
+ default:
285
+ rb_raise(rb_eTypeError, "First argument must be a String or a Symbol");
286
+ break;
287
+ }
288
+
289
+ Environment *env;
290
+ TypedData_Get_Struct(self, Environment, &Environment_type, env);
291
+
292
+ FactBuilder *fb = CreateFactBuilder(env, cdeftemplate_name);
293
+ void *args[2] = { (void *)fb, (void *)env };
294
+ rb_hash_foreach(hash, _clips_environment_assert_hash, (VALUE)args);
295
+ Fact *fact = FBAssert(fb);
296
+ FBDispose(fb);
297
+
298
+ switch (FBError(env))
299
+ {
300
+ case FBE_NO_ERROR:
301
+ break;
302
+ case FBE_NULL_POINTER_ERROR:
303
+ rb_warn("Could not assert fact. This might be a bug in clipsruby!");
304
+ return Qnil;
305
+ case FBE_COULD_NOT_ASSERT_ERROR:
306
+ rb_warn("Could not assert fact. Pattern matching of a fact or instance is already occurring.");
307
+ return Qnil;
308
+ case FBE_RULE_NETWORK_ERROR:
309
+ rb_warn("Could not assert fact. An error occurs while the assertion was being processed in the rule network.");
310
+ return Qnil;
311
+ }
312
+
313
+ VALUE rb_fact =
314
+ TypedData_Wrap_Struct(rb_const_get(CLASS_OF(self), rb_intern("Fact")), &Fact_type, fact);
315
+
316
+ rb_iv_set(rb_fact, "@environment", self);
317
+
318
+ return rb_fact;
319
+ }
320
+
321
+ static VALUE clips_environment_static_assert_hash(VALUE self, VALUE environment, VALUE deftemplate_name, VALUE hash)
322
+ {
323
+ return clips_environment_assert_hash(environment, deftemplate_name, hash);
324
+ }
325
+
326
+ static void CLIPSValue_to_VALUE(CLIPSValue *from, VALUE *value, Environment *env)
327
+ {
328
+ switch (from->header->type)
329
+ {
330
+ case VOID_TYPE:
331
+ *value = Qnil;
332
+ break;
333
+ case FLOAT_TYPE:
334
+ *value = DBL2NUM(from->floatValue->contents);
335
+ break;
336
+ case MULTIFIELD_TYPE:
337
+ *value = rb_ary_new2(from->multifieldValue->length);
338
+ for (size_t i = 0; i < from->multifieldValue->length; i++)
339
+ {
340
+ VALUE innerValue;
341
+ CLIPSValue_to_VALUE(&from->multifieldValue->contents[i], &innerValue, env);
342
+ rb_ary_push(*value, innerValue);
343
+ }
344
+ break;
345
+ case SYMBOL_TYPE:
346
+ if (from->lexemeValue == TrueSymbol(env)) {
347
+ *value = Qtrue;
348
+ } else if (from->lexemeValue == FalseSymbol(env)) {
349
+ *value = Qfalse;
350
+ } else {
351
+ *value = rb_str_new2(from->lexemeValue->contents);
352
+ }
353
+ break;
354
+ case INTEGER_TYPE:
355
+ *value = LONG2NUM(from->integerValue->contents);
356
+ break;
357
+ case STRING_TYPE:
358
+ case INSTANCE_NAME_TYPE:
359
+ *value = rb_str_new2(from->lexemeValue->contents);
360
+ break;
361
+ case EXTERNAL_ADDRESS_TYPE:
362
+ case FACT_ADDRESS_TYPE:
363
+ case INSTANCE_ADDRESS_TYPE:
364
+ default:
365
+ WriteString(env,STDERR,"Unsupported data type returned from function\n");
366
+ *value = Qnil;
367
+ break;
368
+ }
369
+ }
370
+
371
+ static void UDFValue_to_VALUE(UDFValue *from, VALUE *value, Environment *env)
372
+ {
373
+ switch (from->header->type)
374
+ {
375
+ case VOID_TYPE:
376
+ *value = Qnil;
377
+ break;
378
+ case FLOAT_TYPE:
379
+ *value = DBL2NUM(from->floatValue->contents);
380
+ break;
381
+ case MULTIFIELD_TYPE:
382
+ *value = rb_ary_new2(from->multifieldValue->length);
383
+ VALUE innerValue;
384
+ for (size_t i = 0; i < from->multifieldValue->length; i++)
385
+ {
386
+ CLIPSValue_to_VALUE(&from->multifieldValue->contents[i], &innerValue, env);
387
+ rb_ary_push(*value, innerValue);
388
+ }
389
+ break;
390
+ case SYMBOL_TYPE:
391
+ if (from->lexemeValue == TrueSymbol(env)) {
392
+ *value = Qtrue;
393
+ } else if (from->lexemeValue == FalseSymbol(env)) {
394
+ *value = Qfalse;
395
+ } else {
396
+ *value = rb_str_new2(from->lexemeValue->contents);
397
+ }
398
+ break;
399
+ case INTEGER_TYPE:
400
+ *value = LONG2NUM(from->integerValue->contents);
401
+ break;
402
+ case STRING_TYPE:
403
+ case INSTANCE_NAME_TYPE:
404
+ *value = rb_str_new2(from->lexemeValue->contents);
405
+ break;
406
+ case EXTERNAL_ADDRESS_TYPE:
407
+ case FACT_ADDRESS_TYPE:
408
+ case INSTANCE_ADDRESS_TYPE:
409
+ default:
410
+ WriteString(env,STDERR,"Unsupported data type returned from function\n");
411
+ *value = Qnil;
412
+ break;
413
+ }
414
+ }
415
+
416
+ void UDFGenericFunction(
417
+ Environment *theEnv,
418
+ UDFContext *context,
419
+ UDFValue *returnValue)
420
+ {
421
+ int argc = UDFArgumentCount(context);
422
+ VALUE argv[argc];
423
+ VALUE *current_argv = argv;
424
+ UDFValue theArg;
425
+ VALUE method = (VALUE)(context->context);
426
+ VALUE theValue;
427
+ while (UDFHasNextArgument(context))
428
+ {
429
+ UDFNextArgument(context, ANY_TYPE_BITS, &theArg);
430
+ UDFValue_to_VALUE(&theArg, current_argv, theEnv);
431
+ current_argv++;
432
+ }
433
+ // Call the method on the object with the provided arguments
434
+ VALUE result = rb_method_call(argc, argv, method);
435
+ switch(TYPE(result))
436
+ {
437
+ case T_NIL:
438
+ returnValue->voidValue = VoidConstant(theEnv);
439
+ break;
440
+ case T_OBJECT:
441
+ InstanceBuilder *ib = CreateInstanceBuilder(theEnv, rb_obj_classname(result));
442
+ // set instance properties here
443
+ returnValue->instanceValue = IBMake(ib, NULL);
444
+ IBDispose(ib);
445
+ break;
446
+ case T_CLASS:
447
+ case T_MODULE:
448
+ // return name of object or module so that CLIPS can make objects from it if it wanV
449
+ returnValue->lexemeValue = CreateSymbol(theEnv, rb_class2name(result));
450
+ break;
451
+ case T_FLOAT:
452
+ returnValue->floatValue = CreateFloat(theEnv, NUM2DBL(result));
453
+ break;
454
+ case T_STRING:
455
+ returnValue->lexemeValue = CreateString(theEnv, StringValueCStr(result));
456
+ break;
457
+ case T_REGEXP:
458
+ VALUE r = rb_funcall(result, rb_intern("source"), 0);
459
+ returnValue->lexemeValue = CreateString(theEnv, StringValueCStr(r));
460
+ break;
461
+ case T_ARRAY:
462
+ long length = RARRAY_LEN(result);
463
+
464
+ MultifieldBuilder *mb = CreateMultifieldBuilder(theEnv, length);
465
+ CLIPSValue inner;
466
+ for (int i = 0; i < length; i++)
467
+ {
468
+ inner = VALUE_to_CLIPSValue(rb_ary_entry(result, i), theEnv);
469
+ MBAppend(mb, &inner);
470
+ }
471
+ returnValue->multifieldValue = MBCreate(mb);
472
+
473
+ MBDispose(mb);
474
+ break;
475
+ case T_SYMBOL:
476
+ returnValue->lexemeValue = CreateSymbol(theEnv, rb_id2name(SYM2ID(result)));
477
+ break;
478
+ case T_FIXNUM:
479
+ case T_BIGNUM:
480
+ returnValue->integerValue = CreateInteger(theEnv, NUM2LONG(result));
481
+ break;
482
+ case T_TRUE:
483
+ returnValue->lexemeValue = TrueSymbol(theEnv);
484
+ break;
485
+ case T_FALSE:
486
+ returnValue->lexemeValue = FalseSymbol(theEnv);
487
+ break;
488
+ case T_HASH:
489
+ //printf("Hash with size: %ld\n", RHASH_SIZE(obj));
490
+ printf("Hash cannot be returned to CLIPS :(");
491
+ case T_DATA:
492
+ default:
493
+ // unsupported data type
494
+ WriteString(theEnv,STDERR,"Unsupported data type returned from function\n");
495
+ perror("perror");
496
+ break;
497
+ }
498
+ }
499
+
500
+
501
+ static VALUE _clips_environment_add_udf(VALUE environment, VALUE method_name, VALUE clips_function_name) {
502
+ Environment *env;
503
+ TypedData_Get_Struct(environment, Environment, &Environment_type, env);
504
+
505
+ // Look up the method entry for the given method name
506
+ VALUE method = rb_obj_method(environment, method_name);
507
+ if (!method) {
508
+ rb_raise(rb_eNameError, "method '%s' not found", rb_id2name(method_name));
509
+ return Qnil; // Will not be reached due to rb_raise
510
+ }
511
+
512
+ // Determine the arity of the method
513
+ int min_args, max_args;
514
+ int arity = rb_obj_method_arity(environment, SYM2ID(method_name));
515
+
516
+ if (arity >= 0) {
517
+ min_args = max_args = arity;
518
+ } else {
519
+ // Variable number of arguments
520
+ min_args = -(arity + 1);
521
+ max_args = UNBOUNDED;
522
+ }
523
+
524
+ switch (
525
+ AddUDF(env,rb_id2name(SYM2ID(clips_function_name)),"*",min_args,max_args,"*",UDFGenericFunction,"UDFGenericFunction",(void*)method))
526
+ {
527
+ case AUE_MIN_EXCEEDS_MAX_ERROR:
528
+ case AUE_FUNCTION_NAME_IN_USE_ERROR:
529
+ case AUE_INVALID_ARGUMENT_TYPE_ERROR:
530
+ case AUE_INVALID_RETURN_TYPE_ERROR:
531
+ return Qfalse;
532
+ case AUE_NO_ERROR:
533
+ default:
534
+ return Qtrue;
535
+ }
536
+ }
537
+
538
+ static VALUE clips_environment_add_udf(int argc, VALUE *argv, VALUE environment) {
539
+ VALUE method_name, clips_function_name;
540
+
541
+ rb_scan_args(argc, argv, "11", &method_name, &clips_function_name);
542
+
543
+ if (NIL_P(clips_function_name)) {
544
+ clips_function_name = method_name;
545
+ }
546
+
547
+ return _clips_environment_add_udf(environment, method_name, clips_function_name);
548
+ }
549
+
550
+ static VALUE clips_environment_static_add_udf(int argc, VALUE *argv, VALUE klass) {
551
+ VALUE environment, method_name, clips_function_name;
552
+
553
+ rb_scan_args(argc, argv, "21", &environment, &method_name, &clips_function_name);
554
+
555
+ if (NIL_P(clips_function_name)) {
556
+ clips_function_name = method_name;
557
+ }
558
+
559
+ return _clips_environment_add_udf(environment, method_name, clips_function_name);
560
+ }
561
+
562
+ static VALUE clips_environment_run(int argc, VALUE *argv, VALUE environment) {
563
+ VALUE integer;
564
+ Environment *env;
565
+
566
+ rb_scan_args(argc, argv, "01", &integer);
567
+ if (NIL_P(integer)) {
568
+ integer = INT2NUM(-1);
569
+ }
570
+
571
+ TypedData_Get_Struct(environment, Environment, &Environment_type, env);
572
+
573
+ return NUM2INT(Run(env, NUM2INT(integer)));
574
+ }
575
+
576
+ static VALUE clips_environment_static_run(int argc, VALUE *argv, VALUE klass) {
577
+ VALUE environment, integer;
578
+ Environment *env;
579
+
580
+ rb_scan_args(argc, argv, "11", &environment, &integer);
581
+ if (NIL_P(integer)) {
582
+ integer = INT2NUM(-1);
583
+ }
584
+
585
+ TypedData_Get_Struct(environment, Environment, &Environment_type, env);
586
+
587
+ return NUM2INT(Run(env, NUM2INT(integer)));
588
+ }
589
+
590
+ void Init_clipsruby(void)
591
+ {
592
+ VALUE rbCLIPS = rb_define_module("CLIPS");
593
+ rb_define_module_function(rbCLIPS, "create_environment", create_environment, 0);
594
+
595
+ VALUE rbEnvironment = rb_define_class_under(rbCLIPS, "Environment", rb_cObject);
596
+ rb_define_alloc_func(rbEnvironment, environment_alloc);
597
+ rb_define_singleton_method(rbEnvironment, "assert_string", clips_environment_static_assert_string, 2);
598
+ rb_define_method(rbEnvironment, "assert_string", clips_environment_assert_string, 1);
599
+ rb_define_singleton_method(rbEnvironment, "facts", clips_environment_static_facts, 1);
600
+ rb_define_method(rbEnvironment, "facts", clips_environment_facts, 0);
601
+ rb_define_singleton_method(rbEnvironment, "assert_hash", clips_environment_static_assert_hash, 3);
602
+ rb_define_method(rbEnvironment, "assert_hash", clips_environment_assert_hash, 2);
603
+ rb_define_singleton_method(rbEnvironment, "build", clips_environment_static_build, 2);
604
+ rb_define_method(rbEnvironment, "build", clips_environment_build, 1);
605
+ rb_define_singleton_method(rbEnvironment, "add_udf", clips_environment_static_add_udf, -1);
606
+ rb_define_method(rbEnvironment, "add_udf", clips_environment_add_udf, -1);
607
+ rb_define_singleton_method(rbEnvironment, "run", clips_environment_static_run, -1);
608
+ rb_define_method(rbEnvironment, "run", clips_environment_run, -1);
609
+
610
+ VALUE rbFact = rb_define_class_under(rbEnvironment, "Fact", rb_cObject);
611
+ rb_define_singleton_method(rbFact, "deftemplate_name", clips_environment_fact_static_deftemplate_name, 1);
612
+ rb_define_method(rbFact, "deftemplate_name", clips_environment_fact_deftemplate_name, 0);
613
+ /*
614
+ rb_define_singleton_method(rbFact, "to_h", clips_environment_fact_static_to_h, 1);
615
+ rb_define_method(rbFact, "to_h", clips_environment_fact_to_h, 0);
616
+ */
617
+
618
+ VALUE rbInstance = rb_define_class_under(rbEnvironment, "Instance", rb_cObject);
619
+ }