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,1090 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 07/23/20 */
5
+ /* */
6
+ /* CONSTRUCT MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides basic functionality for creating new */
11
+ /* types of constructs, saving constructs to a file, and */
12
+ /* adding new functionality to the clear and reset */
13
+ /* commands. */
14
+ /* */
15
+ /* Principal Programmer(s): */
16
+ /* Gary D. Riley */
17
+ /* */
18
+ /* Contributing Programmer(s): */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.24: Added environment parameter to GenClose. */
23
+ /* Added environment parameter to GenOpen. */
24
+ /* */
25
+ /* Renamed BOOLEAN macro type to intBool. */
26
+ /* */
27
+ /* 6.30: Changed garbage collection algorithm. */
28
+ /* */
29
+ /* Removed conditional code for unsupported */
30
+ /* compilers/operating systems (IBM_MCW and */
31
+ /* MAC_MCW). */
32
+ /* */
33
+ /* Added code for capturing errors/warnings */
34
+ /* (EnvSetParserErrorCallback). */
35
+ /* */
36
+ /* Fixed issue with save function when multiple */
37
+ /* defmodules exist. */
38
+ /* */
39
+ /* Added const qualifiers to remove C++ */
40
+ /* deprecation warnings. */
41
+ /* */
42
+ /* Converted API macros to function calls. */
43
+ /* */
44
+ /* Fixed linkage issue when BLOAD_ONLY compiler */
45
+ /* flag is set to 1. */
46
+ /* */
47
+ /* Added code to prevent a clear command from */
48
+ /* being executed during fact assertions via */
49
+ /* Increment/DecrementClearReadyLocks API. */
50
+ /* */
51
+ /* Added code to keep track of pointers to */
52
+ /* constructs that are contained externally to */
53
+ /* to constructs, DanglingConstructs. */
54
+ /* */
55
+ /* 6.31: Error flags reset before Clear processed when */
56
+ /* called from embedded controller. */
57
+ /* */
58
+ /* 6.32: Fixed incorrect size issue with deallocation */
59
+ /* of WarningString and ErrorString. */
60
+ /* */
61
+ /* 6.40: Added Env prefix to GetHaltExecution and */
62
+ /* SetHaltExecution functions. */
63
+ /* */
64
+ /* Pragma once and other inclusion changes. */
65
+ /* */
66
+ /* Added support for booleans with <stdbool.h>. */
67
+ /* */
68
+ /* Removed use of void pointers for specific */
69
+ /* data structures. */
70
+ /* */
71
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
72
+ /* */
73
+ /* Callbacks must be environment aware. */
74
+ /* */
75
+ /* UDF redesign. */
76
+ /* */
77
+ /* Modified EnvClear to return completion status. */
78
+ /* */
79
+ /* Compilation watch flag defaults to off. */
80
+ /* */
81
+ /* File name/line count displayed for errors */
82
+ /* and warnings during load command. */
83
+ /* */
84
+ /*************************************************************/
85
+
86
+ #include <stdio.h>
87
+ #include <string.h>
88
+
89
+ #include "setup.h"
90
+
91
+ #include "argacces.h"
92
+ #include "commline.h"
93
+ #include "constant.h"
94
+ #include "cstrcpsr.h"
95
+ #include "envrnmnt.h"
96
+ #include "exprnpsr.h"
97
+ #include "memalloc.h"
98
+ #include "miscfun.h"
99
+ #include "moduldef.h"
100
+ #include "modulutl.h"
101
+ #include "multifld.h"
102
+ #include "prcdrfun.h"
103
+ #include "prcdrpsr.h"
104
+ #include "prntutil.h"
105
+ #include "router.h"
106
+ #include "ruledef.h"
107
+ #include "scanner.h"
108
+ #include "sysdep.h"
109
+ #include "utility.h"
110
+ #include "watch.h"
111
+
112
+ #include "constrct.h"
113
+
114
+ /***************************************/
115
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
116
+ /***************************************/
117
+
118
+ static void DeallocateConstructData(Environment *);
119
+
120
+ /**************************************************/
121
+ /* InitializeConstructData: Allocates environment */
122
+ /* data for constructs. */
123
+ /**************************************************/
124
+ void InitializeConstructData(
125
+ Environment *theEnv)
126
+ {
127
+ AllocateEnvironmentData(theEnv,CONSTRUCT_DATA,sizeof(struct constructData),DeallocateConstructData);
128
+ }
129
+
130
+ /****************************************************/
131
+ /* DeallocateConstructData: Deallocates environment */
132
+ /* data for constructs. */
133
+ /****************************************************/
134
+ static void DeallocateConstructData(
135
+ Environment *theEnv)
136
+ {
137
+ Construct *tmpPtr, *nextPtr;
138
+
139
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
140
+ DeallocateSaveCallList(theEnv,ConstructData(theEnv)->ListOfSaveFunctions);
141
+ #endif
142
+ DeallocateVoidCallList(theEnv,ConstructData(theEnv)->ListOfResetFunctions);
143
+ DeallocateVoidCallList(theEnv,ConstructData(theEnv)->ListOfClearFunctions);
144
+ DeallocateBoolCallList(theEnv,ConstructData(theEnv)->ListOfClearReadyFunctions);
145
+
146
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
147
+ if (ConstructData(theEnv)->ErrorString != NULL)
148
+ { genfree(theEnv,ConstructData(theEnv)->ErrorString,strlen(ConstructData(theEnv)->ErrorString) + 1); }
149
+
150
+ if (ConstructData(theEnv)->WarningString != NULL)
151
+ { genfree(theEnv,ConstructData(theEnv)->WarningString,strlen(ConstructData(theEnv)->WarningString) + 1); }
152
+
153
+ ConstructData(theEnv)->ErrorString = NULL;
154
+ ConstructData(theEnv)->WarningString = NULL;
155
+
156
+ SetParsingFileName(theEnv,NULL);
157
+ SetWarningFileName(theEnv,NULL);
158
+ SetErrorFileName(theEnv,NULL);
159
+ #endif
160
+
161
+ tmpPtr = ConstructData(theEnv)->ListOfConstructs;
162
+ while (tmpPtr != NULL)
163
+ {
164
+ nextPtr = tmpPtr->next;
165
+ rtn_struct(theEnv,construct,tmpPtr);
166
+ tmpPtr = nextPtr;
167
+ }
168
+ }
169
+
170
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
171
+
172
+ /***********************************************/
173
+ /* SetParserErrorCallback: Allows the function */
174
+ /* which is called when a construct parsing */
175
+ /* error occurs to be changed. */
176
+ /***********************************************/
177
+ ParserErrorFunction *SetParserErrorCallback(
178
+ Environment *theEnv,
179
+ ParserErrorFunction *functionPtr,
180
+ void *context)
181
+ {
182
+ ParserErrorFunction *tmpPtr;
183
+
184
+ tmpPtr = ConstructData(theEnv)->ParserErrorCallback;
185
+ ConstructData(theEnv)->ParserErrorCallback = functionPtr;
186
+ ConstructData(theEnv)->ParserErrorContext = context;
187
+ return tmpPtr;
188
+ }
189
+
190
+ /*************************************************/
191
+ /* FindConstruct: Determines whether a construct */
192
+ /* type is in the ListOfConstructs. */
193
+ /*************************************************/
194
+ Construct *FindConstruct(
195
+ Environment *theEnv,
196
+ const char *name)
197
+ {
198
+ Construct *currentPtr;
199
+
200
+ for (currentPtr = ConstructData(theEnv)->ListOfConstructs;
201
+ currentPtr != NULL;
202
+ currentPtr = currentPtr->next)
203
+ {
204
+ if (strcmp(name,currentPtr->constructName) == 0)
205
+ { return currentPtr; }
206
+ }
207
+
208
+ return NULL;
209
+ }
210
+
211
+ /***********************************************************/
212
+ /* RemoveConstruct: Removes a construct and its associated */
213
+ /* parsing function from the ListOfConstructs. Returns */
214
+ /* true if the construct type was removed, otherwise */
215
+ /* false. */
216
+ /***********************************************************/
217
+ bool RemoveConstruct(
218
+ Environment *theEnv,
219
+ const char *name)
220
+ {
221
+ Construct *currentPtr, *lastPtr = NULL;
222
+
223
+ for (currentPtr = ConstructData(theEnv)->ListOfConstructs;
224
+ currentPtr != NULL;
225
+ currentPtr = currentPtr->next)
226
+ {
227
+ if (strcmp(name,currentPtr->constructName) == 0)
228
+ {
229
+ if (lastPtr == NULL)
230
+ { ConstructData(theEnv)->ListOfConstructs = currentPtr->next; }
231
+ else
232
+ { lastPtr->next = currentPtr->next; }
233
+ rtn_struct(theEnv,construct,currentPtr);
234
+ return true;
235
+ }
236
+
237
+ lastPtr = currentPtr;
238
+ }
239
+
240
+ return false;
241
+ }
242
+
243
+ /************************************************/
244
+ /* Save: C access routine for the save command. */
245
+ /************************************************/
246
+ bool Save(
247
+ Environment *theEnv,
248
+ const char *fileName)
249
+ {
250
+ struct saveCallFunctionItem *saveFunction;
251
+ FILE *filePtr;
252
+ Defmodule *defmodulePtr;
253
+ bool updated = false;
254
+ bool unvisited = true;
255
+
256
+ /*=====================================*/
257
+ /* If embedded, clear the error flags. */
258
+ /*=====================================*/
259
+
260
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
261
+ { ResetErrorFlags(theEnv); }
262
+
263
+ /*=====================*/
264
+ /* Open the save file. */
265
+ /*=====================*/
266
+
267
+ if ((filePtr = GenOpen(theEnv,fileName,"w")) == NULL)
268
+ { return false; }
269
+
270
+ /*===========================*/
271
+ /* Bypass the router system. */
272
+ /*===========================*/
273
+
274
+ SetFastSave(theEnv,filePtr);
275
+
276
+ /*================================*/
277
+ /* Mark all modules as unvisited. */
278
+ /*================================*/
279
+
280
+ MarkModulesAsUnvisited(theEnv);
281
+
282
+ /*===============================================*/
283
+ /* Save the constructs. Repeatedly loop over the */
284
+ /* modules until each module has been save. */
285
+ /*===============================================*/
286
+
287
+ while (unvisited)
288
+ {
289
+ unvisited = false;
290
+ updated = false;
291
+
292
+ for (defmodulePtr = GetNextDefmodule(theEnv,NULL);
293
+ defmodulePtr != NULL;
294
+ defmodulePtr = GetNextDefmodule(theEnv,defmodulePtr))
295
+ {
296
+ /*=================================================================*/
297
+ /* We only want to save a module if all of the modules it imports */
298
+ /* from have already been saved. Since there can't be circular */
299
+ /* dependencies in imported modules, this should save the modules */
300
+ /* that don't import anything first and then work back from those. */
301
+ /*=================================================================*/
302
+
303
+ if (defmodulePtr->visitedFlag)
304
+ { /* Module has already been saved. */ }
305
+ else if (AllImportedModulesVisited(theEnv,defmodulePtr))
306
+ {
307
+ for (saveFunction = ConstructData(theEnv)->ListOfSaveFunctions;
308
+ saveFunction != NULL;
309
+ saveFunction = saveFunction->next)
310
+ { (*saveFunction->func)(theEnv,defmodulePtr,(char *) filePtr,saveFunction->context); }
311
+
312
+ updated = true;
313
+ defmodulePtr->visitedFlag = true;
314
+ }
315
+ else
316
+ { unvisited = true; }
317
+ }
318
+
319
+ /*=====================================================================*/
320
+ /* At least one module should be saved in every pass. If all have been */
321
+ /* visited/saved, then both flags will be false. If all remaining */
322
+ /* unvisited/unsaved modules were visited/saved, then unvisited will */
323
+ /* be false and updated will be true. If some, but not all, remaining */
324
+ /* unvisited/unsaved modules are visited/saved, then unvisited will */
325
+ /* be true and updated will be true. This leaves the case where there */
326
+ /* are remaining unvisited/unsaved modules, but none were */
327
+ /* visited/saved: unvisited is true and updated is false. */
328
+ /*=====================================================================*/
329
+
330
+ if (unvisited && (! updated))
331
+ {
332
+ SystemError(theEnv,"CONSTRCT",2);
333
+ break;
334
+ }
335
+ }
336
+
337
+ /*======================*/
338
+ /* Close the save file. */
339
+ /*======================*/
340
+
341
+ GenClose(theEnv,filePtr);
342
+
343
+ /*===========================*/
344
+ /* Remove the router bypass. */
345
+ /*===========================*/
346
+
347
+ SetFastSave(theEnv,NULL);
348
+
349
+ /*=========================*/
350
+ /* Return true to indicate */
351
+ /* successful completion. */
352
+ /*=========================*/
353
+
354
+ return true;
355
+ }
356
+
357
+ /*******************************************************/
358
+ /* RemoveSaveFunction: Removes a function from the */
359
+ /* ListOfSaveFunctions. Returns true if the function */
360
+ /* was successfully removed, otherwise false. */
361
+ /*******************************************************/
362
+ bool RemoveSaveFunction(
363
+ Environment *theEnv,
364
+ const char *name)
365
+ {
366
+ bool found;
367
+
368
+ ConstructData(theEnv)->ListOfSaveFunctions =
369
+ RemoveSaveFunctionFromCallList(theEnv,name,ConstructData(theEnv)->ListOfSaveFunctions,&found);
370
+
371
+ if (found) return true;
372
+
373
+ return false;
374
+ }
375
+
376
+ /**********************************/
377
+ /* SetCompilationsWatch: Sets the */
378
+ /* value of WatchCompilations. */
379
+ /**********************************/
380
+ void SetCompilationsWatch(
381
+ Environment *theEnv,
382
+ bool value)
383
+ {
384
+ ConstructData(theEnv)->WatchCompilations = value;
385
+ }
386
+
387
+ /*************************************/
388
+ /* GetCompilationsWatch: Returns the */
389
+ /* value of WatchCompilations. */
390
+ /*************************************/
391
+ bool GetCompilationsWatch(
392
+ Environment *theEnv)
393
+ {
394
+ return ConstructData(theEnv)->WatchCompilations;
395
+ }
396
+
397
+ /**********************************/
398
+ /* SetPrintWhileLoading: Sets the */
399
+ /* value of PrintWhileLoading. */
400
+ /**********************************/
401
+ void SetPrintWhileLoading(
402
+ Environment *theEnv,
403
+ bool value)
404
+ {
405
+ ConstructData(theEnv)->PrintWhileLoading = value;
406
+ }
407
+
408
+ /*************************************/
409
+ /* GetPrintWhileLoading: Returns the */
410
+ /* value of PrintWhileLoading. */
411
+ /*************************************/
412
+ bool GetPrintWhileLoading(
413
+ Environment *theEnv)
414
+ {
415
+ return(ConstructData(theEnv)->PrintWhileLoading);
416
+ }
417
+
418
+ /*******************************/
419
+ /* SetLoadInProgress: Sets the */
420
+ /* value of LoadInProgress. */
421
+ /*******************************/
422
+ void SetLoadInProgress(
423
+ Environment *theEnv,
424
+ bool value)
425
+ {
426
+ ConstructData(theEnv)->LoadInProgress = value;
427
+ }
428
+
429
+ /**********************************/
430
+ /* GetLoadInProgress: Returns the */
431
+ /* value of LoadInProgress. */
432
+ /**********************************/
433
+ bool GetLoadInProgress(
434
+ Environment *theEnv)
435
+ {
436
+ return(ConstructData(theEnv)->LoadInProgress);
437
+ }
438
+
439
+ #endif
440
+
441
+ /*************************************/
442
+ /* InitializeConstructs: Initializes */
443
+ /* the Construct Manager. */
444
+ /*************************************/
445
+ void InitializeConstructs(
446
+ Environment *theEnv)
447
+ {
448
+ #if (! RUN_TIME)
449
+ AddUDF(theEnv,"clear","v",0,0,NULL,ClearCommand,"ClearCommand",NULL);
450
+ AddUDF(theEnv,"reset","v",0,0,NULL,ResetCommand,"ResetCommand",NULL);
451
+
452
+ #if DEBUGGING_FUNCTIONS && (! BLOAD_ONLY)
453
+ AddWatchItem(theEnv,"compilations",0,&ConstructData(theEnv)->WatchCompilations,30,NULL,NULL);
454
+ #endif
455
+ #else
456
+ #if MAC_XCD
457
+ #pragma unused(theEnv)
458
+ #endif
459
+ #endif
460
+ }
461
+
462
+ /**************************************/
463
+ /* ClearCommand: H/L access routine */
464
+ /* for the clear command. */
465
+ /**************************************/
466
+ void ClearCommand(
467
+ Environment *theEnv,
468
+ UDFContext *context,
469
+ UDFValue *returnValue)
470
+ {
471
+ Clear(theEnv);
472
+ }
473
+
474
+ /**************************************/
475
+ /* ResetCommand: H/L access routine */
476
+ /* for the reset command. */
477
+ /**************************************/
478
+ void ResetCommand(
479
+ Environment *theEnv,
480
+ UDFContext *context,
481
+ UDFValue *returnValue)
482
+ {
483
+ Reset(theEnv);
484
+ }
485
+
486
+ /****************************/
487
+ /* Reset: C access routine */
488
+ /* for the reset command. */
489
+ /****************************/
490
+ void Reset(
491
+ Environment *theEnv)
492
+ {
493
+ struct voidCallFunctionItem *resetPtr;
494
+ GCBlock gcb;
495
+
496
+ /*=====================================*/
497
+ /* The reset command can't be executed */
498
+ /* while a reset is in progress. */
499
+ /*=====================================*/
500
+
501
+ if (ConstructData(theEnv)->ResetInProgress) return;
502
+
503
+ ConstructData(theEnv)->ResetInProgress = true;
504
+ ConstructData(theEnv)->ResetReadyInProgress = true;
505
+
506
+ /*=====================================*/
507
+ /* If embedded, clear the error flags. */
508
+ /*=====================================*/
509
+
510
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
511
+ { ResetErrorFlags(theEnv); }
512
+ SetErrorValue(theEnv,NULL);
513
+
514
+ /*========================================*/
515
+ /* Set up the frame for tracking garbage. */
516
+ /*========================================*/
517
+
518
+ GCBlockStart(theEnv,&gcb);
519
+
520
+ /*=======================================================*/
521
+ /* Call the before reset function to determine if the */
522
+ /* reset should continue. [Used by the some of the */
523
+ /* windowed interfaces to query the user whether a */
524
+ /* reset should proceed with activations on the agenda.] */
525
+ /*=======================================================*/
526
+
527
+ if ((ConstructData(theEnv)->BeforeResetCallback != NULL) ?
528
+ ((*ConstructData(theEnv)->BeforeResetCallback)(theEnv) == false) : false)
529
+ {
530
+ ConstructData(theEnv)->ResetReadyInProgress = false;
531
+ ConstructData(theEnv)->ResetInProgress = false;
532
+ GCBlockEnd(theEnv,&gcb);
533
+ return;
534
+ }
535
+ ConstructData(theEnv)->ResetReadyInProgress = false;
536
+
537
+ /*===========================*/
538
+ /* Call each reset function. */
539
+ /*===========================*/
540
+
541
+ for (resetPtr = ConstructData(theEnv)->ListOfResetFunctions;
542
+ (resetPtr != NULL) && (GetHaltExecution(theEnv) == false);
543
+ resetPtr = resetPtr->next)
544
+ { (*resetPtr->func)(theEnv,resetPtr->context); }
545
+
546
+ /*============================================*/
547
+ /* Set the current module to the MAIN module. */
548
+ /*============================================*/
549
+
550
+ SetCurrentModule(theEnv,FindDefmodule(theEnv,"MAIN"));
551
+
552
+ /*================================*/
553
+ /* Restore the old garbage frame. */
554
+ /*================================*/
555
+
556
+ GCBlockEnd(theEnv,&gcb);
557
+
558
+ /*===============================================*/
559
+ /* If embedded, clean the topmost garbage frame. */
560
+ /*===============================================*/
561
+
562
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
563
+ { CleanCurrentGarbageFrame(theEnv,NULL); }
564
+
565
+ /*======================*/
566
+ /* Call periodic tasks. */
567
+ /*======================*/
568
+
569
+ CallPeriodicTasks(theEnv);
570
+
571
+ /*===================================*/
572
+ /* A reset is no longer in progress. */
573
+ /*===================================*/
574
+
575
+ ConstructData(theEnv)->ResetInProgress = false;
576
+ }
577
+
578
+ /************************************/
579
+ /* SetBeforeResetFunction: Sets the */
580
+ /* value of BeforeResetFunction. */
581
+ /************************************/
582
+ BeforeResetFunction *SetBeforeResetFunction(
583
+ Environment *theEnv,
584
+ BeforeResetFunction *theFunction)
585
+ {
586
+ BeforeResetFunction *tempFunction;
587
+
588
+ tempFunction = ConstructData(theEnv)->BeforeResetCallback;
589
+ ConstructData(theEnv)->BeforeResetCallback = theFunction;
590
+ return tempFunction;
591
+ }
592
+
593
+ /*************************************/
594
+ /* AddResetFunction: Adds a function */
595
+ /* to ListOfResetFunctions. */
596
+ /*************************************/
597
+ bool AddResetFunction(
598
+ Environment *theEnv,
599
+ const char *name,
600
+ VoidCallFunction *functionPtr,
601
+ int priority,
602
+ void *context)
603
+ {
604
+ ConstructData(theEnv)->ListOfResetFunctions =
605
+ AddVoidFunctionToCallList(theEnv,name,priority,functionPtr,
606
+ ConstructData(theEnv)->ListOfResetFunctions,context);
607
+ return true;
608
+ }
609
+
610
+ /*******************************************/
611
+ /* RemoveResetFunction: Removes a function */
612
+ /* from the ListOfResetFunctions. */
613
+ /*******************************************/
614
+ bool RemoveResetFunction(
615
+ Environment *theEnv,
616
+ const char *name)
617
+ {
618
+ bool found;
619
+
620
+ ConstructData(theEnv)->ListOfResetFunctions =
621
+ RemoveVoidFunctionFromCallList(theEnv,name,ConstructData(theEnv)->ListOfResetFunctions,&found);
622
+
623
+ return found;
624
+ }
625
+
626
+ /****************************************/
627
+ /* IncrementClearReadyLocks: Increments */
628
+ /* the number of clear ready locks. */
629
+ /****************************************/
630
+ void IncrementClearReadyLocks(
631
+ Environment *theEnv)
632
+ {
633
+ ConstructData(theEnv)->ClearReadyLocks++;
634
+ }
635
+
636
+ /*******************************************/
637
+ /* DecrementClearReadyLocks: Decrements */
638
+ /* the number of clear locks. */
639
+ /*******************************************/
640
+ void DecrementClearReadyLocks(
641
+ Environment *theEnv)
642
+ {
643
+ if (ConstructData(theEnv)->ClearReadyLocks > 0)
644
+ { ConstructData(theEnv)->ClearReadyLocks--; }
645
+ }
646
+
647
+ /**************************************************/
648
+ /* Clear: C access routine for the clear command. */
649
+ /**************************************************/
650
+ bool Clear(
651
+ Environment *theEnv)
652
+ {
653
+ struct voidCallFunctionItem *theFunction;
654
+ GCBlock gcb;
655
+
656
+ /*=====================================*/
657
+ /* If embedded, clear the error flags. */
658
+ /*=====================================*/
659
+
660
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
661
+ { ResetErrorFlags(theEnv); }
662
+ SetErrorValue(theEnv,NULL);
663
+
664
+ /*===================================*/
665
+ /* Determine if a clear is possible. */
666
+ /*===================================*/
667
+
668
+ ConstructData(theEnv)->ClearReadyInProgress = true;
669
+ if ((ConstructData(theEnv)->ClearReadyLocks > 0) ||
670
+ (ConstructData(theEnv)->DanglingConstructs > 0) ||
671
+ (ClearReady(theEnv) == false))
672
+ {
673
+ PrintErrorID(theEnv,"CONSTRCT",1,false);
674
+ WriteString(theEnv,STDERR,"Some constructs are still in use. Clear cannot continue.\n");
675
+ ConstructData(theEnv)->ClearReadyInProgress = false;
676
+ return false;
677
+ }
678
+ ConstructData(theEnv)->ClearReadyInProgress = false;
679
+
680
+ /*========================================*/
681
+ /* Set up the frame for tracking garbage. */
682
+ /*========================================*/
683
+
684
+ GCBlockStart(theEnv,&gcb);
685
+
686
+ /*===========================*/
687
+ /* Call all clear functions. */
688
+ /*===========================*/
689
+
690
+ ConstructData(theEnv)->ClearInProgress = true;
691
+
692
+ for (theFunction = ConstructData(theEnv)->ListOfClearFunctions;
693
+ theFunction != NULL;
694
+ theFunction = theFunction->next)
695
+ { (*theFunction->func)(theEnv,theFunction->context); }
696
+
697
+ /*================================*/
698
+ /* Restore the old garbage frame. */
699
+ /*================================*/
700
+
701
+ GCBlockEnd(theEnv,&gcb);
702
+
703
+ /*=======================================*/
704
+ /* If embedded, clean the garbage frame. */
705
+ /*=======================================*/
706
+
707
+ if (EvaluationData(theEnv)->CurrentExpression == NULL)
708
+ { CleanCurrentGarbageFrame(theEnv,NULL); }
709
+
710
+ /*======================*/
711
+ /* Call periodic tasks. */
712
+ /*======================*/
713
+
714
+ CallPeriodicTasks(theEnv);
715
+
716
+ /*===========================*/
717
+ /* Clear has been completed. */
718
+ /*===========================*/
719
+
720
+ ConstructData(theEnv)->ClearInProgress = false;
721
+
722
+ #if DEFRULE_CONSTRUCT
723
+ if ((DefruleData(theEnv)->RightPrimeJoins != NULL) ||
724
+ (DefruleData(theEnv)->LeftPrimeJoins != NULL))
725
+ { SystemError(theEnv,"CONSTRCT",1); }
726
+ #endif
727
+
728
+ /*============================*/
729
+ /* Perform reset after clear. */
730
+ /*============================*/
731
+
732
+ Reset(theEnv);
733
+
734
+ return true;
735
+ }
736
+
737
+ /*********************************************************/
738
+ /* ClearReady: Returns true if a clear can be performed, */
739
+ /* otherwise false. Note that this is destructively */
740
+ /* determined (e.g. facts will be deleted as part of */
741
+ /* the determination). */
742
+ /*********************************************************/
743
+ bool ClearReady(
744
+ Environment *theEnv)
745
+ {
746
+ struct boolCallFunctionItem *theFunction;
747
+
748
+ for (theFunction = ConstructData(theEnv)->ListOfClearReadyFunctions;
749
+ theFunction != NULL;
750
+ theFunction = theFunction->next)
751
+ {
752
+ if ((*theFunction->func)(theEnv,theFunction->context) == false)
753
+ { return false; }
754
+ }
755
+
756
+ return true;
757
+ }
758
+
759
+ /******************************************/
760
+ /* AddClearReadyFunction: Adds a function */
761
+ /* to ListOfClearReadyFunctions. */
762
+ /******************************************/
763
+ bool AddClearReadyFunction(
764
+ Environment *theEnv,
765
+ const char *name,
766
+ BoolCallFunction *functionPtr,
767
+ int priority,
768
+ void *context)
769
+ {
770
+ ConstructData(theEnv)->ListOfClearReadyFunctions =
771
+ AddBoolFunctionToCallList(theEnv,name,priority,functionPtr,
772
+ ConstructData(theEnv)->ListOfClearReadyFunctions,context);
773
+ return true;
774
+ }
775
+
776
+ /************************************************/
777
+ /* RemoveClearReadyFunction: Removes a function */
778
+ /* from the ListOfClearReadyFunctions. */
779
+ /************************************************/
780
+ bool RemoveClearReadyFunction(
781
+ Environment *theEnv,
782
+ const char *name)
783
+ {
784
+ bool found;
785
+
786
+ ConstructData(theEnv)->ListOfClearReadyFunctions =
787
+ RemoveBoolFunctionFromCallList(theEnv,name,ConstructData(theEnv)->ListOfClearReadyFunctions,&found);
788
+
789
+ if (found) return true;
790
+
791
+ return false;
792
+ }
793
+
794
+ /*************************************/
795
+ /* AddClearFunction: Adds a function */
796
+ /* to ListOfClearFunctions. */
797
+ /*************************************/
798
+ bool AddClearFunction(
799
+ Environment *theEnv,
800
+ const char *name,
801
+ VoidCallFunction *functionPtr,
802
+ int priority,
803
+ void *context)
804
+ {
805
+ ConstructData(theEnv)->ListOfClearFunctions =
806
+ AddVoidFunctionToCallList(theEnv,name,priority,functionPtr,
807
+ ConstructData(theEnv)->ListOfClearFunctions,context);
808
+ return true;
809
+ }
810
+
811
+ /*******************************************/
812
+ /* RemoveClearFunction: Removes a function */
813
+ /* from the ListOfClearFunctions. */
814
+ /*******************************************/
815
+ bool RemoveClearFunction(
816
+ Environment *theEnv,
817
+ const char *name)
818
+ {
819
+ bool found;
820
+
821
+ ConstructData(theEnv)->ListOfClearFunctions =
822
+ RemoveVoidFunctionFromCallList(theEnv,name,ConstructData(theEnv)->ListOfClearFunctions,&found);
823
+
824
+ if (found) return true;
825
+
826
+ return false;
827
+ }
828
+
829
+ /********************************************/
830
+ /* ExecutingConstruct: Returns true if a */
831
+ /* construct is currently being executed, */
832
+ /* otherwise false. */
833
+ /********************************************/
834
+ bool ExecutingConstruct(
835
+ Environment *theEnv)
836
+ {
837
+ return ConstructData(theEnv)->Executing;
838
+ }
839
+
840
+ /********************************************/
841
+ /* SetExecutingConstruct: Sets the value of */
842
+ /* the executing variable indicating that */
843
+ /* actions such as reset, clear, etc */
844
+ /* should not be performed. */
845
+ /********************************************/
846
+ void SetExecutingConstruct(
847
+ Environment *theEnv,
848
+ bool value)
849
+ {
850
+ ConstructData(theEnv)->Executing = value;
851
+ }
852
+
853
+ /*******************************************************/
854
+ /* DeinstallConstructHeader: Decrements the busy count */
855
+ /* of a construct name and frees its pretty print */
856
+ /* representation string (both of which are stored */
857
+ /* in the generic construct header). */
858
+ /*******************************************************/
859
+ void DeinstallConstructHeader(
860
+ Environment *theEnv,
861
+ ConstructHeader *theHeader)
862
+ {
863
+ ReleaseLexeme(theEnv,theHeader->name);
864
+ if (theHeader->ppForm != NULL)
865
+ {
866
+ rm(theEnv,(void *) theHeader->ppForm,
867
+ sizeof(char) * (strlen(theHeader->ppForm) + 1));
868
+ theHeader->ppForm = NULL;
869
+ }
870
+
871
+ if (theHeader->usrData != NULL)
872
+ {
873
+ ClearUserDataList(theEnv,theHeader->usrData);
874
+ theHeader->usrData = NULL;
875
+ }
876
+ }
877
+
878
+ /**************************************************/
879
+ /* DestroyConstructHeader: Frees the pretty print */
880
+ /* representation string and user data (both of */
881
+ /* which are stored in the generic construct */
882
+ /* header). */
883
+ /**************************************************/
884
+ void DestroyConstructHeader(
885
+ Environment *theEnv,
886
+ ConstructHeader *theHeader)
887
+ {
888
+ if (theHeader->ppForm != NULL)
889
+ {
890
+ rm(theEnv,(void *) theHeader->ppForm,
891
+ sizeof(char) * (strlen(theHeader->ppForm) + 1));
892
+ theHeader->ppForm = NULL;
893
+ }
894
+
895
+ if (theHeader->usrData != NULL)
896
+ {
897
+ ClearUserDataList(theEnv,theHeader->usrData);
898
+ theHeader->usrData = NULL;
899
+ }
900
+ }
901
+
902
+ /*****************************************************/
903
+ /* AddConstruct: Adds a construct and its associated */
904
+ /* parsing function to the ListOfConstructs. */
905
+ /*****************************************************/
906
+ Construct *AddConstruct(
907
+ Environment *theEnv,
908
+ const char *name,
909
+ const char *pluralName,
910
+ bool (*parseFunction)(Environment *,const char *),
911
+ FindConstructFunction *findFunction,
912
+ CLIPSLexeme *(*getConstructNameFunction)(ConstructHeader *),
913
+ const char *(*getPPFormFunction)(ConstructHeader *),
914
+ struct defmoduleItemHeader *(*getModuleItemFunction)(ConstructHeader *),
915
+ GetNextConstructFunction *getNextItemFunction,
916
+ void (*setNextItemFunction)(ConstructHeader *,ConstructHeader *),
917
+ IsConstructDeletableFunction *isConstructDeletableFunction,
918
+ DeleteConstructFunction *deleteFunction,
919
+ FreeConstructFunction *freeFunction)
920
+ {
921
+ Construct *newPtr;
922
+
923
+ /*=============================*/
924
+ /* Allocate and initialize the */
925
+ /* construct data structure. */
926
+ /*=============================*/
927
+
928
+ newPtr = get_struct(theEnv,construct);
929
+
930
+ newPtr->constructName = name;
931
+ newPtr->pluralName = pluralName;
932
+ newPtr->parseFunction = parseFunction;
933
+ newPtr->findFunction = findFunction;
934
+ newPtr->getConstructNameFunction = getConstructNameFunction;
935
+ newPtr->getPPFormFunction = getPPFormFunction;
936
+ newPtr->getModuleItemFunction = getModuleItemFunction;
937
+ newPtr->getNextItemFunction = getNextItemFunction;
938
+ newPtr->setNextItemFunction = setNextItemFunction;
939
+ newPtr->isConstructDeletableFunction = isConstructDeletableFunction;
940
+ newPtr->deleteFunction = deleteFunction;
941
+ newPtr->freeFunction = freeFunction;
942
+
943
+ /*===============================*/
944
+ /* Add the construct to the list */
945
+ /* of constructs and return it. */
946
+ /*===============================*/
947
+
948
+ newPtr->next = ConstructData(theEnv)->ListOfConstructs;
949
+ ConstructData(theEnv)->ListOfConstructs = newPtr;
950
+ return(newPtr);
951
+ }
952
+
953
+ /************************************/
954
+ /* AddSaveFunction: Adds a function */
955
+ /* to the ListOfSaveFunctions. */
956
+ /************************************/
957
+ bool AddSaveFunction(
958
+ Environment *theEnv,
959
+ const char *name,
960
+ SaveCallFunction *functionPtr,
961
+ int priority,
962
+ void *context)
963
+ {
964
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
965
+ ConstructData(theEnv)->ListOfSaveFunctions =
966
+ AddSaveFunctionToCallList(theEnv,name,priority,
967
+ functionPtr,
968
+ ConstructData(theEnv)->ListOfSaveFunctions,context);
969
+ #else
970
+ #if MAC_XCD
971
+ #pragma unused(theEnv)
972
+ #endif
973
+ #endif
974
+
975
+ return true;
976
+ }
977
+
978
+ /**********************************************************/
979
+ /* AddSaveFunctionToCallList: Adds a function to a list */
980
+ /* of functions which are called to perform certain */
981
+ /* operations (e.g. clear, reset, and bload functions). */
982
+ /**********************************************************/
983
+ SaveCallFunctionItem *AddSaveFunctionToCallList(
984
+ Environment *theEnv,
985
+ const char *name,
986
+ int priority,
987
+ SaveCallFunction *func,
988
+ struct saveCallFunctionItem *head,
989
+ void *context)
990
+ {
991
+ struct saveCallFunctionItem *newPtr, *currentPtr, *lastPtr = NULL;
992
+ char *nameCopy;
993
+
994
+ newPtr = get_struct(theEnv,saveCallFunctionItem);
995
+
996
+ nameCopy = (char *) genalloc(theEnv,strlen(name) + 1);
997
+ genstrcpy(nameCopy,name);
998
+ newPtr->name = nameCopy;
999
+
1000
+ newPtr->func = func;
1001
+ newPtr->priority = priority;
1002
+ newPtr->context = context;
1003
+
1004
+ if (head == NULL)
1005
+ {
1006
+ newPtr->next = NULL;
1007
+ return(newPtr);
1008
+ }
1009
+
1010
+ currentPtr = head;
1011
+ while ((currentPtr != NULL) ? (priority < currentPtr->priority) : false)
1012
+ {
1013
+ lastPtr = currentPtr;
1014
+ currentPtr = currentPtr->next;
1015
+ }
1016
+
1017
+ if (lastPtr == NULL)
1018
+ {
1019
+ newPtr->next = head;
1020
+ head = newPtr;
1021
+ }
1022
+ else
1023
+ {
1024
+ newPtr->next = currentPtr;
1025
+ lastPtr->next = newPtr;
1026
+ }
1027
+
1028
+ return(head);
1029
+ }
1030
+
1031
+ /******************************************************************/
1032
+ /* RemoveSaveFunctionFromCallList: Removes a function from a list */
1033
+ /* of functions which are called to perform certain operations */
1034
+ /* (e.g. clear, reset, and bload functions). */
1035
+ /******************************************************************/
1036
+ struct saveCallFunctionItem *RemoveSaveFunctionFromCallList(
1037
+ Environment *theEnv,
1038
+ const char *name,
1039
+ struct saveCallFunctionItem *head,
1040
+ bool *found)
1041
+ {
1042
+ struct saveCallFunctionItem *currentPtr, *lastPtr;
1043
+
1044
+ *found = false;
1045
+ lastPtr = NULL;
1046
+ currentPtr = head;
1047
+
1048
+ while (currentPtr != NULL)
1049
+ {
1050
+ if (strcmp(name,currentPtr->name) == 0)
1051
+ {
1052
+ *found = true;
1053
+ if (lastPtr == NULL)
1054
+ { head = currentPtr->next; }
1055
+ else
1056
+ { lastPtr->next = currentPtr->next; }
1057
+
1058
+ genfree(theEnv,(void *) currentPtr->name,strlen(currentPtr->name) + 1);
1059
+ rtn_struct(theEnv,saveCallFunctionItem,currentPtr);
1060
+ return head;
1061
+ }
1062
+
1063
+ lastPtr = currentPtr;
1064
+ currentPtr = currentPtr->next;
1065
+ }
1066
+
1067
+ return head;
1068
+ }
1069
+
1070
+ /*************************************************************/
1071
+ /* DeallocateSaveCallList: Removes all functions from a list */
1072
+ /* of functions which are called to perform certain */
1073
+ /* operations (e.g. clear, reset, and bload functions). */
1074
+ /*************************************************************/
1075
+ void DeallocateSaveCallList(
1076
+ Environment *theEnv,
1077
+ struct saveCallFunctionItem *theList)
1078
+ {
1079
+ struct saveCallFunctionItem *tmpPtr, *nextPtr;
1080
+
1081
+ tmpPtr = theList;
1082
+ while (tmpPtr != NULL)
1083
+ {
1084
+ nextPtr = tmpPtr->next;
1085
+ genfree(theEnv,(void *) tmpPtr->name,strlen(tmpPtr->name) + 1);
1086
+ rtn_struct(theEnv,saveCallFunctionItem,tmpPtr);
1087
+ tmpPtr = nextPtr;
1088
+ }
1089
+ }
1090
+