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,729 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 09/22/17 */
5
+ /* */
6
+ /* INSTANCE-SET QUERIES PARSER MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Instance_set Queries Parsing Routines */
11
+ /* */
12
+ /* Principal Programmer(s): */
13
+ /* Brian L. Dantes */
14
+ /* */
15
+ /* Contributing Programmer(s): */
16
+ /* */
17
+ /* */
18
+ /* Revision History: */
19
+ /* */
20
+ /* 6.23: Changed name of variable exp to theExp */
21
+ /* because of Unix compiler warnings of shadowed */
22
+ /* definitions. */
23
+ /* */
24
+ /* 6.24: Renamed BOOLEAN macro type to intBool. */
25
+ /* */
26
+ /* 6.30: Fixed memory leaks when error occurred. */
27
+ /* */
28
+ /* Changed integer type/precision. */
29
+ /* */
30
+ /* Support for long long integers. */
31
+ /* */
32
+ /* Added const qualifiers to remove C++ */
33
+ /* deprecation warnings. */
34
+ /* */
35
+ /* Added code to keep track of pointers to */
36
+ /* constructs that are contained externally to */
37
+ /* to constructs, DanglingConstructs. */
38
+ /* */
39
+ /* 6.31: Error check for non-symbolic slot names. */
40
+ /* */
41
+ /* 6.40: Pragma once and other inclusion changes. */
42
+ /* */
43
+ /* Added support for booleans with <stdbool.h>. */
44
+ /* */
45
+ /* Removed use of void pointers for specific */
46
+ /* data structures. */
47
+ /* */
48
+ /* Eval support for run time and bload only. */
49
+ /* */
50
+ /*************************************************************/
51
+
52
+ /* =========================================
53
+ *****************************************
54
+ EXTERNAL DEFINITIONS
55
+ =========================================
56
+ ***************************************** */
57
+ #include "setup.h"
58
+
59
+ #if INSTANCE_SET_QUERIES
60
+
61
+ #include <string.h>
62
+
63
+ #include "classcom.h"
64
+ #include "envrnmnt.h"
65
+ #include "exprnpsr.h"
66
+ #include "insquery.h"
67
+ #include "prcdrpsr.h"
68
+ #include "pprint.h"
69
+ #include "prntutil.h"
70
+ #include "router.h"
71
+ #include "scanner.h"
72
+ #include "strngrtr.h"
73
+
74
+ #include "insqypsr.h"
75
+
76
+ /* =========================================
77
+ *****************************************
78
+ CONSTANTS
79
+ =========================================
80
+ ***************************************** */
81
+ #define INSTANCE_SLOT_REF ':'
82
+
83
+ /***************************************/
84
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
85
+ /***************************************/
86
+
87
+ static Expression *ParseQueryRestrictions(Environment *,Expression *,const char *,struct token *);
88
+ static bool ReplaceClassNameWithReference(Environment *,Expression *);
89
+ static bool ParseQueryTestExpression(Environment *,Expression *,const char *);
90
+ static bool ParseQueryActionExpression(Environment *,Expression *,const char *,Expression *,struct token *);
91
+ static bool ReplaceInstanceVariables(Environment *,Expression *,Expression *,bool,int);
92
+ static bool ReplaceSlotReference(Environment *,Expression *,Expression *,
93
+ struct functionDefinition *,int);
94
+ static bool IsQueryFunction(Expression *);
95
+
96
+ /* =========================================
97
+ *****************************************
98
+ EXTERNALLY VISIBLE FUNCTIONS
99
+ =========================================
100
+ ***************************************** */
101
+
102
+ /***********************************************************************
103
+ NAME : ParseQueryNoAction
104
+ DESCRIPTION : Parses the following functions :
105
+ (any-instancep)
106
+ (find-first-instance)
107
+ (find-all-instances)
108
+ INPUTS : 1) The address of the top node of the query function
109
+ 2) The logical name of the input
110
+ RETURNS : The completed expression chain, or NULL on errors
111
+ SIDE EFFECTS : The expression chain is extended, or the "top" node
112
+ is deleted on errors
113
+ NOTES : H/L Syntax :
114
+
115
+ (<function> <query-block>)
116
+
117
+ <query-block> :== (<instance-var>+) <query-expression>
118
+ <instance-var> :== (<var-name> <class-name>+)
119
+
120
+ Parses into following form :
121
+
122
+ <query-function>
123
+ |
124
+ V
125
+ <query-expression> ->
126
+
127
+ <class-1a> -> <class-1b> -> (QDS) ->
128
+
129
+ <class-2a> -> <class-2b> -> (QDS) -> ...
130
+ ***********************************************************************/
131
+ Expression *ParseQueryNoAction(
132
+ Environment *theEnv,
133
+ Expression *top,
134
+ const char *readSource)
135
+ {
136
+ Expression *insQuerySetVars;
137
+ struct token queryInputToken;
138
+
139
+ insQuerySetVars = ParseQueryRestrictions(theEnv,top,readSource,&queryInputToken);
140
+ if (insQuerySetVars == NULL)
141
+ return NULL;
142
+ IncrementIndentDepth(theEnv,3);
143
+ PPCRAndIndent(theEnv);
144
+ if (ParseQueryTestExpression(theEnv,top,readSource) == false)
145
+ {
146
+ DecrementIndentDepth(theEnv,3);
147
+ ReturnExpression(theEnv,insQuerySetVars);
148
+ return NULL;
149
+ }
150
+ DecrementIndentDepth(theEnv,3);
151
+ GetToken(theEnv,readSource,&queryInputToken);
152
+ if (queryInputToken.tknType != RIGHT_PARENTHESIS_TOKEN)
153
+ {
154
+ SyntaxErrorMessage(theEnv,"instance-set query function");
155
+ ReturnExpression(theEnv,top);
156
+ ReturnExpression(theEnv,insQuerySetVars);
157
+ return NULL;
158
+ }
159
+
160
+ if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList,true,0))
161
+ {
162
+ ReturnExpression(theEnv,top);
163
+ ReturnExpression(theEnv,insQuerySetVars);
164
+ return NULL;
165
+ }
166
+
167
+ ReturnExpression(theEnv,insQuerySetVars);
168
+ return top;
169
+ }
170
+
171
+ /***********************************************************************
172
+ NAME : ParseQueryAction
173
+ DESCRIPTION : Parses the following functions :
174
+ (do-for-instance)
175
+ (do-for-all-instances)
176
+ (delayed-do-for-all-instances)
177
+ INPUTS : 1) The address of the top node of the query function
178
+ 2) The logical name of the input
179
+ RETURNS : The completed expression chain, or NULL on errors
180
+ SIDE EFFECTS : The expression chain is extended, or the "top" node
181
+ is deleted on errors
182
+ NOTES : H/L Syntax :
183
+
184
+ (<function> <query-block> <query-action>)
185
+
186
+ <query-block> :== (<instance-var>+) <query-expression>
187
+ <instance-var> :== (<var-name> <class-name>+)
188
+
189
+ Parses into following form :
190
+
191
+ <query-function>
192
+ |
193
+ V
194
+ <query-expression> -> <query-action> ->
195
+
196
+ <class-1a> -> <class-1b> -> (QDS) ->
197
+
198
+ <class-2a> -> <class-2b> -> (QDS) -> ...
199
+ ***********************************************************************/
200
+ Expression *ParseQueryAction(
201
+ Environment *theEnv,
202
+ Expression *top,
203
+ const char *readSource)
204
+ {
205
+ Expression *insQuerySetVars;
206
+ struct token queryInputToken;
207
+
208
+ insQuerySetVars = ParseQueryRestrictions(theEnv,top,readSource,&queryInputToken);
209
+ if (insQuerySetVars == NULL)
210
+ return NULL;
211
+ IncrementIndentDepth(theEnv,3);
212
+ PPCRAndIndent(theEnv);
213
+ if (ParseQueryTestExpression(theEnv,top,readSource) == false)
214
+ {
215
+ DecrementIndentDepth(theEnv,3);
216
+ ReturnExpression(theEnv,insQuerySetVars);
217
+ return NULL;
218
+ }
219
+ PPCRAndIndent(theEnv);
220
+ if (ParseQueryActionExpression(theEnv,top,readSource,insQuerySetVars,&queryInputToken) == false)
221
+ {
222
+ DecrementIndentDepth(theEnv,3);
223
+ ReturnExpression(theEnv,insQuerySetVars);
224
+ return NULL;
225
+ }
226
+ DecrementIndentDepth(theEnv,3);
227
+
228
+ if (queryInputToken.tknType != RIGHT_PARENTHESIS_TOKEN)
229
+ {
230
+ SyntaxErrorMessage(theEnv,"instance-set query function");
231
+ ReturnExpression(theEnv,top);
232
+ ReturnExpression(theEnv,insQuerySetVars);
233
+ return NULL;
234
+ }
235
+
236
+ if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList,true,0))
237
+ {
238
+ ReturnExpression(theEnv,top);
239
+ ReturnExpression(theEnv,insQuerySetVars);
240
+ return NULL;
241
+ }
242
+
243
+ if (ReplaceInstanceVariables(theEnv,insQuerySetVars,top->argList->nextArg,false,0))
244
+ {
245
+ ReturnExpression(theEnv,top);
246
+ ReturnExpression(theEnv,insQuerySetVars);
247
+ return NULL;
248
+ }
249
+
250
+ ReturnExpression(theEnv,insQuerySetVars);
251
+
252
+ return top;
253
+ }
254
+
255
+ /* =========================================
256
+ *****************************************
257
+ INTERNALLY VISIBLE FUNCTIONS
258
+ =========================================
259
+ ***************************************** */
260
+
261
+ /***************************************************************
262
+ NAME : ParseQueryRestrictions
263
+ DESCRIPTION : Parses the class restrictions for a query
264
+ INPUTS : 1) The top node of the query expression
265
+ 2) The logical name of the input
266
+ 3) Caller's token buffer
267
+ RETURNS : The instance-variable expressions
268
+ SIDE EFFECTS : Entire query expression deleted on errors
269
+ Nodes allocated for restrictions and instance
270
+ variable expressions
271
+ Class restrictions attached to query-expression
272
+ as arguments
273
+ NOTES : Expects top != NULL
274
+ ***************************************************************/
275
+ static Expression *ParseQueryRestrictions(
276
+ Environment *theEnv,
277
+ Expression *top,
278
+ const char *readSource,
279
+ struct token *queryInputToken)
280
+ {
281
+ Expression *insQuerySetVars = NULL,*lastInsQuerySetVars = NULL,
282
+ *classExp = NULL,*lastClassExp,
283
+ *tmp,*lastOne = NULL;
284
+ bool error = false;
285
+
286
+ SavePPBuffer(theEnv," ");
287
+ GetToken(theEnv,readSource,queryInputToken);
288
+ if (queryInputToken->tknType != LEFT_PARENTHESIS_TOKEN)
289
+ goto ParseQueryRestrictionsError1;
290
+ GetToken(theEnv,readSource,queryInputToken);
291
+ if (queryInputToken->tknType != LEFT_PARENTHESIS_TOKEN)
292
+ goto ParseQueryRestrictionsError1;
293
+ while (queryInputToken->tknType == LEFT_PARENTHESIS_TOKEN)
294
+ {
295
+ GetToken(theEnv,readSource,queryInputToken);
296
+ if (queryInputToken->tknType != SF_VARIABLE_TOKEN)
297
+ goto ParseQueryRestrictionsError1;
298
+ tmp = insQuerySetVars;
299
+ while (tmp != NULL)
300
+ {
301
+ if (tmp->value == queryInputToken->value)
302
+ {
303
+ PrintErrorID(theEnv,"INSQYPSR",1,false);
304
+ WriteString(theEnv,STDERR,"Duplicate instance member variable name in function '");
305
+ WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
306
+ WriteString(theEnv,STDERR,"'.\n");
307
+ goto ParseQueryRestrictionsError2;
308
+ }
309
+ tmp = tmp->nextArg;
310
+ }
311
+ tmp = GenConstant(theEnv,SF_VARIABLE,queryInputToken->value);
312
+ if (insQuerySetVars == NULL)
313
+ insQuerySetVars = tmp;
314
+ else
315
+ lastInsQuerySetVars->nextArg = tmp;
316
+ lastInsQuerySetVars = tmp;
317
+ SavePPBuffer(theEnv," ");
318
+ classExp = ArgumentParse(theEnv,readSource,&error);
319
+ if (error)
320
+ goto ParseQueryRestrictionsError2;
321
+ if (classExp == NULL)
322
+ goto ParseQueryRestrictionsError1;
323
+ if (ReplaceClassNameWithReference(theEnv,classExp) == false)
324
+ goto ParseQueryRestrictionsError2;
325
+ lastClassExp = classExp;
326
+ SavePPBuffer(theEnv," ");
327
+ while ((tmp = ArgumentParse(theEnv,readSource,&error)) != NULL)
328
+ {
329
+ if (ReplaceClassNameWithReference(theEnv,tmp) == false)
330
+ goto ParseQueryRestrictionsError2;
331
+ lastClassExp->nextArg = tmp;
332
+ lastClassExp = tmp;
333
+ SavePPBuffer(theEnv," ");
334
+ }
335
+ if (error)
336
+ goto ParseQueryRestrictionsError2;
337
+ PPBackup(theEnv);
338
+ PPBackup(theEnv);
339
+ SavePPBuffer(theEnv,")");
340
+ tmp = GenConstant(theEnv,SYMBOL_TYPE,InstanceQueryData(theEnv)->QUERY_DELIMITER_SYMBOL);
341
+ lastClassExp->nextArg = tmp;
342
+ lastClassExp = tmp;
343
+ if (top->argList == NULL)
344
+ top->argList = classExp;
345
+ else
346
+ lastOne->nextArg = classExp;
347
+ lastOne = lastClassExp;
348
+ classExp = NULL;
349
+ SavePPBuffer(theEnv," ");
350
+ GetToken(theEnv,readSource,queryInputToken);
351
+ }
352
+ if (queryInputToken->tknType != RIGHT_PARENTHESIS_TOKEN)
353
+ goto ParseQueryRestrictionsError1;
354
+ PPBackup(theEnv);
355
+ PPBackup(theEnv);
356
+ SavePPBuffer(theEnv,")");
357
+ return(insQuerySetVars);
358
+
359
+ ParseQueryRestrictionsError1:
360
+ SyntaxErrorMessage(theEnv,"instance-set query function");
361
+
362
+ ParseQueryRestrictionsError2:
363
+ ReturnExpression(theEnv,classExp);
364
+ ReturnExpression(theEnv,top);
365
+ ReturnExpression(theEnv,insQuerySetVars);
366
+ return NULL;
367
+ }
368
+
369
+ /***************************************************
370
+ NAME : ReplaceClassNameWithReference
371
+ DESCRIPTION : In parsing an instance-set query,
372
+ this function replaces a constant
373
+ class name with an actual pointer
374
+ to the class
375
+ INPUTS : The expression
376
+ RETURNS : True if all OK, false
377
+ if class cannot be found
378
+ SIDE EFFECTS : The expression type and value are
379
+ modified if class is found
380
+ NOTES : Searches current and imported
381
+ modules for reference
382
+ ***************************************************/
383
+ static bool ReplaceClassNameWithReference(
384
+ Environment *theEnv,
385
+ Expression *theExp)
386
+ {
387
+ const char *theClassName;
388
+ Defclass *theDefclass;
389
+
390
+ if (theExp->type == SYMBOL_TYPE)
391
+ {
392
+ theClassName = theExp->lexemeValue->contents;
393
+ theDefclass = LookupDefclassByMdlOrScope(theEnv,theClassName);
394
+ if (theDefclass == NULL)
395
+ {
396
+ CantFindItemErrorMessage(theEnv,"class",theClassName,true);
397
+ return false;
398
+ }
399
+ theExp->type = DEFCLASS_PTR;
400
+ theExp->value = theDefclass;
401
+
402
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
403
+ if (! ConstructData(theEnv)->ParsingConstruct)
404
+ { ConstructData(theEnv)->DanglingConstructs++; }
405
+ #endif
406
+ }
407
+ return true;
408
+ }
409
+
410
+ /*************************************************************
411
+ NAME : ParseQueryTestExpression
412
+ DESCRIPTION : Parses the test-expression for a query
413
+ INPUTS : 1) The top node of the query expression
414
+ 2) The logical name of the input
415
+ RETURNS : True if all OK, false otherwise
416
+ SIDE EFFECTS : Entire query-expression deleted on errors
417
+ Nodes allocated for new expression
418
+ Test shoved in front of class-restrictions on
419
+ query argument list
420
+ NOTES : Expects top != NULL
421
+ *************************************************************/
422
+ static bool ParseQueryTestExpression(
423
+ Environment *theEnv,
424
+ Expression *top,
425
+ const char *readSource)
426
+ {
427
+ Expression *qtest;
428
+ bool error;
429
+ struct BindInfo *oldBindList;
430
+
431
+ error = false;
432
+ oldBindList = GetParsedBindNames(theEnv);
433
+ SetParsedBindNames(theEnv,NULL);
434
+ qtest = ArgumentParse(theEnv,readSource,&error);
435
+ if (error == true)
436
+ {
437
+ ClearParsedBindNames(theEnv);
438
+ SetParsedBindNames(theEnv,oldBindList);
439
+ ReturnExpression(theEnv,top);
440
+ return false;
441
+ }
442
+ if (qtest == NULL)
443
+ {
444
+ ClearParsedBindNames(theEnv);
445
+ SetParsedBindNames(theEnv,oldBindList);
446
+ SyntaxErrorMessage(theEnv,"instance-set query function");
447
+ ReturnExpression(theEnv,top);
448
+ return false;
449
+ }
450
+ qtest->nextArg = top->argList;
451
+ top->argList = qtest;
452
+ if (ParsedBindNamesEmpty(theEnv) == false)
453
+ {
454
+ ClearParsedBindNames(theEnv);
455
+ SetParsedBindNames(theEnv,oldBindList);
456
+ PrintErrorID(theEnv,"INSQYPSR",2,false);
457
+ WriteString(theEnv,STDERR,"Binds are not allowed in instance-set query in function '");
458
+ WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
459
+ WriteString(theEnv,STDERR,"'.\n");
460
+ ReturnExpression(theEnv,top);
461
+ return false;
462
+ }
463
+ SetParsedBindNames(theEnv,oldBindList);
464
+ return true;
465
+ }
466
+
467
+ /*************************************************************
468
+ NAME : ParseQueryActionExpression
469
+ DESCRIPTION : Parses the action-expression for a query
470
+ INPUTS : 1) The top node of the query expression
471
+ 2) The logical name of the input
472
+ 3) List of query parameters
473
+ RETURNS : True if all OK, false otherwise
474
+ SIDE EFFECTS : Entire query-expression deleted on errors
475
+ Nodes allocated for new expression
476
+ Action shoved in front of class-restrictions
477
+ and in back of test-expression on query
478
+ argument list
479
+ NOTES : Expects top != NULL && top->argList != NULL
480
+ *************************************************************/
481
+ static bool ParseQueryActionExpression(
482
+ Environment *theEnv,
483
+ Expression *top,
484
+ const char *readSource,
485
+ Expression *insQuerySetVars,
486
+ struct token *queryInputToken)
487
+ {
488
+ Expression *qaction, *tmpInsSetVars;
489
+ struct BindInfo *oldBindList,*newBindList,*prev;
490
+
491
+ oldBindList = GetParsedBindNames(theEnv);
492
+ SetParsedBindNames(theEnv,NULL);
493
+ ExpressionData(theEnv)->BreakContext = true;
494
+ ExpressionData(theEnv)->ReturnContext = ExpressionData(theEnv)->svContexts->rtn;
495
+
496
+ qaction = GroupActions(theEnv,readSource,queryInputToken,true,NULL,false);
497
+ PPBackup(theEnv);
498
+ PPBackup(theEnv);
499
+ SavePPBuffer(theEnv,queryInputToken->printForm);
500
+
501
+ ExpressionData(theEnv)->BreakContext = false;
502
+ if (qaction == NULL)
503
+ {
504
+ ClearParsedBindNames(theEnv);
505
+ SetParsedBindNames(theEnv,oldBindList);
506
+ SyntaxErrorMessage(theEnv,"instance-set query function");
507
+ ReturnExpression(theEnv,top);
508
+ return false;
509
+ }
510
+ qaction->nextArg = top->argList->nextArg;
511
+ top->argList->nextArg = qaction;
512
+ newBindList = GetParsedBindNames(theEnv);
513
+ prev = NULL;
514
+ while (newBindList != NULL)
515
+ {
516
+ tmpInsSetVars = insQuerySetVars;
517
+ while (tmpInsSetVars != NULL)
518
+ {
519
+ if (tmpInsSetVars->value == (void *) newBindList->name)
520
+ {
521
+ ClearParsedBindNames(theEnv);
522
+ SetParsedBindNames(theEnv,oldBindList);
523
+ PrintErrorID(theEnv,"INSQYPSR",3,false);
524
+ WriteString(theEnv,STDERR,"Cannot rebind instance-set member variable ?");
525
+ WriteString(theEnv,STDERR,tmpInsSetVars->lexemeValue->contents);
526
+ WriteString(theEnv,STDERR," in function '");
527
+ WriteString(theEnv,STDERR,ExpressionFunctionCallName(top)->contents);
528
+ WriteString(theEnv,STDERR,"'.\n");
529
+ ReturnExpression(theEnv,top);
530
+ return false;
531
+ }
532
+ tmpInsSetVars = tmpInsSetVars->nextArg;
533
+ }
534
+ prev = newBindList;
535
+ newBindList = newBindList->next;
536
+ }
537
+ if (prev == NULL)
538
+ SetParsedBindNames(theEnv,oldBindList);
539
+ else
540
+ prev->next = oldBindList;
541
+ return true;
542
+ }
543
+
544
+ /***********************************************************************************
545
+ NAME : ReplaceInstanceVariables
546
+ DESCRIPTION : Replaces all references to instance-variables within an
547
+ instance query-function with function calls to query-instance
548
+ (which references the instance array at run-time)
549
+ INPUTS : 1) The instance-variable list
550
+ 2) A boolean expression containing variable references
551
+ 3) A flag indicating whether to allow slot references of the type
552
+ <instance-query-variable>:<slot-name> for direct slot access
553
+ or not
554
+ 4) Nesting depth of query functions
555
+ RETURNS : Nothing useful
556
+ SIDE EFFECTS : If a SF_VARIABLE node is found and is on the list of instance
557
+ variables, it is replaced with a query-instance function call.
558
+ NOTES : Other SF_VARIABLE(S) are left alone for replacement by other
559
+ parsers. This implies that a user may use defgeneric,
560
+ defrule, and defmessage-handler variables within a query-function
561
+ where they do not conflict with instance-variable names.
562
+ ***********************************************************************************/
563
+ static bool ReplaceInstanceVariables(
564
+ Environment *theEnv,
565
+ Expression *vlist,
566
+ Expression *bexp,
567
+ bool sdirect,
568
+ int ndepth)
569
+ {
570
+ Expression *eptr;
571
+ struct functionDefinition *rindx_func,*rslot_func;
572
+ int posn;
573
+
574
+ rindx_func = FindFunction(theEnv,"(query-instance)");
575
+ rslot_func = FindFunction(theEnv,"(query-instance-slot)");
576
+ while (bexp != NULL)
577
+ {
578
+ if (bexp->type == SF_VARIABLE)
579
+ {
580
+ eptr = vlist;
581
+ posn = 0;
582
+ while ((eptr != NULL) ? (eptr->value != bexp->value) : false)
583
+ {
584
+ eptr = eptr->nextArg;
585
+ posn++;
586
+ }
587
+ if (eptr != NULL)
588
+ {
589
+ bexp->type = FCALL;
590
+ bexp->value = rindx_func;
591
+ eptr = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,ndepth));
592
+ eptr->nextArg = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,posn));
593
+ bexp->argList = eptr;
594
+ }
595
+ else if (sdirect == true)
596
+ {
597
+ if (ReplaceSlotReference(theEnv,vlist,bexp,rslot_func,ndepth))
598
+ { return true; }
599
+ }
600
+ }
601
+ if (bexp->argList != NULL)
602
+ {
603
+ if (IsQueryFunction(bexp))
604
+ {
605
+ if (ReplaceInstanceVariables(theEnv,vlist,bexp->argList,sdirect,ndepth+1))
606
+ { return true; }
607
+ }
608
+ else
609
+ {
610
+ if (ReplaceInstanceVariables(theEnv,vlist,bexp->argList,sdirect,ndepth))
611
+ { return true; }
612
+ }
613
+ }
614
+ bexp = bexp->nextArg;
615
+ }
616
+
617
+ return false;
618
+ }
619
+
620
+ /*************************************************************************
621
+ NAME : ReplaceSlotReference
622
+ DESCRIPTION : Replaces instance-set query function variable
623
+ references of the form: <instance-variable>:<slot-name>
624
+ with function calls to get these instance-slots at run
625
+ time
626
+ INPUTS : 1) The instance-set variable list
627
+ 2) The expression containing the variable
628
+ 3) The address of the instance slot access function
629
+ 4) Nesting depth of query functions
630
+ RETURNS : Nothing useful
631
+ SIDE EFFECTS : If the variable is a slot reference, then it is replaced
632
+ with the appropriate function-call.
633
+ NOTES : None
634
+ *************************************************************************/
635
+ static bool ReplaceSlotReference(
636
+ Environment *theEnv,
637
+ Expression *vlist,
638
+ Expression *theExp,
639
+ struct functionDefinition *func,
640
+ int ndepth)
641
+ {
642
+ size_t len;
643
+ int posn;
644
+ bool oldpp;
645
+ size_t i;
646
+ const char *str;
647
+ Expression *eptr;
648
+ struct token itkn;
649
+
650
+ str = theExp->lexemeValue->contents;
651
+ len = strlen(str);
652
+ if (len < 3)
653
+ { return false; }
654
+
655
+ for (i = len-2 ; i >= 1 ; i--)
656
+ {
657
+ if ((str[i] == INSTANCE_SLOT_REF) ? (i >= 1) : false)
658
+ {
659
+ eptr = vlist;
660
+ posn = 0;
661
+ while (eptr && ((i != strlen(eptr->lexemeValue->contents)) ||
662
+ strncmp(eptr->lexemeValue->contents,str,
663
+ (STD_SIZE) i)))
664
+ {
665
+ eptr = eptr->nextArg;
666
+ posn++;
667
+ }
668
+ if (eptr != NULL)
669
+ {
670
+ OpenStringSource(theEnv,"query-var",str+i+1,0);
671
+ oldpp = GetPPBufferStatus(theEnv);
672
+ SetPPBufferStatus(theEnv,false);
673
+ GetToken(theEnv,"query-var",&itkn);
674
+ SetPPBufferStatus(theEnv,oldpp);
675
+ CloseStringSource(theEnv,"query-var");
676
+
677
+ if (itkn.tknType != SYMBOL_TOKEN)
678
+ {
679
+ InvalidVarSlotErrorMessage(theEnv,str);
680
+ SetEvaluationError(theEnv,true);
681
+ return true;
682
+ }
683
+
684
+ theExp->type = FCALL;
685
+ theExp->value = func;
686
+ theExp->argList = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,ndepth));
687
+ theExp->argList->nextArg = GenConstant(theEnv,INTEGER_TYPE,CreateInteger(theEnv,posn));
688
+ theExp->argList->nextArg->nextArg = GenConstant(theEnv,TokenTypeToType(itkn.tknType),itkn.value);
689
+ theExp->argList->nextArg->nextArg->nextArg = GenConstant(theEnv,SYMBOL_TYPE,CreateSymbol(theEnv,str));
690
+ return false;
691
+ }
692
+ }
693
+ }
694
+
695
+ return false;
696
+ }
697
+
698
+ /********************************************************************
699
+ NAME : IsQueryFunction
700
+ DESCRIPTION : Determines if an expression is a query function call
701
+ INPUTS : The expression
702
+ RETURNS : True if query function call, false otherwise
703
+ SIDE EFFECTS : None
704
+ NOTES : None
705
+ ********************************************************************/
706
+ static bool IsQueryFunction(
707
+ Expression *theExp)
708
+ {
709
+ int (*fptr)(void);
710
+
711
+ if (theExp->type != FCALL)
712
+ return false;
713
+ fptr = (int (*)(void)) ExpressionFunctionPointer(theExp);
714
+ if (fptr == (int (*)(void)) AnyInstances)
715
+ return true;
716
+ if (fptr == (int (*)(void)) QueryFindInstance)
717
+ return true;
718
+ if (fptr == (int (*)(void)) QueryFindAllInstances)
719
+ return true;
720
+ if (fptr == (int (*)(void)) QueryDoForInstance)
721
+ return true;
722
+ if (fptr == (int (*)(void)) QueryDoForAllInstances)
723
+ return true;
724
+ if (fptr == (int (*)(void)) DelayedQueryDoForAllInstances)
725
+ return true;
726
+ return false;
727
+ }
728
+
729
+ #endif