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,737 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/01/16 */
5
+ /* */
6
+ /* */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Generic Function Execution Routines */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* Revision History: */
18
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
19
+ /* */
20
+ /* 6.24: Removed IMPERATIVE_METHODS compilation flag. */
21
+ /* */
22
+ /* 6.30: Changed garbage collection algorithm. */
23
+ /* */
24
+ /* Support for long long integers. */
25
+ /* */
26
+ /* Changed integer type/precision. */
27
+ /* */
28
+ /* Added const qualifiers to remove C++ */
29
+ /* deprecation warnings. */
30
+ /* */
31
+ /* 6.40: Added Env prefix to GetEvaluationError and */
32
+ /* SetEvaluationError functions. */
33
+ /* */
34
+ /* Pragma once and other inclusion changes. */
35
+ /* */
36
+ /* Added support for booleans with <stdbool.h>. */
37
+ /* */
38
+ /* Removed use of void pointers for specific */
39
+ /* data structures. */
40
+ /* */
41
+ /* UDF redesign. */
42
+ /* */
43
+ /* Added GCBlockStart and GCBlockEnd functions */
44
+ /* for garbage collection blocks. */
45
+ /* */
46
+ /*************************************************************/
47
+
48
+ /* =========================================
49
+ *****************************************
50
+ EXTERNAL DEFINITIONS
51
+ =========================================
52
+ ***************************************** */
53
+ #include "setup.h"
54
+
55
+ #if DEFGENERIC_CONSTRUCT
56
+
57
+ #include <string.h>
58
+
59
+ #if OBJECT_SYSTEM
60
+ #include "classcom.h"
61
+ #include "classfun.h"
62
+ #include "insfun.h"
63
+ #endif
64
+
65
+ #include "argacces.h"
66
+ #include "constrct.h"
67
+ #include "envrnmnt.h"
68
+ #include "genrccom.h"
69
+ #include "prcdrfun.h"
70
+ #include "prccode.h"
71
+ #include "prntutil.h"
72
+ #include "proflfun.h"
73
+ #include "router.h"
74
+ #include "utility.h"
75
+
76
+ #include "genrcexe.h"
77
+
78
+ /* =========================================
79
+ *****************************************
80
+ CONSTANTS
81
+ =========================================
82
+ ***************************************** */
83
+
84
+ #define BEGIN_TRACE ">>"
85
+ #define END_TRACE "<<"
86
+
87
+ /* =========================================
88
+ *****************************************
89
+ INTERNALLY VISIBLE FUNCTION HEADERS
90
+ =========================================
91
+ ***************************************** */
92
+
93
+ static Defmethod *FindApplicableMethod(Environment *,Defgeneric *,Defmethod *);
94
+
95
+ #if DEBUGGING_FUNCTIONS
96
+ static void WatchGeneric(Environment *,const char *);
97
+ static void WatchMethod(Environment *,const char *);
98
+ #endif
99
+
100
+ #if OBJECT_SYSTEM
101
+ static Defclass *DetermineRestrictionClass(Environment *,UDFValue *);
102
+ #endif
103
+
104
+ /* =========================================
105
+ *****************************************
106
+ EXTERNALLY VISIBLE FUNCTIONS
107
+ =========================================
108
+ ***************************************** */
109
+
110
+ /***********************************************************************************
111
+ NAME : GenericDispatch
112
+ DESCRIPTION : Executes the most specific applicable method
113
+ INPUTS : 1) The generic function
114
+ 2) The method to start after in the search for an applicable
115
+ method (ignored if arg #3 is not NULL).
116
+ 3) A specific method to call (NULL if want highest precedence
117
+ method to be called)
118
+ 4) The generic function argument expressions
119
+ 5) The caller's result value buffer
120
+ RETURNS : Nothing useful
121
+ SIDE EFFECTS : Any side-effects of evaluating the generic function arguments
122
+ Any side-effects of evaluating query functions on method parameter
123
+ restrictions when determining the core (see warning #1)
124
+ Any side-effects of actual execution of methods (see warning #2)
125
+ Caller's buffer set to the result of the generic function call
126
+
127
+ In case of errors, the result is false, otherwise it is the
128
+ result returned by the most specific method (which can choose
129
+ to ignore or return the values of more general methods)
130
+ NOTES : WARNING #1: Query functions on method parameter restrictions
131
+ should not have side-effects, for they might be evaluated even
132
+ for methods that aren't applicable to the generic function call.
133
+ WARNING #2: Side-effects of method execution should not always rely
134
+ on only being executed once per generic function call. Every
135
+ time a method calls (shadow-call) the same next-most-specific
136
+ method is executed. Thus, it is possible for a method to be
137
+ executed multiple times per generic function call.
138
+ ***********************************************************************************/
139
+ void GenericDispatch(
140
+ Environment *theEnv,
141
+ Defgeneric *gfunc,
142
+ Defmethod *prevmeth,
143
+ Defmethod *meth,
144
+ Expression *params,
145
+ UDFValue *returnValue)
146
+ {
147
+ Defgeneric *previousGeneric;
148
+ Defmethod *previousMethod;
149
+ bool oldce;
150
+ #if PROFILING_FUNCTIONS
151
+ struct profileFrameInfo profileFrame;
152
+ #endif
153
+ GCBlock gcb;
154
+
155
+ returnValue->value = FalseSymbol(theEnv);
156
+ EvaluationData(theEnv)->EvaluationError = false;
157
+ if (EvaluationData(theEnv)->HaltExecution)
158
+ return;
159
+
160
+ GCBlockStart(theEnv,&gcb);
161
+
162
+ oldce = ExecutingConstruct(theEnv);
163
+ SetExecutingConstruct(theEnv,true);
164
+ previousGeneric = DefgenericData(theEnv)->CurrentGeneric;
165
+ previousMethod = DefgenericData(theEnv)->CurrentMethod;
166
+ DefgenericData(theEnv)->CurrentGeneric = gfunc;
167
+ EvaluationData(theEnv)->CurrentEvaluationDepth++;
168
+ gfunc->busy++;
169
+ PushProcParameters(theEnv,params,CountArguments(params),
170
+ DefgenericName(gfunc),
171
+ "generic function",UnboundMethodErr);
172
+ if (EvaluationData(theEnv)->EvaluationError)
173
+ {
174
+ gfunc->busy--;
175
+ DefgenericData(theEnv)->CurrentGeneric = previousGeneric;
176
+ DefgenericData(theEnv)->CurrentMethod = previousMethod;
177
+ EvaluationData(theEnv)->CurrentEvaluationDepth--;
178
+
179
+ GCBlockEndUDF(theEnv,&gcb,returnValue);
180
+ CallPeriodicTasks(theEnv);
181
+
182
+ SetExecutingConstruct(theEnv,oldce);
183
+ return;
184
+ }
185
+ if (meth != NULL)
186
+ {
187
+ if (IsMethodApplicable(theEnv,meth))
188
+ {
189
+ meth->busy++;
190
+ DefgenericData(theEnv)->CurrentMethod = meth;
191
+ }
192
+ else
193
+ {
194
+ PrintErrorID(theEnv,"GENRCEXE",4,false);
195
+ SetEvaluationError(theEnv,true);
196
+ DefgenericData(theEnv)->CurrentMethod = NULL;
197
+ WriteString(theEnv,STDERR,"Generic function '");
198
+ WriteString(theEnv,STDERR,DefgenericName(gfunc));
199
+ WriteString(theEnv,STDERR,"' method #");
200
+ PrintUnsignedInteger(theEnv,STDERR,meth->index);
201
+ WriteString(theEnv,STDERR," is not applicable to the given arguments.\n");
202
+ }
203
+ }
204
+ else
205
+ DefgenericData(theEnv)->CurrentMethod = FindApplicableMethod(theEnv,gfunc,prevmeth);
206
+ if (DefgenericData(theEnv)->CurrentMethod != NULL)
207
+ {
208
+ #if DEBUGGING_FUNCTIONS
209
+ if (DefgenericData(theEnv)->CurrentGeneric->trace)
210
+ WatchGeneric(theEnv,BEGIN_TRACE);
211
+ if (DefgenericData(theEnv)->CurrentMethod->trace)
212
+ WatchMethod(theEnv,BEGIN_TRACE);
213
+ #endif
214
+ if (DefgenericData(theEnv)->CurrentMethod->system)
215
+ {
216
+ Expression fcall;
217
+
218
+ fcall.type = FCALL;
219
+ fcall.value = DefgenericData(theEnv)->CurrentMethod->actions->value;
220
+ fcall.nextArg = NULL;
221
+ fcall.argList = GetProcParamExpressions(theEnv);
222
+ EvaluateExpression(theEnv,&fcall,returnValue);
223
+ }
224
+ else
225
+ {
226
+ #if PROFILING_FUNCTIONS
227
+ StartProfile(theEnv,&profileFrame,
228
+ &DefgenericData(theEnv)->CurrentMethod->header.usrData,
229
+ ProfileFunctionData(theEnv)->ProfileConstructs);
230
+ #endif
231
+
232
+ EvaluateProcActions(theEnv,DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule,
233
+ DefgenericData(theEnv)->CurrentMethod->actions,DefgenericData(theEnv)->CurrentMethod->localVarCount,
234
+ returnValue,UnboundMethodErr);
235
+
236
+ #if PROFILING_FUNCTIONS
237
+ EndProfile(theEnv,&profileFrame);
238
+ #endif
239
+ }
240
+ DefgenericData(theEnv)->CurrentMethod->busy--;
241
+ #if DEBUGGING_FUNCTIONS
242
+ if (DefgenericData(theEnv)->CurrentMethod->trace)
243
+ WatchMethod(theEnv,END_TRACE);
244
+ if (DefgenericData(theEnv)->CurrentGeneric->trace)
245
+ WatchGeneric(theEnv,END_TRACE);
246
+ #endif
247
+ }
248
+ else if (! EvaluationData(theEnv)->EvaluationError)
249
+ {
250
+ PrintErrorID(theEnv,"GENRCEXE",1,false);
251
+ WriteString(theEnv,STDERR,"No applicable methods for '");
252
+ WriteString(theEnv,STDERR,DefgenericName(gfunc));
253
+ WriteString(theEnv,STDERR,"'.\n");
254
+ SetEvaluationError(theEnv,true);
255
+ }
256
+ gfunc->busy--;
257
+ ProcedureFunctionData(theEnv)->ReturnFlag = false;
258
+ PopProcParameters(theEnv);
259
+ DefgenericData(theEnv)->CurrentGeneric = previousGeneric;
260
+ DefgenericData(theEnv)->CurrentMethod = previousMethod;
261
+ EvaluationData(theEnv)->CurrentEvaluationDepth--;
262
+
263
+ GCBlockEndUDF(theEnv,&gcb,returnValue);
264
+ CallPeriodicTasks(theEnv);
265
+
266
+ SetExecutingConstruct(theEnv,oldce);
267
+ }
268
+
269
+ /*******************************************************
270
+ NAME : UnboundMethodErr
271
+ DESCRIPTION : Print out a synopis of the currently
272
+ executing method for unbound variable
273
+ errors
274
+ INPUTS : None
275
+ RETURNS : Nothing useful
276
+ SIDE EFFECTS : Error synopsis printed to STDERR
277
+ NOTES : None
278
+ *******************************************************/
279
+ void UnboundMethodErr(
280
+ Environment *theEnv,
281
+ const char *logName)
282
+ {
283
+ WriteString(theEnv,logName,"generic function '");
284
+ WriteString(theEnv,logName,DefgenericName(DefgenericData(theEnv)->CurrentGeneric));
285
+ WriteString(theEnv,logName,"' method #");
286
+ PrintUnsignedInteger(theEnv,logName,DefgenericData(theEnv)->CurrentMethod->index);
287
+ WriteString(theEnv,logName,".\n");
288
+ }
289
+
290
+ /***********************************************************************
291
+ NAME : IsMethodApplicable
292
+ DESCRIPTION : Tests to see if a method satsifies the arguments of a
293
+ generic function
294
+ A method is applicable if all its restrictions are
295
+ satisfied by the corresponding arguments
296
+ INPUTS : The method address
297
+ RETURNS : True if method is applicable, false otherwise
298
+ SIDE EFFECTS : Any query functions are evaluated
299
+ NOTES : Uses globals ProcParamArraySize and ProcParamArray
300
+ ***********************************************************************/
301
+ bool IsMethodApplicable(
302
+ Environment *theEnv,
303
+ Defmethod *meth)
304
+ {
305
+ UDFValue temp;
306
+ unsigned int i,j,k;
307
+ RESTRICTION *rp;
308
+ #if OBJECT_SYSTEM
309
+ Defclass *type;
310
+ #else
311
+ int type;
312
+ #endif
313
+
314
+ if (((ProceduralPrimitiveData(theEnv)->ProcParamArraySize < meth->minRestrictions) && (meth->minRestrictions != RESTRICTIONS_UNBOUNDED)) ||
315
+ ((ProceduralPrimitiveData(theEnv)->ProcParamArraySize > meth->minRestrictions) && (meth->maxRestrictions != RESTRICTIONS_UNBOUNDED))) // TBD minRestrictions || maxRestrictions
316
+ return false;
317
+ for (i = 0 , k = 0 ; i < ProceduralPrimitiveData(theEnv)->ProcParamArraySize ; i++)
318
+ {
319
+ rp = &meth->restrictions[k];
320
+ if (rp->tcnt != 0)
321
+ {
322
+ #if OBJECT_SYSTEM
323
+ type = DetermineRestrictionClass(theEnv,&ProceduralPrimitiveData(theEnv)->ProcParamArray[i]);
324
+ if (type == NULL)
325
+ return false;
326
+ for (j = 0 ; j < rp->tcnt ; j++)
327
+ {
328
+ if (type == rp->types[j])
329
+ break;
330
+ if (HasSuperclass(type,(Defclass *) rp->types[j]))
331
+ break;
332
+ if (rp->types[j] == (void *) DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_ADDRESS_TYPE])
333
+ {
334
+ if (ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_ADDRESS_TYPE)
335
+ break;
336
+ }
337
+ else if (rp->types[j] == (void *) DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE])
338
+ {
339
+ if (ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_NAME_TYPE)
340
+ break;
341
+ }
342
+ else if (rp->types[j] ==
343
+ DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]->directSuperclasses.classArray[0])
344
+ {
345
+ if ((ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_NAME_TYPE) ||
346
+ (ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_ADDRESS_TYPE))
347
+ break;
348
+ }
349
+ }
350
+ #else
351
+ type = ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type;
352
+ for (j = 0 ; j < rp->tcnt ; j++)
353
+ {
354
+ if (type == ((CLIPSInteger *) (rp->types[j]))->contents)
355
+ break;
356
+ if (SubsumeType(type,((CLIPSInteger *) (rp->types[j]))->contents))
357
+ break;
358
+ }
359
+ #endif
360
+ if (j == rp->tcnt)
361
+ return false;
362
+ }
363
+ if (rp->query != NULL)
364
+ {
365
+ DefgenericData(theEnv)->GenericCurrentArgument = &ProceduralPrimitiveData(theEnv)->ProcParamArray[i];
366
+ EvaluateExpression(theEnv,rp->query,&temp);
367
+ if (temp.value == FalseSymbol(theEnv))
368
+ return false;
369
+ }
370
+ if ((k + 1) != meth->restrictionCount)
371
+ k++;
372
+ }
373
+ return true;
374
+ }
375
+
376
+ /***************************************************
377
+ NAME : NextMethodP
378
+ DESCRIPTION : Determines if a shadowed generic
379
+ function method is available for
380
+ execution
381
+ INPUTS : None
382
+ RETURNS : True if there is a method available,
383
+ false otherwise
384
+ SIDE EFFECTS : None
385
+ NOTES : H/L Syntax: (next-methodp)
386
+ ***************************************************/
387
+ bool NextMethodP(
388
+ Environment *theEnv)
389
+ {
390
+ Defmethod *meth;
391
+
392
+ if (DefgenericData(theEnv)->CurrentMethod == NULL)
393
+ { return false; }
394
+
395
+ meth = FindApplicableMethod(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod);
396
+ if (meth != NULL)
397
+ {
398
+ meth->busy--;
399
+ return true;
400
+ }
401
+ else
402
+ { return false; }
403
+ }
404
+
405
+ void NextMethodPCommand(
406
+ Environment *theEnv,
407
+ UDFContext *context,
408
+ UDFValue *returnValue)
409
+ {
410
+ returnValue->lexemeValue = CreateBoolean(theEnv,NextMethodP(theEnv));
411
+ }
412
+
413
+ /****************************************************
414
+ NAME : CallNextMethod
415
+ DESCRIPTION : Executes the next available method
416
+ in the core for a generic function
417
+ INPUTS : Caller's buffer for the result
418
+ RETURNS : Nothing useful
419
+ SIDE EFFECTS : Side effects of execution of shadow
420
+ EvaluationError set if no method
421
+ is available to execute.
422
+ NOTES : H/L Syntax: (call-next-method)
423
+ ****************************************************/
424
+ void CallNextMethod(
425
+ Environment *theEnv,
426
+ UDFContext *context,
427
+ UDFValue *returnValue)
428
+ {
429
+ Defmethod *oldMethod;
430
+ #if PROFILING_FUNCTIONS
431
+ struct profileFrameInfo profileFrame;
432
+ #endif
433
+
434
+ returnValue->lexemeValue = FalseSymbol(theEnv);
435
+
436
+ if (EvaluationData(theEnv)->HaltExecution)
437
+ return;
438
+ oldMethod = DefgenericData(theEnv)->CurrentMethod;
439
+ if (DefgenericData(theEnv)->CurrentMethod != NULL)
440
+ DefgenericData(theEnv)->CurrentMethod = FindApplicableMethod(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod);
441
+ if (DefgenericData(theEnv)->CurrentMethod == NULL)
442
+ {
443
+ DefgenericData(theEnv)->CurrentMethod = oldMethod;
444
+ PrintErrorID(theEnv,"GENRCEXE",2,false);
445
+ WriteString(theEnv,STDERR,"Shadowed methods not applicable in current context.\n");
446
+ SetEvaluationError(theEnv,true);
447
+ return;
448
+ }
449
+
450
+ #if DEBUGGING_FUNCTIONS
451
+ if (DefgenericData(theEnv)->CurrentMethod->trace)
452
+ WatchMethod(theEnv,BEGIN_TRACE);
453
+ #endif
454
+ if (DefgenericData(theEnv)->CurrentMethod->system)
455
+ {
456
+ Expression fcall;
457
+
458
+ fcall.type = FCALL;
459
+ fcall.value = DefgenericData(theEnv)->CurrentMethod->actions->value;
460
+ fcall.nextArg = NULL;
461
+ fcall.argList = GetProcParamExpressions(theEnv);
462
+ EvaluateExpression(theEnv,&fcall,returnValue);
463
+ }
464
+ else
465
+ {
466
+ #if PROFILING_FUNCTIONS
467
+ StartProfile(theEnv,&profileFrame,
468
+ &DefgenericData(theEnv)->CurrentGeneric->header.usrData,
469
+ ProfileFunctionData(theEnv)->ProfileConstructs);
470
+ #endif
471
+
472
+ EvaluateProcActions(theEnv,DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule,
473
+ DefgenericData(theEnv)->CurrentMethod->actions,DefgenericData(theEnv)->CurrentMethod->localVarCount,
474
+ returnValue,UnboundMethodErr);
475
+
476
+ #if PROFILING_FUNCTIONS
477
+ EndProfile(theEnv,&profileFrame);
478
+ #endif
479
+ }
480
+
481
+ DefgenericData(theEnv)->CurrentMethod->busy--;
482
+ #if DEBUGGING_FUNCTIONS
483
+ if (DefgenericData(theEnv)->CurrentMethod->trace)
484
+ WatchMethod(theEnv,END_TRACE);
485
+ #endif
486
+ DefgenericData(theEnv)->CurrentMethod = oldMethod;
487
+ ProcedureFunctionData(theEnv)->ReturnFlag = false;
488
+ }
489
+
490
+ /**************************************************************************
491
+ NAME : CallSpecificMethod
492
+ DESCRIPTION : Allows a specific method to be called without regards to
493
+ higher precedence methods which might also be applicable
494
+ However, shadowed methods can still be called.
495
+ INPUTS : A data object buffer to hold the method evaluation result
496
+ RETURNS : Nothing useful
497
+ SIDE EFFECTS : Side-effects of method applicability tests and the
498
+ evaluation of methods
499
+ NOTES : H/L Syntax: (call-specific-method
500
+ <generic-function> <method-index> <args>)
501
+ **************************************************************************/
502
+ void CallSpecificMethod(
503
+ Environment *theEnv,
504
+ UDFContext *context,
505
+ UDFValue *returnValue)
506
+ {
507
+ UDFValue theArg;
508
+ Defgeneric *gfunc;
509
+ int mi;
510
+
511
+ returnValue->lexemeValue = FalseSymbol(theEnv);
512
+
513
+ if (! UDFFirstArgument(context,SYMBOL_BIT,&theArg)) return;
514
+
515
+ gfunc = CheckGenericExists(theEnv,"call-specific-method",theArg.lexemeValue->contents);
516
+ if (gfunc == NULL) return;
517
+
518
+ if (! UDFNextArgument(context,INTEGER_BIT,&theArg)) return;
519
+
520
+ mi = CheckMethodExists(theEnv,"call-specific-method",gfunc,(unsigned short) theArg.integerValue->contents);
521
+ if (mi == METHOD_NOT_FOUND)
522
+ return;
523
+ gfunc->methods[mi].busy++;
524
+ GenericDispatch(theEnv,gfunc,NULL,&gfunc->methods[mi],
525
+ GetFirstArgument()->nextArg->nextArg,returnValue);
526
+ gfunc->methods[mi].busy--;
527
+ }
528
+
529
+ /***********************************************************************
530
+ NAME : OverrideNextMethod
531
+ DESCRIPTION : Changes the arguments to shadowed methods, thus the set
532
+ of applicable methods to this call may change
533
+ INPUTS : A buffer to hold the result of the call
534
+ RETURNS : Nothing useful
535
+ SIDE EFFECTS : Any of evaluating method restrictions and bodies
536
+ NOTES : H/L Syntax: (override-next-method <args>)
537
+ ***********************************************************************/
538
+ void OverrideNextMethod(
539
+ Environment *theEnv,
540
+ UDFContext *context,
541
+ UDFValue *returnValue)
542
+ {
543
+ returnValue->lexemeValue = FalseSymbol(theEnv);
544
+ if (EvaluationData(theEnv)->HaltExecution)
545
+ return;
546
+ if (DefgenericData(theEnv)->CurrentMethod == NULL)
547
+ {
548
+ PrintErrorID(theEnv,"GENRCEXE",2,false);
549
+ WriteString(theEnv,STDERR,"Shadowed methods not applicable in current context.\n");
550
+ SetEvaluationError(theEnv,true);
551
+ return;
552
+ }
553
+ GenericDispatch(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod,NULL,
554
+ GetFirstArgument(),returnValue);
555
+ }
556
+
557
+ /***********************************************************
558
+ NAME : GetGenericCurrentArgument
559
+ DESCRIPTION : Returns the value of the generic function
560
+ argument being tested in the method
561
+ applicability determination process
562
+ INPUTS : A data-object buffer
563
+ RETURNS : Nothing useful
564
+ SIDE EFFECTS : Data-object set
565
+ NOTES : Useful for queries in wildcard restrictions
566
+ ***********************************************************/
567
+ void GetGenericCurrentArgument(
568
+ Environment *theEnv,
569
+ UDFContext *context,
570
+ UDFValue *returnValue)
571
+ {
572
+ returnValue->value = DefgenericData(theEnv)->GenericCurrentArgument->value;
573
+ returnValue->begin = DefgenericData(theEnv)->GenericCurrentArgument->begin;
574
+ returnValue->range = DefgenericData(theEnv)->GenericCurrentArgument->range;
575
+ }
576
+
577
+ /* =========================================
578
+ *****************************************
579
+ INTERNALLY VISIBLE FUNCTIONS
580
+ =========================================
581
+ ***************************************** */
582
+
583
+ /************************************************************
584
+ NAME : FindApplicableMethod
585
+ DESCRIPTION : Finds the first/next applicable
586
+ method for a generic function call
587
+ INPUTS : 1) The generic function pointer
588
+ 2) The address of the current method
589
+ (NULL to find the first)
590
+ RETURNS : The address of the first/next
591
+ applicable method (NULL on errors)
592
+ SIDE EFFECTS : Any from evaluating query restrictions
593
+ Methoid busy count incremented if applicable
594
+ NOTES : None
595
+ ************************************************************/
596
+ static Defmethod *FindApplicableMethod(
597
+ Environment *theEnv,
598
+ Defgeneric *gfunc,
599
+ Defmethod *meth)
600
+ {
601
+ if (meth != NULL)
602
+ meth++;
603
+ else
604
+ meth = gfunc->methods;
605
+ for ( ; meth < &gfunc->methods[gfunc->mcnt] ; meth++)
606
+ {
607
+ meth->busy++;
608
+ if (IsMethodApplicable(theEnv,meth))
609
+ return(meth);
610
+ meth->busy--;
611
+ }
612
+ return NULL;
613
+ }
614
+
615
+ #if DEBUGGING_FUNCTIONS
616
+
617
+ /**********************************************************************
618
+ NAME : WatchGeneric
619
+ DESCRIPTION : Prints out a trace of the beginning or end
620
+ of the execution of a generic function
621
+ INPUTS : A string to indicate beginning or end of execution
622
+ RETURNS : Nothing useful
623
+ SIDE EFFECTS : None
624
+ NOTES : Uses the globals CurrentGeneric, ProcParamArraySize and
625
+ ProcParamArray for other trace info
626
+ **********************************************************************/
627
+ static void WatchGeneric(
628
+ Environment *theEnv,
629
+ const char *tstring)
630
+ {
631
+ if (ConstructData(theEnv)->ClearReadyInProgress ||
632
+ ConstructData(theEnv)->ClearInProgress)
633
+ { return; }
634
+
635
+ WriteString(theEnv,STDOUT,"GNC ");
636
+ WriteString(theEnv,STDOUT,tstring);
637
+ WriteString(theEnv,STDOUT," ");
638
+ if (DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule != GetCurrentModule(theEnv))
639
+ {
640
+ WriteString(theEnv,STDOUT,DefgenericModule(DefgenericData(theEnv)->CurrentGeneric));
641
+ WriteString(theEnv,STDOUT,"::");
642
+ }
643
+ WriteString(theEnv,STDOUT,DefgenericData(theEnv)->CurrentGeneric->header.name->contents);
644
+ WriteString(theEnv,STDOUT," ");
645
+ WriteString(theEnv,STDOUT," ED:");
646
+ WriteInteger(theEnv,STDOUT,EvaluationData(theEnv)->CurrentEvaluationDepth);
647
+ PrintProcParamArray(theEnv,STDOUT);
648
+ }
649
+
650
+ /**********************************************************************
651
+ NAME : WatchMethod
652
+ DESCRIPTION : Prints out a trace of the beginning or end
653
+ of the execution of a generic function
654
+ method
655
+ INPUTS : A string to indicate beginning or end of execution
656
+ RETURNS : Nothing useful
657
+ SIDE EFFECTS : None
658
+ NOTES : Uses the globals CurrentGeneric, CurrentMethod,
659
+ ProcParamArraySize and ProcParamArray for
660
+ other trace info
661
+ **********************************************************************/
662
+ static void WatchMethod(
663
+ Environment *theEnv,
664
+ const char *tstring)
665
+ {
666
+ if (ConstructData(theEnv)->ClearReadyInProgress ||
667
+ ConstructData(theEnv)->ClearInProgress)
668
+ { return; }
669
+
670
+ WriteString(theEnv,STDOUT,"MTH ");
671
+ WriteString(theEnv,STDOUT,tstring);
672
+ WriteString(theEnv,STDOUT," ");
673
+ if (DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule != GetCurrentModule(theEnv))
674
+ {
675
+ WriteString(theEnv,STDOUT,DefgenericModule(DefgenericData(theEnv)->CurrentGeneric));
676
+ WriteString(theEnv,STDOUT,"::");
677
+ }
678
+ WriteString(theEnv,STDOUT,DefgenericData(theEnv)->CurrentGeneric->header.name->contents);
679
+ WriteString(theEnv,STDOUT,":#");
680
+ if (DefgenericData(theEnv)->CurrentMethod->system)
681
+ WriteString(theEnv,STDOUT,"SYS");
682
+ PrintUnsignedInteger(theEnv,STDOUT,DefgenericData(theEnv)->CurrentMethod->index);
683
+ WriteString(theEnv,STDOUT," ");
684
+ WriteString(theEnv,STDOUT," ED:");
685
+ WriteInteger(theEnv,STDOUT,EvaluationData(theEnv)->CurrentEvaluationDepth);
686
+ PrintProcParamArray(theEnv,STDOUT);
687
+ }
688
+
689
+ #endif
690
+
691
+ #if OBJECT_SYSTEM
692
+
693
+ /***************************************************
694
+ NAME : DetermineRestrictionClass
695
+ DESCRIPTION : Finds the class of an argument in
696
+ the ProcParamArray
697
+ INPUTS : The argument data object
698
+ RETURNS : The class address, NULL if error
699
+ SIDE EFFECTS : EvaluationError set on errors
700
+ NOTES : None
701
+ ***************************************************/
702
+ static Defclass *DetermineRestrictionClass(
703
+ Environment *theEnv,
704
+ UDFValue *dobj)
705
+ {
706
+ Instance *ins;
707
+ Defclass *cls;
708
+
709
+ if (dobj->header->type == INSTANCE_NAME_TYPE)
710
+ {
711
+ ins = FindInstanceBySymbol(theEnv,dobj->lexemeValue);
712
+ cls = (ins != NULL) ? ins->cls : NULL;
713
+ }
714
+ else if (dobj->header->type == INSTANCE_ADDRESS_TYPE)
715
+ {
716
+ ins = dobj->instanceValue;
717
+ cls = (ins->garbage == 0) ? ins->cls : NULL;
718
+ }
719
+ else
720
+ return(DefclassData(theEnv)->PrimitiveClassMap[dobj->header->type]);
721
+ if (cls == NULL)
722
+ {
723
+ SetEvaluationError(theEnv,true);
724
+ PrintErrorID(theEnv,"GENRCEXE",3,false);
725
+ WriteString(theEnv,STDERR,"Unable to determine class of ");
726
+ WriteUDFValue(theEnv,STDERR,dobj);
727
+ WriteString(theEnv,STDERR," in generic function '");
728
+ WriteString(theEnv,STDERR,DefgenericName(DefgenericData(theEnv)->CurrentGeneric));
729
+ WriteString(theEnv,STDERR,"'.\n");
730
+ }
731
+ return(cls);
732
+ }
733
+
734
+ #endif
735
+
736
+ #endif
737
+