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,884 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.41 12/04/22 */
5
+ /* */
6
+ /* BLOAD MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides core routines for loading constructs */
11
+ /* from 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
+ /* 6.30: Borland C (IBM_TBC) and Metrowerks CodeWarrior */
24
+ /* (MAC_MCW, IBM_MCW) are no longer supported. */
25
+ /* */
26
+ /* Changed integer type/precision. */
27
+ /* */
28
+ /* Added const qualifiers to remove C++ */
29
+ /* deprecation warnings. */
30
+ /* */
31
+ /* Converted API macros to function calls. */
32
+ /* */
33
+ /* 6.31: Data sizes written to binary files for */
34
+ /* validation when loaded. */
35
+ /* */
36
+ /* 6.40: Refactored code to reduce header dependencies */
37
+ /* in sysdep.c. */
38
+ /* */
39
+ /* Pragma once and other inclusion changes. */
40
+ /* */
41
+ /* Added support for booleans with <stdbool.h>. */
42
+ /* */
43
+ /* Removed use of void pointers for specific */
44
+ /* data structures. */
45
+ /* */
46
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
47
+ /* */
48
+ /* Callbacks must be environment aware. */
49
+ /* */
50
+ /* UDF redesign. */
51
+ /* */
52
+ /* 6.41: Used gensnprintf in place of gensprintf and. */
53
+ /* sprintf. */
54
+ /* */
55
+ /*************************************************************/
56
+
57
+ #include "setup.h"
58
+
59
+ #include "argacces.h"
60
+ #include "bsave.h"
61
+ #include "constrct.h"
62
+ #include "cstrnbin.h"
63
+ #include "envrnmnt.h"
64
+ #include "exprnpsr.h"
65
+ #include "memalloc.h"
66
+ #include "prntutil.h"
67
+ #include "router.h"
68
+ #include "utility.h"
69
+
70
+ #include "bload.h"
71
+
72
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
73
+
74
+ /***************************************/
75
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
76
+ /***************************************/
77
+
78
+ static struct functionDefinition **ReadNeededFunctions(Environment *,unsigned long *,bool *);
79
+ static struct functionDefinition *FastFindFunction(Environment *,const char *,struct functionDefinition *);
80
+ static bool ClearBload(Environment *);
81
+ static void ClearBloadCallback(Environment *,void *);
82
+ static void AbortBload(Environment *);
83
+ static bool BloadOutOfMemoryFunction(Environment *,size_t);
84
+ static void DeallocateBloadData(Environment *);
85
+
86
+ /**********************************************/
87
+ /* InitializeBloadData: Allocates environment */
88
+ /* data for the bload command. */
89
+ /**********************************************/
90
+ void InitializeBloadData(
91
+ Environment *theEnv)
92
+ {
93
+ char sizeBuffer[20];
94
+ gensnprintf(sizeBuffer,sizeof(sizeBuffer),
95
+ "%2zu%2zu%2zu%2zu%2zu",sizeof(void *),sizeof(double),
96
+ sizeof(int),sizeof(long),sizeof(long long));
97
+
98
+ AllocateEnvironmentData(theEnv,BLOAD_DATA,sizeof(struct bloadData),NULL);
99
+ AddEnvironmentCleanupFunction(theEnv,"bload",DeallocateBloadData,-1500);
100
+ AddClearFunction(theEnv,"bload",ClearBloadCallback,10000,NULL);
101
+
102
+ BloadData(theEnv)->BinaryPrefixID = "\1\2\3\4CLIPS";
103
+ BloadData(theEnv)->BinaryVersionID = "V6.40";
104
+ BloadData(theEnv)->BinarySizes = (char *) genalloc(theEnv,strlen(sizeBuffer) + 1);
105
+ genstrcpy(BloadData(theEnv)->BinarySizes,sizeBuffer);
106
+ }
107
+
108
+ /************************************************/
109
+ /* DeallocateBloadData: Deallocates environment */
110
+ /* data for the bload command. */
111
+ /************************************************/
112
+ static void DeallocateBloadData(
113
+ Environment *theEnv)
114
+ {
115
+ DeallocateVoidCallList(theEnv,BloadData(theEnv)->BeforeBloadFunctions);
116
+ DeallocateVoidCallList(theEnv,BloadData(theEnv)->AfterBloadFunctions);
117
+ DeallocateBoolCallList(theEnv,BloadData(theEnv)->ClearBloadReadyFunctions);
118
+ DeallocateVoidCallList(theEnv,BloadData(theEnv)->AbortBloadFunctions);
119
+ genfree(theEnv,BloadData(theEnv)->BinarySizes,strlen(BloadData(theEnv)->BinarySizes) + 1);
120
+ }
121
+
122
+ /****************************/
123
+ /* Bload: C access routine */
124
+ /* for the bload command. */
125
+ /****************************/
126
+ bool Bload(
127
+ Environment *theEnv,
128
+ const char *fileName)
129
+ {
130
+ unsigned long numberOfFunctions;
131
+ unsigned long space;
132
+ bool error;
133
+ char IDbuffer[20];
134
+ char sizesBuffer[20];
135
+ char constructBuffer[CONSTRUCT_HEADER_SIZE];
136
+ struct BinaryItem *biPtr;
137
+ struct voidCallFunctionItem *bfPtr;
138
+
139
+ /*=====================================*/
140
+ /* If embedded, clear the error flags. */
141
+ /*=====================================*/
142
+
143
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
144
+ { ResetErrorFlags(theEnv); }
145
+
146
+ /*================*/
147
+ /* Open the file. */
148
+ /*================*/
149
+
150
+ if (GenOpenReadBinary(theEnv,"bload",fileName) == false)
151
+ {
152
+ OpenErrorMessage(theEnv,"bload",fileName);
153
+ return false;
154
+ }
155
+
156
+ /*=====================================*/
157
+ /* Determine if this is a binary file. */
158
+ /*=====================================*/
159
+
160
+ GenReadBinary(theEnv,IDbuffer,strlen(BloadData(theEnv)->BinaryPrefixID) + 1);
161
+ if (strcmp(IDbuffer,BloadData(theEnv)->BinaryPrefixID) != 0)
162
+ {
163
+ PrintErrorID(theEnv,"BLOAD",2,false);
164
+ WriteString(theEnv,STDERR,"File '");
165
+ WriteString(theEnv,STDERR,fileName);
166
+ WriteString(theEnv,STDERR,"' is not a binary construct file.\n");
167
+ GenCloseBinary(theEnv);
168
+ return false;
169
+ }
170
+
171
+ /*=======================================*/
172
+ /* Determine if it's a binary file using */
173
+ /* a format from a different version. */
174
+ /*=======================================*/
175
+
176
+ GenReadBinary(theEnv,IDbuffer,strlen(BloadData(theEnv)->BinaryVersionID) + 1);
177
+ if (strcmp(IDbuffer,BloadData(theEnv)->BinaryVersionID) != 0)
178
+ {
179
+ PrintErrorID(theEnv,"BLOAD",3,false);
180
+ WriteString(theEnv,STDERR,"File '");
181
+ WriteString(theEnv,STDERR,fileName);
182
+ WriteString(theEnv,STDERR,"' is an incompatible binary construct file.\n");
183
+ GenCloseBinary(theEnv);
184
+ return false;
185
+ }
186
+
187
+ /*===========================================*/
188
+ /* Determine if it's a binary file using the */
189
+ /* correct size for pointers and numbers. */
190
+ /*===========================================*/
191
+
192
+ GenReadBinary(theEnv,sizesBuffer,strlen(BloadData(theEnv)->BinarySizes) + 1);
193
+ if (strcmp(sizesBuffer,BloadData(theEnv)->BinarySizes) != 0)
194
+ {
195
+ PrintErrorID(theEnv,"BLOAD",3,false);
196
+ WriteString(theEnv,STDERR,"File '");
197
+ WriteString(theEnv,STDERR,fileName);
198
+ WriteString(theEnv,STDERR,"' is an incompatible binary construct file.\n");
199
+ GenCloseBinary(theEnv);
200
+ return false;
201
+ }
202
+
203
+ /*====================*/
204
+ /* Clear environment. */
205
+ /*====================*/
206
+
207
+ if (BloadData(theEnv)->BloadActive)
208
+ {
209
+ if (ClearBload(theEnv) == false)
210
+ {
211
+ GenCloseBinary(theEnv);
212
+ return false;
213
+ }
214
+ }
215
+
216
+ /*=================================*/
217
+ /* Determine if the KB environment */
218
+ /* was successfully cleared. */
219
+ /*=================================*/
220
+
221
+ if (ClearReady(theEnv) == false)
222
+ {
223
+ GenCloseBinary(theEnv);
224
+ PrintErrorID(theEnv,"BLOAD",4,false);
225
+ WriteString(theEnv,STDERR,"The ");
226
+ WriteString(theEnv,STDERR,APPLICATION_NAME);
227
+ WriteString(theEnv,STDERR," environment could not be cleared.\n");
228
+ WriteString(theEnv,STDERR,"Binary load cannot continue.\n");
229
+ return false;
230
+ }
231
+
232
+ /*==================================*/
233
+ /* Call the list of functions to be */
234
+ /* executed before a bload occurs. */
235
+ /*==================================*/
236
+
237
+ ConstructData(theEnv)->ClearInProgress = true;
238
+ for (bfPtr = BloadData(theEnv)->BeforeBloadFunctions;
239
+ bfPtr != NULL;
240
+ bfPtr = bfPtr->next)
241
+ { (*bfPtr->func)(theEnv,bfPtr->context); }
242
+
243
+ ConstructData(theEnv)->ClearInProgress = false;
244
+
245
+ /*====================================================*/
246
+ /* Read in the functions needed by this binary image. */
247
+ /*====================================================*/
248
+
249
+ BloadData(theEnv)->FunctionArray = ReadNeededFunctions(theEnv,&numberOfFunctions,&error);
250
+ if (error)
251
+ {
252
+ GenCloseBinary(theEnv);
253
+ AbortBload(theEnv);
254
+ return false;
255
+ }
256
+
257
+ /*================================================*/
258
+ /* Read in the atoms needed by this binary image. */
259
+ /*================================================*/
260
+
261
+ ReadNeededAtomicValues(theEnv);
262
+
263
+ /*===========================================*/
264
+ /* Determine the number of expressions to be */
265
+ /* read and allocate the appropriate space */
266
+ /*===========================================*/
267
+
268
+ AllocateExpressions(theEnv);
269
+
270
+ /*==========================================================*/
271
+ /* Read in the memory requirements of the constructs stored */
272
+ /* in this binary image and allocate the necessary space */
273
+ /*==========================================================*/
274
+
275
+ for (GenReadBinary(theEnv,constructBuffer,CONSTRUCT_HEADER_SIZE);
276
+ strncmp(constructBuffer,BloadData(theEnv)->BinaryPrefixID,CONSTRUCT_HEADER_SIZE) != 0;
277
+ GenReadBinary(theEnv,constructBuffer,CONSTRUCT_HEADER_SIZE))
278
+ {
279
+ bool found;
280
+
281
+ /*================================================*/
282
+ /* Search for the construct type in the list of */
283
+ /* binary items. If found, allocate the storage */
284
+ /* needed by the construct for this binary image. */
285
+ /*================================================*/
286
+
287
+ found = false;
288
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
289
+ biPtr != NULL;
290
+ biPtr = biPtr->next)
291
+ {
292
+ if (strncmp(biPtr->name,constructBuffer,CONSTRUCT_HEADER_SIZE) == 0)
293
+ {
294
+ if (biPtr->bloadStorageFunction != NULL)
295
+ {
296
+ (*biPtr->bloadStorageFunction)(theEnv);
297
+ found = true;
298
+ }
299
+ break;
300
+ }
301
+ }
302
+
303
+ /*==========================================*/
304
+ /* If the construct type wasn't found, skip */
305
+ /* the storage binary load information for */
306
+ /* this construct. */
307
+ /*==========================================*/
308
+
309
+ if (! found)
310
+ {
311
+ GenReadBinary(theEnv,&space,sizeof(unsigned long));
312
+ GetSeekCurBinary(theEnv,(long) space);
313
+ if (space != 0)
314
+ {
315
+ WriteString(theEnv,STDOUT,"\nSkipping ");
316
+ WriteString(theEnv,STDOUT,constructBuffer);
317
+ WriteString(theEnv,STDOUT," constructs because of unavailability\n");
318
+ }
319
+ }
320
+ }
321
+
322
+ /*======================================*/
323
+ /* Refresh the pointers in expressions. */
324
+ /*======================================*/
325
+
326
+ RefreshExpressions(theEnv);
327
+
328
+ /*==========================*/
329
+ /* Read in the constraints. */
330
+ /*==========================*/
331
+
332
+ ReadNeededConstraints(theEnv);
333
+
334
+ /*======================================================*/
335
+ /* Read in the constructs stored in this binary image. */
336
+ /*======================================================*/
337
+
338
+ for (GenReadBinary(theEnv,constructBuffer,CONSTRUCT_HEADER_SIZE);
339
+ strncmp(constructBuffer,BloadData(theEnv)->BinaryPrefixID,CONSTRUCT_HEADER_SIZE) != 0;
340
+ GenReadBinary(theEnv,constructBuffer,CONSTRUCT_HEADER_SIZE))
341
+ {
342
+ bool found;
343
+
344
+ /*==================================================*/
345
+ /* Search for the function to load the construct */
346
+ /* into the previously allocated storage. If found, */
347
+ /* call the function to load the construct. */
348
+ /*==================================================*/
349
+
350
+ found = false;
351
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
352
+ biPtr != NULL;
353
+ biPtr = biPtr->next)
354
+ {
355
+ if (strncmp(biPtr->name,constructBuffer,CONSTRUCT_HEADER_SIZE) == 0)
356
+ {
357
+ if (biPtr->bloadFunction != NULL)
358
+ {
359
+ (*biPtr->bloadFunction)(theEnv);
360
+ found = true;
361
+ }
362
+ break;
363
+ }
364
+ }
365
+
366
+ /*==========================================*/
367
+ /* If the construct type wasn't found, skip */
368
+ /* the binary data for this construct. */
369
+ /*==========================================*/
370
+
371
+ if (! found)
372
+ {
373
+ GenReadBinary(theEnv,&space,sizeof(unsigned long));
374
+ GetSeekCurBinary(theEnv,(long) space);
375
+ }
376
+ }
377
+
378
+ /*=================*/
379
+ /* Close the file. */
380
+ /*=================*/
381
+
382
+ GenCloseBinary(theEnv);
383
+
384
+ /*========================================*/
385
+ /* Free up temporary storage used for the */
386
+ /* function and atomic value information. */
387
+ /*========================================*/
388
+
389
+ if (BloadData(theEnv)->FunctionArray != NULL)
390
+ {
391
+ genfree(theEnv,BloadData(theEnv)->FunctionArray,
392
+ sizeof(struct functionDefinition *) * numberOfFunctions);
393
+ }
394
+ FreeAtomicValueStorage(theEnv);
395
+
396
+ /*==================================*/
397
+ /* Call the list of functions to be */
398
+ /* executed after a bload occurs. */
399
+ /*==================================*/
400
+
401
+ for (bfPtr = BloadData(theEnv)->AfterBloadFunctions;
402
+ bfPtr != NULL;
403
+ bfPtr = bfPtr->next)
404
+ { (*bfPtr->func)(theEnv,bfPtr->context); }
405
+
406
+ /*=======================================*/
407
+ /* Add a clear function to remove binary */
408
+ /* load when a clear command is issued. */
409
+ /*=======================================*/
410
+
411
+ BloadData(theEnv)->BloadActive = true;
412
+
413
+ /*=============================*/
414
+ /* Return true to indicate the */
415
+ /* binary load was successful. */
416
+ /*=============================*/
417
+
418
+ return true;
419
+ }
420
+
421
+ /************************************************************
422
+ NAME : BloadandRefresh
423
+ DESCRIPTION : Loads and refreshes objects - will bload
424
+ all objects at once, if possible, but
425
+ will aslo work in increments if memory is
426
+ restricted
427
+ INPUTS : 1) the number of objects to bload and update
428
+ 2) the size of one object
429
+ 3) An update function which takes a bloaded
430
+ object buffer and the index of the object
431
+ to refresh as arguments
432
+ RETURNS : Nothing useful
433
+ SIDE EFFECTS : Objects bloaded and updated
434
+ NOTES : Assumes binary file pointer is positioned
435
+ for bloads of the objects
436
+ ************************************************************/
437
+ void BloadandRefresh(
438
+ Environment *theEnv,
439
+ unsigned long objcnt,
440
+ size_t objsz,
441
+ void (*objupdate)(Environment *,void *,unsigned long))
442
+ {
443
+ unsigned long i, bi;
444
+ char *buf;
445
+ unsigned long objsmaxread, objsread;
446
+ size_t space;
447
+ OutOfMemoryFunction *oldOutOfMemoryFunction;
448
+
449
+ if (objcnt == 0L) return;
450
+
451
+ oldOutOfMemoryFunction = SetOutOfMemoryFunction(theEnv,BloadOutOfMemoryFunction);
452
+ objsmaxread = objcnt;
453
+ do
454
+ {
455
+ space = objsmaxread * objsz;
456
+ buf = (char *) genalloc(theEnv,space);
457
+ if (buf == NULL)
458
+ {
459
+ if ((objsmaxread / 2) == 0)
460
+ {
461
+ if ((*oldOutOfMemoryFunction)(theEnv,space) == true)
462
+ {
463
+ SetOutOfMemoryFunction(theEnv,oldOutOfMemoryFunction);
464
+ return;
465
+ }
466
+ }
467
+ else
468
+ objsmaxread /= 2;
469
+ }
470
+ }
471
+ while (buf == NULL);
472
+
473
+ SetOutOfMemoryFunction(theEnv,oldOutOfMemoryFunction);
474
+
475
+ i = 0L;
476
+ do
477
+ {
478
+ objsread = (objsmaxread > (objcnt - i)) ? (objcnt - i) : objsmaxread;
479
+ GenReadBinary(theEnv,buf,objsread * objsz);
480
+ for (bi = 0L ; bi < objsread ; bi++ , i++)
481
+ (*objupdate)(theEnv,buf + objsz * bi,i);
482
+ }
483
+ while (i < objcnt);
484
+ genfree(theEnv,buf,space);
485
+ }
486
+
487
+ /**********************************************/
488
+ /* ReadNeededFunctions: Reads in the names of */
489
+ /* functions needed by the binary image. */
490
+ /**********************************************/
491
+ static struct functionDefinition **ReadNeededFunctions(
492
+ Environment *theEnv,
493
+ unsigned long *numberOfFunctions,
494
+ bool *error)
495
+ {
496
+ char *functionNames, *namePtr;
497
+ unsigned long space;
498
+ size_t temp;
499
+ unsigned long i;
500
+ struct functionDefinition **newFunctionArray, *functionPtr;
501
+ bool functionsNotFound = false;
502
+
503
+ /*===================================================*/
504
+ /* Determine the number of function names to be read */
505
+ /* and the space required for them. */
506
+ /*===================================================*/
507
+
508
+ GenReadBinary(theEnv,numberOfFunctions,sizeof(long));
509
+ GenReadBinary(theEnv,&space,sizeof(unsigned long));
510
+ if (*numberOfFunctions == 0)
511
+ {
512
+ *error = false;
513
+ return NULL;
514
+ }
515
+
516
+ /*=======================================*/
517
+ /* Allocate area for strings to be read. */
518
+ /*=======================================*/
519
+
520
+ functionNames = (char *) genalloc(theEnv,space);
521
+ GenReadBinary(theEnv,functionNames,space);
522
+
523
+ /*====================================================*/
524
+ /* Store the function pointers in the function array. */
525
+ /*====================================================*/
526
+
527
+ temp = sizeof(struct functionDefinition *) * *numberOfFunctions;
528
+ newFunctionArray = (struct functionDefinition **) genalloc(theEnv,temp);
529
+ namePtr = functionNames;
530
+ functionPtr = NULL;
531
+ for (i = 0; i < *numberOfFunctions; i++)
532
+ {
533
+ if ((functionPtr = FastFindFunction(theEnv,namePtr,functionPtr)) == NULL)
534
+ {
535
+ if (! functionsNotFound)
536
+ {
537
+ PrintErrorID(theEnv,"BLOAD",6,false);
538
+ WriteString(theEnv,STDERR,"The following undefined functions are ");
539
+ WriteString(theEnv,STDERR,"referenced by this binary image:\n");
540
+ }
541
+
542
+ WriteString(theEnv,STDERR," ");
543
+ WriteString(theEnv,STDERR,namePtr);
544
+ WriteString(theEnv,STDERR,"\n");
545
+ functionsNotFound = true;
546
+ }
547
+
548
+ newFunctionArray[i] = functionPtr;
549
+ namePtr += strlen(namePtr) + 1;
550
+ }
551
+
552
+ /*==========================================*/
553
+ /* Free the memory used by the name buffer. */
554
+ /*==========================================*/
555
+
556
+ genfree(theEnv,functionNames,space);
557
+
558
+ /*==================================================*/
559
+ /* If any of the required functions were not found, */
560
+ /* then free the memory used by the function array. */
561
+ /*==================================================*/
562
+
563
+ if (functionsNotFound)
564
+ {
565
+ genfree(theEnv,newFunctionArray,temp);
566
+ newFunctionArray = NULL;
567
+ }
568
+
569
+ /*===================================*/
570
+ /* Set globals to appropriate values */
571
+ /* and return the function array. */
572
+ /*===================================*/
573
+
574
+ *error = functionsNotFound;
575
+ return newFunctionArray;
576
+ }
577
+
578
+ /*****************************************/
579
+ /* FastFindFunction: Search the function */
580
+ /* list for a specific function. */
581
+ /*****************************************/
582
+ static struct functionDefinition *FastFindFunction(
583
+ Environment *theEnv,
584
+ const char *functionName,
585
+ struct functionDefinition *lastFunction)
586
+ {
587
+ struct functionDefinition *theList, *theFunction;
588
+
589
+ /*========================*/
590
+ /* Get the function list. */
591
+ /*========================*/
592
+
593
+ theList = GetFunctionList(theEnv);
594
+ if (theList == NULL) { return NULL; }
595
+
596
+ /*=======================================*/
597
+ /* If we completed a previous function */
598
+ /* search, start where we last left off. */
599
+ /*=======================================*/
600
+
601
+ if (lastFunction != NULL)
602
+ { theFunction = lastFunction->next; }
603
+ else
604
+ { theFunction = theList; }
605
+
606
+ /*======================================================*/
607
+ /* Traverse the rest of the function list searching for */
608
+ /* the named function wrapping around if necessary. */
609
+ /*======================================================*/
610
+
611
+ while (strcmp(functionName,theFunction->callFunctionName->contents) != 0)
612
+ {
613
+ theFunction = theFunction->next;
614
+ if (theFunction == lastFunction) return NULL;
615
+ if (theFunction == NULL) theFunction = theList;
616
+ }
617
+
618
+ /*=======================*/
619
+ /* Return the pointer to */
620
+ /* the found function. */
621
+ /*=======================*/
622
+
623
+ return(theFunction);
624
+ }
625
+
626
+ /******************************************/
627
+ /* Bloaded: Returns true if the current */
628
+ /* environment is the result of a bload */
629
+ /* command, otherwise returns false. */
630
+ /******************************************/
631
+ bool Bloaded(
632
+ Environment *theEnv)
633
+ {
634
+ return BloadData(theEnv)->BloadActive;
635
+ }
636
+
637
+ /***************************************/
638
+ /* ClearBloadCallback: Clears a binary */
639
+ /* image from the KB environment. */
640
+ /***************************************/
641
+ static void ClearBloadCallback(
642
+ Environment *theEnv,
643
+ void *context)
644
+ {
645
+ ClearBload(theEnv);
646
+ }
647
+
648
+ /*************************************/
649
+ /* ClearBload: Clears a binary image */
650
+ /* from the KB environment. */
651
+ /*************************************/
652
+ static bool ClearBload(
653
+ Environment *theEnv)
654
+ {
655
+ struct BinaryItem *biPtr;
656
+ struct boolCallFunctionItem *bfPtr;
657
+ bool ready, error;
658
+
659
+ /*======================================*/
660
+ /* If bload is not active, then there's */
661
+ /* no need to clear bload data. */
662
+ /*======================================*/
663
+
664
+ if (! BloadData(theEnv)->BloadActive)
665
+ { return true; }
666
+
667
+ /*=================================================*/
668
+ /* Make sure it's safe to clear the bloaded image. */
669
+ /*=================================================*/
670
+
671
+ error = false;
672
+ for (bfPtr = BloadData(theEnv)->ClearBloadReadyFunctions;
673
+ bfPtr != NULL;
674
+ bfPtr = bfPtr->next)
675
+ {
676
+ ready = (bfPtr->func)(theEnv,bfPtr->context);
677
+
678
+ if (ready == false)
679
+ {
680
+ if (! error)
681
+ {
682
+ PrintErrorID(theEnv,"BLOAD",5,false);
683
+ WriteString(theEnv,STDERR,
684
+ "Some constructs are still in use by the current binary image:\n");
685
+ }
686
+ WriteString(theEnv,STDERR," ");
687
+ WriteString(theEnv,STDERR,bfPtr->name);
688
+ WriteString(theEnv,STDERR,"\n");
689
+ error = true;
690
+ }
691
+ }
692
+
693
+ /*==================================================*/
694
+ /* If some constructs are still in use and can't be */
695
+ /* cleared, indicate the binary load can't continue */
696
+ /* and return false to indicate this condition. */
697
+ /*==================================================*/
698
+
699
+ if (error == true)
700
+ {
701
+ WriteString(theEnv,STDERR,"Binary clear cannot continue.\n");
702
+ return false;
703
+ }
704
+
705
+ /*=============================*/
706
+ /* Call bload clear functions. */
707
+ /*=============================*/
708
+
709
+ for (biPtr = BsaveData(theEnv)->ListOfBinaryItems;
710
+ biPtr != NULL;
711
+ biPtr = biPtr->next)
712
+ { if (biPtr->clearFunction != NULL) (*biPtr->clearFunction)(theEnv); }
713
+
714
+ /*===========================*/
715
+ /* Free bloaded expressions. */
716
+ /*===========================*/
717
+
718
+ ClearBloadedExpressions(theEnv);
719
+
720
+ /*===========================*/
721
+ /* Free bloaded constraints. */
722
+ /*===========================*/
723
+
724
+ ClearBloadedConstraints(theEnv);
725
+
726
+ /*==================================*/
727
+ /* Remove the bload clear function. */
728
+ /*==================================*/
729
+
730
+ BloadData(theEnv)->BloadActive = false;
731
+
732
+ /*====================================*/
733
+ /* Return true to indicate the binary */
734
+ /* image was successfully cleared. */
735
+ /*====================================*/
736
+
737
+ return true;
738
+ }
739
+
740
+ /*************************************************/
741
+ /* AbortBload: Cleans up effects of before-bload */
742
+ /* functions in event of failure. */
743
+ /*************************************************/
744
+ static void AbortBload(
745
+ Environment *theEnv)
746
+ {
747
+ struct voidCallFunctionItem *bfPtr;
748
+
749
+ for (bfPtr = BloadData(theEnv)->AbortBloadFunctions;
750
+ bfPtr != NULL;
751
+ bfPtr = bfPtr->next)
752
+ { (*bfPtr->func)(theEnv,bfPtr->context); }
753
+ }
754
+
755
+ /********************************************/
756
+ /* AddBeforeBloadFunction: Adds a function */
757
+ /* to the list of functions called before */
758
+ /* a binary load occurs. */
759
+ /********************************************/
760
+ void AddBeforeBloadFunction(
761
+ Environment *theEnv,
762
+ const char *name,
763
+ VoidCallFunction *func,
764
+ int priority,
765
+ void *context)
766
+ {
767
+ BloadData(theEnv)->BeforeBloadFunctions =
768
+ AddVoidFunctionToCallList(theEnv,name,priority,func,BloadData(theEnv)->BeforeBloadFunctions,context);
769
+ }
770
+
771
+ /*******************************************/
772
+ /* AddAfterBloadFunction: Adds a function */
773
+ /* to the list of functions called after */
774
+ /* a binary load occurs. */
775
+ /*******************************************/
776
+ void AddAfterBloadFunction(
777
+ Environment *theEnv,
778
+ const char *name,
779
+ VoidCallFunction *func,
780
+ int priority,
781
+ void *context)
782
+ {
783
+ BloadData(theEnv)->AfterBloadFunctions =
784
+ AddVoidFunctionToCallList(theEnv,name,priority,func,BloadData(theEnv)->AfterBloadFunctions,context);
785
+ }
786
+
787
+ /**************************************************/
788
+ /* AddClearBloadReadyFunction: Adds a function to */
789
+ /* the list of functions called to determine if */
790
+ /* a binary image can be cleared. */
791
+ /**************************************************/
792
+ void AddClearBloadReadyFunction(
793
+ Environment *theEnv,
794
+ const char *name,
795
+ BoolCallFunction *func,
796
+ int priority,
797
+ void *context)
798
+ {
799
+ BloadData(theEnv)->ClearBloadReadyFunctions =
800
+ AddBoolFunctionToCallList(theEnv,name,priority,func,
801
+ BloadData(theEnv)->ClearBloadReadyFunctions,context);
802
+ }
803
+
804
+ /*********************************************/
805
+ /* AddAbortBloadFunction: Adds a function to */
806
+ /* the list of functions called if a bload */
807
+ /* has to be aborted. */
808
+ /*********************************************/
809
+ void AddAbortBloadFunction(
810
+ Environment *theEnv,
811
+ const char *name,
812
+ VoidCallFunction *func,
813
+ int priority,
814
+ void *context)
815
+ {
816
+ BloadData(theEnv)->AbortBloadFunctions =
817
+ AddVoidFunctionToCallList(theEnv,name,priority,func,
818
+ BloadData(theEnv)->AbortBloadFunctions,context);
819
+ }
820
+
821
+ /*******************************************************
822
+ NAME : BloadOutOfMemoryFunction
823
+ DESCRIPTION : Memory function used by bload to
824
+ prevent exiting when out of
825
+ memory - used by BloadandRefresh
826
+ INPUTS : The memory request size (unused)
827
+ RETURNS : True (indicates a failure and for
828
+ the memory functions to simply
829
+ return a NULL pointer)
830
+ SIDE EFFECTS : None
831
+ NOTES : None
832
+ *******************************************************/
833
+ static bool BloadOutOfMemoryFunction(
834
+ Environment *theEnv,
835
+ size_t size)
836
+ {
837
+ #if MAC_XCD
838
+ #pragma unused(size,theEnv)
839
+ #endif
840
+ return true;
841
+ }
842
+
843
+ /*****************************************************/
844
+ /* CannotLoadWithBloadMessage: Generic error message */
845
+ /* for indicating that a construct can't be loaded */
846
+ /* when a binary image is active. */
847
+ /*****************************************************/
848
+ void CannotLoadWithBloadMessage(
849
+ Environment *theEnv,
850
+ const char *constructName)
851
+ {
852
+ PrintErrorID(theEnv,"BLOAD",1,true);
853
+ WriteString(theEnv,STDERR,"Cannot load ");
854
+ WriteString(theEnv,STDERR,constructName);
855
+ WriteString(theEnv,STDERR," construct with binary load in effect.\n");
856
+ }
857
+
858
+ #endif /* (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) */
859
+
860
+ /**************************************/
861
+ /* BloadCommand: H/L access routine */
862
+ /* for the bload command. */
863
+ /**************************************/
864
+ void BloadCommand(
865
+ Environment *theEnv,
866
+ UDFContext *context,
867
+ UDFValue *returnValue)
868
+ {
869
+ #if (! RUN_TIME) && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)
870
+ const char *fileName;
871
+
872
+ fileName = GetFileName(context);
873
+ if (fileName != NULL)
874
+ {
875
+ returnValue->lexemeValue = CreateBoolean(theEnv,Bload(theEnv,fileName));
876
+ return;
877
+ }
878
+ #else
879
+ #if MAC_XCD
880
+ #pragma unused(theEnv,context)
881
+ #endif
882
+ #endif
883
+ returnValue->lexemeValue = FalseSymbol(theEnv);
884
+ }