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,698 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 04/04/19 */
5
+ /* */
6
+ /* MESSAGE-HANDLER PARSER FUNCTIONS */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* */
19
+ /* 6.23: Changed name of variable exp to theExp */
20
+ /* because of Unix compiler warnings of shadowed */
21
+ /* definitions. */
22
+ /* */
23
+ /* 6.24: Removed IMPERATIVE_MESSAGE_HANDLERS */
24
+ /* compilation flag. */
25
+ /* */
26
+ /* 6.30: Renamed BOOLEAN macro type to intBool. */
27
+ /* */
28
+ /* GetConstructNameAndComment API change. */
29
+ /* */
30
+ /* Changed integer type/precision. */
31
+ /* */
32
+ /* Used gensprintf instead of sprintf. */
33
+ /* */
34
+ /* Added const qualifiers to remove C++ */
35
+ /* deprecation warnings. */
36
+ /* */
37
+ /* Fixed linkage issue when BLOAD_AND_SAVE */
38
+ /* compiler flag is set to 0. */
39
+ /* */
40
+ /* 6.31: Compiler warning fix. */
41
+ /* */
42
+ /* 6.40: Pragma once and other inclusion changes. */
43
+ /* */
44
+ /* Added support for booleans with <stdbool.h>. */
45
+ /* */
46
+ /* Removed use of void pointers for specific */
47
+ /* data structures. */
48
+ /* */
49
+ /* Static constraint checking is always enabled. */
50
+ /* */
51
+ /*************************************************************/
52
+
53
+ /* =========================================
54
+ *****************************************
55
+ EXTERNAL DEFINITIONS
56
+ =========================================
57
+ ***************************************** */
58
+ #include "setup.h"
59
+
60
+ #if OBJECT_SYSTEM && (! BLOAD_ONLY) && (! RUN_TIME)
61
+
62
+ #include <string.h>
63
+
64
+ #if BLOAD || BLOAD_AND_BSAVE
65
+ #include "bload.h"
66
+ #endif
67
+
68
+ #include "classcom.h"
69
+ #include "classfun.h"
70
+ #include "constrct.h"
71
+ #include "cstrcpsr.h"
72
+ #include "cstrnchk.h"
73
+ #include "envrnmnt.h"
74
+ #include "exprnpsr.h"
75
+ #include "insfun.h"
76
+ #include "memalloc.h"
77
+ #include "modulutl.h"
78
+ #include "msgcom.h"
79
+ #include "msgfun.h"
80
+ #include "pprint.h"
81
+ #include "prccode.h"
82
+ #include "prntutil.h"
83
+ #include "router.h"
84
+ #include "scanner.h"
85
+ #include "strngrtr.h"
86
+ #include "sysdep.h"
87
+
88
+ #include "msgpsr.h"
89
+
90
+ /* =========================================
91
+ *****************************************
92
+ CONSTANTS
93
+ =========================================
94
+ ***************************************** */
95
+ #define SELF_LEN 4
96
+ #define SELF_SLOT_REF ':'
97
+
98
+ /***************************************/
99
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
100
+ /***************************************/
101
+
102
+ static bool IsParameterSlotReference(Environment *,const char *);
103
+ static int SlotReferenceVar(Environment *,Expression *,void *);
104
+ static int BindSlotReference(Environment *,Expression *,void *);
105
+ static SlotDescriptor *CheckSlotReference(Environment *,Defclass *,int,void *,bool,Expression *);
106
+ static void GenHandlerSlotReference(Environment *,Expression *,unsigned short,SlotDescriptor *);
107
+
108
+ /* =========================================
109
+ *****************************************
110
+ EXTERNALLY VISIBLE FUNCTIONS
111
+ =========================================
112
+ ***************************************** */
113
+
114
+ /***********************************************************************
115
+ NAME : ParseDefmessageHandler
116
+ DESCRIPTION : Parses a message-handler for a class of objects
117
+ INPUTS : The logical name of the input source
118
+ RETURNS : False if successful parse, true otherwise
119
+ SIDE EFFECTS : Handler allocated and inserted into class
120
+ NOTES : H/L Syntax:
121
+
122
+ (defmessage-handler <class> <name> [<type>] [<comment>]
123
+ (<params>)
124
+ <action>*)
125
+
126
+ <params> ::= <var>* | <var>* $?<name>
127
+ ***********************************************************************/
128
+ bool ParseDefmessageHandler(
129
+ Environment *theEnv,
130
+ const char *readSource)
131
+ {
132
+ Defclass *cls;
133
+ CLIPSLexeme *cname, *mname, *wildcard;
134
+ unsigned mtype = MPRIMARY;
135
+ unsigned short min, max;
136
+ unsigned short lvars;
137
+ bool error;
138
+ Expression *hndParams,*actions;
139
+ DefmessageHandler *hnd;
140
+
141
+ SetPPBufferStatus(theEnv,true);
142
+ FlushPPBuffer(theEnv);
143
+ SetIndentDepth(theEnv,3);
144
+ SavePPBuffer(theEnv,"(defmessage-handler ");
145
+
146
+ #if BLOAD || BLOAD_AND_BSAVE
147
+ if ((Bloaded(theEnv)) && (! ConstructData(theEnv)->CheckSyntaxMode))
148
+ {
149
+ CannotLoadWithBloadMessage(theEnv,"defmessage-handler");
150
+ return true;
151
+ }
152
+ #endif
153
+ cname = GetConstructNameAndComment(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken,"defmessage-handler",
154
+ NULL,NULL,"~",true,false,true,false);
155
+ if (cname == NULL)
156
+ return true;
157
+ cls = LookupDefclassByMdlOrScope(theEnv,cname->contents);
158
+ if (cls == NULL)
159
+ {
160
+ PrintErrorID(theEnv,"MSGPSR",1,false);
161
+ WriteString(theEnv,STDERR,"A class must be defined before its message-handlers.\n");
162
+ return true;
163
+ }
164
+ if ((cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]) ||
165
+ (cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_ADDRESS_TYPE]) ||
166
+ (cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]->directSuperclasses.classArray[0]))
167
+ {
168
+ PrintErrorID(theEnv,"MSGPSR",8,false);
169
+ WriteString(theEnv,STDERR,"Message-handlers cannot be attached to the class '");
170
+ WriteString(theEnv,STDERR,DefclassName(cls));
171
+ WriteString(theEnv,STDERR,"'.\n");
172
+ return true;
173
+ }
174
+ if (HandlersExecuting(cls))
175
+ {
176
+ PrintErrorID(theEnv,"MSGPSR",2,false);
177
+ WriteString(theEnv,STDERR,"Cannot (re)define message-handlers during execution of ");
178
+ WriteString(theEnv,STDERR,"other message-handlers for the same class.\n");
179
+ return true;
180
+ }
181
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
182
+ {
183
+ SyntaxErrorMessage(theEnv,"defmessage-handler");
184
+ return true;
185
+ }
186
+ PPBackup(theEnv);
187
+ PPBackup(theEnv);
188
+ SavePPBuffer(theEnv," ");
189
+ SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
190
+ SavePPBuffer(theEnv," ");
191
+ mname = DefclassData(theEnv)->ObjectParseToken.lexemeValue;
192
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
193
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != LEFT_PARENTHESIS_TOKEN)
194
+ {
195
+ SavePPBuffer(theEnv," ");
196
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != STRING_TOKEN)
197
+ {
198
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
199
+ {
200
+ SyntaxErrorMessage(theEnv,"defmessage-handler");
201
+ return true;
202
+ }
203
+ mtype = HandlerType(theEnv,"defmessage-handler",false,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents);
204
+ if (mtype == MERROR)
205
+ return true;
206
+
207
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
208
+ if (DefclassData(theEnv)->ObjectParseToken.tknType == STRING_TOKEN)
209
+ {
210
+ SavePPBuffer(theEnv," ");
211
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
212
+ }
213
+ }
214
+ else
215
+ {
216
+ SavePPBuffer(theEnv," ");
217
+ GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
218
+ }
219
+ }
220
+ PPBackup(theEnv);
221
+ PPBackup(theEnv);
222
+ PPCRAndIndent(theEnv);
223
+ SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
224
+
225
+ hnd = FindHandlerByAddress(cls,mname,mtype);
226
+ if (GetPrintWhileLoading(theEnv) && GetCompilationsWatch(theEnv))
227
+ {
228
+ WriteString(theEnv,STDOUT," Handler ");
229
+ WriteString(theEnv,STDOUT,mname->contents);
230
+ WriteString(theEnv,STDOUT," ");
231
+ WriteString(theEnv,STDOUT,MessageHandlerData(theEnv)->hndquals[mtype]);
232
+ if (hnd == NULL)
233
+ WriteString(theEnv,STDOUT," defined.\n");
234
+ else
235
+ WriteString(theEnv,STDOUT," redefined.\n");
236
+ }
237
+
238
+ if ((hnd != NULL) ? hnd->system : false)
239
+ {
240
+ PrintErrorID(theEnv,"MSGPSR",3,false);
241
+ WriteString(theEnv,STDERR,"System message-handlers may not be modified.\n");
242
+ return true;
243
+ }
244
+
245
+ hndParams = GenConstant(theEnv,SYMBOL_TYPE,MessageHandlerData(theEnv)->SELF_SYMBOL);
246
+ hndParams = ParseProcParameters(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken,hndParams,
247
+ &wildcard,&min,&max,&error,IsParameterSlotReference);
248
+ if (error)
249
+ return true;
250
+ PPCRAndIndent(theEnv);
251
+ ExpressionData(theEnv)->ReturnContext = true;
252
+ actions = ParseProcActions(theEnv,"message-handler",readSource,
253
+ &DefclassData(theEnv)->ObjectParseToken,hndParams,wildcard,
254
+ SlotReferenceVar,BindSlotReference,&lvars,
255
+ cls);
256
+ if (actions == NULL)
257
+ {
258
+ ReturnExpression(theEnv,hndParams);
259
+ return true;
260
+ }
261
+ if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
262
+ {
263
+ SyntaxErrorMessage(theEnv,"defmessage-handler");
264
+ ReturnExpression(theEnv,hndParams);
265
+ ReturnPackedExpression(theEnv,actions);
266
+ return true;
267
+ }
268
+ PPBackup(theEnv);
269
+ PPBackup(theEnv);
270
+ SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
271
+ SavePPBuffer(theEnv,"\n");
272
+
273
+ /* ===================================================
274
+ If we're only checking syntax, don't add the
275
+ successfully parsed defmessage-handler to the KB.
276
+ =================================================== */
277
+
278
+ if (ConstructData(theEnv)->CheckSyntaxMode)
279
+ {
280
+ ReturnExpression(theEnv,hndParams);
281
+ ReturnPackedExpression(theEnv,actions);
282
+ return false;
283
+ }
284
+
285
+ if (hnd != NULL)
286
+ {
287
+ ExpressionDeinstall(theEnv,hnd->actions);
288
+ ReturnPackedExpression(theEnv,hnd->actions);
289
+ if (hnd->header.ppForm != NULL)
290
+ rm(theEnv,(void *) hnd->header.ppForm,
291
+ (sizeof(char) * (strlen(hnd->header.ppForm)+1)));
292
+ }
293
+ else
294
+ {
295
+ hnd = InsertHandlerHeader(theEnv,cls,mname,mtype);
296
+ IncrementLexemeCount(hnd->header.name);
297
+ }
298
+ ReturnExpression(theEnv,hndParams);
299
+
300
+ hnd->minParams = min;
301
+ hnd->maxParams = max;
302
+ hnd->localVarCount = lvars;
303
+ hnd->actions = actions;
304
+ ExpressionInstall(theEnv,hnd->actions);
305
+ #if DEBUGGING_FUNCTIONS
306
+
307
+ /* ===================================================
308
+ Old handler trace status is automatically preserved
309
+ =================================================== */
310
+ if (GetConserveMemory(theEnv) == false)
311
+ hnd->header.ppForm = CopyPPBuffer(theEnv);
312
+ else
313
+ #endif
314
+ hnd->header.ppForm = NULL;
315
+ return false;
316
+ }
317
+
318
+ /*******************************************************************************
319
+ NAME : CreateGetAndPutHandlers
320
+ DESCRIPTION : Creates two message-handlers with
321
+ the following syntax for the slot:
322
+
323
+ (defmessage-handler <class> get-<slot-name> primary ()
324
+ ?self:<slot-name>)
325
+
326
+ For single-field slots:
327
+
328
+ (defmessage-handler <class> put-<slot-name> primary (?value)
329
+ (bind ?self:<slot-name> ?value))
330
+
331
+ For multifield slots:
332
+
333
+ (defmessage-handler <class> put-<slot-name> primary ($?value)
334
+ (bind ?self:<slot-name> ?value))
335
+
336
+ INPUTS : The class slot descriptor
337
+ RETURNS : Nothing useful
338
+ SIDE EFFECTS : Message-handlers created
339
+ NOTES : A put handler is not created for read-only slots
340
+ *******************************************************************************/
341
+ void CreateGetAndPutHandlers(
342
+ Environment *theEnv,
343
+ SlotDescriptor *sd)
344
+ {
345
+ const char *className,*slotName;
346
+ size_t bufsz;
347
+ char *buf;
348
+ const char *handlerRouter = "*** Default Public Handlers ***";
349
+ bool oldPWL,oldCM;
350
+ const char *oldRouter;
351
+ const char *oldString;
352
+ long oldIndex;
353
+
354
+ if ((sd->createReadAccessor == 0) && (sd->createWriteAccessor == 0))
355
+ return;
356
+ className = sd->cls->header.name->contents;
357
+ slotName = sd->slotName->name->contents;
358
+
359
+ bufsz = (sizeof(char) * (strlen(className) + (strlen(slotName) * 2) + 80));
360
+ buf = (char *) gm2(theEnv,bufsz);
361
+
362
+ oldPWL = GetPrintWhileLoading(theEnv);
363
+ SetPrintWhileLoading(theEnv,false);
364
+ oldCM = SetConserveMemory(theEnv,true);
365
+
366
+ if (sd->createReadAccessor)
367
+ {
368
+ gensprintf(buf,"%s get-%s () ?self:%s)",className,slotName,slotName);
369
+
370
+ oldRouter = RouterData(theEnv)->FastCharGetRouter;
371
+ oldString = RouterData(theEnv)->FastCharGetString;
372
+ oldIndex = RouterData(theEnv)->FastCharGetIndex;
373
+
374
+ RouterData(theEnv)->FastCharGetRouter = handlerRouter;
375
+ RouterData(theEnv)->FastCharGetIndex = 0;
376
+ RouterData(theEnv)->FastCharGetString = buf;
377
+
378
+ ParseDefmessageHandler(theEnv,handlerRouter);
379
+ DestroyPPBuffer(theEnv);
380
+ /*
381
+ if (OpenStringSource(theEnv,handlerRouter,buf,0))
382
+ {
383
+ ParseDefmessageHandler(handlerRouter);
384
+ DestroyPPBuffer();
385
+ CloseStringSource(theEnv,handlerRouter);
386
+ }
387
+ */
388
+ RouterData(theEnv)->FastCharGetRouter = oldRouter;
389
+ RouterData(theEnv)->FastCharGetIndex = oldIndex;
390
+ RouterData(theEnv)->FastCharGetString = oldString;
391
+ }
392
+
393
+ if (sd->createWriteAccessor)
394
+ {
395
+ gensprintf(buf,"%s put-%s ($?value) (bind ?self:%s ?value))",
396
+ className,slotName,slotName);
397
+
398
+ oldRouter = RouterData(theEnv)->FastCharGetRouter;
399
+ oldString = RouterData(theEnv)->FastCharGetString;
400
+ oldIndex = RouterData(theEnv)->FastCharGetIndex;
401
+
402
+ RouterData(theEnv)->FastCharGetRouter = handlerRouter;
403
+ RouterData(theEnv)->FastCharGetIndex = 0;
404
+ RouterData(theEnv)->FastCharGetString = buf;
405
+
406
+ ParseDefmessageHandler(theEnv,handlerRouter);
407
+ DestroyPPBuffer(theEnv);
408
+
409
+ /*
410
+ if (OpenStringSource(theEnv,handlerRouter,buf,0))
411
+ {
412
+ ParseDefmessageHandler(handlerRouter);
413
+ DestroyPPBuffer();
414
+ CloseStringSource(theEnv,handlerRouter);
415
+ }
416
+ */
417
+ RouterData(theEnv)->FastCharGetRouter = oldRouter;
418
+ RouterData(theEnv)->FastCharGetIndex = oldIndex;
419
+ RouterData(theEnv)->FastCharGetString = oldString;
420
+ }
421
+
422
+ SetPrintWhileLoading(theEnv,oldPWL);
423
+ SetConserveMemory(theEnv,oldCM);
424
+
425
+ rm(theEnv,buf,bufsz);
426
+ }
427
+
428
+ /* =========================================
429
+ *****************************************
430
+ INTERNALLY VISIBLE FUNCTIONS
431
+ =========================================
432
+ ***************************************** */
433
+
434
+ /*****************************************************************
435
+ NAME : IsParameterSlotReference
436
+ DESCRIPTION : Determines if a message-handler parameter is of
437
+ the form ?self:<name>, which is not allowed since
438
+ this is slot reference syntax
439
+ INPUTS : The paramter name
440
+ RETURNS : True if the parameter is a slot reference,
441
+ false otherwise
442
+ SIDE EFFECTS : None
443
+ NOTES : None
444
+ *****************************************************************/
445
+ static bool IsParameterSlotReference(
446
+ Environment *theEnv,
447
+ const char *pname)
448
+ {
449
+ if ((strncmp(pname,SELF_STRING,SELF_LEN) == 0) ?
450
+ (pname[SELF_LEN] == SELF_SLOT_REF) : false)
451
+ {
452
+ PrintErrorID(theEnv,"MSGPSR",4,false);
453
+ WriteString(theEnv,STDERR,"Illegal slot reference in parameter list.\n");
454
+ return true;
455
+ }
456
+ return false;
457
+ }
458
+
459
+ /****************************************************************************
460
+ NAME : SlotReferenceVar
461
+ DESCRIPTION : Replaces direct slot references in handler body
462
+ with special function calls to reference active instance
463
+ at run-time
464
+ The slot in in the class bound at parse-time is always
465
+ referenced (early binding).
466
+ Slot references of the form ?self:<name> directly reference
467
+ ProcParamArray[0] (the message object - ?self) to
468
+ find the specified slot at run-time
469
+ INPUTS : 1) Variable expression
470
+ 2) The class of the handler being parsed
471
+ RETURNS : 0 if not recognized, 1 if so, -1 on errors
472
+ SIDE EFFECTS : Handler body SF_VARIABLE and MF_VARIABLE replaced with
473
+ direct slot access function
474
+ NOTES : Objects are allowed to directly access their own slots
475
+ without sending a message to themselves. Since the object
476
+ is "within the boundary of its internals", this does not
477
+ violate the encapsulation principle of OOP.
478
+ ****************************************************************************/
479
+ static int SlotReferenceVar(
480
+ Environment *theEnv,
481
+ Expression *varexp,
482
+ void *userBuffer)
483
+ {
484
+ struct token itkn;
485
+ bool oldpp;
486
+ SlotDescriptor *sd;
487
+
488
+ if ((varexp->type != SF_VARIABLE) && (varexp->type != MF_VARIABLE))
489
+ { return 0; }
490
+ if ((strncmp(varexp->lexemeValue->contents,SELF_STRING,SELF_LEN) == 0) ?
491
+ (varexp->lexemeValue->contents[SELF_LEN] == SELF_SLOT_REF) : false)
492
+ {
493
+ OpenStringSource(theEnv,"hnd-var",varexp->lexemeValue->contents + SELF_LEN + 1,0);
494
+ oldpp = GetPPBufferStatus(theEnv);
495
+ SetPPBufferStatus(theEnv,false);
496
+ GetToken(theEnv,"hnd-var",&itkn);
497
+ SetPPBufferStatus(theEnv,oldpp);
498
+ CloseStringSource(theEnv,"hnd-var");
499
+ if (itkn.tknType != STOP_TOKEN)
500
+ {
501
+ sd = CheckSlotReference(theEnv,(Defclass *) userBuffer,TokenTypeToType(itkn.tknType),itkn.value,
502
+ false,NULL);
503
+ if (sd == NULL)
504
+ { return -1; }
505
+ GenHandlerSlotReference(theEnv,varexp,HANDLER_GET,sd);
506
+ return 1;
507
+ }
508
+ }
509
+
510
+ return 0;
511
+ }
512
+
513
+ /****************************************************************************
514
+ NAME : BindSlotReference
515
+ DESCRIPTION : Replaces direct slot binds in handler body with special
516
+ function calls to reference active instance at run-time
517
+ The slot in in the class bound at parse-time is always
518
+ referenced (early binding).
519
+ Slot references of the form ?self:<name> directly reference
520
+ ProcParamArray[0] (the message object - ?self) to
521
+ find the specified slot at run-time
522
+ INPUTS : 1) Variable expression
523
+ 2) The class for the message-handler being parsed
524
+ RETURNS : 0 if not recognized, 1 if so, -1 on errors
525
+ SIDE EFFECTS : Handler body "bind" call replaced with direct slot access
526
+ function
527
+ NOTES : Objects are allowed to directly access their own slots
528
+ without sending a message to themselves. Since the object
529
+ is "within the boundary of its internals", this does not
530
+ violate the encapsulation principle of OOP.
531
+ ****************************************************************************/
532
+ static int BindSlotReference(
533
+ Environment *theEnv,
534
+ Expression *bindExp,
535
+ void *userBuffer)
536
+ {
537
+ const char *bindName;
538
+ struct token itkn;
539
+ bool oldpp;
540
+ SlotDescriptor *sd;
541
+ Expression *saveExp;
542
+
543
+ bindName = bindExp->argList->lexemeValue->contents;
544
+ if (strcmp(bindName,SELF_STRING) == 0)
545
+ {
546
+ PrintErrorID(theEnv,"MSGPSR",5,false);
547
+ WriteString(theEnv,STDERR,"Active instance parameter cannot be changed.\n");
548
+ return -1;
549
+ }
550
+ if ((strncmp(bindName,SELF_STRING,SELF_LEN) == 0) ?
551
+ (bindName[SELF_LEN] == SELF_SLOT_REF) : false)
552
+ {
553
+ OpenStringSource(theEnv,"hnd-var",bindName + SELF_LEN + 1,0);
554
+ oldpp = GetPPBufferStatus(theEnv);
555
+ SetPPBufferStatus(theEnv,false);
556
+ GetToken(theEnv,"hnd-var",&itkn);
557
+ SetPPBufferStatus(theEnv,oldpp);
558
+ CloseStringSource(theEnv,"hnd-var");
559
+ if (itkn.tknType != STOP_TOKEN)
560
+ {
561
+ saveExp = bindExp->argList->nextArg;
562
+ sd = CheckSlotReference(theEnv,(Defclass *) userBuffer,TokenTypeToType(itkn.tknType),itkn.value,
563
+ true,saveExp);
564
+ if (sd == NULL)
565
+ { return -1; }
566
+ GenHandlerSlotReference(theEnv,bindExp,HANDLER_PUT,sd);
567
+ bindExp->argList->nextArg = NULL;
568
+ ReturnExpression(theEnv,bindExp->argList);
569
+ bindExp->argList = saveExp;
570
+ return 1;
571
+ }
572
+ }
573
+ return 0;
574
+ }
575
+
576
+ /*********************************************************
577
+ NAME : CheckSlotReference
578
+ DESCRIPTION : Examines a ?self:<slot-name> reference
579
+ If the reference is a single-field or
580
+ global variable, checking and evaluation
581
+ is delayed until run-time. If the
582
+ reference is a symbol, this routine
583
+ verifies that the slot is a legal
584
+ slot for the reference (i.e., it exists
585
+ in the class to which the message-handler
586
+ is being attached, it is visible and it
587
+ is writable for write reference)
588
+ INPUTS : 1) A buffer holding the class
589
+ of the handler being parsed
590
+ 2) The type of the slot reference
591
+ 3) The value of the slot reference
592
+ 4) A flag indicating if this is a read
593
+ or write access
594
+ 5) Value expression for write
595
+ RETURNS : Class slot on success, NULL on errors
596
+ SIDE EFFECTS : Messages printed on errors.
597
+ NOTES : For static references, this function
598
+ insures that the slot is either
599
+ publicly visible or that the handler
600
+ is being attached to the same class in
601
+ which the private slot is defined.
602
+ *********************************************************/
603
+ static SlotDescriptor *CheckSlotReference(
604
+ Environment *theEnv,
605
+ Defclass *theDefclass,
606
+ int theType,
607
+ void *theValue,
608
+ bool writeFlag,
609
+ Expression *writeExpression)
610
+ {
611
+ int slotIndex;
612
+ SlotDescriptor *sd;
613
+ ConstraintViolationType vCode;
614
+
615
+ if (theType != SYMBOL_TYPE)
616
+ {
617
+ PrintErrorID(theEnv,"MSGPSR",7,false);
618
+ WriteString(theEnv,STDERR,"Illegal value for ?self reference.\n");
619
+ return NULL;
620
+ }
621
+ slotIndex = FindInstanceTemplateSlot(theEnv,theDefclass,(CLIPSLexeme *) theValue);
622
+ if (slotIndex == -1)
623
+ {
624
+ PrintErrorID(theEnv,"MSGPSR",6,false);
625
+ WriteString(theEnv,STDERR,"No such slot '");
626
+ WriteString(theEnv,STDERR,((CLIPSLexeme *) theValue)->contents);
627
+ WriteString(theEnv,STDERR,"' in class '");
628
+ WriteString(theEnv,STDERR,DefclassName(theDefclass));
629
+ WriteString(theEnv,STDERR,"' for ?self reference.\n");
630
+ return NULL;
631
+ }
632
+ sd = theDefclass->instanceTemplate[slotIndex];
633
+ if ((sd->publicVisibility == 0) && (sd->cls != theDefclass))
634
+ {
635
+ SlotVisibilityViolationError(theEnv,sd,theDefclass,true);
636
+ return NULL;
637
+ }
638
+ if (! writeFlag)
639
+ return(sd);
640
+
641
+ /* =================================================
642
+ If a slot is initialize-only, the WithinInit flag
643
+ still needs to be checked at run-time, for the
644
+ handler could be called out of the context of
645
+ an init.
646
+ ================================================= */
647
+ if (sd->noWrite && (sd->initializeOnly == 0))
648
+ {
649
+ SlotAccessViolationError(theEnv,((CLIPSLexeme *) theValue)->contents,
650
+ NULL,theDefclass);
651
+ return NULL;
652
+ }
653
+
654
+ vCode = ConstraintCheckExpressionChain(theEnv,writeExpression,sd->constraint);
655
+ if (vCode != NO_VIOLATION)
656
+ {
657
+ PrintErrorID(theEnv,"CSTRNCHK",1,false);
658
+ WriteString(theEnv,STDERR,"Expression for ");
659
+ PrintSlot(theEnv,STDERR,sd,NULL,"direct slot write");
660
+ ConstraintViolationErrorMessage(theEnv,NULL,NULL,0,0,NULL,0,
661
+ vCode,sd->constraint,false);
662
+ return NULL;
663
+ }
664
+ return(sd);
665
+ }
666
+
667
+ /***************************************************
668
+ NAME : GenHandlerSlotReference
669
+ DESCRIPTION : Creates a bitmap of the class id
670
+ and slot index for the get or put
671
+ operation. The bitmap and operation
672
+ type are stored in the given
673
+ expression.
674
+ INPUTS : 1) The expression
675
+ 2) The operation type
676
+ 3) The class slot
677
+ RETURNS : Nothing useful
678
+ SIDE EFFECTS : Bitmap created and expression
679
+ initialized
680
+ NOTES : None
681
+ ***************************************************/
682
+ static void GenHandlerSlotReference(
683
+ Environment *theEnv,
684
+ Expression *theExp,
685
+ unsigned short theType,
686
+ SlotDescriptor *sd)
687
+ {
688
+ HANDLER_SLOT_REFERENCE handlerReference;
689
+
690
+ ClearBitString(&handlerReference,sizeof(HANDLER_SLOT_REFERENCE));
691
+ handlerReference.classID = sd->cls->id;
692
+ handlerReference.slotID = sd->slotName->id;
693
+ theExp->type = theType;
694
+ theExp->value = AddBitMap(theEnv,&handlerReference,
695
+ sizeof(HANDLER_SLOT_REFERENCE));
696
+ }
697
+
698
+ #endif