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,554 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 10/18/16 */
5
+ /* */
6
+ /* CONSTRAINT MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functions for creating and removing */
11
+ /* constraint records, adding them to the contraint hash */
12
+ /* table, and enabling and disabling static and dynamic */
13
+ /* constraint checking. */
14
+ /* */
15
+ /* Principal Programmer(s): */
16
+ /* Gary D. Riley */
17
+ /* */
18
+ /* Contributing Programmer(s): */
19
+ /* Brian Dantes */
20
+ /* */
21
+ /* Revision History: */
22
+ /* */
23
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
24
+ /* */
25
+ /* 6.24: Added allowed-classes slot facet. */
26
+ /* */
27
+ /* Renamed BOOLEAN macro type to intBool. */
28
+ /* */
29
+ /* 6.30: Removed conditional code for unsupported */
30
+ /* compilers/operating systems (IBM_MCW and */
31
+ /* MAC_MCW). */
32
+ /* */
33
+ /* Changed integer type/precision. */
34
+ /* */
35
+ /* Converted API macros to function calls. */
36
+ /* */
37
+ /* 6.40: Pragma once and other inclusion changes. */
38
+ /* */
39
+ /* Added support for booleans with <stdbool.h>. */
40
+ /* */
41
+ /* Removed use of void pointers for specific */
42
+ /* data structures. */
43
+ /* */
44
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
45
+ /* */
46
+ /* Static constraint checking is always enabled. */
47
+ /* */
48
+ /* UDF redesign. */
49
+ /* */
50
+ /* Eval support for run time and bload only. */
51
+ /* */
52
+ /*************************************************************/
53
+
54
+ #include <stdio.h>
55
+ #include <stdlib.h>
56
+
57
+ #include "setup.h"
58
+
59
+ #include "argacces.h"
60
+ #include "constant.h"
61
+ #include "envrnmnt.h"
62
+ #include "extnfunc.h"
63
+ #include "memalloc.h"
64
+ #include "multifld.h"
65
+ #include "router.h"
66
+ #include "scanner.h"
67
+
68
+ #include "constrnt.h"
69
+
70
+ /***************************************/
71
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
72
+ /***************************************/
73
+
74
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
75
+ static void InstallConstraintRecord(Environment *,CONSTRAINT_RECORD *);
76
+ static bool ConstraintCompare(struct constraintRecord *,struct constraintRecord *);
77
+ #endif
78
+ static void ReturnConstraintRecord(Environment *,CONSTRAINT_RECORD *);
79
+ static void DeinstallConstraintRecord(Environment *,CONSTRAINT_RECORD *);
80
+ static void DeallocateConstraintData(Environment *);
81
+
82
+ /*****************************************************/
83
+ /* InitializeConstraints: Initializes the constraint */
84
+ /* hash table to NULL and defines the static and */
85
+ /* dynamic constraint access functions. */
86
+ /*****************************************************/
87
+ void InitializeConstraints(
88
+ Environment *theEnv)
89
+ {
90
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
91
+ int i;
92
+ #endif
93
+
94
+ AllocateEnvironmentData(theEnv,CONSTRAINT_DATA,sizeof(struct constraintData),DeallocateConstraintData);
95
+
96
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
97
+
98
+ ConstraintData(theEnv)->ConstraintHashtable = (struct constraintRecord **)
99
+ gm2(theEnv,sizeof (struct constraintRecord *) *
100
+ SIZE_CONSTRAINT_HASH);
101
+
102
+ if (ConstraintData(theEnv)->ConstraintHashtable == NULL) ExitRouter(theEnv,EXIT_FAILURE);
103
+
104
+ for (i = 0; i < SIZE_CONSTRAINT_HASH; i++) ConstraintData(theEnv)->ConstraintHashtable[i] = NULL;
105
+ #endif
106
+
107
+ #if (! RUN_TIME)
108
+ AddUDF(theEnv,"get-dynamic-constraint-checking","b",0,0,NULL,GDCCommand,"GDCCommand",NULL);
109
+ AddUDF(theEnv,"set-dynamic-constraint-checking","b",1,1,NULL,SDCCommand,"SDCCommand",NULL);
110
+ #endif
111
+ }
112
+
113
+ /*****************************************************/
114
+ /* DeallocateConstraintData: Deallocates environment */
115
+ /* data for constraints. */
116
+ /*****************************************************/
117
+ static void DeallocateConstraintData(
118
+ Environment *theEnv)
119
+ {
120
+ #if ! RUN_TIME
121
+ struct constraintRecord *tmpPtr, *nextPtr;
122
+ int i;
123
+
124
+ for (i = 0; i < SIZE_CONSTRAINT_HASH; i++)
125
+ {
126
+ tmpPtr = ConstraintData(theEnv)->ConstraintHashtable[i];
127
+ while (tmpPtr != NULL)
128
+ {
129
+ nextPtr = tmpPtr->next;
130
+ ReturnConstraintRecord(theEnv,tmpPtr);
131
+ tmpPtr = nextPtr;
132
+ }
133
+ }
134
+
135
+ rm(theEnv,ConstraintData(theEnv)->ConstraintHashtable,
136
+ sizeof(struct constraintRecord *) * SIZE_CONSTRAINT_HASH);
137
+ #else
138
+ #if MAC_XCD
139
+ #pragma unused(theEnv)
140
+ #endif
141
+ #endif
142
+
143
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
144
+ if (ConstraintData(theEnv)->NumberOfConstraints != 0)
145
+ {
146
+ genfree(theEnv,ConstraintData(theEnv)->ConstraintArray,
147
+ (sizeof(CONSTRAINT_RECORD) * ConstraintData(theEnv)->NumberOfConstraints));
148
+ }
149
+ #endif
150
+ }
151
+
152
+ /*************************************************************/
153
+ /* ReturnConstraintRecord: Frees the data structures used by */
154
+ /* a constraint record. If the returnOnlyFields argument */
155
+ /* is false, then the constraint record is also freed. */
156
+ /*************************************************************/
157
+ static void ReturnConstraintRecord(
158
+ Environment *theEnv,
159
+ CONSTRAINT_RECORD *constraints)
160
+ {
161
+ if (constraints == NULL) return;
162
+
163
+ if (! constraints->installed)
164
+ {
165
+ ReturnExpression(theEnv,constraints->classList);
166
+ ReturnExpression(theEnv,constraints->restrictionList);
167
+ ReturnExpression(theEnv,constraints->maxValue);
168
+ ReturnExpression(theEnv,constraints->minValue);
169
+ ReturnExpression(theEnv,constraints->minFields);
170
+ ReturnExpression(theEnv,constraints->maxFields);
171
+ }
172
+
173
+ ReturnConstraintRecord(theEnv,constraints->multifield);
174
+
175
+ rtn_struct(theEnv,constraintRecord,constraints);
176
+ }
177
+
178
+ /***************************************************/
179
+ /* DeinstallConstraintRecord: Decrements the count */
180
+ /* values of all occurrences of primitive data */
181
+ /* types found in a constraint record. */
182
+ /***************************************************/
183
+ static void DeinstallConstraintRecord(
184
+ Environment *theEnv,
185
+ CONSTRAINT_RECORD *constraints)
186
+ {
187
+ if (constraints->installed)
188
+ {
189
+ RemoveHashedExpression(theEnv,constraints->classList);
190
+ RemoveHashedExpression(theEnv,constraints->restrictionList);
191
+ RemoveHashedExpression(theEnv,constraints->maxValue);
192
+ RemoveHashedExpression(theEnv,constraints->minValue);
193
+ RemoveHashedExpression(theEnv,constraints->minFields);
194
+ RemoveHashedExpression(theEnv,constraints->maxFields);
195
+ }
196
+ else
197
+ {
198
+ ExpressionDeinstall(theEnv,constraints->classList);
199
+ ExpressionDeinstall(theEnv,constraints->restrictionList);
200
+ ExpressionDeinstall(theEnv,constraints->maxValue);
201
+ ExpressionDeinstall(theEnv,constraints->minValue);
202
+ ExpressionDeinstall(theEnv,constraints->minFields);
203
+ ExpressionDeinstall(theEnv,constraints->maxFields);
204
+ }
205
+
206
+ if (constraints->multifield != NULL)
207
+ { DeinstallConstraintRecord(theEnv,constraints->multifield); }
208
+ }
209
+
210
+ /******************************************/
211
+ /* RemoveConstraint: Removes a constraint */
212
+ /* from the constraint hash table. */
213
+ /******************************************/
214
+ void RemoveConstraint(
215
+ Environment *theEnv,
216
+ struct constraintRecord *theConstraint)
217
+ {
218
+ struct constraintRecord *tmpPtr, *prevPtr = NULL;
219
+
220
+ if (theConstraint == NULL) return;
221
+
222
+ /*========================================*/
223
+ /* If the bucket value is less than zero, */
224
+ /* then the constraint wasn't stored in */
225
+ /* the hash table. */
226
+ /*========================================*/
227
+
228
+ if (! theConstraint->installed)
229
+ {
230
+ ReturnConstraintRecord(theEnv,theConstraint);
231
+ return;
232
+ }
233
+
234
+ /*================================*/
235
+ /* Find and remove the constraint */
236
+ /* from the contraint hash table. */
237
+ /*================================*/
238
+
239
+ tmpPtr = ConstraintData(theEnv)->ConstraintHashtable[theConstraint->bucket];
240
+ while (tmpPtr != NULL)
241
+ {
242
+ if (tmpPtr == theConstraint)
243
+ {
244
+ theConstraint->count--;
245
+ if (theConstraint->count == 0)
246
+ {
247
+ if (prevPtr == NULL)
248
+ { ConstraintData(theEnv)->ConstraintHashtable[theConstraint->bucket] = theConstraint->next; }
249
+ else
250
+ { prevPtr->next = theConstraint->next; }
251
+ DeinstallConstraintRecord(theEnv,theConstraint);
252
+ ReturnConstraintRecord(theEnv,theConstraint);
253
+ }
254
+ return;
255
+ }
256
+
257
+ prevPtr = tmpPtr;
258
+ tmpPtr = tmpPtr->next;
259
+ }
260
+
261
+ return;
262
+ }
263
+
264
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
265
+
266
+ /***********************************/
267
+ /* HashConstraint: Returns a hash */
268
+ /* value for a given constraint. */
269
+ /***********************************/
270
+ unsigned long HashConstraint(
271
+ struct constraintRecord *theConstraint)
272
+ {
273
+ unsigned short i = 0;
274
+ unsigned long count = 0;
275
+ unsigned long hashValue;
276
+ struct expr *tmpPtr;
277
+
278
+ count +=
279
+ (theConstraint->anyAllowed * 17) +
280
+ (theConstraint->symbolsAllowed * 5) +
281
+ (theConstraint->stringsAllowed * 23) +
282
+ (theConstraint->floatsAllowed * 19) +
283
+ (theConstraint->integersAllowed * 29) +
284
+ (theConstraint->instanceNamesAllowed * 31) +
285
+ (theConstraint->instanceAddressesAllowed * 17);
286
+
287
+ count +=
288
+ (theConstraint->externalAddressesAllowed * 29) +
289
+ (theConstraint->voidAllowed * 29) +
290
+ (theConstraint->multifieldsAllowed * 29) +
291
+ (theConstraint->factAddressesAllowed * 79) +
292
+ (theConstraint->anyRestriction * 59) +
293
+ (theConstraint->symbolRestriction * 61);
294
+
295
+ count +=
296
+ (theConstraint->stringRestriction * 3) +
297
+ (theConstraint->floatRestriction * 37) +
298
+ (theConstraint->integerRestriction * 9) +
299
+ (theConstraint->classRestriction * 11) +
300
+ (theConstraint->instanceNameRestriction * 7);
301
+
302
+ for (tmpPtr = theConstraint->classList; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
303
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
304
+
305
+ for (tmpPtr = theConstraint->restrictionList; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
306
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
307
+
308
+ for (tmpPtr = theConstraint->minValue; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
309
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
310
+
311
+ for (tmpPtr = theConstraint->maxValue; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
312
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
313
+
314
+ for (tmpPtr = theConstraint->minFields; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
315
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
316
+
317
+ for (tmpPtr = theConstraint->maxFields; tmpPtr != NULL; tmpPtr = tmpPtr->nextArg)
318
+ { count += GetAtomicHashValue(tmpPtr->type,tmpPtr->value,i++); }
319
+
320
+ if (theConstraint->multifield != NULL)
321
+ { count += HashConstraint(theConstraint->multifield); }
322
+
323
+ hashValue = count % SIZE_CONSTRAINT_HASH;
324
+
325
+ return hashValue;
326
+ }
327
+
328
+ /**********************************************/
329
+ /* ConstraintCompare: Compares two constraint */
330
+ /* records and returns true if they are */
331
+ /* identical, otherwise false. */
332
+ /**********************************************/
333
+ static bool ConstraintCompare(
334
+ struct constraintRecord *constraint1,
335
+ struct constraintRecord *constraint2)
336
+ {
337
+ struct expr *tmpPtr1, *tmpPtr2;
338
+
339
+ if ((constraint1->anyAllowed != constraint2->anyAllowed) ||
340
+ (constraint1->symbolsAllowed != constraint2->symbolsAllowed) ||
341
+ (constraint1->stringsAllowed != constraint2->stringsAllowed) ||
342
+ (constraint1->floatsAllowed != constraint2->floatsAllowed) ||
343
+ (constraint1->integersAllowed != constraint2->integersAllowed) ||
344
+ (constraint1->instanceNamesAllowed != constraint2->instanceNamesAllowed) ||
345
+ (constraint1->instanceAddressesAllowed != constraint2->instanceAddressesAllowed) ||
346
+ (constraint1->externalAddressesAllowed != constraint2->externalAddressesAllowed) ||
347
+ (constraint1->voidAllowed != constraint2->voidAllowed) ||
348
+ (constraint1->multifieldsAllowed != constraint2->multifieldsAllowed) ||
349
+ (constraint1->singlefieldsAllowed != constraint2->singlefieldsAllowed) ||
350
+ (constraint1->factAddressesAllowed != constraint2->factAddressesAllowed) ||
351
+ (constraint1->anyRestriction != constraint2->anyRestriction) ||
352
+ (constraint1->symbolRestriction != constraint2->symbolRestriction) ||
353
+ (constraint1->stringRestriction != constraint2->stringRestriction) ||
354
+ (constraint1->floatRestriction != constraint2->floatRestriction) ||
355
+ (constraint1->integerRestriction != constraint2->integerRestriction) ||
356
+ (constraint1->classRestriction != constraint2->classRestriction) ||
357
+ (constraint1->instanceNameRestriction != constraint2->instanceNameRestriction))
358
+ { return false; }
359
+
360
+ for (tmpPtr1 = constraint1->classList, tmpPtr2 = constraint2->classList;
361
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
362
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
363
+ {
364
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
365
+ { return false; }
366
+ }
367
+ if (tmpPtr1 != tmpPtr2) return false;
368
+
369
+ for (tmpPtr1 = constraint1->restrictionList, tmpPtr2 = constraint2->restrictionList;
370
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
371
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
372
+ {
373
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
374
+ { return false; }
375
+ }
376
+ if (tmpPtr1 != tmpPtr2) return false;
377
+
378
+ for (tmpPtr1 = constraint1->minValue, tmpPtr2 = constraint2->minValue;
379
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
380
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
381
+ {
382
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
383
+ { return false; }
384
+ }
385
+ if (tmpPtr1 != tmpPtr2) return false;
386
+
387
+ for (tmpPtr1 = constraint1->maxValue, tmpPtr2 = constraint2->maxValue;
388
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
389
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
390
+ {
391
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
392
+ { return false; }
393
+ }
394
+ if (tmpPtr1 != tmpPtr2) return false;
395
+
396
+ for (tmpPtr1 = constraint1->minFields, tmpPtr2 = constraint2->minFields;
397
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
398
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
399
+ {
400
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
401
+ { return false; }
402
+ }
403
+ if (tmpPtr1 != tmpPtr2) return false;
404
+
405
+ for (tmpPtr1 = constraint1->maxFields, tmpPtr2 = constraint2->maxFields;
406
+ (tmpPtr1 != NULL) && (tmpPtr2 != NULL);
407
+ tmpPtr1 = tmpPtr1->nextArg, tmpPtr2 = tmpPtr2->nextArg)
408
+ {
409
+ if ((tmpPtr1->type != tmpPtr2->type) || (tmpPtr1->value != tmpPtr2->value))
410
+ { return false; }
411
+ }
412
+ if (tmpPtr1 != tmpPtr2) return false;
413
+
414
+ if (((constraint1->multifield == NULL) && (constraint2->multifield != NULL)) ||
415
+ ((constraint1->multifield != NULL) && (constraint2->multifield == NULL)))
416
+ { return false; }
417
+ else if (constraint1->multifield == constraint2->multifield)
418
+ { return true; }
419
+
420
+ return(ConstraintCompare(constraint1->multifield,constraint2->multifield));
421
+ }
422
+
423
+ /************************************/
424
+ /* AddConstraint: Adds a constraint */
425
+ /* to the constraint hash table. */
426
+ /************************************/
427
+ struct constraintRecord *AddConstraint(
428
+ Environment *theEnv,
429
+ struct constraintRecord *theConstraint)
430
+ {
431
+ struct constraintRecord *tmpPtr;
432
+ unsigned long hashValue;
433
+
434
+ if (theConstraint == NULL) return NULL;
435
+
436
+ hashValue = HashConstraint(theConstraint);
437
+
438
+ for (tmpPtr = ConstraintData(theEnv)->ConstraintHashtable[hashValue];
439
+ tmpPtr != NULL;
440
+ tmpPtr = tmpPtr->next)
441
+ {
442
+ if (ConstraintCompare(theConstraint,tmpPtr))
443
+ {
444
+ tmpPtr->count++;
445
+ ReturnConstraintRecord(theEnv,theConstraint);
446
+ return tmpPtr;
447
+ }
448
+ }
449
+
450
+ InstallConstraintRecord(theEnv,theConstraint);
451
+ theConstraint->count = 1;
452
+ theConstraint->bucket = (unsigned int) hashValue;
453
+ theConstraint->installed = true;
454
+ theConstraint->next = ConstraintData(theEnv)->ConstraintHashtable[hashValue];
455
+ ConstraintData(theEnv)->ConstraintHashtable[hashValue] = theConstraint;
456
+ return theConstraint;
457
+ }
458
+
459
+ /*************************************************/
460
+ /* InstallConstraintRecord: Increments the count */
461
+ /* values of all occurrences of primitive data */
462
+ /* types found in a constraint record. */
463
+ /*************************************************/
464
+ static void InstallConstraintRecord(
465
+ Environment *theEnv,
466
+ CONSTRAINT_RECORD *constraints)
467
+ {
468
+ struct expr *tempExpr;
469
+
470
+ tempExpr = AddHashedExpression(theEnv,constraints->classList);
471
+ ReturnExpression(theEnv,constraints->classList);
472
+ constraints->classList = tempExpr;
473
+
474
+ tempExpr = AddHashedExpression(theEnv,constraints->restrictionList);
475
+ ReturnExpression(theEnv,constraints->restrictionList);
476
+ constraints->restrictionList = tempExpr;
477
+
478
+ tempExpr = AddHashedExpression(theEnv,constraints->maxValue);
479
+ ReturnExpression(theEnv,constraints->maxValue);
480
+ constraints->maxValue = tempExpr;
481
+
482
+ tempExpr = AddHashedExpression(theEnv,constraints->minValue);
483
+ ReturnExpression(theEnv,constraints->minValue);
484
+ constraints->minValue = tempExpr;
485
+
486
+ tempExpr = AddHashedExpression(theEnv,constraints->minFields);
487
+ ReturnExpression(theEnv,constraints->minFields);
488
+ constraints->minFields = tempExpr;
489
+
490
+ tempExpr = AddHashedExpression(theEnv,constraints->maxFields);
491
+ ReturnExpression(theEnv,constraints->maxFields);
492
+ constraints->maxFields = tempExpr;
493
+
494
+ if (constraints->multifield != NULL)
495
+ { InstallConstraintRecord(theEnv,constraints->multifield); }
496
+ }
497
+
498
+ #endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
499
+
500
+ /**********************************************/
501
+ /* SDCCommand: H/L access routine for the */
502
+ /* set-dynamic-constraint-checking command. */
503
+ /**********************************************/
504
+ void SDCCommand(
505
+ Environment *theEnv,
506
+ UDFContext *context,
507
+ UDFValue *returnValue)
508
+ {
509
+ UDFValue theArg;
510
+
511
+ returnValue->lexemeValue = CreateBoolean(theEnv,GetDynamicConstraintChecking(theEnv));
512
+
513
+ if (! UDFFirstArgument(context,ANY_TYPE_BITS,&theArg))
514
+ { return; }
515
+
516
+ SetDynamicConstraintChecking(theEnv,theArg.value != FalseSymbol(theEnv));
517
+ }
518
+
519
+ /**********************************************/
520
+ /* GDCCommand: H/L access routine for the */
521
+ /* get-dynamic-constraint-checking command. */
522
+ /**********************************************/
523
+ void GDCCommand(
524
+ Environment *theEnv,
525
+ UDFContext *context,
526
+ UDFValue *returnValue)
527
+ {
528
+ returnValue->lexemeValue = CreateBoolean(theEnv,GetDynamicConstraintChecking(theEnv));
529
+ }
530
+
531
+ /******************************************************/
532
+ /* SetDynamicConstraintChecking: C access routine */
533
+ /* for the set-dynamic-constraint-checking command. */
534
+ /******************************************************/
535
+ bool SetDynamicConstraintChecking(
536
+ Environment *theEnv,
537
+ bool value)
538
+ {
539
+ bool ov;
540
+ ov = ConstraintData(theEnv)->DynamicConstraintChecking;
541
+ ConstraintData(theEnv)->DynamicConstraintChecking = value;
542
+ return(ov);
543
+ }
544
+
545
+ /******************************************************/
546
+ /* GetDynamicConstraintChecking: C access routine */
547
+ /* for the get-dynamic-constraint-checking command. */
548
+ /******************************************************/
549
+ bool GetDynamicConstraintChecking(
550
+ Environment *theEnv)
551
+ {
552
+ return(ConstraintData(theEnv)->DynamicConstraintChecking);
553
+ }
554
+
@@ -0,0 +1,132 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 12/02/19 */
5
+ /* */
6
+ /* CONSTRAINT HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functions for creating and removing */
11
+ /* constraint records, adding them to the contraint hash */
12
+ /* table, and enabling and disabling static and dynamic */
13
+ /* constraint checking. */
14
+ /* */
15
+ /* Principal Programmer(s): */
16
+ /* Gary D. Riley */
17
+ /* */
18
+ /* Contributing Programmer(s): */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
23
+ /* */
24
+ /* 6.24: Added allowed-classes slot facet. */
25
+ /* */
26
+ /* Renamed BOOLEAN macro type to intBool. */
27
+ /* */
28
+ /* 6.30: Removed conditional code for unsupported */
29
+ /* compilers/operating systems (IBM_MCW and */
30
+ /* MAC_MCW). */
31
+ /* */
32
+ /* Changed integer type/precision. */
33
+ /* */
34
+ /* Converted API macros to function calls. */
35
+ /* */
36
+ /* 6.40: Removed LOCALE definition. */
37
+ /* */
38
+ /* Pragma once and other inclusion changes. */
39
+ /* */
40
+ /* Added support for booleans with <stdbool.h>. */
41
+ /* */
42
+ /* Removed use of void pointers for specific */
43
+ /* data structures. */
44
+ /* */
45
+ /* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
46
+ /* */
47
+ /* Static constraint checking is always enabled. */
48
+ /* */
49
+ /* UDF redesign. */
50
+ /* */
51
+ /* Eval support for run time and bload only. */
52
+ /* */
53
+ /*************************************************************/
54
+
55
+ #ifndef _H_constrnt
56
+
57
+ #pragma once
58
+
59
+ #define _H_constrnt
60
+
61
+ struct constraintRecord;
62
+ typedef struct constraintRecord CONSTRAINT_RECORD;
63
+
64
+ #include "evaluatn.h"
65
+
66
+ struct constraintRecord
67
+ {
68
+ unsigned int anyAllowed : 1;
69
+ unsigned int symbolsAllowed : 1;
70
+ unsigned int stringsAllowed : 1;
71
+ unsigned int floatsAllowed : 1;
72
+ unsigned int integersAllowed : 1;
73
+ unsigned int instanceNamesAllowed : 1;
74
+ unsigned int instanceAddressesAllowed : 1;
75
+ unsigned int externalAddressesAllowed : 1;
76
+ unsigned int factAddressesAllowed : 1;
77
+ unsigned int voidAllowed : 1;
78
+ unsigned int anyRestriction : 1;
79
+ unsigned int symbolRestriction : 1;
80
+ unsigned int stringRestriction : 1;
81
+ unsigned int floatRestriction : 1;
82
+ unsigned int integerRestriction : 1;
83
+ unsigned int classRestriction : 1;
84
+ unsigned int instanceNameRestriction : 1;
85
+ unsigned int multifieldsAllowed : 1;
86
+ unsigned int singlefieldsAllowed : 1;
87
+ unsigned int installed : 1;
88
+ unsigned long bsaveID;
89
+ struct expr *classList;
90
+ struct expr *restrictionList;
91
+ struct expr *minValue;
92
+ struct expr *maxValue;
93
+ struct expr *minFields;
94
+ struct expr *maxFields;
95
+ struct constraintRecord *multifield;
96
+ struct constraintRecord *next;
97
+ unsigned int bucket;
98
+ unsigned int count;
99
+ };
100
+
101
+ #define SIZE_CONSTRAINT_HASH 167
102
+
103
+ #define CONSTRAINT_DATA 43
104
+
105
+ struct constraintData
106
+ {
107
+ struct constraintRecord **ConstraintHashtable;
108
+ bool DynamicConstraintChecking;
109
+ #if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)
110
+ struct constraintRecord *ConstraintArray;
111
+ unsigned long NumberOfConstraints;
112
+ #endif
113
+ };
114
+
115
+ #define ConstraintData(theEnv) ((struct constraintData *) GetEnvironmentData(theEnv,CONSTRAINT_DATA))
116
+
117
+ void InitializeConstraints(Environment *);
118
+ void GDCCommand(Environment *,UDFContext *,UDFValue *);
119
+ void SDCCommand(Environment *,UDFContext *,UDFValue *);
120
+ bool SetDynamicConstraintChecking(Environment *,bool);
121
+ bool GetDynamicConstraintChecking(Environment *);
122
+ #if (! BLOAD_ONLY) && (! RUN_TIME)
123
+ unsigned long HashConstraint(struct constraintRecord *);
124
+ struct constraintRecord *AddConstraint(Environment *,struct constraintRecord *);
125
+ #endif
126
+ void RemoveConstraint(Environment *,struct constraintRecord *);
127
+
128
+ #endif
129
+
130
+
131
+
132
+