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,94 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/01/16 */
5
+ /* */
6
+ /* BLOAD HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Gary D. Riley */
14
+ /* Brian L. Dantes */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* */
18
+ /* Revision History: */
19
+ /* */
20
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
21
+ /* */
22
+ /* 6.30: Borland C (IBM_TBC) and Metrowerks CodeWarrior */
23
+ /* (MAC_MCW, IBM_MCW) are no longer supported. */
24
+ /* */
25
+ /* Changed integer type/precision. */
26
+ /* */
27
+ /* Added const qualifiers to remove C++ */
28
+ /* deprecation warnings. */
29
+ /* */
30
+ /* Converted API macros to function calls. */
31
+ /* */
32
+ /* 6.31: Data sizes written to binary files for */
33
+ /* validation when loaded. */
34
+ /* */
35
+ /* 6.40: Removed LOCALE definition. */
36
+ /* */
37
+ /* Pragma once and other inclusion changes. */
38
+ /* */
39
+ /* Added support for booleans with <stdbool.h>. */
40
+ /* */
41
+ /* Removed use of void pointers for specific */
42
+ /* data structures. */
43
+ /* */
44
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
45
+ /* */
46
+ /* UDF redesign. */
47
+ /* */
48
+ /*************************************************************/
49
+
50
+ #ifndef _H_bload
51
+
52
+ #pragma once
53
+
54
+ #define _H_bload
55
+
56
+ #include "utility.h"
57
+ #include "extnfunc.h"
58
+ #include "exprnbin.h"
59
+ #include "symbol.h"
60
+ #include "sysdep.h"
61
+ #include "symblbin.h"
62
+
63
+ #define BLOAD_DATA 38
64
+
65
+ struct bloadData
66
+ {
67
+ const char *BinaryPrefixID;
68
+ const char *BinaryVersionID;
69
+ char *BinarySizes;
70
+ struct functionDefinition **FunctionArray;
71
+ bool BloadActive;
72
+ struct voidCallFunctionItem *BeforeBloadFunctions;
73
+ struct voidCallFunctionItem *AfterBloadFunctions;
74
+ struct boolCallFunctionItem *ClearBloadReadyFunctions;
75
+ struct voidCallFunctionItem *AbortBloadFunctions;
76
+ };
77
+
78
+ #define BloadData(theEnv) ((struct bloadData *) GetEnvironmentData(theEnv,BLOAD_DATA))
79
+
80
+ #define FunctionPointer(i) ((((i) == ULONG_MAX) ? NULL : BloadData(theEnv)->FunctionArray[i]))
81
+
82
+ void InitializeBloadData(Environment *);
83
+ void BloadCommand(Environment *,UDFContext *,UDFValue *);
84
+ bool Bload(Environment *,const char *);
85
+ void BloadandRefresh(Environment *,unsigned long,size_t,void (*)(Environment *,void *,unsigned long));
86
+ bool Bloaded(Environment *);
87
+ void AddBeforeBloadFunction(Environment *,const char *,VoidCallFunction *,int,void *);
88
+ void AddAfterBloadFunction(Environment *,const char *,VoidCallFunction *,int,void *);
89
+ void AddClearBloadReadyFunction(Environment *,const char *,BoolCallFunction *,int,void *);
90
+ void AddAbortBloadFunction(Environment *,const char *,VoidCallFunction *,int,void *);
91
+ void CannotLoadWithBloadMessage(Environment *,const char *);
92
+
93
+ #endif
94
+
@@ -0,0 +1,557 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 01/29/18 */
5
+ /* */
6
+ /* BASIC MATH FUNCTIONS MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Contains the code for numerous basic math */
11
+ /* functions including +, *, -, /, integer, float, div, */
12
+ /* abs,set-auto-float-dividend, get-auto-float-dividend, */
13
+ /* min, and max. */
14
+ /* */
15
+ /* Principal Programmer(s): */
16
+ /* Gary D. Riley */
17
+ /* */
18
+ /* Contributing Programmer(s): */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
23
+ /* */
24
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
25
+ /* */
26
+ /* 6.30: Support for long long integers. */
27
+ /* */
28
+ /* Converted API macros to function calls. */
29
+ /* */
30
+ /* 6.31: Fix for overflow error in div function. */
31
+ /* */
32
+ /* 6.40: Added Env prefix to GetEvaluationError and */
33
+ /* SetEvaluationError functions. */
34
+ /* */
35
+ /* Added Env prefix to GetHaltExecution and */
36
+ /* SetHaltExecution functions. */
37
+ /* */
38
+ /* Pragma once and other inclusion changes. */
39
+ /* */
40
+ /* Added support for booleans with <stdbool.h>. */
41
+ /* */
42
+ /* Removed use of void pointers for specific */
43
+ /* data structures. */
44
+ /* */
45
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
46
+ /* */
47
+ /* UDF redesign. */
48
+ /* */
49
+ /* Auto-float-dividend always enabled. */
50
+ /* */
51
+ /*************************************************************/
52
+
53
+ #include <stdio.h>
54
+
55
+ #include "setup.h"
56
+
57
+ #include "argacces.h"
58
+ #include "envrnmnt.h"
59
+ #include "exprnpsr.h"
60
+ #include "prntutil.h"
61
+ #include "router.h"
62
+
63
+ #include "bmathfun.h"
64
+
65
+ /***************************************************************/
66
+ /* BasicMathFunctionDefinitions: Defines basic math functions. */
67
+ /***************************************************************/
68
+ void BasicMathFunctionDefinitions(
69
+ Environment *theEnv)
70
+ {
71
+ #if ! RUN_TIME
72
+ AddUDF(theEnv,"+","ld",2,UNBOUNDED,"ld",AdditionFunction,"AdditionFunction",NULL);
73
+ AddUDF(theEnv,"*","ld",2,UNBOUNDED,"ld",MultiplicationFunction,"MultiplicationFunction",NULL);
74
+ AddUDF(theEnv,"-","ld",2,UNBOUNDED,"ld",SubtractionFunction,"SubtractionFunction",NULL);
75
+ AddUDF(theEnv,"/","d",2,UNBOUNDED,"ld",DivisionFunction,"DivisionFunction",NULL);
76
+ AddUDF(theEnv,"div","l",2,UNBOUNDED,"ld",DivFunction,"DivFunction",NULL);
77
+ AddUDF(theEnv,"integer","l",1,1,"ld",IntegerFunction,"IntegerFunction",NULL);
78
+ AddUDF(theEnv,"float","d",1,1,"ld",FloatFunction,"FloatFunction",NULL);
79
+ AddUDF(theEnv,"abs","ld",1,1,"ld",AbsFunction,"AbsFunction",NULL);
80
+ AddUDF(theEnv,"min","ld",1,UNBOUNDED,"ld",MinFunction,"MinFunction",NULL);
81
+ AddUDF(theEnv,"max","ld",1,UNBOUNDED,"ld",MaxFunction,"MaxFunction",NULL);
82
+ #endif
83
+ }
84
+
85
+ /**********************************/
86
+ /* AdditionFunction: H/L access */
87
+ /* routine for the + function. */
88
+ /**********************************/
89
+ void AdditionFunction(
90
+ Environment *theEnv,
91
+ UDFContext *context,
92
+ UDFValue *returnValue)
93
+ {
94
+ double ftotal = 0.0;
95
+ long long ltotal = 0LL;
96
+ bool useFloatTotal = false;
97
+ UDFValue theArg;
98
+
99
+ /*=================================================*/
100
+ /* Loop through each of the arguments adding it to */
101
+ /* a running total. If a floating point number is */
102
+ /* encountered, then do all subsequent operations */
103
+ /* using floating point values. */
104
+ /*=================================================*/
105
+
106
+ while (UDFHasNextArgument(context))
107
+ {
108
+ if (! UDFNextArgument(context,NUMBER_BITS,&theArg))
109
+ { return; }
110
+
111
+ if (useFloatTotal)
112
+ { ftotal += CVCoerceToFloat(&theArg); }
113
+ else
114
+ {
115
+ if (CVIsType(&theArg,INTEGER_BIT))
116
+ { ltotal += theArg.integerValue->contents; }
117
+ else
118
+ {
119
+ ftotal = (double) ltotal + CVCoerceToFloat(&theArg);
120
+ useFloatTotal = true;
121
+ }
122
+ }
123
+ }
124
+
125
+ /*======================================================*/
126
+ /* If a floating point number was in the argument list, */
127
+ /* then return a float, otherwise return an integer. */
128
+ /*======================================================*/
129
+
130
+ if (useFloatTotal)
131
+ { returnValue->floatValue = CreateFloat(theEnv,ftotal); }
132
+ else
133
+ { returnValue->integerValue = CreateInteger(theEnv,ltotal); }
134
+ }
135
+
136
+ /****************************************/
137
+ /* MultiplicationFunction: CLIPS access */
138
+ /* routine for the * function. */
139
+ /****************************************/
140
+ void MultiplicationFunction(
141
+ Environment *theEnv,
142
+ UDFContext *context,
143
+ UDFValue *returnValue)
144
+ {
145
+ double ftotal = 1.0;
146
+ long long ltotal = 1LL;
147
+ bool useFloatTotal = false;
148
+ UDFValue theArg;
149
+
150
+ /*===================================================*/
151
+ /* Loop through each of the arguments multiplying it */
152
+ /* by a running product. If a floating point number */
153
+ /* is encountered, then do all subsequent operations */
154
+ /* using floating point values. */
155
+ /*===================================================*/
156
+
157
+ while (UDFHasNextArgument(context))
158
+ {
159
+ if (! UDFNextArgument(context,NUMBER_BITS,&theArg))
160
+ { return; }
161
+
162
+ if (useFloatTotal)
163
+ { ftotal *= CVCoerceToFloat(&theArg); }
164
+ else
165
+ {
166
+ if (CVIsType(&theArg,INTEGER_BIT))
167
+ { ltotal *= theArg.integerValue->contents; }
168
+ else
169
+ {
170
+ ftotal = (double) ltotal * CVCoerceToFloat(&theArg);
171
+ useFloatTotal = true;
172
+ }
173
+ }
174
+ }
175
+
176
+ /*======================================================*/
177
+ /* If a floating point number was in the argument list, */
178
+ /* then return a float, otherwise return an integer. */
179
+ /*======================================================*/
180
+
181
+ if (useFloatTotal)
182
+ { returnValue->floatValue = CreateFloat(theEnv,ftotal); }
183
+ else
184
+ { returnValue->integerValue = CreateInteger(theEnv,ltotal); }
185
+ }
186
+
187
+ /*************************************/
188
+ /* SubtractionFunction: CLIPS access */
189
+ /* routine for the - function. */
190
+ /*************************************/
191
+ void SubtractionFunction(
192
+ Environment *theEnv,
193
+ UDFContext *context,
194
+ UDFValue *returnValue)
195
+ {
196
+ double ftotal = 0.0;
197
+ long long ltotal = 0LL;
198
+ bool useFloatTotal = false;
199
+ UDFValue theArg;
200
+
201
+ /*=================================================*/
202
+ /* Get the first argument. This number which will */
203
+ /* be the starting total from which all subsequent */
204
+ /* arguments will subtracted. */
205
+ /*=================================================*/
206
+
207
+ if (! UDFFirstArgument(context,NUMBER_BITS,&theArg))
208
+ { return; }
209
+
210
+ if (CVIsType(&theArg,INTEGER_BIT))
211
+ { ltotal = theArg.integerValue->contents; }
212
+ else
213
+ {
214
+ ftotal = CVCoerceToFloat(&theArg);
215
+ useFloatTotal = true;
216
+ }
217
+
218
+ /*===================================================*/
219
+ /* Loop through each of the arguments subtracting it */
220
+ /* from a running total. If a floating point number */
221
+ /* is encountered, then do all subsequent operations */
222
+ /* using floating point values. */
223
+ /*===================================================*/
224
+
225
+ while (UDFHasNextArgument(context))
226
+ {
227
+ if (! UDFNextArgument(context,NUMBER_BITS,&theArg))
228
+ { return; }
229
+
230
+ if (useFloatTotal)
231
+ { ftotal -= CVCoerceToFloat(&theArg); }
232
+ else
233
+ {
234
+ if (CVIsType(&theArg,INTEGER_BIT))
235
+ { ltotal -= theArg.integerValue->contents; }
236
+ else
237
+ {
238
+ ftotal = (double) ltotal - theArg.floatValue->contents;
239
+ useFloatTotal = true;
240
+ }
241
+ }
242
+ }
243
+
244
+ /*======================================================*/
245
+ /* If a floating point number was in the argument list, */
246
+ /* then return a float, otherwise return an integer. */
247
+ /*======================================================*/
248
+
249
+ if (useFloatTotal)
250
+ { returnValue->floatValue = CreateFloat(theEnv,ftotal); }
251
+ else
252
+ { returnValue->integerValue = CreateInteger(theEnv,ltotal); }
253
+ }
254
+
255
+ /***********************************/
256
+ /* DivisionFunction: CLIPS access */
257
+ /* routine for the / function. */
258
+ /***********************************/
259
+ void DivisionFunction(
260
+ Environment *theEnv,
261
+ UDFContext *context,
262
+ UDFValue *returnValue)
263
+ {
264
+ double ftotal = 1.0;
265
+ double theNumber;
266
+ UDFValue theArg;
267
+
268
+ /*===================================================*/
269
+ /* Get the first argument. This number which will be */
270
+ /* the starting product from which all subsequent */
271
+ /* arguments will divide. If the auto float dividend */
272
+ /* feature is enable, then this number is converted */
273
+ /* to a float if it is an integer. */
274
+ /*===================================================*/
275
+
276
+ if (! UDFFirstArgument(context,NUMBER_BITS,&theArg))
277
+ { return; }
278
+
279
+ ftotal = CVCoerceToFloat(&theArg);
280
+
281
+ /*====================================================*/
282
+ /* Loop through each of the arguments dividing it */
283
+ /* into a running product. If a floating point number */
284
+ /* is encountered, then do all subsequent operations */
285
+ /* using floating point values. Each argument is */
286
+ /* checked to prevent a divide by zero error. */
287
+ /*====================================================*/
288
+
289
+ while (UDFHasNextArgument(context))
290
+ {
291
+ if (! UDFNextArgument(context,NUMBER_BITS,&theArg))
292
+ { return; }
293
+
294
+ theNumber = CVCoerceToFloat(&theArg);
295
+
296
+ if (theNumber == 0.0)
297
+ {
298
+ DivideByZeroErrorMessage(theEnv,"/");
299
+ SetEvaluationError(theEnv,true);
300
+ returnValue->floatValue = CreateFloat(theEnv,1.0);
301
+ return;
302
+ }
303
+
304
+ ftotal /= theNumber;
305
+ }
306
+
307
+ /*======================================================*/
308
+ /* If a floating point number was in the argument list, */
309
+ /* then return a float, otherwise return an integer. */
310
+ /*======================================================*/
311
+
312
+ returnValue->floatValue = CreateFloat(theEnv,ftotal);
313
+ }
314
+
315
+ /*************************************/
316
+ /* DivFunction: H/L access routine */
317
+ /* for the div function. */
318
+ /*************************************/
319
+ void DivFunction(
320
+ Environment *theEnv,
321
+ UDFContext *context,
322
+ UDFValue *returnValue)
323
+ {
324
+ long long total = 1LL;
325
+ UDFValue theArg;
326
+ long long theNumber;
327
+
328
+ /*===================================================*/
329
+ /* Get the first argument. This number which will be */
330
+ /* the starting product from which all subsequent */
331
+ /* arguments will divide. */
332
+ /*===================================================*/
333
+
334
+ if (! UDFFirstArgument(context,NUMBER_BITS,&theArg))
335
+ { return; }
336
+ total = CVCoerceToInteger(&theArg);
337
+
338
+ /*=====================================================*/
339
+ /* Loop through each of the arguments dividing it into */
340
+ /* a running product. Floats are converted to integers */
341
+ /* and each argument is checked to prevent a divide by */
342
+ /* zero error. */
343
+ /*=====================================================*/
344
+
345
+ while (UDFHasNextArgument(context))
346
+ {
347
+ if (! UDFNextArgument(context,NUMBER_BITS,&theArg))
348
+ { return; }
349
+
350
+ theNumber = CVCoerceToInteger(&theArg);
351
+
352
+ if (theNumber == 0LL)
353
+ {
354
+ DivideByZeroErrorMessage(theEnv,"div");
355
+ SetEvaluationError(theEnv,true);
356
+ returnValue->integerValue = CreateInteger(theEnv,1L);
357
+ return;
358
+ }
359
+
360
+ if ((total == LLONG_MIN) && (theNumber == -1))
361
+ {
362
+ ArgumentOverUnderflowErrorMessage(theEnv,"div",true);
363
+ SetEvaluationError(theEnv,true);
364
+ returnValue->integerValue = CreateInteger(theEnv,1L);
365
+ return;
366
+ }
367
+
368
+ total /= theNumber;
369
+ }
370
+
371
+ /*======================================================*/
372
+ /* The result of the div function is always an integer. */
373
+ /*======================================================*/
374
+
375
+ returnValue->integerValue = CreateInteger(theEnv,total);
376
+ }
377
+
378
+ /*****************************************/
379
+ /* IntegerFunction: H/L access routine */
380
+ /* for the integer function. */
381
+ /*****************************************/
382
+ void IntegerFunction(
383
+ Environment *theEnv,
384
+ UDFContext *context,
385
+ UDFValue *returnValue)
386
+ {
387
+ /*======================================*/
388
+ /* Check that the argument is a number. */
389
+ /*======================================*/
390
+
391
+ if (! UDFNthArgument(context,1,NUMBER_BITS,returnValue))
392
+ { return; }
393
+
394
+ /*============================================*/
395
+ /* Convert a float type to integer, otherwise */
396
+ /* return the argument unchanged. */
397
+ /*============================================*/
398
+
399
+ if (CVIsType(returnValue,FLOAT_BIT))
400
+ { returnValue->integerValue = CreateInteger(theEnv,CVCoerceToInteger(returnValue)); }
401
+ }
402
+
403
+ /***************************************/
404
+ /* FloatFunction: H/L access routine */
405
+ /* for the float function. */
406
+ /***************************************/
407
+ void FloatFunction(
408
+ Environment *theEnv,
409
+ UDFContext *context,
410
+ UDFValue *returnValue)
411
+ {
412
+ /*======================================*/
413
+ /* Check that the argument is a number. */
414
+ /*======================================*/
415
+
416
+ if (! UDFNthArgument(context,1,NUMBER_BITS,returnValue))
417
+ { return; }
418
+
419
+ /*=============================================*/
420
+ /* Convert an integer type to float, otherwise */
421
+ /* return the argument unchanged. */
422
+ /*=============================================*/
423
+
424
+ if (CVIsType(returnValue,INTEGER_BIT))
425
+ { returnValue->floatValue = CreateFloat(theEnv,CVCoerceToFloat(returnValue)); }
426
+ }
427
+
428
+ /*************************************/
429
+ /* AbsFunction: H/L access routine */
430
+ /* for the abs function. */
431
+ /*************************************/
432
+ void AbsFunction(
433
+ Environment *theEnv,
434
+ UDFContext *context,
435
+ UDFValue *returnValue)
436
+ {
437
+ /*======================================*/
438
+ /* Check that the argument is a number. */
439
+ /*======================================*/
440
+
441
+ if (! UDFNthArgument(context,1,NUMBER_BITS,returnValue))
442
+ { return; }
443
+
444
+ /*==========================================*/
445
+ /* Return the absolute value of the number. */
446
+ /*==========================================*/
447
+
448
+ if (CVIsType(returnValue,INTEGER_BIT))
449
+ {
450
+ long long lv = returnValue->integerValue->contents;
451
+ if (lv < 0L)
452
+ { returnValue->integerValue = CreateInteger(theEnv,-lv); }
453
+ }
454
+ else
455
+ {
456
+ double dv = returnValue->floatValue->contents;
457
+ if (dv < 0.0)
458
+ { returnValue->floatValue = CreateFloat(theEnv,-dv); }
459
+ }
460
+ }
461
+
462
+ /*************************************/
463
+ /* MinFunction: H/L access routine */
464
+ /* for the min function. */
465
+ /*************************************/
466
+ void MinFunction(
467
+ Environment *theEnv,
468
+ UDFContext *context,
469
+ UDFValue *returnValue)
470
+ {
471
+ UDFValue nextPossible;
472
+
473
+ /*============================================*/
474
+ /* Check that the first argument is a number. */
475
+ /*============================================*/
476
+
477
+ if (! UDFFirstArgument(context,NUMBER_BITS,returnValue))
478
+ { return; }
479
+
480
+ /*===========================================================*/
481
+ /* Loop through the remaining arguments, first checking each */
482
+ /* argument to see that it is a number, and then determining */
483
+ /* if the argument is less than the previous arguments and */
484
+ /* is thus the minimum value. */
485
+ /*===========================================================*/
486
+
487
+ while (UDFHasNextArgument(context))
488
+ {
489
+ if (! UDFNextArgument(context,NUMBER_BITS,&nextPossible))
490
+ { return; }
491
+
492
+ /*=============================================*/
493
+ /* If either argument is a float, convert both */
494
+ /* to floats. Otherwise compare two integers. */
495
+ /*=============================================*/
496
+
497
+ if (CVIsType(returnValue,FLOAT_BIT) || CVIsType(&nextPossible,FLOAT_BIT))
498
+ {
499
+ if (CVCoerceToFloat(returnValue) > CVCoerceToFloat(&nextPossible))
500
+ { returnValue->value = nextPossible.value; }
501
+ }
502
+ else
503
+ {
504
+ if (returnValue->integerValue->contents > nextPossible.integerValue->contents)
505
+ { returnValue->value = nextPossible.value; }
506
+ }
507
+ }
508
+ }
509
+
510
+ /*************************************/
511
+ /* MaxFunction: H/L access routine */
512
+ /* for the max function. */
513
+ /*************************************/
514
+ void MaxFunction(
515
+ Environment *theEnv,
516
+ UDFContext *context,
517
+ UDFValue *returnValue)
518
+ {
519
+ UDFValue nextPossible;
520
+
521
+ /*============================================*/
522
+ /* Check that the first argument is a number. */
523
+ /*============================================*/
524
+
525
+ if (! UDFFirstArgument(context,NUMBER_BITS,returnValue))
526
+ { return; }
527
+
528
+ /*===========================================================*/
529
+ /* Loop through the remaining arguments, first checking each */
530
+ /* argument to see that it is a number, and then determining */
531
+ /* if the argument is greater than the previous arguments */
532
+ /* and is thus the maximum value. */
533
+ /*===========================================================*/
534
+
535
+ while (UDFHasNextArgument(context))
536
+ {
537
+ if (! UDFNextArgument(context,NUMBER_BITS,&nextPossible))
538
+ { return; }
539
+
540
+ /*=============================================*/
541
+ /* If either argument is a float, convert both */
542
+ /* to floats. Otherwise compare two integers. */
543
+ /*=============================================*/
544
+
545
+ if (CVIsType(returnValue,FLOAT_BIT) || CVIsType(&nextPossible,FLOAT_BIT))
546
+ {
547
+ if (CVCoerceToFloat(returnValue) < CVCoerceToFloat(&nextPossible))
548
+ { returnValue->value = nextPossible.value; }
549
+ }
550
+ else
551
+ {
552
+ if (returnValue->integerValue->contents < nextPossible.integerValue->contents)
553
+ { returnValue->value = nextPossible.value; }
554
+ }
555
+ }
556
+ }
557
+