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,66 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/25/16 */
5
+ /* */
6
+ /* BASIC MATH FUNCTIONS MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Gary D. Riley */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
20
+ /* */
21
+ /* 6.30: Support for long long integers. */
22
+ /* */
23
+ /* Converted API macros to function calls. */
24
+ /* */
25
+ /* 6.40: Removed LOCALE definition. */
26
+ /* */
27
+ /* Pragma once and other inclusion changes. */
28
+ /* */
29
+ /* Added support for booleans with <stdbool.h>. */
30
+ /* */
31
+ /* Removed use of void pointers for specific */
32
+ /* data structures. */
33
+ /* */
34
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
35
+ /* */
36
+ /* UDF redesign. */
37
+ /* */
38
+ /* Auto-float-dividend always enabled. */
39
+ /* */
40
+ /*************************************************************/
41
+
42
+ #ifndef _H_bmathfun
43
+
44
+ #pragma once
45
+
46
+ #define _H_bmathfun
47
+
48
+ #include "evaluatn.h"
49
+
50
+ void BasicMathFunctionDefinitions(Environment *);
51
+ void AdditionFunction(Environment *,UDFContext *,UDFValue *);
52
+ void MultiplicationFunction(Environment *,UDFContext *,UDFValue *);
53
+ void SubtractionFunction(Environment *,UDFContext *,UDFValue *);
54
+ void DivisionFunction(Environment *,UDFContext *,UDFValue *);
55
+ void DivFunction(Environment *,UDFContext *,UDFValue *);
56
+ void IntegerFunction(Environment *,UDFContext *,UDFValue *);
57
+ void FloatFunction(Environment *,UDFContext *,UDFValue *);
58
+ void AbsFunction(Environment *,UDFContext *,UDFValue *);
59
+ void MinFunction(Environment *,UDFContext *,UDFValue *);
60
+ void MaxFunction(Environment *,UDFContext *,UDFValue *);
61
+
62
+ #endif
63
+
64
+
65
+
66
+
@@ -0,0 +1,634 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/04/17 */
5
+ /* */
6
+ /* BSAVE MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides core routines for saving constructs to */
11
+ /* a binary file. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* Brian L. Dantes */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
22
+ /* */
23
+ /* Added environment parameter to GenClose. */
24
+ /* Added environment parameter to GenOpen. */
25
+ /* */
26
+ /* 6.30: Changed integer type/precision. */
27
+ /* */
28
+ /* Used genstrncpy instead of strncpy. */
29
+ /* */
30
+ /* Borland C (IBM_TBC) and Metrowerks CodeWarrior */
31
+ /* (MAC_MCW, IBM_MCW) are no longer supported. */
32
+ /* */
33
+ /* Added const qualifiers to remove C++ */
34
+ /* deprecation warnings. */
35
+ /* */
36
+ /* Converted API macros to function calls. */
37
+ /* */
38
+ /* 6.31: Data sizes written to binary files for */
39
+ /* validation when loaded. */
40
+ /* */
41
+ /* 6.40: Pragma once and other inclusion changes. */
42
+ /* */
43
+ /* Added support for booleans with <stdbool.h>. */
44
+ /* */
45
+ /* Removed use of void pointers for specific */
46
+ /* data structures. */
47
+ /* */
48
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
49
+ /* */
50
+ /* UDF redesign. */
51
+ /* */
52
+ /*************************************************************/
53
+
54
+ #include "setup.h"
55
+
56
+ #include "argacces.h"
57
+ #include "bload.h"
58
+ #include "cstrnbin.h"
59
+ #include "envrnmnt.h"
60
+ #include "exprnpsr.h"
61
+ #include "memalloc.h"
62
+ #include "moduldef.h"
63
+ #include "prntutil.h"
64
+ #include "router.h"
65
+ #include "symblbin.h"
66
+
67
+ #include "bsave.h"
68
+
69
+ /***************************************/
70
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
71
+ /***************************************/
72
+
73
+ #if BLOAD_AND_BSAVE
74
+ static void FindNeededItems(Environment *);
75
+ static void InitializeFunctionNeededFlags(Environment *);
76
+ static void WriteNeededFunctions(Environment *,FILE *);
77
+ static size_t FunctionBinarySize(Environment *);
78
+ static void WriteBinaryHeader(Environment *,FILE *);
79
+ static void WriteBinaryFooter(Environment *,FILE *);
80
+ #endif
81
+ static void DeallocateBsaveData(Environment *);
82
+
83
+ /**********************************************/
84
+ /* InitializeBsaveData: Allocates environment */
85
+ /* data for the bsave command. */
86
+ /**********************************************/
87
+ void InitializeBsaveData(
88
+ Environment *theEnv)
89
+ {
90
+ AllocateEnvironmentData(theEnv,BSAVE_DATA,sizeof(struct bsaveData),DeallocateBsaveData);
91
+ }
92
+
93
+ /************************************************/
94
+ /* DeallocateBsaveData: Deallocates environment */
95
+ /* data for the bsave command. */
96
+ /************************************************/
97
+ static void DeallocateBsaveData(
98
+ Environment *theEnv)
99
+ {
100
+ struct BinaryItem *tmpPtr, *nextPtr;
101
+
102
+ tmpPtr = BsaveData(theEnv)->ListOfBinaryItems;
103
+ while (tmpPtr != NULL)
104
+ {
105
+ nextPtr = tmpPtr->next;
106
+ rtn_struct(theEnv,BinaryItem,tmpPtr);
107
+ tmpPtr = nextPtr;
108
+ }
109
+ }
110
+
111
+ /**************************************/
112
+ /* BsaveCommand: H/L access routine */
113
+ /* for the bsave command. */
114
+ /**************************************/
115
+ void BsaveCommand(
116
+ Environment *theEnv,
117
+ UDFContext *context,
118
+ UDFValue *returnValue)
119
+ {
120
+ #if (! RUN_TIME) && BLOAD_AND_BSAVE
121
+ const char *fileName;
122
+
123
+ fileName = GetFileName(context);
124
+ if (fileName != NULL)
125
+ {
126
+ if (Bsave(theEnv,fileName))
127
+ {
128
+ returnValue->lexemeValue = TrueSymbol(theEnv);
129
+ return;
130
+ }
131
+ }
132
+ #else
133
+ #if MAC_XCD
134
+ #pragma unused(theEnv,context)
135
+ #endif
136
+ #endif
137
+ returnValue->lexemeValue = FalseSymbol(theEnv);
138
+ }
139
+
140
+ #if BLOAD_AND_BSAVE
141
+
142
+ /****************************/
143
+ /* Bsave: C access routine */
144
+ /* for the bsave command. */
145
+ /****************************/
146
+ bool Bsave(
147
+ Environment *theEnv,
148
+ const char *fileName)
149
+ {
150
+ FILE *fp;
151
+ struct BinaryItem *biPtr;
152
+ char constructBuffer[CONSTRUCT_HEADER_SIZE];
153
+ unsigned long saveExpressionCount;
154
+
155
+ /*=====================================*/
156
+ /* If embedded, clear the error flags. */
157
+ /*=====================================*/
158
+
159
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
160
+ { ResetErrorFlags(theEnv); }
161
+
162
+ /*===================================*/
163
+ /* A bsave can't occur when a binary */
164
+ /* image is already loaded. */
165
+ /*===================================*/
166
+
167
+ if (Bloaded(theEnv))
168
+ {
169
+ PrintErrorID(theEnv,"BSAVE",1,false);
170
+ WriteString(theEnv,STDERR,
171
+ "Cannot perform a binary save while a binary load is in effect.\n");
172
+ return false;
173
+ }
174
+
175
+ /*================*/
176
+ /* Open the file. */
177
+ /*================*/
178
+
179
+ if ((fp = GenOpen(theEnv,fileName,"wb")) == NULL)
180
+ {
181
+ OpenErrorMessage(theEnv,"bsave",fileName);
182
+ return false;
183
+ }
184
+
185
+ /*==============================*/
186
+ /* Remember the current module. */
187
+ /*==============================*/
188
+
189
+ SaveCurrentModule(theEnv);
190
+
191
+ /*==================================*/
192
+ /* Write binary header to the file. */
193
+ /*==================================*/
194
+
195
+ WriteBinaryHeader(theEnv,fp);
196
+
197
+ /*===========================================*/
198
+ /* Initialize count variables, index values, */
199
+ /* and determine some of the data structures */
200
+ /* which need to be saved. */
201
+ /*===========================================*/
202
+
203
+ ExpressionData(theEnv)->ExpressionCount = 0;
204
+ InitializeFunctionNeededFlags(theEnv);
205
+ InitAtomicValueNeededFlags(theEnv);
206
+ FindHashedExpressions(theEnv);
207
+ FindNeededItems(theEnv);
208
+ SetAtomicValueIndices(theEnv,false);
209
+
210
+ /*===============================*/
211
+ /* Save the functions and atoms. */
212
+ /*===============================*/
213
+
214
+ WriteNeededFunctions(theEnv,fp);
215
+ WriteNeededAtomicValues(theEnv,fp);
216
+
217
+ /*=========================================*/
218
+ /* Write out the number of expression data */
219
+ /* structures in the binary image. */
220
+ /*=========================================*/
221
+
222
+ GenWrite(&ExpressionData(theEnv)->ExpressionCount,sizeof(unsigned long),fp);
223
+
224
+ /*===========================================*/
225
+ /* Save the numbers indicating the amount of */
226
+ /* memory needed to bload the constructs. */
227
+ /*===========================================*/
228
+
229
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
230
+ biPtr != NULL;
231
+ biPtr = biPtr->next)
232
+ {
233
+ if (biPtr->bsaveStorageFunction != NULL)
234
+ {
235
+ genstrncpy(constructBuffer,biPtr->name,CONSTRUCT_HEADER_SIZE);
236
+ GenWrite(constructBuffer,CONSTRUCT_HEADER_SIZE,fp);
237
+ (*biPtr->bsaveStorageFunction)(theEnv,fp);
238
+ }
239
+ }
240
+
241
+ /*====================================*/
242
+ /* Write a binary footer to the file. */
243
+ /*====================================*/
244
+
245
+ WriteBinaryFooter(theEnv,fp);
246
+
247
+ /*===================*/
248
+ /* Save expressions. */
249
+ /*===================*/
250
+
251
+ ExpressionData(theEnv)->ExpressionCount = 0;
252
+ BsaveHashedExpressions(theEnv,fp);
253
+ saveExpressionCount = ExpressionData(theEnv)->ExpressionCount;
254
+ BsaveConstructExpressions(theEnv,fp);
255
+ ExpressionData(theEnv)->ExpressionCount = saveExpressionCount;
256
+
257
+ /*===================*/
258
+ /* Save constraints. */
259
+ /*===================*/
260
+
261
+ WriteNeededConstraints(theEnv,fp);
262
+
263
+ /*==================*/
264
+ /* Save constructs. */
265
+ /*==================*/
266
+
267
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
268
+ biPtr != NULL;
269
+ biPtr = biPtr->next)
270
+ {
271
+ if (biPtr->bsaveFunction != NULL)
272
+ {
273
+ genstrncpy(constructBuffer,biPtr->name,CONSTRUCT_HEADER_SIZE);
274
+ GenWrite(constructBuffer,CONSTRUCT_HEADER_SIZE,fp);
275
+ (*biPtr->bsaveFunction)(theEnv,fp);
276
+ }
277
+ }
278
+
279
+ /*===================================*/
280
+ /* Save a binary footer to the file. */
281
+ /*===================================*/
282
+
283
+ WriteBinaryFooter(theEnv,fp);
284
+
285
+ /*===========*/
286
+ /* Clean up. */
287
+ /*===========*/
288
+
289
+ RestoreAtomicValueBuckets(theEnv);
290
+
291
+ /*=================*/
292
+ /* Close the file. */
293
+ /*=================*/
294
+
295
+ GenClose(theEnv,fp);
296
+
297
+ /*=============================*/
298
+ /* Restore the current module. */
299
+ /*=============================*/
300
+
301
+ RestoreCurrentModule(theEnv);
302
+
303
+ /*==================================*/
304
+ /* Return true to indicate success. */
305
+ /*==================================*/
306
+
307
+ return true;
308
+ }
309
+
310
+ /*********************************************/
311
+ /* InitializeFunctionNeededFlags: Marks each */
312
+ /* function in the list of functions as */
313
+ /* being unneeded by this binary image. */
314
+ /*********************************************/
315
+ static void InitializeFunctionNeededFlags(
316
+ Environment *theEnv)
317
+ {
318
+ struct functionDefinition *functionList;
319
+
320
+ for (functionList = GetFunctionList(theEnv);
321
+ functionList != NULL;
322
+ functionList = functionList->next)
323
+ { functionList->neededFunction = false; }
324
+ }
325
+
326
+ /**********************************************************/
327
+ /* FindNeededItems: Searches through the constructs for */
328
+ /* the functions, constraints, or atoms that are needed */
329
+ /* by that construct. This routine also counts the */
330
+ /* number of expressions in use (through a global). */
331
+ /**********************************************************/
332
+ static void FindNeededItems(
333
+ Environment *theEnv)
334
+ {
335
+ struct BinaryItem *biPtr;
336
+
337
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
338
+ biPtr != NULL;
339
+ biPtr = biPtr->next)
340
+ { if (biPtr->findFunction != NULL) (*biPtr->findFunction)(theEnv); }
341
+ }
342
+
343
+ /****************************************************/
344
+ /* WriteNeededFunctions: Writes the names of needed */
345
+ /* functions to the binary save file. */
346
+ /****************************************************/
347
+ static void WriteNeededFunctions(
348
+ Environment *theEnv,
349
+ FILE *fp)
350
+ {
351
+ unsigned long count = 0;
352
+ size_t space, length;
353
+ struct functionDefinition *functionList;
354
+
355
+ /*================================================*/
356
+ /* Assign each function an index if it is needed. */
357
+ /*================================================*/
358
+
359
+ for (functionList = GetFunctionList(theEnv);
360
+ functionList != NULL;
361
+ functionList = functionList->next)
362
+ {
363
+ if (functionList->neededFunction)
364
+ { functionList->bsaveIndex = count++; }
365
+ else
366
+ { functionList->bsaveIndex = ULONG_MAX; }
367
+ }
368
+
369
+ /*===================================================*/
370
+ /* Write the number of function names to be written. */
371
+ /*===================================================*/
372
+
373
+ GenWrite(&count,sizeof(unsigned long),fp);
374
+ if (count == 0)
375
+ {
376
+ GenWrite(&count,sizeof(unsigned long),fp);
377
+ return;
378
+ }
379
+
380
+ /*================================*/
381
+ /* Determine the amount of space */
382
+ /* needed for the function names. */
383
+ /*================================*/
384
+
385
+ space = FunctionBinarySize(theEnv);
386
+ GenWrite(&space,sizeof(unsigned long),fp);
387
+
388
+ /*===============================*/
389
+ /* Write out the function names. */
390
+ /*===============================*/
391
+
392
+ for (functionList = GetFunctionList(theEnv);
393
+ functionList != NULL;
394
+ functionList = functionList->next)
395
+ {
396
+ if (functionList->neededFunction)
397
+ {
398
+ length = strlen(functionList->callFunctionName->contents) + 1;
399
+ GenWrite((void *) functionList->callFunctionName->contents,length,fp);
400
+ }
401
+ }
402
+ }
403
+
404
+ /*********************************************/
405
+ /* FunctionBinarySize: Determines the number */
406
+ /* of bytes needed to save all of the */
407
+ /* function names in the binary save file. */
408
+ /*********************************************/
409
+ static size_t FunctionBinarySize(
410
+ Environment *theEnv)
411
+ {
412
+ size_t size = 0;
413
+ struct functionDefinition *functionList;
414
+
415
+ for (functionList = GetFunctionList(theEnv);
416
+ functionList != NULL;
417
+ functionList = functionList->next)
418
+ {
419
+ if (functionList->neededFunction)
420
+ { size += strlen(functionList->callFunctionName->contents) + 1; }
421
+ }
422
+
423
+ return(size);
424
+ }
425
+
426
+ /***************************************************/
427
+ /* SaveBloadCount: Used to save the data structure */
428
+ /* count values when a binary save command is */
429
+ /* issued when a binary image is loaded. */
430
+ /***************************************************/
431
+ void SaveBloadCount(
432
+ Environment *theEnv,
433
+ unsigned long cnt)
434
+ {
435
+ BLOADCNTSV *tmp, *prv;
436
+
437
+ tmp = get_struct(theEnv,bloadcntsv);
438
+ tmp->val = cnt;
439
+ tmp->nxt = NULL;
440
+
441
+ if (BsaveData(theEnv)->BloadCountSaveTop == NULL)
442
+ { BsaveData(theEnv)->BloadCountSaveTop = tmp; }
443
+ else
444
+ {
445
+ prv = BsaveData(theEnv)->BloadCountSaveTop;
446
+ while (prv->nxt != NULL)
447
+ { prv = prv->nxt; }
448
+ prv->nxt = tmp;
449
+ }
450
+ }
451
+
452
+ /**************************************************/
453
+ /* RestoreBloadCount: Restores the data structure */
454
+ /* count values after a binary save command is */
455
+ /* completed when a binary image is loaded. */
456
+ /**************************************************/
457
+ void RestoreBloadCount(
458
+ Environment *theEnv,
459
+ unsigned long *cnt)
460
+ {
461
+ BLOADCNTSV *tmp;
462
+
463
+ *cnt = BsaveData(theEnv)->BloadCountSaveTop->val;
464
+ tmp = BsaveData(theEnv)->BloadCountSaveTop;
465
+ BsaveData(theEnv)->BloadCountSaveTop = BsaveData(theEnv)->BloadCountSaveTop->nxt;
466
+ rtn_struct(theEnv,bloadcntsv,tmp);
467
+ }
468
+
469
+ /**********************************************/
470
+ /* MarkNeededItems: Examines an expression to */
471
+ /* determine which items are needed to save */
472
+ /* an expression as part of a binary image. */
473
+ /**********************************************/
474
+ void MarkNeededItems(
475
+ Environment *theEnv,
476
+ struct expr *testPtr)
477
+ {
478
+ while (testPtr != NULL)
479
+ {
480
+ switch (testPtr->type)
481
+ {
482
+ case SYMBOL_TYPE:
483
+ case STRING_TYPE:
484
+ case GBL_VARIABLE:
485
+ case INSTANCE_NAME_TYPE:
486
+ testPtr->lexemeValue->neededSymbol = true;
487
+ break;
488
+
489
+ case FLOAT_TYPE:
490
+ testPtr->floatValue->neededFloat = true;
491
+ break;
492
+
493
+ case INTEGER_TYPE:
494
+ testPtr->integerValue->neededInteger = true;
495
+ break;
496
+
497
+ case FCALL:
498
+ testPtr->functionValue->neededFunction = true;
499
+ break;
500
+
501
+ case VOID_TYPE:
502
+ break;
503
+
504
+ default:
505
+ if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type] == NULL) break;
506
+ if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type]->bitMap)
507
+ { ((CLIPSBitMap *) testPtr->value)->neededBitMap = true; }
508
+ break;
509
+
510
+ }
511
+
512
+ if (testPtr->argList != NULL)
513
+ { MarkNeededItems(theEnv,testPtr->argList); }
514
+
515
+ testPtr = testPtr->nextArg;
516
+ }
517
+ }
518
+
519
+ /******************************************************/
520
+ /* WriteBinaryHeader: Writes a binary header used for */
521
+ /* verification when a binary image is loaded. */
522
+ /******************************************************/
523
+ static void WriteBinaryHeader(
524
+ Environment *theEnv,
525
+ FILE *fp)
526
+ {
527
+ GenWrite((void *) BloadData(theEnv)->BinaryPrefixID,strlen(BloadData(theEnv)->BinaryPrefixID) + 1,fp);
528
+ GenWrite((void *) BloadData(theEnv)->BinaryVersionID,strlen(BloadData(theEnv)->BinaryVersionID) + 1,fp);
529
+ GenWrite((void *) BloadData(theEnv)->BinarySizes,strlen(BloadData(theEnv)->BinarySizes) + 1,fp);
530
+ }
531
+
532
+ /******************************************************/
533
+ /* WriteBinaryFooter: Writes a binary footer used for */
534
+ /* verification when a binary image is loaded. */
535
+ /******************************************************/
536
+ static void WriteBinaryFooter(
537
+ Environment *theEnv,
538
+ FILE *fp)
539
+ {
540
+ char footerBuffer[CONSTRUCT_HEADER_SIZE];
541
+
542
+ genstrncpy(footerBuffer,BloadData(theEnv)->BinaryPrefixID,CONSTRUCT_HEADER_SIZE);
543
+ GenWrite(footerBuffer,CONSTRUCT_HEADER_SIZE,fp);
544
+ }
545
+
546
+ #endif /* BLOAD_AND_BSAVE */
547
+
548
+ #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
549
+
550
+ /**********************************************************/
551
+ /* AddBinaryItem: Informs the bload/bsave commands of the */
552
+ /* appropriate access functions needed to save/load the */
553
+ /* data structures of a construct or other "item" to a */
554
+ /* binary file. */
555
+ /**********************************************************/
556
+ bool AddBinaryItem(
557
+ Environment *theEnv,
558
+ const char *name,
559
+ int priority,
560
+ void (*findFunction)(Environment *),
561
+ void (*expressionFunction)(Environment *,FILE *),
562
+ void (*bsaveStorageFunction)(Environment *,FILE *),
563
+ void (*bsaveFunction)(Environment *,FILE *),
564
+ void (*bloadStorageFunction)(Environment *),
565
+ void (*bloadFunction)(Environment *),
566
+ void (*clearFunction)(Environment *))
567
+ {
568
+ struct BinaryItem *newPtr, *currentPtr, *lastPtr = NULL;
569
+
570
+ /*========================================*/
571
+ /* Create the binary item data structure. */
572
+ /*========================================*/
573
+
574
+ newPtr = get_struct(theEnv,BinaryItem);
575
+
576
+ newPtr->name = name;
577
+ newPtr->findFunction = findFunction;
578
+ newPtr->expressionFunction = expressionFunction;
579
+ newPtr->bsaveStorageFunction = bsaveStorageFunction;
580
+ newPtr->bsaveFunction = bsaveFunction;
581
+ newPtr->bloadStorageFunction = bloadStorageFunction;
582
+ newPtr->bloadFunction = bloadFunction;
583
+ newPtr->clearFunction = clearFunction;
584
+ newPtr->priority = priority;
585
+
586
+ /*=================================*/
587
+ /* If no binary items are defined, */
588
+ /* just put the item on the list. */
589
+ /*=================================*/
590
+
591
+ if (BsaveData(theEnv)->ListOfBinaryItems == NULL)
592
+ {
593
+ newPtr->next = NULL;
594
+ BsaveData(theEnv)->ListOfBinaryItems = newPtr;
595
+ return true;
596
+ }
597
+
598
+ /*=========================================*/
599
+ /* Otherwise, place the binary item at the */
600
+ /* appropriate place in the list of binary */
601
+ /* items based on its priority. */
602
+ /*=========================================*/
603
+
604
+ currentPtr = BsaveData(theEnv)->ListOfBinaryItems;
605
+ while ((currentPtr != NULL) ? (priority < currentPtr->priority) : false)
606
+ {
607
+ lastPtr = currentPtr;
608
+ currentPtr = currentPtr->next;
609
+ }
610
+
611
+ if (lastPtr == NULL)
612
+ {
613
+ newPtr->next = BsaveData(theEnv)->ListOfBinaryItems;
614
+ BsaveData(theEnv)->ListOfBinaryItems = newPtr;
615
+ }
616
+ else
617
+ {
618
+ newPtr->next = currentPtr;
619
+ lastPtr->next = newPtr;
620
+ }
621
+
622
+ /*==================================*/
623
+ /* Return true to indicate the item */
624
+ /* was successfully added. */
625
+ /*==================================*/
626
+
627
+ return true;
628
+ }
629
+
630
+ #endif /* BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE */
631
+
632
+
633
+
634
+