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,865 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/25/16 */
5
+ /* */
6
+ /* WATCH MODULE */
7
+ /*******************************************************/
8
+
9
+
10
+ /*************************************************************/
11
+ /* Purpose: Support functions for the watch and unwatch */
12
+ /* commands. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* Brian Dantes */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.23: Changed name of variable log to logName */
23
+ /* because of Unix compiler warnings of shadowed */
24
+ /* definitions. */
25
+ /* */
26
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
27
+ /* */
28
+ /* Added EnvSetWatchItem function. */
29
+ /* */
30
+ /* 6.30: Removed conditional code for unsupported */
31
+ /* compilers/operating systems (IBM_MCW, */
32
+ /* MAC_MCW, and IBM_TBC). */
33
+ /* */
34
+ /* Added const qualifiers to remove C++ */
35
+ /* deprecation warnings. */
36
+ /* */
37
+ /* Converted API macros to function calls. */
38
+ /* */
39
+ /* 6.40: Added Env prefix to GetEvaluationError and */
40
+ /* SetEvaluationError functions. */
41
+ /* */
42
+ /* Pragma once and other inclusion changes. */
43
+ /* */
44
+ /* Added support for booleans with <stdbool.h>. */
45
+ /* */
46
+ /* Changed return values for router functions. */
47
+ /* */
48
+ /* Removed use of void pointers for specific */
49
+ /* data structures. */
50
+ /* */
51
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
52
+ /* */
53
+ /* UDF redesign. */
54
+ /* */
55
+ /*************************************************************/
56
+
57
+ #include "setup.h"
58
+
59
+ #if DEBUGGING_FUNCTIONS
60
+
61
+ #include <stdio.h>
62
+ #include <string.h>
63
+
64
+ #include "argacces.h"
65
+ #include "constant.h"
66
+ #include "envrnmnt.h"
67
+ #include "extnfunc.h"
68
+ #include "memalloc.h"
69
+ #include "router.h"
70
+
71
+ #include "watch.h"
72
+
73
+ /***************************************/
74
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
75
+ /***************************************/
76
+
77
+ static WatchItemRecord *ValidWatchItem(Environment *,const char *,bool *);
78
+ static void DeallocateWatchData(Environment *);
79
+
80
+ /**********************************************/
81
+ /* InitializeWatchData: Allocates environment */
82
+ /* data for watch items. */
83
+ /**********************************************/
84
+ void InitializeWatchData(
85
+ Environment *theEnv)
86
+ {
87
+ AllocateEnvironmentData(theEnv,WATCH_DATA,sizeof(struct watchData),DeallocateWatchData);
88
+ }
89
+
90
+ /************************************************/
91
+ /* DeallocateWatchData: Deallocates environment */
92
+ /* data for watch items. */
93
+ /************************************************/
94
+ static void DeallocateWatchData(
95
+ Environment *theEnv)
96
+ {
97
+ WatchItemRecord *tmpPtr, *nextPtr;
98
+
99
+ tmpPtr = WatchData(theEnv)->ListOfWatchItems;
100
+ while (tmpPtr != NULL)
101
+ {
102
+ nextPtr = tmpPtr->next;
103
+ rtn_struct(theEnv,watchItemRecord,tmpPtr);
104
+ tmpPtr = nextPtr;
105
+ }
106
+ }
107
+
108
+ /*************************************************************/
109
+ /* AddWatchItem: Adds an item to the list of watchable items */
110
+ /* that can be set using the watch and unwatch commands. */
111
+ /* Returns false if the item is already in the list, */
112
+ /* otherwise returns true. */
113
+ /*************************************************************/
114
+ bool AddWatchItem(
115
+ Environment *theEnv,
116
+ const char *name,
117
+ int code,
118
+ bool *flag,
119
+ int priority,
120
+ bool (*accessFunc)(Environment *,int,bool,struct expr *),
121
+ bool (*printFunc)(Environment *,const char *,int,struct expr *))
122
+ {
123
+ WatchItemRecord *newPtr, *currentPtr, *lastPtr;
124
+
125
+ /*================================================================*/
126
+ /* Find the insertion point in the watchable items list to place */
127
+ /* the new item. If the item is already in the list return false. */
128
+ /*================================================================*/
129
+
130
+ for (currentPtr = WatchData(theEnv)->ListOfWatchItems, lastPtr = NULL;
131
+ currentPtr != NULL;
132
+ currentPtr = currentPtr->next)
133
+ {
134
+ if (strcmp(currentPtr->name,name) == 0) return false;
135
+ if (priority < currentPtr->priority) lastPtr = currentPtr;
136
+ }
137
+
138
+ /*============================*/
139
+ /* Create the new watch item. */
140
+ /*============================*/
141
+
142
+ newPtr = get_struct(theEnv,watchItemRecord);
143
+ newPtr->name = name;
144
+ newPtr->flag = flag;
145
+ newPtr->code = code;
146
+ newPtr->priority = priority;
147
+ newPtr->accessFunc = accessFunc;
148
+ newPtr->printFunc = printFunc;
149
+
150
+ /*=================================================*/
151
+ /* Insert the new item in the list of watch items. */
152
+ /*=================================================*/
153
+
154
+ if (lastPtr == NULL)
155
+ {
156
+ newPtr->next = WatchData(theEnv)->ListOfWatchItems;
157
+ WatchData(theEnv)->ListOfWatchItems = newPtr;
158
+ }
159
+ else
160
+ {
161
+ newPtr->next = lastPtr->next;
162
+ lastPtr->next = newPtr;
163
+ }
164
+
165
+ /*==================================================*/
166
+ /* Return true to indicate the item has been added. */
167
+ /*==================================================*/
168
+
169
+ return true;
170
+ }
171
+
172
+ /**************************************************/
173
+ /* Watch: C access routine for the watch command. */
174
+ /**************************************************/
175
+ void Watch(
176
+ Environment *theEnv,
177
+ WatchItem item)
178
+ {
179
+ switch (item)
180
+ {
181
+ case ALL:
182
+ SetWatchItem(theEnv,"all",true,NULL);
183
+ break;
184
+
185
+ case FACTS:
186
+ SetWatchItem(theEnv,"facts",true,NULL);
187
+ break;
188
+
189
+ case INSTANCES:
190
+ SetWatchItem(theEnv,"instances",true,NULL);
191
+ break;
192
+
193
+ case SLOTS:
194
+ SetWatchItem(theEnv,"slots",true,NULL);
195
+ break;
196
+
197
+ case RULES:
198
+ SetWatchItem(theEnv,"rules",true,NULL);
199
+ break;
200
+
201
+ case ACTIVATIONS:
202
+ SetWatchItem(theEnv,"activations",true,NULL);
203
+ break;
204
+
205
+ case MESSAGES:
206
+ SetWatchItem(theEnv,"messages",true,NULL);
207
+ break;
208
+
209
+ case MESSAGE_HANDLERS:
210
+ SetWatchItem(theEnv,"message-handlers",true,NULL);
211
+ break;
212
+
213
+ case GENERIC_FUNCTIONS:
214
+ SetWatchItem(theEnv,"generic-functions",true,NULL);
215
+ break;
216
+
217
+ case METHODS:
218
+ SetWatchItem(theEnv,"methods",true,NULL);
219
+ break;
220
+
221
+ case DEFFUNCTIONS:
222
+ SetWatchItem(theEnv,"deffunctions",true,NULL);
223
+ break;
224
+
225
+ case COMPILATIONS:
226
+ SetWatchItem(theEnv,"compilations",true,NULL);
227
+ break;
228
+
229
+ case STATISTICS:
230
+ SetWatchItem(theEnv,"statistics",true,NULL);
231
+ break;
232
+
233
+ case GLOBALS:
234
+ SetWatchItem(theEnv,"globals",true,NULL);
235
+ break;
236
+
237
+ case FOCUS:
238
+ SetWatchItem(theEnv,"focus",true,NULL);
239
+ break;
240
+ }
241
+ }
242
+
243
+ /****************************************************/
244
+ /* Unwatch: C access routine for the watch command. */
245
+ /****************************************************/
246
+ void Unwatch(
247
+ Environment *theEnv,
248
+ WatchItem item)
249
+ {
250
+ switch (item)
251
+ {
252
+ case ALL:
253
+ SetWatchItem(theEnv,"all",false,NULL);
254
+ break;
255
+
256
+ case FACTS:
257
+ SetWatchItem(theEnv,"facts",false,NULL);
258
+ break;
259
+
260
+ case INSTANCES:
261
+ SetWatchItem(theEnv,"instances",false,NULL);
262
+ break;
263
+
264
+ case SLOTS:
265
+ SetWatchItem(theEnv,"slots",false,NULL);
266
+ break;
267
+
268
+ case RULES:
269
+ SetWatchItem(theEnv,"rules",false,NULL);
270
+ break;
271
+
272
+ case ACTIVATIONS:
273
+ SetWatchItem(theEnv,"activations",false,NULL);
274
+ break;
275
+
276
+ case MESSAGES:
277
+ SetWatchItem(theEnv,"messages",false,NULL);
278
+ break;
279
+
280
+ case MESSAGE_HANDLERS:
281
+ SetWatchItem(theEnv,"message-handlers",false,NULL);
282
+ break;
283
+
284
+ case GENERIC_FUNCTIONS:
285
+ SetWatchItem(theEnv,"generic-functions",false,NULL);
286
+ break;
287
+
288
+ case METHODS:
289
+ SetWatchItem(theEnv,"methods",false,NULL);
290
+ break;
291
+
292
+ case DEFFUNCTIONS:
293
+ SetWatchItem(theEnv,"deffunctions",false,NULL);
294
+ break;
295
+
296
+ case COMPILATIONS:
297
+ SetWatchItem(theEnv,"compilations",false,NULL);
298
+ break;
299
+
300
+ case STATISTICS:
301
+ SetWatchItem(theEnv,"statistics",false,NULL);
302
+ break;
303
+
304
+ case GLOBALS:
305
+ SetWatchItem(theEnv,"globals",false,NULL);
306
+ break;
307
+
308
+ case FOCUS:
309
+ SetWatchItem(theEnv,"focus",false,NULL);
310
+ break;
311
+ }
312
+ }
313
+
314
+ /******************************************/
315
+ /* GetWatchState: Returns the watch state */
316
+ /* for the specified watch item. */
317
+ /******************************************/
318
+ bool GetWatchState(
319
+ Environment *theEnv,
320
+ WatchItem item)
321
+ {
322
+ switch (item)
323
+ {
324
+ case ALL:
325
+ return false;
326
+
327
+ case FACTS:
328
+ return (GetWatchItem(theEnv,"facts") == 1);
329
+
330
+ case INSTANCES:
331
+ return (GetWatchItem(theEnv,"instances") == 1);
332
+
333
+ case SLOTS:
334
+ return (GetWatchItem(theEnv,"slots") == 1);
335
+
336
+ case RULES:
337
+ return (GetWatchItem(theEnv,"rules") == 1);
338
+
339
+ case ACTIVATIONS:
340
+ return (GetWatchItem(theEnv,"activations") == 1);
341
+
342
+ case MESSAGES:
343
+ return (GetWatchItem(theEnv,"messages") == 1);
344
+
345
+ case MESSAGE_HANDLERS:
346
+ return (GetWatchItem(theEnv,"message-handlers") == 1);
347
+
348
+ case GENERIC_FUNCTIONS:
349
+ return (GetWatchItem(theEnv,"generic-functions") == 1);
350
+
351
+ case METHODS:
352
+ return (GetWatchItem(theEnv,"methods") == 1);
353
+
354
+ case DEFFUNCTIONS:
355
+ return (GetWatchItem(theEnv,"deffunctions") == 1);
356
+
357
+ case COMPILATIONS:
358
+ return (GetWatchItem(theEnv,"compilations") == 1);
359
+
360
+ case STATISTICS:
361
+ return (GetWatchItem(theEnv,"statistics") == 1);
362
+
363
+ case GLOBALS:
364
+ return (GetWatchItem(theEnv,"globals") == 1);
365
+
366
+ case FOCUS:
367
+ return (GetWatchItem(theEnv,"focus") == 1);
368
+ }
369
+
370
+ return false;
371
+ }
372
+
373
+ /******************************************/
374
+ /* SetWatchState: Returns the watch state */
375
+ /* for the specified watch item. */
376
+ /******************************************/
377
+ void SetWatchState(
378
+ Environment *theEnv,
379
+ WatchItem item,
380
+ bool newState)
381
+ {
382
+ switch (item)
383
+ {
384
+ case ALL:
385
+ SetWatchItem(theEnv,"all",newState,NULL);
386
+ return;
387
+
388
+ case FACTS:
389
+ SetWatchItem(theEnv,"facts",newState,NULL);
390
+ return;
391
+
392
+ case INSTANCES:
393
+ SetWatchItem(theEnv,"instances",newState,NULL);
394
+ return;
395
+
396
+ case SLOTS:
397
+ SetWatchItem(theEnv,"slots",newState,NULL);
398
+ return;
399
+
400
+ case RULES:
401
+ SetWatchItem(theEnv,"rules",newState,NULL);
402
+ return;
403
+
404
+ case ACTIVATIONS:
405
+ SetWatchItem(theEnv,"activations",newState,NULL);
406
+ return;
407
+
408
+ case MESSAGES:
409
+ SetWatchItem(theEnv,"messages",newState,NULL);
410
+ return;
411
+
412
+ case MESSAGE_HANDLERS:
413
+ SetWatchItem(theEnv,"message-handlers",newState,NULL);
414
+ return;
415
+
416
+ case GENERIC_FUNCTIONS:
417
+ SetWatchItem(theEnv,"generic-functions",newState,NULL);
418
+ return;
419
+
420
+ case METHODS:
421
+ SetWatchItem(theEnv,"methods",newState,NULL);
422
+ return;
423
+
424
+ case DEFFUNCTIONS:
425
+ SetWatchItem(theEnv,"deffunctions",newState,NULL);
426
+ return;
427
+
428
+ case COMPILATIONS:
429
+ SetWatchItem(theEnv,"compilations",newState,NULL);
430
+ return;
431
+
432
+ case STATISTICS:
433
+ SetWatchItem(theEnv,"statistics",newState,NULL);
434
+ return;
435
+
436
+ case GLOBALS:
437
+ SetWatchItem(theEnv,"globals",newState,NULL);
438
+ return;
439
+
440
+ case FOCUS:
441
+ SetWatchItem(theEnv,"focus",newState,NULL);
442
+ return;
443
+ }
444
+ }
445
+
446
+ /********************************************************/
447
+ /* WatchString: C access routine for the watch command. */
448
+ /********************************************************/
449
+ bool WatchString(
450
+ Environment *theEnv,
451
+ const char *itemName)
452
+ {
453
+ return SetWatchItem(theEnv,itemName,true,NULL);
454
+ }
455
+
456
+ /************************************************************/
457
+ /* UnwatchString: C access routine for the unwatch command. */
458
+ /************************************************************/
459
+ bool UnwatchString(
460
+ Environment *theEnv,
461
+ const char *itemName)
462
+ {
463
+ return SetWatchItem(theEnv,itemName,false,NULL);
464
+ }
465
+
466
+ /********************************************************************/
467
+ /* SetWatchItem: Sets the state of a specified watch item to either */
468
+ /* on or off. Returns true if the item was set, otherwise false. */
469
+ /********************************************************************/
470
+ bool SetWatchItem(
471
+ Environment *theEnv,
472
+ const char *itemName,
473
+ bool newState,
474
+ struct expr *argExprs)
475
+ {
476
+ WatchItemRecord *wPtr;
477
+
478
+ /*===================================================*/
479
+ /* If the name of the watch item to set is all, then */
480
+ /* all watch items are set to the new state and true */
481
+ /* is returned. */
482
+ /*===================================================*/
483
+
484
+ if (strcmp(itemName,"all") == 0)
485
+ {
486
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
487
+ {
488
+ /*==============================================*/
489
+ /* If no specific arguments are specified, then */
490
+ /* set the global flag for the watch item. */
491
+ /*==============================================*/
492
+
493
+ if (argExprs == NULL) *(wPtr->flag) = newState;
494
+
495
+ /*=======================================*/
496
+ /* Set flags for individual watch items. */
497
+ /*=======================================*/
498
+
499
+ if ((wPtr->accessFunc == NULL) ? false :
500
+ ((*wPtr->accessFunc)(theEnv,wPtr->code,newState,argExprs) == false))
501
+ {
502
+ SetEvaluationError(theEnv,true);
503
+ return false;
504
+ }
505
+ }
506
+ return true;
507
+ }
508
+
509
+ /*=================================================*/
510
+ /* Search for the watch item to be set in the list */
511
+ /* of watch items. If found, set the watch item to */
512
+ /* its new state and return true. */
513
+ /*=================================================*/
514
+
515
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
516
+ {
517
+ if (strcmp(itemName,wPtr->name) == 0)
518
+ {
519
+ /*==============================================*/
520
+ /* If no specific arguments are specified, then */
521
+ /* set the global flag for the watch item. */
522
+ /*==============================================*/
523
+
524
+ if (argExprs == NULL) *(wPtr->flag) = newState;
525
+
526
+ /*=======================================*/
527
+ /* Set flags for individual watch items. */
528
+ /*=======================================*/
529
+
530
+ if ((wPtr->accessFunc == NULL) ? false :
531
+ ((*wPtr->accessFunc)(theEnv,wPtr->code,newState,argExprs) == false))
532
+ {
533
+ SetEvaluationError(theEnv,true);
534
+ return false;
535
+ }
536
+
537
+ return true;
538
+ }
539
+ }
540
+
541
+ /*=================================================*/
542
+ /* If the specified item was not found in the list */
543
+ /* of watchable items then return false. */
544
+ /*=================================================*/
545
+
546
+ return false;
547
+ }
548
+
549
+ /****************************************************************/
550
+ /* GetWatchItem: Gets the current state of the specified watch */
551
+ /* item. Returns the state of the watch item (0 for off and 1 */
552
+ /* for on) if the watch item is found in the list of watch */
553
+ /* items, otherwise -1 is returned. */
554
+ /****************************************************************/
555
+ int GetWatchItem(
556
+ Environment *theEnv,
557
+ const char *itemName)
558
+ {
559
+ WatchItemRecord *wPtr;
560
+
561
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
562
+ {
563
+ if (strcmp(itemName,wPtr->name) == 0)
564
+ {
565
+ if (*(wPtr->flag))
566
+ { return 1; }
567
+ else
568
+ { return 0; }
569
+ }
570
+ }
571
+
572
+ return -1;
573
+ }
574
+
575
+ /***************************************************************/
576
+ /* ValidWatchItem: Returns true if the specified name is found */
577
+ /* in the list of watch items, otherwise returns false. */
578
+ /***************************************************************/
579
+ static WatchItemRecord *ValidWatchItem(
580
+ Environment *theEnv,
581
+ const char *itemName,
582
+ bool *recognized)
583
+ {
584
+ WatchItemRecord *wPtr;
585
+
586
+ *recognized = true;
587
+ if (strcmp(itemName,"all") == 0)
588
+ return NULL;
589
+
590
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
591
+ { if (strcmp(itemName,wPtr->name) == 0) return(wPtr); }
592
+
593
+ *recognized = false;
594
+ return NULL;
595
+ }
596
+
597
+ /*************************************************************/
598
+ /* GetNthWatchName: Returns the name associated with the nth */
599
+ /* item in the list of watchable items. If the nth item */
600
+ /* does not exist, then NULL is returned. */
601
+ /*************************************************************/
602
+ const char *GetNthWatchName(
603
+ Environment *theEnv,
604
+ int whichItem)
605
+ {
606
+ int i;
607
+ WatchItemRecord *wPtr;
608
+
609
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems, i = 1;
610
+ wPtr != NULL;
611
+ wPtr = wPtr->next, i++)
612
+ { if (i == whichItem) return(wPtr->name); }
613
+
614
+ return NULL;
615
+ }
616
+
617
+ /***************************************************************/
618
+ /* GetNthWatchValue: Returns the current state associated with */
619
+ /* the nth item in the list of watchable items. If the nth */
620
+ /* item does not exist, then -1 is returned. */
621
+ /***************************************************************/
622
+ int GetNthWatchValue(
623
+ Environment *theEnv,
624
+ int whichItem)
625
+ {
626
+ int i;
627
+ WatchItemRecord *wPtr;
628
+
629
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems, i = 1;
630
+ wPtr != NULL;
631
+ wPtr = wPtr->next, i++)
632
+ { if (i == whichItem) return((int) *(wPtr->flag)); }
633
+
634
+ return(-1);
635
+ }
636
+
637
+ /**************************************/
638
+ /* WatchCommand: H/L access routine */
639
+ /* for the watch command. */
640
+ /**************************************/
641
+ void WatchCommand(
642
+ Environment *theEnv,
643
+ UDFContext *context,
644
+ UDFValue *returnValue)
645
+ {
646
+ UDFValue theValue;
647
+ const char *argument;
648
+ bool recognized;
649
+ WatchItemRecord *wPtr;
650
+
651
+ /*========================================*/
652
+ /* Determine which item is to be watched. */
653
+ /*========================================*/
654
+
655
+ if (! UDFFirstArgument(context,SYMBOL_BIT,&theValue)) return;
656
+
657
+ argument = theValue.lexemeValue->contents;
658
+ wPtr = ValidWatchItem(theEnv,argument,&recognized);
659
+ if (recognized == false)
660
+ {
661
+ SetEvaluationError(theEnv,true);
662
+ UDFInvalidArgumentMessage(context,"watchable symbol");
663
+ return;
664
+ }
665
+
666
+ /*=================================================*/
667
+ /* Check to make sure extra arguments are allowed. */
668
+ /*=================================================*/
669
+
670
+ if (GetNextArgument(GetFirstArgument()) != NULL)
671
+ {
672
+ if ((wPtr == NULL) ? true : (wPtr->accessFunc == NULL))
673
+ {
674
+ SetEvaluationError(theEnv,true);
675
+ ExpectedCountError(theEnv,"watch",EXACTLY,1);
676
+ return;
677
+ }
678
+ }
679
+
680
+ /*=====================*/
681
+ /* Set the watch item. */
682
+ /*=====================*/
683
+
684
+ SetWatchItem(theEnv,argument,true,GetNextArgument(GetFirstArgument()));
685
+ }
686
+
687
+ /****************************************/
688
+ /* UnwatchCommand: H/L access routine */
689
+ /* for the unwatch command. */
690
+ /****************************************/
691
+ void UnwatchCommand(
692
+ Environment *theEnv,
693
+ UDFContext *context,
694
+ UDFValue *returnValue)
695
+ {
696
+ UDFValue theValue;
697
+ const char *argument;
698
+ bool recognized;
699
+ WatchItemRecord *wPtr;
700
+
701
+ /*==========================================*/
702
+ /* Determine which item is to be unwatched. */
703
+ /*==========================================*/
704
+
705
+ if (! UDFFirstArgument(context,SYMBOL_BIT,&theValue)) return;
706
+
707
+ argument = theValue.lexemeValue->contents;
708
+ wPtr = ValidWatchItem(theEnv,argument,&recognized);
709
+ if (recognized == false)
710
+ {
711
+ SetEvaluationError(theEnv,true);
712
+ UDFInvalidArgumentMessage(context,"watchable symbol");
713
+ return;
714
+ }
715
+
716
+ /*=================================================*/
717
+ /* Check to make sure extra arguments are allowed. */
718
+ /*=================================================*/
719
+
720
+ if (GetNextArgument(GetFirstArgument()) != NULL)
721
+ {
722
+ if ((wPtr == NULL) ? true : (wPtr->accessFunc == NULL))
723
+ {
724
+ SetEvaluationError(theEnv,true);
725
+ ExpectedCountError(theEnv,"unwatch",EXACTLY,1);
726
+ return;
727
+ }
728
+ }
729
+
730
+ /*=====================*/
731
+ /* Set the watch item. */
732
+ /*=====================*/
733
+
734
+ SetWatchItem(theEnv,argument,false,GetNextArgument(GetFirstArgument()));
735
+ }
736
+
737
+ /************************************************/
738
+ /* ListWatchItemsCommand: H/L access routines */
739
+ /* for the list-watch-items command. */
740
+ /************************************************/
741
+ void ListWatchItemsCommand(
742
+ Environment *theEnv,
743
+ UDFContext *context,
744
+ UDFValue *returnValue)
745
+ {
746
+ WatchItemRecord *wPtr;
747
+ UDFValue theValue;
748
+ bool recognized;
749
+
750
+ /*=======================*/
751
+ /* List the watch items. */
752
+ /*=======================*/
753
+
754
+ if (GetFirstArgument() == NULL)
755
+ {
756
+ for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
757
+ {
758
+ WriteString(theEnv,STDOUT,wPtr->name);
759
+ if (*(wPtr->flag)) WriteString(theEnv,STDOUT," = on\n");
760
+ else WriteString(theEnv,STDOUT," = off\n");
761
+ }
762
+ return;
763
+ }
764
+
765
+ /*=======================================*/
766
+ /* Determine which item is to be listed. */
767
+ /*=======================================*/
768
+
769
+ if (! UDFFirstArgument(context,SYMBOL_BIT,&theValue)) return;
770
+ wPtr = ValidWatchItem(theEnv,theValue.lexemeValue->contents,&recognized);
771
+ if ((recognized == false) || (wPtr == NULL))
772
+ {
773
+ SetEvaluationError(theEnv,true);
774
+ ExpectedTypeError1(theEnv,"list-watch-items",1,"'watchable symbol'");
775
+ return;
776
+ }
777
+
778
+ /*=================================================*/
779
+ /* Check to make sure extra arguments are allowed. */
780
+ /*=================================================*/
781
+
782
+ if ((wPtr->printFunc == NULL) &&
783
+ (GetNextArgument(GetFirstArgument()) != NULL))
784
+ {
785
+ SetEvaluationError(theEnv,true);
786
+ ExpectedCountError(theEnv,"list-watch-items",EXACTLY,1);
787
+ return;
788
+ }
789
+
790
+ /*====================================*/
791
+ /* List the status of the watch item. */
792
+ /*====================================*/
793
+
794
+ WriteString(theEnv,STDOUT,wPtr->name);
795
+ if (*(wPtr->flag)) WriteString(theEnv,STDOUT," = on\n");
796
+ else WriteString(theEnv,STDOUT," = off\n");
797
+
798
+ /*============================================*/
799
+ /* List the status of individual watch items. */
800
+ /*============================================*/
801
+
802
+ if (wPtr->printFunc != NULL)
803
+ {
804
+ if ((*wPtr->printFunc)(theEnv,STDOUT,wPtr->code,
805
+ GetNextArgument(GetFirstArgument())) == false)
806
+ { SetEvaluationError(theEnv,true); }
807
+ }
808
+ }
809
+
810
+ /*******************************************/
811
+ /* GetWatchItemCommand: H/L access routine */
812
+ /* for the get-watch-item command. */
813
+ /*******************************************/
814
+ void GetWatchItemCommand(
815
+ Environment *theEnv,
816
+ UDFContext *context,
817
+ UDFValue *returnValue)
818
+ {
819
+ UDFValue theValue;
820
+ const char *argument;
821
+ bool recognized;
822
+
823
+ /*========================================*/
824
+ /* Determine which item is to be watched. */
825
+ /*========================================*/
826
+
827
+ if (! UDFFirstArgument(context,SYMBOL_BIT,&theValue))
828
+ { return; }
829
+
830
+ argument = theValue.lexemeValue->contents;
831
+ ValidWatchItem(theEnv,argument,&recognized);
832
+ if (recognized == false)
833
+ {
834
+ SetEvaluationError(theEnv,true);
835
+ ExpectedTypeError1(theEnv,"get-watch-item",1,"'watchable symbol'");
836
+ returnValue->lexemeValue = FalseSymbol(theEnv);
837
+ return;
838
+ }
839
+
840
+ /*===========================*/
841
+ /* Get the watch item value. */
842
+ /*===========================*/
843
+
844
+ if (GetWatchItem(theEnv,argument) == 1)
845
+ { returnValue->lexemeValue = TrueSymbol(theEnv); }
846
+ else
847
+ { returnValue->lexemeValue = FalseSymbol(theEnv); }
848
+ }
849
+
850
+ /*************************************************************/
851
+ /* WatchFunctionDefinitions: Initializes the watch commands. */
852
+ /*************************************************************/
853
+ void WatchFunctionDefinitions(
854
+ Environment *theEnv)
855
+ {
856
+ #if ! RUN_TIME
857
+ AddUDF(theEnv,"watch","v",1,UNBOUNDED,"*;y",WatchCommand,"WatchCommand",NULL);
858
+ AddUDF(theEnv,"unwatch","v",1,UNBOUNDED,"*;y",UnwatchCommand,"UnwatchCommand",NULL);
859
+ AddUDF(theEnv,"get-watch-item","b",1,1,"y",GetWatchItemCommand,"GetWatchItemCommand",NULL);
860
+ AddUDF(theEnv,"list-watch-items","v",0,UNBOUNDED,"*;y",ListWatchItemsCommand,"ListWatchItemsCommand",NULL);
861
+ #endif
862
+ }
863
+
864
+ #endif /* DEBUGGING_FUNCTIONS */
865
+