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.
- checksums.yaml +7 -0
- data/ext/clipsruby/agenda.c +1373 -0
- data/ext/clipsruby/agenda.h +169 -0
- data/ext/clipsruby/analysis.c +1142 -0
- data/ext/clipsruby/analysis.h +61 -0
- data/ext/clipsruby/argacces.c +526 -0
- data/ext/clipsruby/argacces.h +77 -0
- data/ext/clipsruby/bload.c +884 -0
- data/ext/clipsruby/bload.h +94 -0
- data/ext/clipsruby/bmathfun.c +557 -0
- data/ext/clipsruby/bmathfun.h +66 -0
- data/ext/clipsruby/bsave.c +634 -0
- data/ext/clipsruby/bsave.h +130 -0
- data/ext/clipsruby/classcom.c +976 -0
- data/ext/clipsruby/classcom.h +115 -0
- data/ext/clipsruby/classexm.c +1376 -0
- data/ext/clipsruby/classexm.h +97 -0
- data/ext/clipsruby/classfun.c +1392 -0
- data/ext/clipsruby/classfun.h +164 -0
- data/ext/clipsruby/classinf.c +1245 -0
- data/ext/clipsruby/classinf.h +94 -0
- data/ext/clipsruby/classini.c +843 -0
- data/ext/clipsruby/classini.h +75 -0
- data/ext/clipsruby/classpsr.c +957 -0
- data/ext/clipsruby/classpsr.h +73 -0
- data/ext/clipsruby/clips.h +133 -0
- data/ext/clipsruby/clipsruby.c +619 -0
- data/ext/clipsruby/clsltpsr.c +931 -0
- data/ext/clipsruby/clsltpsr.h +72 -0
- data/ext/clipsruby/commline.c +1217 -0
- data/ext/clipsruby/commline.h +131 -0
- data/ext/clipsruby/conscomp.c +1593 -0
- data/ext/clipsruby/conscomp.h +150 -0
- data/ext/clipsruby/constant.h +264 -0
- data/ext/clipsruby/constrct.c +1090 -0
- data/ext/clipsruby/constrct.h +216 -0
- data/ext/clipsruby/constrnt.c +554 -0
- data/ext/clipsruby/constrnt.h +132 -0
- data/ext/clipsruby/crstrtgy.c +1088 -0
- data/ext/clipsruby/crstrtgy.h +85 -0
- data/ext/clipsruby/cstrcbin.c +185 -0
- data/ext/clipsruby/cstrcbin.h +61 -0
- data/ext/clipsruby/cstrccmp.h +43 -0
- data/ext/clipsruby/cstrccom.c +1791 -0
- data/ext/clipsruby/cstrccom.h +115 -0
- data/ext/clipsruby/cstrcpsr.c +835 -0
- data/ext/clipsruby/cstrcpsr.h +97 -0
- data/ext/clipsruby/cstrnbin.c +282 -0
- data/ext/clipsruby/cstrnbin.h +55 -0
- data/ext/clipsruby/cstrnchk.c +826 -0
- data/ext/clipsruby/cstrnchk.h +91 -0
- data/ext/clipsruby/cstrncmp.c +238 -0
- data/ext/clipsruby/cstrncmp.h +57 -0
- data/ext/clipsruby/cstrnops.c +1176 -0
- data/ext/clipsruby/cstrnops.h +47 -0
- data/ext/clipsruby/cstrnpsr.c +1394 -0
- data/ext/clipsruby/cstrnpsr.h +88 -0
- data/ext/clipsruby/cstrnutl.c +564 -0
- data/ext/clipsruby/cstrnutl.h +54 -0
- data/ext/clipsruby/default.c +454 -0
- data/ext/clipsruby/default.h +57 -0
- data/ext/clipsruby/defins.c +971 -0
- data/ext/clipsruby/defins.h +127 -0
- data/ext/clipsruby/developr.c +677 -0
- data/ext/clipsruby/developr.h +69 -0
- data/ext/clipsruby/dffctbin.c +477 -0
- data/ext/clipsruby/dffctbin.h +76 -0
- data/ext/clipsruby/dffctbsc.c +308 -0
- data/ext/clipsruby/dffctbsc.h +72 -0
- data/ext/clipsruby/dffctcmp.c +297 -0
- data/ext/clipsruby/dffctcmp.h +44 -0
- data/ext/clipsruby/dffctdef.c +364 -0
- data/ext/clipsruby/dffctdef.h +104 -0
- data/ext/clipsruby/dffctpsr.c +179 -0
- data/ext/clipsruby/dffctpsr.h +49 -0
- data/ext/clipsruby/dffnxbin.c +520 -0
- data/ext/clipsruby/dffnxbin.h +67 -0
- data/ext/clipsruby/dffnxcmp.c +378 -0
- data/ext/clipsruby/dffnxcmp.h +54 -0
- data/ext/clipsruby/dffnxexe.c +241 -0
- data/ext/clipsruby/dffnxexe.h +58 -0
- data/ext/clipsruby/dffnxfun.c +1192 -0
- data/ext/clipsruby/dffnxfun.h +155 -0
- data/ext/clipsruby/dffnxpsr.c +514 -0
- data/ext/clipsruby/dffnxpsr.h +57 -0
- data/ext/clipsruby/dfinsbin.c +509 -0
- data/ext/clipsruby/dfinsbin.h +66 -0
- data/ext/clipsruby/dfinscmp.c +345 -0
- data/ext/clipsruby/dfinscmp.h +48 -0
- data/ext/clipsruby/drive.c +1191 -0
- data/ext/clipsruby/drive.h +65 -0
- data/ext/clipsruby/emathfun.c +1213 -0
- data/ext/clipsruby/emathfun.h +99 -0
- data/ext/clipsruby/engine.c +1568 -0
- data/ext/clipsruby/engine.h +203 -0
- data/ext/clipsruby/entities.h +276 -0
- data/ext/clipsruby/envrnbld.c +514 -0
- data/ext/clipsruby/envrnbld.h +40 -0
- data/ext/clipsruby/envrnmnt.c +257 -0
- data/ext/clipsruby/envrnmnt.h +112 -0
- data/ext/clipsruby/evaluatn.c +1736 -0
- data/ext/clipsruby/evaluatn.h +211 -0
- data/ext/clipsruby/expressn.c +494 -0
- data/ext/clipsruby/expressn.h +154 -0
- data/ext/clipsruby/exprnbin.c +538 -0
- data/ext/clipsruby/exprnbin.h +60 -0
- data/ext/clipsruby/exprnops.c +564 -0
- data/ext/clipsruby/exprnops.h +67 -0
- data/ext/clipsruby/exprnpsr.c +1112 -0
- data/ext/clipsruby/exprnpsr.h +98 -0
- data/ext/clipsruby/extconf.rb +2 -0
- data/ext/clipsruby/extnfunc.c +1015 -0
- data/ext/clipsruby/extnfunc.h +157 -0
- data/ext/clipsruby/factbin.c +447 -0
- data/ext/clipsruby/factbin.h +56 -0
- data/ext/clipsruby/factbld.c +1035 -0
- data/ext/clipsruby/factbld.h +63 -0
- data/ext/clipsruby/factcmp.c +386 -0
- data/ext/clipsruby/factcmp.h +46 -0
- data/ext/clipsruby/factcom.c +759 -0
- data/ext/clipsruby/factcom.h +80 -0
- data/ext/clipsruby/factfile.c +1761 -0
- data/ext/clipsruby/factfile.h +54 -0
- data/ext/clipsruby/factfun.c +682 -0
- data/ext/clipsruby/factfun.h +77 -0
- data/ext/clipsruby/factgen.c +1305 -0
- data/ext/clipsruby/factgen.h +229 -0
- data/ext/clipsruby/facthsh.c +438 -0
- data/ext/clipsruby/facthsh.h +81 -0
- data/ext/clipsruby/factlhs.c +250 -0
- data/ext/clipsruby/factlhs.h +54 -0
- data/ext/clipsruby/factmch.c +905 -0
- data/ext/clipsruby/factmch.h +68 -0
- data/ext/clipsruby/factmngr.c +3373 -0
- data/ext/clipsruby/factmngr.h +325 -0
- data/ext/clipsruby/factprt.c +498 -0
- data/ext/clipsruby/factprt.h +60 -0
- data/ext/clipsruby/factqpsr.c +796 -0
- data/ext/clipsruby/factqpsr.h +61 -0
- data/ext/clipsruby/factqury.c +1267 -0
- data/ext/clipsruby/factqury.h +112 -0
- data/ext/clipsruby/factrete.c +978 -0
- data/ext/clipsruby/factrete.h +70 -0
- data/ext/clipsruby/factrhs.c +667 -0
- data/ext/clipsruby/factrhs.h +55 -0
- data/ext/clipsruby/filecom.c +353 -0
- data/ext/clipsruby/filecom.h +137 -0
- data/ext/clipsruby/filertr.c +481 -0
- data/ext/clipsruby/filertr.h +94 -0
- data/ext/clipsruby/fileutil.c +1020 -0
- data/ext/clipsruby/fileutil.h +50 -0
- data/ext/clipsruby/generate.c +1079 -0
- data/ext/clipsruby/generate.h +57 -0
- data/ext/clipsruby/genrcbin.c +902 -0
- data/ext/clipsruby/genrcbin.h +69 -0
- data/ext/clipsruby/genrccmp.c +640 -0
- data/ext/clipsruby/genrccmp.h +59 -0
- data/ext/clipsruby/genrccom.c +2017 -0
- data/ext/clipsruby/genrccom.h +119 -0
- data/ext/clipsruby/genrcexe.c +737 -0
- data/ext/clipsruby/genrcexe.h +73 -0
- data/ext/clipsruby/genrcfun.c +890 -0
- data/ext/clipsruby/genrcfun.h +185 -0
- data/ext/clipsruby/genrcpsr.c +1618 -0
- data/ext/clipsruby/genrcpsr.h +80 -0
- data/ext/clipsruby/globlbin.c +458 -0
- data/ext/clipsruby/globlbin.h +71 -0
- data/ext/clipsruby/globlbsc.c +361 -0
- data/ext/clipsruby/globlbsc.h +83 -0
- data/ext/clipsruby/globlcmp.c +330 -0
- data/ext/clipsruby/globlcmp.h +52 -0
- data/ext/clipsruby/globlcom.c +289 -0
- data/ext/clipsruby/globlcom.h +63 -0
- data/ext/clipsruby/globldef.c +1087 -0
- data/ext/clipsruby/globldef.h +151 -0
- data/ext/clipsruby/globlpsr.c +530 -0
- data/ext/clipsruby/globlpsr.h +59 -0
- data/ext/clipsruby/immthpsr.c +431 -0
- data/ext/clipsruby/immthpsr.h +55 -0
- data/ext/clipsruby/incrrset.c +530 -0
- data/ext/clipsruby/incrrset.h +73 -0
- data/ext/clipsruby/inherpsr.c +850 -0
- data/ext/clipsruby/inherpsr.h +52 -0
- data/ext/clipsruby/inscom.c +2076 -0
- data/ext/clipsruby/inscom.h +182 -0
- data/ext/clipsruby/insfile.c +1764 -0
- data/ext/clipsruby/insfile.h +96 -0
- data/ext/clipsruby/insfun.c +1451 -0
- data/ext/clipsruby/insfun.h +134 -0
- data/ext/clipsruby/insmngr.c +2550 -0
- data/ext/clipsruby/insmngr.h +125 -0
- data/ext/clipsruby/insmoddp.c +1041 -0
- data/ext/clipsruby/insmoddp.h +91 -0
- data/ext/clipsruby/insmult.c +804 -0
- data/ext/clipsruby/insmult.h +62 -0
- data/ext/clipsruby/inspsr.c +602 -0
- data/ext/clipsruby/inspsr.h +60 -0
- data/ext/clipsruby/insquery.c +1278 -0
- data/ext/clipsruby/insquery.h +115 -0
- data/ext/clipsruby/insqypsr.c +729 -0
- data/ext/clipsruby/insqypsr.h +63 -0
- data/ext/clipsruby/iofun.c +2045 -0
- data/ext/clipsruby/iofun.h +116 -0
- data/ext/clipsruby/lgcldpnd.c +644 -0
- data/ext/clipsruby/lgcldpnd.h +75 -0
- data/ext/clipsruby/main.c +112 -0
- data/ext/clipsruby/match.h +142 -0
- data/ext/clipsruby/memalloc.c +481 -0
- data/ext/clipsruby/memalloc.h +197 -0
- data/ext/clipsruby/miscfun.c +1801 -0
- data/ext/clipsruby/miscfun.h +132 -0
- data/ext/clipsruby/modulbin.c +607 -0
- data/ext/clipsruby/modulbin.h +84 -0
- data/ext/clipsruby/modulbsc.c +347 -0
- data/ext/clipsruby/modulbsc.h +67 -0
- data/ext/clipsruby/modulcmp.c +499 -0
- data/ext/clipsruby/modulcmp.h +54 -0
- data/ext/clipsruby/moduldef.c +817 -0
- data/ext/clipsruby/moduldef.h +271 -0
- data/ext/clipsruby/modulpsr.c +1150 -0
- data/ext/clipsruby/modulpsr.h +69 -0
- data/ext/clipsruby/modulutl.c +1036 -0
- data/ext/clipsruby/modulutl.h +84 -0
- data/ext/clipsruby/msgcom.c +1221 -0
- data/ext/clipsruby/msgcom.h +125 -0
- data/ext/clipsruby/msgfun.c +1076 -0
- data/ext/clipsruby/msgfun.h +118 -0
- data/ext/clipsruby/msgpass.c +1441 -0
- data/ext/clipsruby/msgpass.h +103 -0
- data/ext/clipsruby/msgpsr.c +698 -0
- data/ext/clipsruby/msgpsr.h +73 -0
- data/ext/clipsruby/multifld.c +1404 -0
- data/ext/clipsruby/multifld.h +130 -0
- data/ext/clipsruby/multifun.c +2182 -0
- data/ext/clipsruby/multifun.h +102 -0
- data/ext/clipsruby/network.h +142 -0
- data/ext/clipsruby/objbin.c +1522 -0
- data/ext/clipsruby/objbin.h +79 -0
- data/ext/clipsruby/objcmp.c +1507 -0
- data/ext/clipsruby/objcmp.h +71 -0
- data/ext/clipsruby/object.h +260 -0
- data/ext/clipsruby/objrtbin.c +701 -0
- data/ext/clipsruby/objrtbin.h +79 -0
- data/ext/clipsruby/objrtbld.c +2393 -0
- data/ext/clipsruby/objrtbld.h +66 -0
- data/ext/clipsruby/objrtcmp.c +734 -0
- data/ext/clipsruby/objrtcmp.h +66 -0
- data/ext/clipsruby/objrtfnx.c +1330 -0
- data/ext/clipsruby/objrtfnx.h +222 -0
- data/ext/clipsruby/objrtgen.c +736 -0
- data/ext/clipsruby/objrtgen.h +63 -0
- data/ext/clipsruby/objrtmch.c +1524 -0
- data/ext/clipsruby/objrtmch.h +160 -0
- data/ext/clipsruby/parsefun.c +415 -0
- data/ext/clipsruby/parsefun.h +67 -0
- data/ext/clipsruby/pattern.c +1265 -0
- data/ext/clipsruby/pattern.h +163 -0
- data/ext/clipsruby/pprint.c +328 -0
- data/ext/clipsruby/pprint.h +79 -0
- data/ext/clipsruby/prccode.c +1478 -0
- data/ext/clipsruby/prccode.h +145 -0
- data/ext/clipsruby/prcdrfun.c +640 -0
- data/ext/clipsruby/prcdrfun.h +95 -0
- data/ext/clipsruby/prcdrpsr.c +1068 -0
- data/ext/clipsruby/prcdrpsr.h +79 -0
- data/ext/clipsruby/prdctfun.c +869 -0
- data/ext/clipsruby/prdctfun.h +77 -0
- data/ext/clipsruby/prntutil.c +878 -0
- data/ext/clipsruby/prntutil.h +125 -0
- data/ext/clipsruby/proflfun.c +827 -0
- data/ext/clipsruby/proflfun.h +118 -0
- data/ext/clipsruby/reorder.c +2082 -0
- data/ext/clipsruby/reorder.h +172 -0
- data/ext/clipsruby/reteutil.c +1732 -0
- data/ext/clipsruby/reteutil.h +111 -0
- data/ext/clipsruby/retract.c +710 -0
- data/ext/clipsruby/retract.h +74 -0
- data/ext/clipsruby/router.c +737 -0
- data/ext/clipsruby/router.h +147 -0
- data/ext/clipsruby/rulebin.c +1136 -0
- data/ext/clipsruby/rulebin.h +153 -0
- data/ext/clipsruby/rulebld.c +1328 -0
- data/ext/clipsruby/rulebld.h +62 -0
- data/ext/clipsruby/rulebsc.c +517 -0
- data/ext/clipsruby/rulebsc.h +91 -0
- data/ext/clipsruby/rulecmp.c +733 -0
- data/ext/clipsruby/rulecmp.h +63 -0
- data/ext/clipsruby/rulecom.c +1583 -0
- data/ext/clipsruby/rulecom.h +116 -0
- data/ext/clipsruby/rulecstr.c +892 -0
- data/ext/clipsruby/rulecstr.h +53 -0
- data/ext/clipsruby/ruledef.c +559 -0
- data/ext/clipsruby/ruledef.h +179 -0
- data/ext/clipsruby/ruledlt.c +599 -0
- data/ext/clipsruby/ruledlt.h +58 -0
- data/ext/clipsruby/rulelhs.c +1216 -0
- data/ext/clipsruby/rulelhs.h +52 -0
- data/ext/clipsruby/rulepsr.c +1073 -0
- data/ext/clipsruby/rulepsr.h +61 -0
- data/ext/clipsruby/scanner.c +856 -0
- data/ext/clipsruby/scanner.h +112 -0
- data/ext/clipsruby/setup.h +488 -0
- data/ext/clipsruby/sortfun.c +433 -0
- data/ext/clipsruby/sortfun.h +55 -0
- data/ext/clipsruby/strngfun.c +1173 -0
- data/ext/clipsruby/strngfun.h +96 -0
- data/ext/clipsruby/strngrtr.c +523 -0
- data/ext/clipsruby/strngrtr.h +97 -0
- data/ext/clipsruby/symblbin.c +648 -0
- data/ext/clipsruby/symblbin.h +64 -0
- data/ext/clipsruby/symblcmp.c +893 -0
- data/ext/clipsruby/symblcmp.h +61 -0
- data/ext/clipsruby/symbol.c +1961 -0
- data/ext/clipsruby/symbol.h +243 -0
- data/ext/clipsruby/sysdep.c +894 -0
- data/ext/clipsruby/sysdep.h +164 -0
- data/ext/clipsruby/textpro.c +1388 -0
- data/ext/clipsruby/textpro.h +77 -0
- data/ext/clipsruby/tmpltbin.c +609 -0
- data/ext/clipsruby/tmpltbin.h +108 -0
- data/ext/clipsruby/tmpltbsc.c +327 -0
- data/ext/clipsruby/tmpltbsc.h +87 -0
- data/ext/clipsruby/tmpltcmp.c +450 -0
- data/ext/clipsruby/tmpltcmp.h +57 -0
- data/ext/clipsruby/tmpltdef.c +584 -0
- data/ext/clipsruby/tmpltdef.h +155 -0
- data/ext/clipsruby/tmpltfun.c +2477 -0
- data/ext/clipsruby/tmpltfun.h +122 -0
- data/ext/clipsruby/tmpltlhs.c +379 -0
- data/ext/clipsruby/tmpltlhs.h +50 -0
- data/ext/clipsruby/tmpltpsr.c +819 -0
- data/ext/clipsruby/tmpltpsr.h +59 -0
- data/ext/clipsruby/tmpltrhs.c +595 -0
- data/ext/clipsruby/tmpltrhs.h +55 -0
- data/ext/clipsruby/tmpltutl.c +637 -0
- data/ext/clipsruby/tmpltutl.h +82 -0
- data/ext/clipsruby/userdata.c +156 -0
- data/ext/clipsruby/userdata.h +72 -0
- data/ext/clipsruby/userfunctions.c +70 -0
- data/ext/clipsruby/usrsetup.h +7 -0
- data/ext/clipsruby/utility.c +1594 -0
- data/ext/clipsruby/utility.h +250 -0
- data/ext/clipsruby/watch.c +865 -0
- data/ext/clipsruby/watch.h +124 -0
- data/lib/clipsruby.rb +1 -0
- metadata +388 -0
@@ -0,0 +1,1087 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.41 07/23/21 */
|
5
|
+
/* */
|
6
|
+
/* DEFGLOBAL MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Provides core routines for the creation and */
|
11
|
+
/* maintenance of the defglobal construct. */
|
12
|
+
/* */
|
13
|
+
/* Principal Programmer(s): */
|
14
|
+
/* Gary D. Riley */
|
15
|
+
/* */
|
16
|
+
/* Contributing Programmer(s): */
|
17
|
+
/* Brian L. Dantes */
|
18
|
+
/* */
|
19
|
+
/* Revision History: */
|
20
|
+
/* */
|
21
|
+
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
22
|
+
/* */
|
23
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
24
|
+
/* */
|
25
|
+
/* Corrected code to remove run-time program */
|
26
|
+
/* compiler warning. */
|
27
|
+
/* */
|
28
|
+
/* 6.30: Removed conditional code for unsupported */
|
29
|
+
/* compilers/operating systems (IBM_MCW, */
|
30
|
+
/* MAC_MCW, and IBM_TBC). */
|
31
|
+
/* */
|
32
|
+
/* Changed garbage collection algorithm. */
|
33
|
+
/* */
|
34
|
+
/* Added const qualifiers to remove C++ */
|
35
|
+
/* deprecation warnings. */
|
36
|
+
/* */
|
37
|
+
/* Converted API macros to function calls. */
|
38
|
+
/* */
|
39
|
+
/* Fixed linkage issue when BLOAD_ONLY compiler */
|
40
|
+
/* flag is set to 1. */
|
41
|
+
/* */
|
42
|
+
/* Changed find construct functionality so that */
|
43
|
+
/* imported modules are search when locating a */
|
44
|
+
/* named construct. */
|
45
|
+
/* */
|
46
|
+
/* 6.32: Fixed issue with optimized join network */
|
47
|
+
/* expression evaluation. */
|
48
|
+
/* */
|
49
|
+
/* 6.40: Added Env prefix to GetEvaluationError and */
|
50
|
+
/* SetEvaluationError functions. */
|
51
|
+
/* */
|
52
|
+
/* Pragma once and other inclusion changes. */
|
53
|
+
/* */
|
54
|
+
/* Added support for booleans with <stdbool.h>. */
|
55
|
+
/* */
|
56
|
+
/* Removed use of void pointers for specific */
|
57
|
+
/* data structures. */
|
58
|
+
/* */
|
59
|
+
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
|
60
|
+
/* */
|
61
|
+
/* UDF redesign. */
|
62
|
+
/* */
|
63
|
+
/* Use of ?<var>, $?<var>, ?*<var>, and $?*var* */
|
64
|
+
/* by itself at the command prompt and within */
|
65
|
+
/* the eval function now consistently returns the */
|
66
|
+
/* value of the variable. */
|
67
|
+
/* */
|
68
|
+
/*************************************************************/
|
69
|
+
|
70
|
+
#include "setup.h"
|
71
|
+
|
72
|
+
#if DEFGLOBAL_CONSTRUCT
|
73
|
+
|
74
|
+
#include <stdio.h>
|
75
|
+
|
76
|
+
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
|
77
|
+
#include "bload.h"
|
78
|
+
#include "globlbin.h"
|
79
|
+
#endif
|
80
|
+
#include "commline.h"
|
81
|
+
#include "envrnmnt.h"
|
82
|
+
#include "globlbsc.h"
|
83
|
+
#if CONSTRUCT_COMPILER && (! RUN_TIME)
|
84
|
+
#include "globlcmp.h"
|
85
|
+
#endif
|
86
|
+
#include "globlcom.h"
|
87
|
+
#include "globlpsr.h"
|
88
|
+
#include "memalloc.h"
|
89
|
+
#include "modulpsr.h"
|
90
|
+
#include "modulutl.h"
|
91
|
+
#include "multifld.h"
|
92
|
+
#include "prntutil.h"
|
93
|
+
#include "router.h"
|
94
|
+
#include "strngrtr.h"
|
95
|
+
#include "utility.h"
|
96
|
+
|
97
|
+
#include "globldef.h"
|
98
|
+
|
99
|
+
/***************************************/
|
100
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
101
|
+
/***************************************/
|
102
|
+
|
103
|
+
static void *AllocateModule(Environment *);
|
104
|
+
static void ReturnModule(Environment *,void *);
|
105
|
+
static void ReturnDefglobal(Environment *,Defglobal *);
|
106
|
+
static void InitializeDefglobalModules(Environment *);
|
107
|
+
static bool EntityGetDefglobalValue(Environment *,void *,UDFValue *);
|
108
|
+
static void IncrementDefglobalBusyCount(Environment *,Defglobal *);
|
109
|
+
static void DecrementDefglobalBusyCount(Environment *,Defglobal *);
|
110
|
+
static void DeallocateDefglobalData(Environment *);
|
111
|
+
static void DestroyDefglobalAction(Environment *,ConstructHeader *,void *);
|
112
|
+
#if (! BLOAD_ONLY)
|
113
|
+
static void DestroyDefglobal(Environment *,Defglobal *);
|
114
|
+
#endif
|
115
|
+
#if RUN_TIME
|
116
|
+
static void RuntimeDefglobalAction(Environment *,ConstructHeader *,void *);
|
117
|
+
#endif
|
118
|
+
|
119
|
+
/**************************************************************/
|
120
|
+
/* InitializeDefglobals: Initializes the defglobal construct. */
|
121
|
+
/**************************************************************/
|
122
|
+
void InitializeDefglobals(
|
123
|
+
Environment *theEnv)
|
124
|
+
{
|
125
|
+
struct entityRecord globalInfo = { "GBL_VARIABLE", GBL_VARIABLE,0,0,0,
|
126
|
+
NULL,
|
127
|
+
NULL,
|
128
|
+
NULL,
|
129
|
+
(EntityEvaluationFunction *) EntityGetDefglobalValue,
|
130
|
+
NULL,NULL,
|
131
|
+
NULL,NULL,NULL,NULL,NULL,NULL };
|
132
|
+
|
133
|
+
struct entityRecord defglobalPtrRecord = { "DEFGLOBAL_PTR", DEFGLOBAL_PTR,0,0,0,
|
134
|
+
NULL,NULL,NULL,
|
135
|
+
(EntityEvaluationFunction *) QGetDefglobalUDFValue,
|
136
|
+
NULL,
|
137
|
+
(EntityBusyCountFunction *) DecrementDefglobalBusyCount,
|
138
|
+
(EntityBusyCountFunction *) IncrementDefglobalBusyCount,
|
139
|
+
NULL,NULL,NULL,NULL,NULL };
|
140
|
+
|
141
|
+
AllocateEnvironmentData(theEnv,DEFGLOBAL_DATA,sizeof(struct defglobalData),DeallocateDefglobalData);
|
142
|
+
|
143
|
+
memcpy(&DefglobalData(theEnv)->GlobalInfo,&globalInfo,sizeof(struct entityRecord));
|
144
|
+
memcpy(&DefglobalData(theEnv)->DefglobalPtrRecord,&defglobalPtrRecord,sizeof(struct entityRecord));
|
145
|
+
|
146
|
+
DefglobalData(theEnv)->ResetGlobals = true;
|
147
|
+
DefglobalData(theEnv)->LastModuleIndex = -1;
|
148
|
+
|
149
|
+
InstallPrimitive(theEnv,&DefglobalData(theEnv)->GlobalInfo,GBL_VARIABLE);
|
150
|
+
InstallPrimitive(theEnv,&DefglobalData(theEnv)->GlobalInfo,MF_GBL_VARIABLE);
|
151
|
+
InstallPrimitive(theEnv,&DefglobalData(theEnv)->DefglobalPtrRecord,DEFGLOBAL_PTR);
|
152
|
+
|
153
|
+
InitializeDefglobalModules(theEnv);
|
154
|
+
|
155
|
+
DefglobalBasicCommands(theEnv);
|
156
|
+
DefglobalCommandDefinitions(theEnv);
|
157
|
+
|
158
|
+
DefglobalData(theEnv)->DefglobalConstruct =
|
159
|
+
AddConstruct(theEnv,"defglobal","defglobals",ParseDefglobal,
|
160
|
+
(FindConstructFunction *) FindDefglobal,
|
161
|
+
GetConstructNamePointer,GetConstructPPForm,
|
162
|
+
GetConstructModuleItem,
|
163
|
+
(GetNextConstructFunction *) GetNextDefglobal,
|
164
|
+
SetNextConstruct,
|
165
|
+
(IsConstructDeletableFunction *) DefglobalIsDeletable,
|
166
|
+
(DeleteConstructFunction *) Undefglobal,
|
167
|
+
(FreeConstructFunction *) ReturnDefglobal);
|
168
|
+
}
|
169
|
+
|
170
|
+
/****************************************************/
|
171
|
+
/* DeallocateDefglobalData: Deallocates environment */
|
172
|
+
/* data for the defglobal construct. */
|
173
|
+
/****************************************************/
|
174
|
+
static void DeallocateDefglobalData(
|
175
|
+
Environment *theEnv)
|
176
|
+
{
|
177
|
+
#if ! RUN_TIME
|
178
|
+
struct defglobalModule *theModuleItem;
|
179
|
+
Defmodule *theModule;
|
180
|
+
|
181
|
+
#if BLOAD || BLOAD_AND_BSAVE
|
182
|
+
if (Bloaded(theEnv)) return;
|
183
|
+
#endif
|
184
|
+
|
185
|
+
DoForAllConstructs(theEnv,DestroyDefglobalAction,
|
186
|
+
DefglobalData(theEnv)->DefglobalModuleIndex,false,NULL);
|
187
|
+
|
188
|
+
for (theModule = GetNextDefmodule(theEnv,NULL);
|
189
|
+
theModule != NULL;
|
190
|
+
theModule = GetNextDefmodule(theEnv,theModule))
|
191
|
+
{
|
192
|
+
theModuleItem = (struct defglobalModule *)
|
193
|
+
GetModuleItem(theEnv,theModule,
|
194
|
+
DefglobalData(theEnv)->DefglobalModuleIndex);
|
195
|
+
rtn_struct(theEnv,defglobalModule,theModuleItem);
|
196
|
+
}
|
197
|
+
#else
|
198
|
+
DoForAllConstructs(theEnv,DestroyDefglobalAction,DefglobalData(theEnv)->DefglobalModuleIndex,false,NULL);
|
199
|
+
#endif
|
200
|
+
}
|
201
|
+
|
202
|
+
/***************************************************/
|
203
|
+
/* DestroyDefglobalAction: Action used to remove */
|
204
|
+
/* defglobals as a result of DestroyEnvironment. */
|
205
|
+
/***************************************************/
|
206
|
+
static void DestroyDefglobalAction(
|
207
|
+
Environment *theEnv,
|
208
|
+
ConstructHeader *theConstruct,
|
209
|
+
void *buffer)
|
210
|
+
{
|
211
|
+
#if MAC_XCD
|
212
|
+
#pragma unused(buffer)
|
213
|
+
#endif
|
214
|
+
#if (! BLOAD_ONLY)
|
215
|
+
Defglobal *theDefglobal = (Defglobal *) theConstruct;
|
216
|
+
|
217
|
+
if (theDefglobal == NULL) return;
|
218
|
+
|
219
|
+
DestroyDefglobal(theEnv,theDefglobal);
|
220
|
+
#else
|
221
|
+
#if MAC_XCD
|
222
|
+
#pragma unused(theEnv,theConstruct)
|
223
|
+
#endif
|
224
|
+
#endif
|
225
|
+
}
|
226
|
+
|
227
|
+
/*********************************************************/
|
228
|
+
/* InitializeDefglobalModules: Initializes the defglobal */
|
229
|
+
/* construct for use with the defmodule construct. */
|
230
|
+
/*********************************************************/
|
231
|
+
static void InitializeDefglobalModules(
|
232
|
+
Environment *theEnv)
|
233
|
+
{
|
234
|
+
DefglobalData(theEnv)->DefglobalModuleIndex = RegisterModuleItem(theEnv,"defglobal",
|
235
|
+
AllocateModule,
|
236
|
+
ReturnModule,
|
237
|
+
#if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY
|
238
|
+
BloadDefglobalModuleReference,
|
239
|
+
#else
|
240
|
+
NULL,
|
241
|
+
#endif
|
242
|
+
#if CONSTRUCT_COMPILER && (! RUN_TIME)
|
243
|
+
DefglobalCModuleReference,
|
244
|
+
#else
|
245
|
+
NULL,
|
246
|
+
#endif
|
247
|
+
(FindConstructFunction *) FindDefglobalInModule);
|
248
|
+
|
249
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME) && DEFMODULE_CONSTRUCT
|
250
|
+
AddPortConstructItem(theEnv,"defglobal",SYMBOL_TOKEN);
|
251
|
+
#endif
|
252
|
+
}
|
253
|
+
|
254
|
+
/*************************************************/
|
255
|
+
/* AllocateModule: Allocates a defglobal module. */
|
256
|
+
/*************************************************/
|
257
|
+
static void *AllocateModule(
|
258
|
+
Environment *theEnv)
|
259
|
+
{
|
260
|
+
return (void *) get_struct(theEnv,defglobalModule);
|
261
|
+
}
|
262
|
+
|
263
|
+
/*************************************************/
|
264
|
+
/* ReturnModule: Deallocates a defglobal module. */
|
265
|
+
/*************************************************/
|
266
|
+
static void ReturnModule(
|
267
|
+
Environment *theEnv,
|
268
|
+
void *theItem)
|
269
|
+
{
|
270
|
+
FreeConstructHeaderModule(theEnv,(struct defmoduleItemHeader *) theItem,DefglobalData(theEnv)->DefglobalConstruct);
|
271
|
+
rtn_struct(theEnv,defglobalModule,theItem);
|
272
|
+
}
|
273
|
+
|
274
|
+
/**************************************************************/
|
275
|
+
/* GetDefglobalModuleItem: Returns a pointer to the defmodule */
|
276
|
+
/* item for the specified defglobal or defmodule. */
|
277
|
+
/**************************************************************/
|
278
|
+
struct defglobalModule *GetDefglobalModuleItem(
|
279
|
+
Environment *theEnv,
|
280
|
+
Defmodule *theModule)
|
281
|
+
{
|
282
|
+
return((struct defglobalModule *) GetConstructModuleItemByIndex(theEnv,theModule,DefglobalData(theEnv)->DefglobalModuleIndex));
|
283
|
+
}
|
284
|
+
|
285
|
+
/**************************************************/
|
286
|
+
/* FindDefglobal: Searches for a defglobal in the */
|
287
|
+
/* list of defglobals. Returns a pointer to the */
|
288
|
+
/* defglobal if found, otherwise NULL. */
|
289
|
+
/**************************************************/
|
290
|
+
Defglobal *FindDefglobal(
|
291
|
+
Environment *theEnv,
|
292
|
+
const char *defglobalName)
|
293
|
+
{
|
294
|
+
return (Defglobal *) FindNamedConstructInModuleOrImports(theEnv,defglobalName,DefglobalData(theEnv)->DefglobalConstruct);
|
295
|
+
}
|
296
|
+
|
297
|
+
/******************************************************/
|
298
|
+
/* FindDefglobalInModule: Searches for a defglobal in */
|
299
|
+
/* the list of defglobals. Returns a pointer to the */
|
300
|
+
/* defglobal if found, otherwise NULL. */
|
301
|
+
/******************************************************/
|
302
|
+
Defglobal *FindDefglobalInModule(
|
303
|
+
Environment *theEnv,
|
304
|
+
const char *defglobalName)
|
305
|
+
{
|
306
|
+
return (Defglobal *) FindNamedConstructInModule(theEnv,defglobalName,DefglobalData(theEnv)->DefglobalConstruct);
|
307
|
+
}
|
308
|
+
|
309
|
+
/*****************************************************************/
|
310
|
+
/* GetNextDefglobal: If passed a NULL pointer, returns the first */
|
311
|
+
/* defglobal in the defglobal list. Otherwise returns the next */
|
312
|
+
/* defglobal following the defglobal passed as an argument. */
|
313
|
+
/*****************************************************************/
|
314
|
+
Defglobal *GetNextDefglobal(
|
315
|
+
Environment *theEnv,
|
316
|
+
Defglobal *defglobalPtr)
|
317
|
+
{
|
318
|
+
return (Defglobal *) GetNextConstructItem(theEnv,&defglobalPtr->header,DefglobalData(theEnv)->DefglobalModuleIndex);
|
319
|
+
}
|
320
|
+
|
321
|
+
/********************************************************/
|
322
|
+
/* DefglobalIsDeletable: Returns true if a particular */
|
323
|
+
/* defglobal can be deleted, otherwise returns false. */
|
324
|
+
/********************************************************/
|
325
|
+
bool DefglobalIsDeletable(
|
326
|
+
Defglobal *theDefglobal)
|
327
|
+
{
|
328
|
+
Environment *theEnv = theDefglobal->header.env;
|
329
|
+
|
330
|
+
if (! ConstructsDeletable(theEnv))
|
331
|
+
{ return false; }
|
332
|
+
|
333
|
+
if (theDefglobal->busyCount) return false;
|
334
|
+
|
335
|
+
return true;
|
336
|
+
}
|
337
|
+
|
338
|
+
/************************************************************/
|
339
|
+
/* ReturnDefglobal: Returns the data structures associated */
|
340
|
+
/* with a defglobal construct to the pool of free memory. */
|
341
|
+
/************************************************************/
|
342
|
+
static void ReturnDefglobal(
|
343
|
+
Environment *theEnv,
|
344
|
+
Defglobal *theDefglobal)
|
345
|
+
{
|
346
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME)
|
347
|
+
if (theDefglobal == NULL) return;
|
348
|
+
|
349
|
+
/*====================================*/
|
350
|
+
/* Return the global's current value. */
|
351
|
+
/*====================================*/
|
352
|
+
|
353
|
+
Release(theEnv,theDefglobal->current.header);
|
354
|
+
if (theDefglobal->current.header->type == MULTIFIELD_TYPE)
|
355
|
+
{
|
356
|
+
if (theDefglobal->current.multifieldValue->busyCount == 0)
|
357
|
+
{ ReturnMultifield(theEnv,theDefglobal->current.multifieldValue); }
|
358
|
+
else
|
359
|
+
{ AddToMultifieldList(theEnv,theDefglobal->current.multifieldValue); }
|
360
|
+
}
|
361
|
+
|
362
|
+
/*================================================*/
|
363
|
+
/* Return the expression representing the initial */
|
364
|
+
/* value of the defglobal when it was defined. */
|
365
|
+
/*================================================*/
|
366
|
+
|
367
|
+
RemoveHashedExpression(theEnv,theDefglobal->initial);
|
368
|
+
|
369
|
+
/*===============================*/
|
370
|
+
/* Release items stored in the */
|
371
|
+
/* defglobal's construct header. */
|
372
|
+
/*===============================*/
|
373
|
+
|
374
|
+
DeinstallConstructHeader(theEnv,&theDefglobal->header);
|
375
|
+
|
376
|
+
/*======================================*/
|
377
|
+
/* Return the defglobal data structure. */
|
378
|
+
/*======================================*/
|
379
|
+
|
380
|
+
rtn_struct(theEnv,defglobal,theDefglobal);
|
381
|
+
|
382
|
+
/*===========================================*/
|
383
|
+
/* Set the variable indicating that a change */
|
384
|
+
/* has been made to a global variable. */
|
385
|
+
/*===========================================*/
|
386
|
+
|
387
|
+
DefglobalData(theEnv)->ChangeToGlobals = true;
|
388
|
+
#endif
|
389
|
+
}
|
390
|
+
|
391
|
+
/************************************************************/
|
392
|
+
/* DestroyDefglobal: Returns the data structures associated */
|
393
|
+
/* with a defglobal construct to the pool of free memory. */
|
394
|
+
/************************************************************/
|
395
|
+
#if (! BLOAD_ONLY)
|
396
|
+
static void DestroyDefglobal(
|
397
|
+
Environment *theEnv,
|
398
|
+
Defglobal *theDefglobal)
|
399
|
+
{
|
400
|
+
if (theDefglobal == NULL) return;
|
401
|
+
|
402
|
+
/*====================================*/
|
403
|
+
/* Return the global's current value. */
|
404
|
+
/*====================================*/
|
405
|
+
|
406
|
+
if (theDefglobal->current.header->type == MULTIFIELD_TYPE)
|
407
|
+
{
|
408
|
+
if (theDefglobal->current.multifieldValue->busyCount == 0)
|
409
|
+
{ ReturnMultifield(theEnv,theDefglobal->current.multifieldValue); }
|
410
|
+
else
|
411
|
+
{ AddToMultifieldList(theEnv,theDefglobal->current.multifieldValue); }
|
412
|
+
}
|
413
|
+
|
414
|
+
#if (! RUN_TIME)
|
415
|
+
|
416
|
+
/*===============================*/
|
417
|
+
/* Release items stored in the */
|
418
|
+
/* defglobal's construct header. */
|
419
|
+
/*===============================*/
|
420
|
+
|
421
|
+
DeinstallConstructHeader(theEnv,&theDefglobal->header);
|
422
|
+
|
423
|
+
/*======================================*/
|
424
|
+
/* Return the defglobal data structure. */
|
425
|
+
/*======================================*/
|
426
|
+
|
427
|
+
rtn_struct(theEnv,defglobal,theDefglobal);
|
428
|
+
#endif
|
429
|
+
}
|
430
|
+
#endif
|
431
|
+
|
432
|
+
/************************************************/
|
433
|
+
/* QSetDefglobalValue: Lowest level routine for */
|
434
|
+
/* setting a defglobal's value. */
|
435
|
+
/************************************************/
|
436
|
+
void QSetDefglobalValue(
|
437
|
+
Environment *theEnv,
|
438
|
+
Defglobal *theGlobal,
|
439
|
+
UDFValue *vPtr,
|
440
|
+
bool resetVar)
|
441
|
+
{
|
442
|
+
CLIPSValue newValue;
|
443
|
+
|
444
|
+
/*====================================================*/
|
445
|
+
/* If the new value passed for the defglobal is NULL, */
|
446
|
+
/* then reset the defglobal to the initial value it */
|
447
|
+
/* had when it was defined. */
|
448
|
+
/*====================================================*/
|
449
|
+
|
450
|
+
if (resetVar)
|
451
|
+
{
|
452
|
+
EvaluateExpression(theEnv,theGlobal->initial,vPtr);
|
453
|
+
if (EvaluationData(theEnv)->EvaluationError)
|
454
|
+
{ vPtr->value = FalseSymbol(theEnv); }
|
455
|
+
}
|
456
|
+
|
457
|
+
/*==========================================*/
|
458
|
+
/* If globals are being watch, then display */
|
459
|
+
/* the change to the global variable. */
|
460
|
+
/*==========================================*/
|
461
|
+
|
462
|
+
#if DEBUGGING_FUNCTIONS
|
463
|
+
if (theGlobal->watch &&
|
464
|
+
(! ConstructData(theEnv)->ClearReadyInProgress) &&
|
465
|
+
(! ConstructData(theEnv)->ClearInProgress))
|
466
|
+
{
|
467
|
+
WriteString(theEnv,STDOUT,":== ?*");
|
468
|
+
WriteString(theEnv,STDOUT,theGlobal->header.name->contents);
|
469
|
+
WriteString(theEnv,STDOUT,"* ==> ");
|
470
|
+
WriteUDFValue(theEnv,STDOUT,vPtr);
|
471
|
+
WriteString(theEnv,STDOUT," <== ");
|
472
|
+
WriteCLIPSValue(theEnv,STDOUT,&theGlobal->current);
|
473
|
+
WriteString(theEnv,STDOUT,"\n");
|
474
|
+
}
|
475
|
+
#endif
|
476
|
+
|
477
|
+
/*==============================================*/
|
478
|
+
/* Retain the new value of the global variable. */
|
479
|
+
/*==============================================*/
|
480
|
+
|
481
|
+
NormalizeMultifield(theEnv,vPtr);
|
482
|
+
if (vPtr->header->type != MULTIFIELD_TYPE)
|
483
|
+
{ newValue.value = vPtr->value; }
|
484
|
+
else
|
485
|
+
{ newValue.value = CopyMultifield(theEnv,vPtr->multifieldValue); }
|
486
|
+
Retain(theEnv,newValue.header);
|
487
|
+
|
488
|
+
/*==============================================*/
|
489
|
+
/* Remove the old value of the global variable. */
|
490
|
+
/*==============================================*/
|
491
|
+
|
492
|
+
Release(theEnv,theGlobal->current.header);
|
493
|
+
if (theGlobal->current.header->type == MULTIFIELD_TYPE)
|
494
|
+
{
|
495
|
+
if (theGlobal->current.multifieldValue->busyCount == 0)
|
496
|
+
{ ReturnMultifield(theEnv,theGlobal->current.multifieldValue); }
|
497
|
+
else
|
498
|
+
{ AddToMultifieldList(theEnv,theGlobal->current.multifieldValue); }
|
499
|
+
}
|
500
|
+
|
501
|
+
/*===========================================*/
|
502
|
+
/* Set the new value of the global variable. */
|
503
|
+
/*===========================================*/
|
504
|
+
|
505
|
+
theGlobal->current.value = newValue.value;
|
506
|
+
|
507
|
+
/*===========================================*/
|
508
|
+
/* Set the variable indicating that a change */
|
509
|
+
/* has been made to a global variable. */
|
510
|
+
/*===========================================*/
|
511
|
+
|
512
|
+
DefglobalData(theEnv)->ChangeToGlobals = true;
|
513
|
+
|
514
|
+
if (EvaluationData(theEnv)->CurrentExpression == NULL)
|
515
|
+
{
|
516
|
+
CleanCurrentGarbageFrame(theEnv,NULL);
|
517
|
+
CallPeriodicTasks(theEnv);
|
518
|
+
}
|
519
|
+
}
|
520
|
+
|
521
|
+
/**************************************************************/
|
522
|
+
/* QFindDefglobal: Searches for a defglobal in the list of */
|
523
|
+
/* defglobals. Returns a pointer to the defglobal if found, */
|
524
|
+
/* otherwise NULL. */
|
525
|
+
/**************************************************************/
|
526
|
+
Defglobal *QFindDefglobal(
|
527
|
+
Environment *theEnv,
|
528
|
+
CLIPSLexeme *defglobalName)
|
529
|
+
{
|
530
|
+
Defglobal *theDefglobal;
|
531
|
+
|
532
|
+
for (theDefglobal = GetNextDefglobal(theEnv,NULL);
|
533
|
+
theDefglobal != NULL;
|
534
|
+
theDefglobal = GetNextDefglobal(theEnv,theDefglobal))
|
535
|
+
{ if (defglobalName == theDefglobal->header.name) return theDefglobal; }
|
536
|
+
|
537
|
+
return NULL;
|
538
|
+
}
|
539
|
+
|
540
|
+
/*******************************************************************/
|
541
|
+
/* DefglobalValueForm: Returns the pretty print representation of */
|
542
|
+
/* the current value of the specified defglobal. For example, if */
|
543
|
+
/* the current value of ?*x* is 5, the string "?*x* = 5" would */
|
544
|
+
/* be returned. */
|
545
|
+
/*******************************************************************/
|
546
|
+
void DefglobalValueForm(
|
547
|
+
Defglobal *theGlobal,
|
548
|
+
StringBuilder *theSB)
|
549
|
+
{
|
550
|
+
Environment *theEnv = theGlobal->header.env;
|
551
|
+
|
552
|
+
OpenStringBuilderDestination(theEnv,"GlobalValueForm",theSB);
|
553
|
+
WriteString(theEnv,"GlobalValueForm","?*");
|
554
|
+
WriteString(theEnv,"GlobalValueForm",theGlobal->header.name->contents);
|
555
|
+
WriteString(theEnv,"GlobalValueForm","* = ");
|
556
|
+
WriteCLIPSValue(theEnv,"GlobalValueForm",&theGlobal->current);
|
557
|
+
CloseStringBuilderDestination(theEnv,"GlobalValueForm");
|
558
|
+
}
|
559
|
+
|
560
|
+
/*********************************************************/
|
561
|
+
/* GetGlobalsChanged: Returns the defglobal change flag. */
|
562
|
+
/*********************************************************/
|
563
|
+
bool GetGlobalsChanged(
|
564
|
+
Environment *theEnv)
|
565
|
+
{
|
566
|
+
return DefglobalData(theEnv)->ChangeToGlobals;
|
567
|
+
}
|
568
|
+
|
569
|
+
/******************************************************/
|
570
|
+
/* SetGlobalsChanged: Sets the defglobal change flag. */
|
571
|
+
/******************************************************/
|
572
|
+
void SetGlobalsChanged(
|
573
|
+
Environment *theEnv,
|
574
|
+
bool value)
|
575
|
+
{
|
576
|
+
DefglobalData(theEnv)->ChangeToGlobals = value;
|
577
|
+
}
|
578
|
+
|
579
|
+
/*********************************************************/
|
580
|
+
/* EntityGetDefglobalValue: Returns the value of the */
|
581
|
+
/* specified global variable in the supplied UDFValue. */
|
582
|
+
/*********************************************************/
|
583
|
+
static bool EntityGetDefglobalValue(
|
584
|
+
Environment *theEnv,
|
585
|
+
void *theValue,
|
586
|
+
UDFValue *vPtr)
|
587
|
+
{
|
588
|
+
Defglobal *theGlobal;
|
589
|
+
unsigned int count;
|
590
|
+
|
591
|
+
/*===========================================*/
|
592
|
+
/* Search for the specified defglobal in the */
|
593
|
+
/* modules visible to the current module. */
|
594
|
+
/*===========================================*/
|
595
|
+
|
596
|
+
theGlobal = (Defglobal *)
|
597
|
+
FindImportedConstruct(theEnv,"defglobal",NULL,((CLIPSLexeme *) theValue)->contents,
|
598
|
+
&count,true,NULL);
|
599
|
+
|
600
|
+
/*=============================================*/
|
601
|
+
/* If it wasn't found, print an error message. */
|
602
|
+
/*=============================================*/
|
603
|
+
|
604
|
+
if (theGlobal == NULL)
|
605
|
+
{
|
606
|
+
PrintErrorID(theEnv,"GLOBLDEF",1,false);
|
607
|
+
WriteString(theEnv,STDERR,"Global variable ?*");
|
608
|
+
WriteString(theEnv,STDERR,((CLIPSLexeme *) theValue)->contents);
|
609
|
+
WriteString(theEnv,STDERR,"* is unbound.\n");
|
610
|
+
vPtr->value = FalseSymbol(theEnv);
|
611
|
+
SetEvaluationError(theEnv,true);
|
612
|
+
return false;
|
613
|
+
}
|
614
|
+
|
615
|
+
/*========================================================*/
|
616
|
+
/* The current implementation of the defmodules shouldn't */
|
617
|
+
/* allow a construct to be defined which would cause an */
|
618
|
+
/* ambiguous reference, but we'll check for it anyway. */
|
619
|
+
/*========================================================*/
|
620
|
+
|
621
|
+
if (count > 1)
|
622
|
+
{
|
623
|
+
AmbiguousReferenceErrorMessage(theEnv,"defglobal",((CLIPSLexeme *) theValue)->contents);
|
624
|
+
vPtr->value = FalseSymbol(theEnv);
|
625
|
+
SetEvaluationError(theEnv,true);
|
626
|
+
return false;
|
627
|
+
}
|
628
|
+
|
629
|
+
/*=================================*/
|
630
|
+
/* Get the value of the defglobal. */
|
631
|
+
/*=================================*/
|
632
|
+
|
633
|
+
CLIPSToUDFValue(&theGlobal->current,vPtr);
|
634
|
+
|
635
|
+
if (vPtr->value == FalseSymbol(theEnv))
|
636
|
+
{ return false; }
|
637
|
+
|
638
|
+
return true;
|
639
|
+
}
|
640
|
+
|
641
|
+
/******************************************************************/
|
642
|
+
/* QGetDefglobalUDFValue: Returns the value of a global variable. */
|
643
|
+
/******************************************************************/
|
644
|
+
bool QGetDefglobalUDFValue(
|
645
|
+
Environment *theEnv,
|
646
|
+
Defglobal *theGlobal,
|
647
|
+
UDFValue *vPtr)
|
648
|
+
{
|
649
|
+
vPtr->value = theGlobal->current.value;
|
650
|
+
|
651
|
+
/*===========================================================*/
|
652
|
+
/* If the global contains a multifield value, return a copy */
|
653
|
+
/* of the value so that routines which use this value are */
|
654
|
+
/* not affected if the value of the global is later changed. */
|
655
|
+
/*===========================================================*/
|
656
|
+
|
657
|
+
if (theGlobal->current.header->type == MULTIFIELD_TYPE)
|
658
|
+
{
|
659
|
+
vPtr->begin = 0;
|
660
|
+
vPtr->range = theGlobal->current.multifieldValue->length;
|
661
|
+
}
|
662
|
+
|
663
|
+
if (vPtr->value == FalseSymbol(theEnv))
|
664
|
+
{ return false; }
|
665
|
+
|
666
|
+
return true;
|
667
|
+
}
|
668
|
+
|
669
|
+
/*********************************************************/
|
670
|
+
/* DefglobalGetValue: Returns the value of the specified */
|
671
|
+
/* global variable in the supplied UDFValue. */
|
672
|
+
/*********************************************************/
|
673
|
+
void DefglobalGetValue(
|
674
|
+
Defglobal *theDefglobal,
|
675
|
+
CLIPSValue *vPtr)
|
676
|
+
{
|
677
|
+
vPtr->value = theDefglobal->current.value;
|
678
|
+
}
|
679
|
+
|
680
|
+
/*************************************************************/
|
681
|
+
/* DefglobalSetValue: Sets the value of the specified global */
|
682
|
+
/* variable to the value stored in the supplied UDFValue. */
|
683
|
+
/*************************************************************/
|
684
|
+
void DefglobalSetValue(
|
685
|
+
Defglobal *theDefglobal,
|
686
|
+
CLIPSValue *vPtr)
|
687
|
+
{
|
688
|
+
UDFValue temp;
|
689
|
+
GCBlock gcb;
|
690
|
+
Environment *theEnv = theDefglobal->header.env;
|
691
|
+
|
692
|
+
/*=====================================*/
|
693
|
+
/* If embedded, clear the error flags. */
|
694
|
+
/*=====================================*/
|
695
|
+
|
696
|
+
if (EvaluationData(theEnv)->CurrentExpression == NULL)
|
697
|
+
{ ResetErrorFlags(theEnv); }
|
698
|
+
|
699
|
+
GCBlockStart(theEnv,&gcb);
|
700
|
+
CLIPSToUDFValue(vPtr,&temp);
|
701
|
+
QSetDefglobalValue(theEnv,theDefglobal,&temp,false);
|
702
|
+
GCBlockEnd(theEnv,&gcb);
|
703
|
+
}
|
704
|
+
|
705
|
+
/************************/
|
706
|
+
/* DefglobalSetInteger: */
|
707
|
+
/************************/
|
708
|
+
void DefglobalSetInteger(
|
709
|
+
Defglobal *theDefglobal,
|
710
|
+
long long value)
|
711
|
+
{
|
712
|
+
CLIPSValue cv;
|
713
|
+
|
714
|
+
cv.integerValue = CreateInteger(theDefglobal->header.env,value);
|
715
|
+
|
716
|
+
DefglobalSetValue(theDefglobal,&cv);
|
717
|
+
}
|
718
|
+
|
719
|
+
/**********************/
|
720
|
+
/* DefglobalSetFloat: */
|
721
|
+
/**********************/
|
722
|
+
void DefglobalSetFloat(
|
723
|
+
Defglobal *theDefglobal,
|
724
|
+
double value)
|
725
|
+
{
|
726
|
+
CLIPSValue cv;
|
727
|
+
|
728
|
+
cv.floatValue = CreateFloat(theDefglobal->header.env,value);
|
729
|
+
|
730
|
+
DefglobalSetValue(theDefglobal,&cv);
|
731
|
+
}
|
732
|
+
|
733
|
+
/***********************/
|
734
|
+
/* DefglobalSetSymbol: */
|
735
|
+
/***********************/
|
736
|
+
void DefglobalSetSymbol(
|
737
|
+
Defglobal *theDefglobal,
|
738
|
+
const char *value)
|
739
|
+
{
|
740
|
+
CLIPSValue cv;
|
741
|
+
|
742
|
+
cv.lexemeValue = CreateSymbol(theDefglobal->header.env,value);
|
743
|
+
|
744
|
+
DefglobalSetValue(theDefglobal,&cv);
|
745
|
+
}
|
746
|
+
|
747
|
+
/***********************/
|
748
|
+
/* DefglobalSetString: */
|
749
|
+
/***********************/
|
750
|
+
void DefglobalSetString(
|
751
|
+
Defglobal *theDefglobal,
|
752
|
+
const char *value)
|
753
|
+
{
|
754
|
+
CLIPSValue cv;
|
755
|
+
|
756
|
+
cv.lexemeValue = CreateString(theDefglobal->header.env,value);
|
757
|
+
|
758
|
+
DefglobalSetValue(theDefglobal,&cv);
|
759
|
+
}
|
760
|
+
|
761
|
+
/*****************************/
|
762
|
+
/* DefglobalSetInstanceName: */
|
763
|
+
/*****************************/
|
764
|
+
void DefglobalSetInstanceName(
|
765
|
+
Defglobal *theDefglobal,
|
766
|
+
const char *value)
|
767
|
+
{
|
768
|
+
CLIPSValue cv;
|
769
|
+
|
770
|
+
cv.lexemeValue = CreateInstanceName(theDefglobal->header.env,value);
|
771
|
+
|
772
|
+
DefglobalSetValue(theDefglobal,&cv);
|
773
|
+
}
|
774
|
+
|
775
|
+
/*****************************/
|
776
|
+
/* DefglobalSetCLIPSInteger: */
|
777
|
+
/*****************************/
|
778
|
+
void DefglobalSetCLIPSInteger(
|
779
|
+
Defglobal *theDefglobal,
|
780
|
+
CLIPSInteger *value)
|
781
|
+
{
|
782
|
+
CLIPSValue cv;
|
783
|
+
|
784
|
+
cv.integerValue = value;
|
785
|
+
|
786
|
+
DefglobalSetValue(theDefglobal,&cv);
|
787
|
+
}
|
788
|
+
|
789
|
+
/***************************/
|
790
|
+
/* DefglobalSetCLIPSFloat: */
|
791
|
+
/***************************/
|
792
|
+
void DefglobalSetCLIPSFloat(
|
793
|
+
Defglobal *theDefglobal,
|
794
|
+
CLIPSFloat *value)
|
795
|
+
{
|
796
|
+
CLIPSValue cv;
|
797
|
+
|
798
|
+
cv.floatValue = value;
|
799
|
+
|
800
|
+
DefglobalSetValue(theDefglobal,&cv);
|
801
|
+
}
|
802
|
+
|
803
|
+
/****************************/
|
804
|
+
/* DefglobalSetCLIPSLexeme: */
|
805
|
+
/****************************/
|
806
|
+
void DefglobalSetCLIPSLexeme(
|
807
|
+
Defglobal *theDefglobal,
|
808
|
+
CLIPSLexeme *value)
|
809
|
+
{
|
810
|
+
CLIPSValue cv;
|
811
|
+
|
812
|
+
cv.lexemeValue = value;
|
813
|
+
|
814
|
+
DefglobalSetValue(theDefglobal,&cv);
|
815
|
+
}
|
816
|
+
|
817
|
+
/*********************/
|
818
|
+
/* DefglobalSetFact: */
|
819
|
+
/*********************/
|
820
|
+
void DefglobalSetFact(
|
821
|
+
Defglobal *theDefglobal,
|
822
|
+
Fact *value)
|
823
|
+
{
|
824
|
+
CLIPSValue cv;
|
825
|
+
|
826
|
+
cv.factValue = value;
|
827
|
+
|
828
|
+
DefglobalSetValue(theDefglobal,&cv);
|
829
|
+
}
|
830
|
+
|
831
|
+
/*************************/
|
832
|
+
/* DefglobalSetInstance: */
|
833
|
+
/*************************/
|
834
|
+
void DefglobalSetInstance(
|
835
|
+
Defglobal *theDefglobal,
|
836
|
+
Instance *value)
|
837
|
+
{
|
838
|
+
CLIPSValue cv;
|
839
|
+
|
840
|
+
cv.instanceValue = value;
|
841
|
+
|
842
|
+
DefglobalSetValue(theDefglobal,&cv);
|
843
|
+
}
|
844
|
+
|
845
|
+
/***************************/
|
846
|
+
/* DefglobalSetMultifield: */
|
847
|
+
/***************************/
|
848
|
+
void DefglobalSetMultifield(
|
849
|
+
Defglobal *theDefglobal,
|
850
|
+
Multifield *value)
|
851
|
+
{
|
852
|
+
CLIPSValue cv;
|
853
|
+
|
854
|
+
cv.multifieldValue = value;
|
855
|
+
|
856
|
+
DefglobalSetValue(theDefglobal,&cv);
|
857
|
+
}
|
858
|
+
|
859
|
+
/*************************************/
|
860
|
+
/* DefglobalSetCLIPSExternalAddress: */
|
861
|
+
/*************************************/
|
862
|
+
void DefglobalSetCLIPSExternalAddress(
|
863
|
+
Defglobal *theDefglobal,
|
864
|
+
CLIPSExternalAddress *value)
|
865
|
+
{
|
866
|
+
CLIPSValue cv;
|
867
|
+
|
868
|
+
cv.externalAddressValue = value;
|
869
|
+
|
870
|
+
DefglobalSetValue(theDefglobal,&cv);
|
871
|
+
}
|
872
|
+
|
873
|
+
/**********************************************************/
|
874
|
+
/* DecrementDefglobalBusyCount: Decrements the busy count */
|
875
|
+
/* of a defglobal data structure. */
|
876
|
+
/**********************************************************/
|
877
|
+
static void DecrementDefglobalBusyCount(
|
878
|
+
Environment *theEnv,
|
879
|
+
Defglobal *theGlobal)
|
880
|
+
{
|
881
|
+
if (! ConstructData(theEnv)->ClearInProgress) theGlobal->busyCount--;
|
882
|
+
}
|
883
|
+
|
884
|
+
/**********************************************************/
|
885
|
+
/* IncrementDefglobalBusyCount: Increments the busy count */
|
886
|
+
/* of a defglobal data structure. */
|
887
|
+
/**********************************************************/
|
888
|
+
static void IncrementDefglobalBusyCount(
|
889
|
+
Environment *theEnv,
|
890
|
+
Defglobal *theGlobal)
|
891
|
+
{
|
892
|
+
#if MAC_XCD
|
893
|
+
#pragma unused(theEnv)
|
894
|
+
#endif
|
895
|
+
|
896
|
+
theGlobal->busyCount++;
|
897
|
+
}
|
898
|
+
|
899
|
+
/***********************************************************************/
|
900
|
+
/* UpdateDefglobalScope: Updates the scope flag of all the defglobals. */
|
901
|
+
/***********************************************************************/
|
902
|
+
void UpdateDefglobalScope(
|
903
|
+
Environment *theEnv)
|
904
|
+
{
|
905
|
+
Defglobal *theDefglobal;
|
906
|
+
unsigned int moduleCount;
|
907
|
+
Defmodule *theModule;
|
908
|
+
struct defmoduleItemHeader *theItem;
|
909
|
+
|
910
|
+
/*============================*/
|
911
|
+
/* Loop through every module. */
|
912
|
+
/*============================*/
|
913
|
+
|
914
|
+
for (theModule = GetNextDefmodule(theEnv,NULL);
|
915
|
+
theModule != NULL;
|
916
|
+
theModule = GetNextDefmodule(theEnv,theModule))
|
917
|
+
{
|
918
|
+
/*============================================================*/
|
919
|
+
/* Loop through every defglobal in the module being examined. */
|
920
|
+
/*============================================================*/
|
921
|
+
|
922
|
+
theItem = (struct defmoduleItemHeader *)
|
923
|
+
GetModuleItem(theEnv,theModule,DefglobalData(theEnv)->DefglobalModuleIndex);
|
924
|
+
|
925
|
+
for (theDefglobal = (Defglobal *) theItem->firstItem;
|
926
|
+
theDefglobal != NULL ;
|
927
|
+
theDefglobal = GetNextDefglobal(theEnv,theDefglobal))
|
928
|
+
{
|
929
|
+
/*====================================================*/
|
930
|
+
/* If the defglobal is visible to the current module, */
|
931
|
+
/* then mark it as being in scope, otherwise mark it */
|
932
|
+
/* as being out of scope. */
|
933
|
+
/*====================================================*/
|
934
|
+
|
935
|
+
if (FindImportedConstruct(theEnv,"defglobal",theModule,
|
936
|
+
theDefglobal->header.name->contents,
|
937
|
+
&moduleCount,true,NULL) != NULL)
|
938
|
+
{ theDefglobal->inScope = true; }
|
939
|
+
else
|
940
|
+
{ theDefglobal->inScope = false; }
|
941
|
+
}
|
942
|
+
}
|
943
|
+
}
|
944
|
+
|
945
|
+
/*******************************************************/
|
946
|
+
/* GetNextDefglobalInScope: Returns the next defglobal */
|
947
|
+
/* that is scope of the current module. Works in a */
|
948
|
+
/* similar fashion to GetNextDefglobal, but skips */
|
949
|
+
/* defglobals that are out of scope. */
|
950
|
+
/*******************************************************/
|
951
|
+
Defglobal *GetNextDefglobalInScope(
|
952
|
+
Environment *theEnv,
|
953
|
+
Defglobal *theGlobal)
|
954
|
+
{
|
955
|
+
struct defmoduleItemHeader *theItem;
|
956
|
+
|
957
|
+
/*=======================================*/
|
958
|
+
/* If we're beginning the search for the */
|
959
|
+
/* first defglobal in scope, then ... */
|
960
|
+
/*=======================================*/
|
961
|
+
|
962
|
+
if (theGlobal == NULL)
|
963
|
+
{
|
964
|
+
/*==============================================*/
|
965
|
+
/* If the current module has been changed since */
|
966
|
+
/* the last time the scopes were computed, then */
|
967
|
+
/* recompute the scopes. */
|
968
|
+
/*==============================================*/
|
969
|
+
|
970
|
+
if (DefglobalData(theEnv)->LastModuleIndex != DefmoduleData(theEnv)->ModuleChangeIndex)
|
971
|
+
{
|
972
|
+
UpdateDefglobalScope(theEnv);
|
973
|
+
DefglobalData(theEnv)->LastModuleIndex = DefmoduleData(theEnv)->ModuleChangeIndex;
|
974
|
+
}
|
975
|
+
|
976
|
+
/*==========================================*/
|
977
|
+
/* Get the first module and first defglobal */
|
978
|
+
/* to start the search with. */
|
979
|
+
/*==========================================*/
|
980
|
+
|
981
|
+
DefglobalData(theEnv)->TheDefmodule = GetNextDefmodule(theEnv,NULL);
|
982
|
+
theItem = (struct defmoduleItemHeader *)
|
983
|
+
GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
|
984
|
+
theGlobal = (Defglobal *) theItem->firstItem;
|
985
|
+
}
|
986
|
+
|
987
|
+
/*==================================================*/
|
988
|
+
/* Otherwise, see if the last defglobal returned by */
|
989
|
+
/* this function has a defglobal following it. */
|
990
|
+
/*==================================================*/
|
991
|
+
|
992
|
+
else
|
993
|
+
{ theGlobal = GetNextDefglobal(theEnv,theGlobal); }
|
994
|
+
|
995
|
+
/*======================================*/
|
996
|
+
/* Continue looping through the modules */
|
997
|
+
/* until a defglobal in scope is found. */
|
998
|
+
/*======================================*/
|
999
|
+
|
1000
|
+
while (DefglobalData(theEnv)->TheDefmodule != NULL)
|
1001
|
+
{
|
1002
|
+
/*=====================================================*/
|
1003
|
+
/* Loop through the defglobals in the module currently */
|
1004
|
+
/* being examined to see if one is in scope. */
|
1005
|
+
/*=====================================================*/
|
1006
|
+
|
1007
|
+
for (;
|
1008
|
+
theGlobal != NULL;
|
1009
|
+
theGlobal = GetNextDefglobal(theEnv,theGlobal))
|
1010
|
+
{ if (theGlobal->inScope) return theGlobal; }
|
1011
|
+
|
1012
|
+
/*================================================*/
|
1013
|
+
/* If a global in scope couldn't be found in this */
|
1014
|
+
/* module, then move on to the next module. */
|
1015
|
+
/*================================================*/
|
1016
|
+
|
1017
|
+
DefglobalData(theEnv)->TheDefmodule = GetNextDefmodule(theEnv,DefglobalData(theEnv)->TheDefmodule);
|
1018
|
+
theItem = (struct defmoduleItemHeader *)
|
1019
|
+
GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
|
1020
|
+
theGlobal = (Defglobal *) theItem->firstItem;
|
1021
|
+
}
|
1022
|
+
|
1023
|
+
/*====================================*/
|
1024
|
+
/* All the globals in scope have been */
|
1025
|
+
/* traversed and there are none left. */
|
1026
|
+
/*====================================*/
|
1027
|
+
|
1028
|
+
return NULL;
|
1029
|
+
}
|
1030
|
+
|
1031
|
+
#if RUN_TIME
|
1032
|
+
|
1033
|
+
/************************************************/
|
1034
|
+
/* RuntimeDefglobalAction: Action to be applied */
|
1035
|
+
/* to each defglobal construct when a runtime */
|
1036
|
+
/* initialization occurs. */
|
1037
|
+
/************************************************/
|
1038
|
+
static void RuntimeDefglobalAction(
|
1039
|
+
Environment *theEnv,
|
1040
|
+
ConstructHeader *theConstruct,
|
1041
|
+
void *buffer)
|
1042
|
+
{
|
1043
|
+
#if MAC_XCD
|
1044
|
+
#pragma unused(buffer)
|
1045
|
+
#endif
|
1046
|
+
Defglobal *theDefglobal = (Defglobal *) theConstruct;
|
1047
|
+
|
1048
|
+
theDefglobal->header.env = theEnv;
|
1049
|
+
theDefglobal->current.value = VoidConstant(theEnv);
|
1050
|
+
}
|
1051
|
+
|
1052
|
+
/*******************************/
|
1053
|
+
/* DefglobalRunTimeInitialize: */
|
1054
|
+
/*******************************/
|
1055
|
+
void DefglobalRunTimeInitialize(
|
1056
|
+
Environment *theEnv)
|
1057
|
+
{
|
1058
|
+
DoForAllConstructs(theEnv,RuntimeDefglobalAction,DefglobalData(theEnv)->DefglobalModuleIndex,true,NULL);
|
1059
|
+
}
|
1060
|
+
|
1061
|
+
#endif
|
1062
|
+
|
1063
|
+
/*##################################*/
|
1064
|
+
/* Additional Environment Functions */
|
1065
|
+
/*##################################*/
|
1066
|
+
|
1067
|
+
const char *DefglobalModule(
|
1068
|
+
Defglobal *theDefglobal)
|
1069
|
+
{
|
1070
|
+
return GetConstructModuleName(&theDefglobal->header);
|
1071
|
+
}
|
1072
|
+
|
1073
|
+
const char *DefglobalName(
|
1074
|
+
Defglobal *theDefglobal)
|
1075
|
+
{
|
1076
|
+
return GetConstructNameString(&theDefglobal->header);
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
const char *DefglobalPPForm(
|
1080
|
+
Defglobal *theDefglobal)
|
1081
|
+
{
|
1082
|
+
return GetConstructPPForm(&theDefglobal->header);
|
1083
|
+
}
|
1084
|
+
|
1085
|
+
#endif /* DEFGLOBAL_CONSTRUCT */
|
1086
|
+
|
1087
|
+
|