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,54 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/25/16 */
5
+ /* */
6
+ /* CONSTRAINT UTILITY HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Utility routines for manipulating, initializing, */
11
+ /* creating, copying, and comparing constraint records. */
12
+ /* */
13
+ /* Principal Programmer(s): */
14
+ /* Gary D. Riley */
15
+ /* */
16
+ /* Contributing Programmer(s): */
17
+ /* Brian Dantes */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.40: Removed LOCALE definition. */
22
+ /* */
23
+ /* Pragma once and other inclusion changes. */
24
+ /* */
25
+ /* Added support for booleans with <stdbool.h>. */
26
+ /* */
27
+ /* Removed use of void pointers for specific */
28
+ /* data structures. */
29
+ /* */
30
+ /* UDF redesign. */
31
+ /* */
32
+ /*************************************************************/
33
+
34
+ #ifndef _H_cstrnutl
35
+
36
+ #pragma once
37
+
38
+ #define _H_cstrnutl
39
+
40
+ #include "constrnt.h"
41
+
42
+ struct constraintRecord *GetConstraintRecord(Environment *);
43
+ int CompareNumbers(Environment *,int,void *,int,void *);
44
+ struct constraintRecord *CopyConstraintRecord(Environment *,CONSTRAINT_RECORD *);
45
+ bool SetConstraintType(int,CONSTRAINT_RECORD *);
46
+ void SetAnyAllowedFlags(CONSTRAINT_RECORD *,bool);
47
+ void SetAnyRestrictionFlags(CONSTRAINT_RECORD *,bool);
48
+ CONSTRAINT_RECORD *FunctionCallToConstraintRecord(Environment *,void *);
49
+ CONSTRAINT_RECORD *ExpressionToConstraintRecord(Environment *,struct expr *);
50
+ CONSTRAINT_RECORD *ArgumentTypeToConstraintRecord(Environment *,unsigned);
51
+
52
+ #endif /* _H_cstrnutl */
53
+
54
+
@@ -0,0 +1,454 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/25/16 */
5
+ /* */
6
+ /* DEFAULT ATTRIBUTE MODULE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functions for parsing the default */
11
+ /* attribute and determining default values based on */
12
+ /* slot constraints. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* Brian Dantes */
19
+ /* */
20
+ /* Revision History: */
21
+ /* */
22
+ /* 6.24: Support for deftemplate-slot-default-value */
23
+ /* function. */
24
+ /* */
25
+ /* 6.30: Support for long long integers. */
26
+ /* */
27
+ /* Added const qualifiers to remove C++ */
28
+ /* deprecation warnings. */
29
+ /* */
30
+ /* 6.40: Added Env prefix to GetEvaluationError and */
31
+ /* SetEvaluationError functions. */
32
+ /* */
33
+ /* Pragma once and other inclusion changes. */
34
+ /* */
35
+ /* Added support for booleans with <stdbool.h>. */
36
+ /* */
37
+ /* Removed use of void pointers for specific */
38
+ /* data structures. */
39
+ /* */
40
+ /* UDF redesign. */
41
+ /* */
42
+ /*************************************************************/
43
+
44
+ #include "setup.h"
45
+
46
+ #include <stdio.h>
47
+ #include <stdlib.h>
48
+ #include <string.h>
49
+
50
+ #include "constant.h"
51
+ #include "constrnt.h"
52
+ #include "cstrnchk.h"
53
+ #include "cstrnutl.h"
54
+ #include "envrnmnt.h"
55
+ #include "exprnpsr.h"
56
+ #include "factmngr.h"
57
+ #include "inscom.h"
58
+ #include "multifld.h"
59
+ #include "pprint.h"
60
+ #include "prntutil.h"
61
+ #include "router.h"
62
+ #include "scanner.h"
63
+
64
+ #include "default.h"
65
+
66
+ /***************************************/
67
+ /* LOCAL INTERNAL FUNCTION DEFINITIONS */
68
+ /***************************************/
69
+
70
+ static void *FindDefaultValue(Environment *,int,CONSTRAINT_RECORD *,void *);
71
+
72
+ /********************************************************/
73
+ /* DeriveDefaultFromConstraints: Returns an appropriate */
74
+ /* default value for the supplied constraints. */
75
+ /********************************************************/
76
+ void DeriveDefaultFromConstraints(
77
+ Environment *theEnv,
78
+ CONSTRAINT_RECORD *constraints,
79
+ UDFValue *theDefault,
80
+ bool multifield,
81
+ bool garbageMultifield)
82
+ {
83
+ unsigned long minFields;
84
+ void *theValue;
85
+
86
+ /*=============================================================*/
87
+ /* If no constraints are specified, then use the symbol nil as */
88
+ /* a default for single field slots and a multifield of length */
89
+ /* 0 as a default for multifield slots. */
90
+ /*=============================================================*/
91
+
92
+ if (constraints == NULL)
93
+ {
94
+ if (multifield)
95
+ {
96
+ theDefault->begin = 0;
97
+ theDefault->range = 0;
98
+ if (garbageMultifield) theDefault->value = CreateMultifield(theEnv,0L);
99
+ else theDefault->value = CreateUnmanagedMultifield(theEnv,0L);
100
+ }
101
+ else
102
+ { theDefault->value = CreateSymbol(theEnv,"nil"); }
103
+
104
+ return;
105
+ }
106
+
107
+ /*=========================================*/
108
+ /* Determine the default's type and value. */
109
+ /*=========================================*/
110
+
111
+ if (constraints->anyAllowed || constraints->symbolsAllowed)
112
+ { theValue = FindDefaultValue(theEnv,SYMBOL_TYPE,constraints,CreateSymbol(theEnv,"nil")); }
113
+
114
+ else if (constraints->stringsAllowed)
115
+ { theValue = FindDefaultValue(theEnv,STRING_TYPE,constraints,CreateString(theEnv,"")); }
116
+
117
+ else if (constraints->integersAllowed)
118
+ { theValue = FindDefaultValue(theEnv,INTEGER_TYPE,constraints,CreateInteger(theEnv,0LL)); }
119
+
120
+ else if (constraints->floatsAllowed)
121
+ { theValue = FindDefaultValue(theEnv,FLOAT_TYPE,constraints,CreateFloat(theEnv,0.0)); }
122
+ #if OBJECT_SYSTEM
123
+ else if (constraints->instanceNamesAllowed)
124
+ { theValue = FindDefaultValue(theEnv,INSTANCE_NAME_TYPE,constraints,CreateInstanceName(theEnv,"nil")); }
125
+
126
+ else if (constraints->instanceAddressesAllowed)
127
+ { theValue = &InstanceData(theEnv)->DummyInstance; }
128
+ #endif
129
+ #if DEFTEMPLATE_CONSTRUCT
130
+ else if (constraints->factAddressesAllowed)
131
+ { theValue = &FactData(theEnv)->DummyFact; }
132
+ #endif
133
+ else if (constraints->externalAddressesAllowed)
134
+ { theValue = CreateExternalAddress(theEnv,NULL,0); }
135
+
136
+ else
137
+ { theValue = CreateSymbol(theEnv,"nil"); }
138
+
139
+ /*=========================================================*/
140
+ /* If the default is for a multifield slot, then create a */
141
+ /* multifield default value that satisfies the cardinality */
142
+ /* constraints for the slot. The default value for a */
143
+ /* multifield slot is a multifield of length 0. */
144
+ /*=========================================================*/
145
+
146
+ if (multifield)
147
+ {
148
+ if (constraints->minFields == NULL) minFields = 0;
149
+ else if (constraints->minFields->value == SymbolData(theEnv)->NegativeInfinity) minFields = 0;
150
+ else minFields = (unsigned long) constraints->minFields->integerValue->contents;
151
+
152
+ theDefault->begin = 0;
153
+ theDefault->range = minFields;
154
+ if (garbageMultifield) theDefault->value = CreateMultifield(theEnv,minFields);
155
+ else theDefault->value = CreateUnmanagedMultifield(theEnv,minFields);
156
+
157
+ for (; minFields > 0; minFields--)
158
+ { theDefault->multifieldValue->contents[minFields-1].value = theValue; }
159
+ }
160
+ else
161
+ {
162
+ theDefault->value = theValue;
163
+ }
164
+ }
165
+
166
+ /***********************************************************************/
167
+ /* FindDefaultValue: Searches the list of restriction values for a */
168
+ /* constraint to find a default value of the specified type. For */
169
+ /* example, if the attribute (allowed-symbols on off) was specified, */
170
+ /* then the symbol "on" would be used as a default value rather than */
171
+ /* the symbol "nil". For integers and floats, the range attribute is */
172
+ /* also used to select a suitable default value. If a minimum value */
173
+ /* was specified, then this value is used first followed by the */
174
+ /* maximum value. */
175
+ /************************************************************************/
176
+ static void *FindDefaultValue(
177
+ Environment *theEnv,
178
+ int theType,
179
+ CONSTRAINT_RECORD *theConstraints,
180
+ void *standardDefault)
181
+ {
182
+ struct expr *theList;
183
+
184
+ /*=====================================================*/
185
+ /* Look on the the allowed values list to see if there */
186
+ /* is a value of the requested type. Return the first */
187
+ /* value found of the requested type. */
188
+ /*=====================================================*/
189
+
190
+ theList = theConstraints->restrictionList;
191
+ while (theList != NULL)
192
+ {
193
+ if (theList->type == theType) return(theList->value);
194
+ theList = theList->nextArg;
195
+ }
196
+
197
+ /*=============================================================*/
198
+ /* If no specific values were available for the default value, */
199
+ /* and the type requested is a float or integer, then use the */
200
+ /* range attribute to select a default value. */
201
+ /*=============================================================*/
202
+
203
+ if (theType == INTEGER_TYPE)
204
+ {
205
+ if (theConstraints->minValue->type == INTEGER_TYPE)
206
+ { return(theConstraints->minValue->value); }
207
+ else if (theConstraints->minValue->type == FLOAT_TYPE)
208
+ { return(CreateInteger(theEnv,(long long) theConstraints->minValue->floatValue->contents)); }
209
+ else if (theConstraints->maxValue->type == INTEGER_TYPE)
210
+ { return(theConstraints->maxValue->value); }
211
+ else if (theConstraints->maxValue->type == FLOAT_TYPE)
212
+ { return(CreateInteger(theEnv,(long long) theConstraints->maxValue->floatValue->contents)); }
213
+ }
214
+ else if (theType == FLOAT_TYPE)
215
+ {
216
+ if (theConstraints->minValue->type == FLOAT_TYPE)
217
+ { return(theConstraints->minValue->value); }
218
+ else if (theConstraints->minValue->type == INTEGER_TYPE)
219
+ { return(CreateFloat(theEnv,(double) theConstraints->minValue->integerValue->contents)); }
220
+ else if (theConstraints->maxValue->type == FLOAT_TYPE)
221
+ { return(theConstraints->maxValue->value); }
222
+ else if (theConstraints->maxValue->type == INTEGER_TYPE)
223
+ { return(CreateFloat(theEnv,(double) theConstraints->maxValue->integerValue->contents)); }
224
+ }
225
+
226
+ /*======================================*/
227
+ /* Use the standard default value (such */
228
+ /* as nil if symbols are allowed). */
229
+ /*======================================*/
230
+
231
+ return(standardDefault);
232
+ }
233
+
234
+ #if (! RUN_TIME) && (! BLOAD_ONLY)
235
+
236
+ /**********************************************/
237
+ /* ParseDefault: Parses a default value list. */
238
+ /**********************************************/
239
+ struct expr *ParseDefault(
240
+ Environment *theEnv,
241
+ const char *readSource,
242
+ bool multifield,
243
+ bool dynamic,
244
+ bool evalStatic,
245
+ bool *noneSpecified,
246
+ bool *deriveSpecified,
247
+ bool *error)
248
+ {
249
+ struct expr *defaultList = NULL, *lastDefault = NULL;
250
+ struct expr *newItem, *tmpItem;
251
+ struct token theToken;
252
+ UDFValue theValue;
253
+ CONSTRAINT_RECORD *rv;
254
+ int specialVarCode;
255
+
256
+ *noneSpecified = false;
257
+ *deriveSpecified = false;
258
+
259
+ SavePPBuffer(theEnv," ");
260
+ GetToken(theEnv,readSource,&theToken);
261
+
262
+ /*===================================================*/
263
+ /* Read the items contained in the default attribute */
264
+ /* until a closing right parenthesis is encountered. */
265
+ /*===================================================*/
266
+
267
+ while (theToken.tknType != RIGHT_PARENTHESIS_TOKEN)
268
+ {
269
+ /*========================================*/
270
+ /* Get the next item in the default list. */
271
+ /*========================================*/
272
+
273
+ newItem = ParseAtomOrExpression(theEnv,readSource,&theToken);
274
+ if (newItem == NULL)
275
+ {
276
+ ReturnExpression(theEnv,defaultList);
277
+ *error = true;
278
+ return NULL;
279
+ }
280
+
281
+ /*===========================================================*/
282
+ /* Check for invalid variable usage. With the expection of */
283
+ /* ?NONE for the default attribute, local variables may not */
284
+ /* be used within the default or default-dynamic attributes. */
285
+ /*===========================================================*/
286
+
287
+ if ((newItem->type == SF_VARIABLE) || (newItem->type == MF_VARIABLE))
288
+ {
289
+ if (strcmp(newItem->lexemeValue->contents,"NONE") == 0)
290
+ { specialVarCode = 0; }
291
+ else if (strcmp(newItem->lexemeValue->contents,"DERIVE") == 0)
292
+ { specialVarCode = 1; }
293
+ else
294
+ { specialVarCode = -1; }
295
+
296
+ if ((dynamic) ||
297
+ (newItem->type == MF_VARIABLE) ||
298
+ (specialVarCode == -1) ||
299
+ ((specialVarCode != -1) && (defaultList != NULL)))
300
+ {
301
+ if (dynamic) SyntaxErrorMessage(theEnv,"default-dynamic attribute");
302
+ else SyntaxErrorMessage(theEnv,"default attribute");
303
+ ReturnExpression(theEnv,newItem);
304
+ ReturnExpression(theEnv,defaultList);
305
+ *error = true;
306
+ return NULL;
307
+ }
308
+
309
+ ReturnExpression(theEnv,newItem);
310
+
311
+ /*============================================*/
312
+ /* Check for the closing right parenthesis of */
313
+ /* the default or default dynamic attribute. */
314
+ /*============================================*/
315
+
316
+ GetToken(theEnv,readSource,&theToken);
317
+
318
+ if (theToken.tknType != RIGHT_PARENTHESIS_TOKEN)
319
+ {
320
+ if (dynamic) SyntaxErrorMessage(theEnv,"default-dynamic attribute");
321
+ else SyntaxErrorMessage(theEnv,"default attribute");
322
+ PPBackup(theEnv);
323
+ SavePPBuffer(theEnv," ");
324
+ SavePPBuffer(theEnv,theToken.printForm);
325
+ *error = true;
326
+ }
327
+
328
+ if (specialVarCode == 0)
329
+ *noneSpecified = true;
330
+ else
331
+ *deriveSpecified = true;
332
+ return NULL;
333
+ }
334
+
335
+ /*====================================================*/
336
+ /* Look to see if any variables have been used within */
337
+ /* expressions contained within the default list. */
338
+ /*====================================================*/
339
+
340
+ if (ExpressionContainsVariables(newItem,false) == true)
341
+ {
342
+ ReturnExpression(theEnv,defaultList);
343
+ ReturnExpression(theEnv,newItem);
344
+ *error = true;
345
+ if (dynamic) SyntaxErrorMessage(theEnv,"default-dynamic attribute");
346
+ else SyntaxErrorMessage(theEnv,"default attribute");
347
+ return NULL;
348
+ }
349
+
350
+ /*============================================*/
351
+ /* Add the default value to the default list. */
352
+ /*============================================*/
353
+
354
+ if (lastDefault == NULL)
355
+ { defaultList = newItem; }
356
+ else
357
+ { lastDefault->nextArg = newItem; }
358
+ lastDefault = newItem;
359
+
360
+ /*=======================================*/
361
+ /* Begin parsing the next default value. */
362
+ /*=======================================*/
363
+
364
+ SavePPBuffer(theEnv," ");
365
+ GetToken(theEnv,readSource,&theToken);
366
+ }
367
+
368
+ /*=====================================*/
369
+ /* Fix up pretty print representation. */
370
+ /*=====================================*/
371
+
372
+ PPBackup(theEnv);
373
+ PPBackup(theEnv);
374
+ SavePPBuffer(theEnv,")");
375
+
376
+ /*=========================================*/
377
+ /* A single field slot's default attribute */
378
+ /* must contain a single value. */
379
+ /*=========================================*/
380
+
381
+ if (multifield == false)
382
+ {
383
+ if (defaultList == NULL)
384
+ { *error = true; }
385
+ else if (defaultList->nextArg != NULL)
386
+ { *error = true; }
387
+ else
388
+ {
389
+ rv = ExpressionToConstraintRecord(theEnv,defaultList);
390
+ rv->multifieldsAllowed = false;
391
+ if (UnmatchableConstraint(rv)) *error = true;
392
+ RemoveConstraint(theEnv,rv);
393
+ }
394
+
395
+ if (*error)
396
+ {
397
+ PrintErrorID(theEnv,"DEFAULT",1,true);
398
+ WriteString(theEnv,STDERR,"The default value for a single field slot must be a single field value.\n");
399
+ ReturnExpression(theEnv,defaultList);
400
+ return NULL;
401
+ }
402
+ }
403
+
404
+ /*=======================================================*/
405
+ /* If the dynamic-default attribute is not being parsed, */
406
+ /* evaluate the expressions to make the default value. */
407
+ /*=======================================================*/
408
+
409
+ if (dynamic || (! evalStatic) || (defaultList == NULL)) return(defaultList);
410
+
411
+ tmpItem = defaultList;
412
+ newItem = defaultList;
413
+
414
+ defaultList = NULL;
415
+
416
+ while (newItem != NULL)
417
+ {
418
+ SetEvaluationError(theEnv,false);
419
+ if (EvaluateExpression(theEnv,newItem,&theValue)) *error = true;
420
+
421
+ if ((theValue.header->type == MULTIFIELD_TYPE) &&
422
+ (multifield == false) &&
423
+ (*error == false))
424
+ {
425
+ PrintErrorID(theEnv,"DEFAULT",1,true);
426
+ WriteString(theEnv,STDERR,"The default value for a single field slot must be a single field value.\n");
427
+ *error = true;
428
+ }
429
+
430
+ if (*error)
431
+ {
432
+ ReturnExpression(theEnv,tmpItem);
433
+ ReturnExpression(theEnv,defaultList);
434
+ *error = true;
435
+ return NULL;
436
+ }
437
+
438
+ lastDefault = ConvertValueToExpression(theEnv,&theValue);
439
+
440
+ defaultList = AppendExpressions(defaultList,lastDefault);
441
+
442
+ newItem = newItem->nextArg;
443
+ }
444
+
445
+ ReturnExpression(theEnv,tmpItem);
446
+
447
+ /*==========================*/
448
+ /* Return the default list. */
449
+ /*==========================*/
450
+
451
+ return(defaultList);
452
+ }
453
+
454
+ #endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
@@ -0,0 +1,57 @@
1
+ /*******************************************************/
2
+ /* "C" Language Integrated Production System */
3
+ /* */
4
+ /* CLIPS Version 6.40 08/25/16 */
5
+ /* */
6
+ /* DEFAULT ATTRIBUTE HEADER FILE */
7
+ /*******************************************************/
8
+
9
+ /*************************************************************/
10
+ /* Purpose: Provides functions for parsing the default */
11
+ /* attribute and determining default values based on */
12
+ /* slot constraints. */
13
+ /* */
14
+ /* Principal Programmer(s): */
15
+ /* Gary D. Riley */
16
+ /* */
17
+ /* Contributing Programmer(s): */
18
+ /* */
19
+ /* Revision History: */
20
+ /* */
21
+ /* 6.24: Support for deftemplate-slot-default-value */
22
+ /* function. */
23
+ /* */
24
+ /* 6.30: Support for long long integers. */
25
+ /* */
26
+ /* Added const qualifiers to remove C++ */
27
+ /* deprecation warnings. */
28
+ /* */
29
+ /* 6.40: Removed LOCALE definition. */
30
+ /* */
31
+ /* Pragma once and other inclusion changes. */
32
+ /* */
33
+ /* Added support for booleans with <stdbool.h>. */
34
+ /* */
35
+ /* Removed use of void pointers for specific */
36
+ /* data structures. */
37
+ /* */
38
+ /* UDF redesign. */
39
+ /* */
40
+ /*************************************************************/
41
+
42
+ #ifndef _H_default
43
+
44
+ #pragma once
45
+
46
+ #define _H_default
47
+
48
+ #include "constrnt.h"
49
+ #include "evaluatn.h"
50
+
51
+ void DeriveDefaultFromConstraints(Environment *,CONSTRAINT_RECORD *,UDFValue *,bool,bool);
52
+ struct expr *ParseDefault(Environment *,const char *,bool,bool,bool,bool *,bool *,bool *);
53
+
54
+ #endif /* _H_default */
55
+
56
+
57
+