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,151 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 11/13/17 */
|
5
|
+
/* */
|
6
|
+
/* DEFGLOBAL HEADER FILE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Gary D. Riley */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* Brian L. Dantes */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
21
|
+
/* */
|
22
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
23
|
+
/* */
|
24
|
+
/* Corrected code to remove run-time program */
|
25
|
+
/* compiler warning. */
|
26
|
+
/* */
|
27
|
+
/* 6.30: Removed conditional code for unsupported */
|
28
|
+
/* compilers/operating systems (IBM_MCW, */
|
29
|
+
/* MAC_MCW, and IBM_TBC). */
|
30
|
+
/* */
|
31
|
+
/* Changed garbage collection algorithm. */
|
32
|
+
/* */
|
33
|
+
/* Added const qualifiers to remove C++ */
|
34
|
+
/* deprecation warnings. */
|
35
|
+
/* */
|
36
|
+
/* Converted API macros to function calls. */
|
37
|
+
/* */
|
38
|
+
/* Fixed linkage issue when BLOAD_ONLY compiler */
|
39
|
+
/* flag is set to 1. */
|
40
|
+
/* */
|
41
|
+
/* Changed find construct functionality so that */
|
42
|
+
/* imported modules are search when locating a */
|
43
|
+
/* named construct. */
|
44
|
+
/* */
|
45
|
+
/* 6.40: Removed LOCALE definition. */
|
46
|
+
/* */
|
47
|
+
/* Pragma once and other inclusion changes. */
|
48
|
+
/* */
|
49
|
+
/* Added support for booleans with <stdbool.h>. */
|
50
|
+
/* */
|
51
|
+
/* Removed use of void pointers for specific */
|
52
|
+
/* data structures. */
|
53
|
+
/* */
|
54
|
+
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
|
55
|
+
/* */
|
56
|
+
/* UDF redesign. */
|
57
|
+
/* */
|
58
|
+
/*************************************************************/
|
59
|
+
|
60
|
+
#ifndef _H_globldef
|
61
|
+
|
62
|
+
#pragma once
|
63
|
+
|
64
|
+
#define _H_globldef
|
65
|
+
|
66
|
+
typedef struct defglobal Defglobal;
|
67
|
+
|
68
|
+
#include "conscomp.h"
|
69
|
+
#include "constrct.h"
|
70
|
+
#include "cstrccom.h"
|
71
|
+
#include "evaluatn.h"
|
72
|
+
#include "expressn.h"
|
73
|
+
#include "moduldef.h"
|
74
|
+
#include "symbol.h"
|
75
|
+
|
76
|
+
#define DEFGLOBAL_DATA 1
|
77
|
+
|
78
|
+
struct defglobalData
|
79
|
+
{
|
80
|
+
Construct *DefglobalConstruct;
|
81
|
+
unsigned DefglobalModuleIndex;
|
82
|
+
bool ChangeToGlobals;
|
83
|
+
#if DEBUGGING_FUNCTIONS
|
84
|
+
bool WatchGlobals;
|
85
|
+
#endif
|
86
|
+
bool ResetGlobals;
|
87
|
+
struct entityRecord GlobalInfo;
|
88
|
+
struct entityRecord DefglobalPtrRecord;
|
89
|
+
long LastModuleIndex;
|
90
|
+
Defmodule *TheDefmodule;
|
91
|
+
#if CONSTRUCT_COMPILER && (! RUN_TIME)
|
92
|
+
struct CodeGeneratorItem *DefglobalCodeItem;
|
93
|
+
#endif
|
94
|
+
};
|
95
|
+
|
96
|
+
struct defglobal
|
97
|
+
{
|
98
|
+
ConstructHeader header;
|
99
|
+
unsigned int watch : 1;
|
100
|
+
unsigned int inScope : 1;
|
101
|
+
long busyCount;
|
102
|
+
CLIPSValue current;
|
103
|
+
struct expr *initial;
|
104
|
+
};
|
105
|
+
|
106
|
+
struct defglobalModule
|
107
|
+
{
|
108
|
+
struct defmoduleItemHeader header;
|
109
|
+
};
|
110
|
+
|
111
|
+
#define DefglobalData(theEnv) ((struct defglobalData *) GetEnvironmentData(theEnv,DEFGLOBAL_DATA))
|
112
|
+
|
113
|
+
void InitializeDefglobals(Environment *);
|
114
|
+
Defglobal *FindDefglobal(Environment *,const char *);
|
115
|
+
Defglobal *FindDefglobalInModule(Environment *,const char *);
|
116
|
+
Defglobal *GetNextDefglobal(Environment *,Defglobal *);
|
117
|
+
void CreateInitialFactDefglobal(void);
|
118
|
+
bool DefglobalIsDeletable(Defglobal *);
|
119
|
+
struct defglobalModule *GetDefglobalModuleItem(Environment *,Defmodule *);
|
120
|
+
void QSetDefglobalValue(Environment *,Defglobal *,UDFValue *,bool);
|
121
|
+
Defglobal *QFindDefglobal(Environment *,CLIPSLexeme *);
|
122
|
+
void DefglobalValueForm(Defglobal *,StringBuilder *);
|
123
|
+
bool GetGlobalsChanged(Environment *);
|
124
|
+
void SetGlobalsChanged(Environment *,bool);
|
125
|
+
void DefglobalGetValue(Defglobal *,CLIPSValue *);
|
126
|
+
void DefglobalSetValue(Defglobal *,CLIPSValue *);
|
127
|
+
void DefglobalSetInteger(Defglobal *,long long);
|
128
|
+
void DefglobalSetFloat(Defglobal *,double);
|
129
|
+
void DefglobalSetSymbol(Defglobal *,const char *);
|
130
|
+
void DefglobalSetString(Defglobal *,const char *);
|
131
|
+
void DefglobalSetInstanceName(Defglobal *,const char *);
|
132
|
+
void DefglobalSetCLIPSInteger(Defglobal *,CLIPSInteger *);
|
133
|
+
void DefglobalSetCLIPSFloat(Defglobal *,CLIPSFloat *);
|
134
|
+
void DefglobalSetCLIPSLexeme(Defglobal *,CLIPSLexeme *);
|
135
|
+
void DefglobalSetFact(Defglobal *,Fact *);
|
136
|
+
void DefglobalSetInstance(Defglobal *,Instance *);
|
137
|
+
void DefglobalSetMultifield(Defglobal *,Multifield *);
|
138
|
+
void DefglobalSetCLIPSExternalAddress(Defglobal *,CLIPSExternalAddress *);
|
139
|
+
void UpdateDefglobalScope(Environment *);
|
140
|
+
Defglobal *GetNextDefglobalInScope(Environment *,Defglobal *);
|
141
|
+
bool QGetDefglobalUDFValue(Environment *,Defglobal *,UDFValue *);
|
142
|
+
const char *DefglobalModule(Defglobal *);
|
143
|
+
const char *DefglobalName(Defglobal *);
|
144
|
+
const char *DefglobalPPForm(Defglobal *);
|
145
|
+
#if RUN_TIME
|
146
|
+
void DefglobalRunTimeInitialize(Environment *);
|
147
|
+
#endif
|
148
|
+
|
149
|
+
#endif /* _H_globldef */
|
150
|
+
|
151
|
+
|
@@ -0,0 +1,530 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.41 04/30/21 */
|
5
|
+
/* */
|
6
|
+
/* DEFGLOBAL PARSER MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Parses the defglobal construct. */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Gary D. Riley */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* Brian L. Dantes */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
21
|
+
/* */
|
22
|
+
/* Made the construct redefinition message more */
|
23
|
+
/* prominent. */
|
24
|
+
/* */
|
25
|
+
/* 6.30: Removed conditional code for unsupported */
|
26
|
+
/* compilers/operating systems (IBM_MCW and */
|
27
|
+
/* MAC_MCW). */
|
28
|
+
/* */
|
29
|
+
/* Added const qualifiers to remove C++ */
|
30
|
+
/* deprecation warnings. */
|
31
|
+
/* */
|
32
|
+
/* Moved WatchGlobals global to defglobalData. */
|
33
|
+
/* */
|
34
|
+
/* 6.40: Added Env prefix to GetEvaluationError and */
|
35
|
+
/* SetEvaluationError functions. */
|
36
|
+
/* */
|
37
|
+
/* 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
|
+
/* UDF redesign. */
|
45
|
+
/* */
|
46
|
+
/* Eval support for run time and bload only. */
|
47
|
+
/* */
|
48
|
+
/* 6.41: Normalized multifields intially assigned to */
|
49
|
+
/* global variables so that subsequences of */
|
50
|
+
/* larger multifields are correctly assigned. */
|
51
|
+
/* */
|
52
|
+
/*************************************************************/
|
53
|
+
|
54
|
+
#include "setup.h"
|
55
|
+
|
56
|
+
#if DEFGLOBAL_CONSTRUCT
|
57
|
+
|
58
|
+
#include <string.h>
|
59
|
+
|
60
|
+
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
|
61
|
+
#include "bload.h"
|
62
|
+
#endif
|
63
|
+
#include "constrct.h"
|
64
|
+
#include "cstrcpsr.h"
|
65
|
+
#include "envrnmnt.h"
|
66
|
+
#include "evaluatn.h"
|
67
|
+
#include "exprnpsr.h"
|
68
|
+
#include "globlbsc.h"
|
69
|
+
#include "globldef.h"
|
70
|
+
#include "memalloc.h"
|
71
|
+
#include "modulpsr.h"
|
72
|
+
#include "modulutl.h"
|
73
|
+
#include "multifld.h"
|
74
|
+
#include "pprint.h"
|
75
|
+
#include "prntutil.h"
|
76
|
+
#include "router.h"
|
77
|
+
#include "scanner.h"
|
78
|
+
#include "watch.h"
|
79
|
+
|
80
|
+
#include "globlpsr.h"
|
81
|
+
|
82
|
+
/***************************************/
|
83
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
84
|
+
/***************************************/
|
85
|
+
|
86
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
87
|
+
static bool GetVariableDefinition(Environment *,const char *,bool *,bool,struct token *);
|
88
|
+
static void AddDefglobal(Environment *,CLIPSLexeme *,UDFValue *,struct expr *);
|
89
|
+
#endif
|
90
|
+
|
91
|
+
/*********************************************************************/
|
92
|
+
/* ParseDefglobal: Coordinates all actions necessary for the parsing */
|
93
|
+
/* and creation of a defglobal into the current environment. */
|
94
|
+
/*********************************************************************/
|
95
|
+
bool ParseDefglobal(
|
96
|
+
Environment *theEnv,
|
97
|
+
const char *readSource)
|
98
|
+
{
|
99
|
+
bool defglobalError = false;
|
100
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
101
|
+
|
102
|
+
struct token theToken;
|
103
|
+
bool tokenRead = true;
|
104
|
+
Defmodule *theModule;
|
105
|
+
|
106
|
+
/*=====================================*/
|
107
|
+
/* Pretty print buffer initialization. */
|
108
|
+
/*=====================================*/
|
109
|
+
|
110
|
+
SetPPBufferStatus(theEnv,true);
|
111
|
+
FlushPPBuffer(theEnv);
|
112
|
+
SetIndentDepth(theEnv,3);
|
113
|
+
SavePPBuffer(theEnv,"(defglobal ");
|
114
|
+
|
115
|
+
/*=================================================*/
|
116
|
+
/* Individual defglobal constructs can't be parsed */
|
117
|
+
/* while a binary load is in effect. */
|
118
|
+
/*=================================================*/
|
119
|
+
|
120
|
+
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
|
121
|
+
if ((Bloaded(theEnv) == true) && (! ConstructData(theEnv)->CheckSyntaxMode))
|
122
|
+
{
|
123
|
+
CannotLoadWithBloadMessage(theEnv,"defglobal");
|
124
|
+
return true;
|
125
|
+
}
|
126
|
+
#endif
|
127
|
+
|
128
|
+
/*===========================*/
|
129
|
+
/* Look for the module name. */
|
130
|
+
/*===========================*/
|
131
|
+
|
132
|
+
GetToken(theEnv,readSource,&theToken);
|
133
|
+
if (theToken.tknType == SYMBOL_TOKEN)
|
134
|
+
{
|
135
|
+
/*=================================================*/
|
136
|
+
/* The optional module name can't contain a module */
|
137
|
+
/* separator like other constructs. For example, */
|
138
|
+
/* (defrule X::foo is OK for rules, but the right */
|
139
|
+
/* syntax for defglobals is (defglobal X ?*foo*. */
|
140
|
+
/*=================================================*/
|
141
|
+
|
142
|
+
tokenRead = false;
|
143
|
+
if (FindModuleSeparator(theToken.lexemeValue->contents))
|
144
|
+
{
|
145
|
+
SyntaxErrorMessage(theEnv,"defglobal");
|
146
|
+
return true;
|
147
|
+
}
|
148
|
+
|
149
|
+
/*=================================*/
|
150
|
+
/* Determine if the module exists. */
|
151
|
+
/*=================================*/
|
152
|
+
|
153
|
+
theModule = FindDefmodule(theEnv,theToken.lexemeValue->contents);
|
154
|
+
if (theModule == NULL)
|
155
|
+
{
|
156
|
+
CantFindItemErrorMessage(theEnv,"defmodule",theToken.lexemeValue->contents,true);
|
157
|
+
return true;
|
158
|
+
}
|
159
|
+
|
160
|
+
/*=========================================*/
|
161
|
+
/* If the module name was OK, then set the */
|
162
|
+
/* current module to the specified module. */
|
163
|
+
/*=========================================*/
|
164
|
+
|
165
|
+
SavePPBuffer(theEnv," ");
|
166
|
+
SetCurrentModule(theEnv,theModule);
|
167
|
+
}
|
168
|
+
|
169
|
+
/*===========================================*/
|
170
|
+
/* If the module name wasn't specified, then */
|
171
|
+
/* use the current module's name in the */
|
172
|
+
/* defglobal's pretty print representation. */
|
173
|
+
/*===========================================*/
|
174
|
+
|
175
|
+
else
|
176
|
+
{
|
177
|
+
PPBackup(theEnv);
|
178
|
+
SavePPBuffer(theEnv,DefmoduleName(GetCurrentModule(theEnv)));
|
179
|
+
SavePPBuffer(theEnv," ");
|
180
|
+
SavePPBuffer(theEnv,theToken.printForm);
|
181
|
+
}
|
182
|
+
|
183
|
+
/*======================*/
|
184
|
+
/* Parse the variables. */
|
185
|
+
/*======================*/
|
186
|
+
|
187
|
+
while (GetVariableDefinition(theEnv,readSource,&defglobalError,tokenRead,&theToken))
|
188
|
+
{
|
189
|
+
tokenRead = false;
|
190
|
+
|
191
|
+
FlushPPBuffer(theEnv);
|
192
|
+
SavePPBuffer(theEnv,"(defglobal ");
|
193
|
+
SavePPBuffer(theEnv,DefmoduleName(GetCurrentModule(theEnv)));
|
194
|
+
SavePPBuffer(theEnv," ");
|
195
|
+
}
|
196
|
+
|
197
|
+
#endif
|
198
|
+
|
199
|
+
/*==================================*/
|
200
|
+
/* Return the parsing error status. */
|
201
|
+
/*==================================*/
|
202
|
+
|
203
|
+
return(defglobalError);
|
204
|
+
}
|
205
|
+
|
206
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
207
|
+
|
208
|
+
/***************************************************************/
|
209
|
+
/* GetVariableDefinition: Parses and evaluates a single global */
|
210
|
+
/* variable in a defglobal construct. Returns true if the */
|
211
|
+
/* variable was successfully parsed and false if a right */
|
212
|
+
/* parenthesis is encountered (signifying the end of the */
|
213
|
+
/* defglobal construct) or an error occurs. The error status */
|
214
|
+
/* flag is also set if an error occurs. */
|
215
|
+
/***************************************************************/
|
216
|
+
static bool GetVariableDefinition(
|
217
|
+
Environment *theEnv,
|
218
|
+
const char *readSource,
|
219
|
+
bool *defglobalError,
|
220
|
+
bool tokenRead,
|
221
|
+
struct token *theToken)
|
222
|
+
{
|
223
|
+
CLIPSLexeme *variableName;
|
224
|
+
struct expr *assignPtr;
|
225
|
+
UDFValue assignValue;
|
226
|
+
|
227
|
+
/*========================================*/
|
228
|
+
/* Get next token, which should either be */
|
229
|
+
/* a closing parenthesis or a variable. */
|
230
|
+
/*========================================*/
|
231
|
+
|
232
|
+
if (! tokenRead) GetToken(theEnv,readSource,theToken);
|
233
|
+
if (theToken->tknType == RIGHT_PARENTHESIS_TOKEN) return false;
|
234
|
+
|
235
|
+
if (theToken->tknType == SF_VARIABLE_TOKEN)
|
236
|
+
{
|
237
|
+
SyntaxErrorMessage(theEnv,"defglobal");
|
238
|
+
*defglobalError = true;
|
239
|
+
return false;
|
240
|
+
}
|
241
|
+
else if (theToken->tknType != GBL_VARIABLE_TOKEN)
|
242
|
+
{
|
243
|
+
SyntaxErrorMessage(theEnv,"defglobal");
|
244
|
+
*defglobalError = true;
|
245
|
+
return false;
|
246
|
+
}
|
247
|
+
|
248
|
+
variableName = theToken->lexemeValue;
|
249
|
+
|
250
|
+
SavePPBuffer(theEnv," ");
|
251
|
+
|
252
|
+
/*================================*/
|
253
|
+
/* Print out compilation message. */
|
254
|
+
/*================================*/
|
255
|
+
|
256
|
+
#if DEBUGGING_FUNCTIONS
|
257
|
+
if ((GetWatchItem(theEnv,"compilations") == 1) && GetPrintWhileLoading(theEnv))
|
258
|
+
{
|
259
|
+
const char *outRouter = STDOUT;
|
260
|
+
if (QFindDefglobal(theEnv,variableName) != NULL)
|
261
|
+
{
|
262
|
+
outRouter = STDWRN;
|
263
|
+
PrintWarningID(theEnv,"CSTRCPSR",1,true);
|
264
|
+
WriteString(theEnv,outRouter,"Redefining defglobal: ");
|
265
|
+
}
|
266
|
+
else WriteString(theEnv,outRouter,"Defining defglobal: ");
|
267
|
+
WriteString(theEnv,outRouter,variableName->contents);
|
268
|
+
WriteString(theEnv,outRouter,"\n");
|
269
|
+
}
|
270
|
+
else
|
271
|
+
#endif
|
272
|
+
{ if (GetPrintWhileLoading(theEnv)) WriteString(theEnv,STDOUT,":"); }
|
273
|
+
|
274
|
+
/*==================================================================*/
|
275
|
+
/* Check for import/export conflicts from the construct definition. */
|
276
|
+
/*==================================================================*/
|
277
|
+
|
278
|
+
#if DEFMODULE_CONSTRUCT
|
279
|
+
if (FindImportExportConflict(theEnv,"defglobal",GetCurrentModule(theEnv),variableName->contents))
|
280
|
+
{
|
281
|
+
ImportExportConflictMessage(theEnv,"defglobal",variableName->contents,NULL,NULL);
|
282
|
+
*defglobalError = true;
|
283
|
+
return false;
|
284
|
+
}
|
285
|
+
#endif
|
286
|
+
|
287
|
+
/*==============================*/
|
288
|
+
/* The next token must be an =. */
|
289
|
+
/*==============================*/
|
290
|
+
|
291
|
+
GetToken(theEnv,readSource,theToken);
|
292
|
+
if (strcmp(theToken->printForm,"=") != 0)
|
293
|
+
{
|
294
|
+
SyntaxErrorMessage(theEnv,"defglobal");
|
295
|
+
*defglobalError = true;
|
296
|
+
return false;
|
297
|
+
}
|
298
|
+
|
299
|
+
SavePPBuffer(theEnv," ");
|
300
|
+
|
301
|
+
/*======================================================*/
|
302
|
+
/* Parse the expression to be assigned to the variable. */
|
303
|
+
/*======================================================*/
|
304
|
+
|
305
|
+
assignPtr = ParseAtomOrExpression(theEnv,readSource,NULL);
|
306
|
+
if (assignPtr == NULL)
|
307
|
+
{
|
308
|
+
*defglobalError = true;
|
309
|
+
return false;
|
310
|
+
}
|
311
|
+
|
312
|
+
/*==========================*/
|
313
|
+
/* Evaluate the expression. */
|
314
|
+
/*==========================*/
|
315
|
+
|
316
|
+
if (! ConstructData(theEnv)->CheckSyntaxMode)
|
317
|
+
{
|
318
|
+
SetEvaluationError(theEnv,false);
|
319
|
+
if (EvaluateExpression(theEnv,assignPtr,&assignValue))
|
320
|
+
{
|
321
|
+
ReturnExpression(theEnv,assignPtr);
|
322
|
+
*defglobalError = true;
|
323
|
+
return false;
|
324
|
+
}
|
325
|
+
}
|
326
|
+
else
|
327
|
+
{ ReturnExpression(theEnv,assignPtr); }
|
328
|
+
|
329
|
+
SavePPBuffer(theEnv,")");
|
330
|
+
|
331
|
+
/*======================================*/
|
332
|
+
/* Add the variable to the global list. */
|
333
|
+
/*======================================*/
|
334
|
+
|
335
|
+
if (! ConstructData(theEnv)->CheckSyntaxMode)
|
336
|
+
{ AddDefglobal(theEnv,variableName,&assignValue,assignPtr); }
|
337
|
+
|
338
|
+
/*==================================================*/
|
339
|
+
/* Return true to indicate that the global variable */
|
340
|
+
/* definition was successfully parsed. */
|
341
|
+
/*==================================================*/
|
342
|
+
|
343
|
+
return true;
|
344
|
+
}
|
345
|
+
|
346
|
+
/*********************************************************/
|
347
|
+
/* AddDefglobal: Adds a defglobal to the current module. */
|
348
|
+
/*********************************************************/
|
349
|
+
static void AddDefglobal(
|
350
|
+
Environment *theEnv,
|
351
|
+
CLIPSLexeme *name,
|
352
|
+
UDFValue *vPtr,
|
353
|
+
struct expr *ePtr)
|
354
|
+
{
|
355
|
+
Defglobal *defglobalPtr;
|
356
|
+
bool newGlobal = false;
|
357
|
+
#if DEBUGGING_FUNCTIONS
|
358
|
+
bool globalHadWatch = false;
|
359
|
+
#endif
|
360
|
+
|
361
|
+
/*========================================================*/
|
362
|
+
/* If the defglobal is already defined, then use the old */
|
363
|
+
/* data structure and substitute new values. If it hasn't */
|
364
|
+
/* been defined, then create a new data structure. */
|
365
|
+
/*========================================================*/
|
366
|
+
|
367
|
+
defglobalPtr = QFindDefglobal(theEnv,name);
|
368
|
+
if (defglobalPtr == NULL)
|
369
|
+
{
|
370
|
+
newGlobal = true;
|
371
|
+
defglobalPtr = get_struct(theEnv,defglobal);
|
372
|
+
}
|
373
|
+
else
|
374
|
+
{
|
375
|
+
DeinstallConstructHeader(theEnv,&defglobalPtr->header);
|
376
|
+
#if DEBUGGING_FUNCTIONS
|
377
|
+
globalHadWatch = defglobalPtr->watch;
|
378
|
+
#endif
|
379
|
+
}
|
380
|
+
|
381
|
+
/*===========================================*/
|
382
|
+
/* Remove the old values from the defglobal. */
|
383
|
+
/*===========================================*/
|
384
|
+
|
385
|
+
if (newGlobal == false)
|
386
|
+
{
|
387
|
+
Release(theEnv,defglobalPtr->current.header);
|
388
|
+
if (defglobalPtr->current.header->type == MULTIFIELD_TYPE)
|
389
|
+
{ ReturnMultifield(theEnv,defglobalPtr->current.multifieldValue); }
|
390
|
+
|
391
|
+
RemoveHashedExpression(theEnv,defglobalPtr->initial);
|
392
|
+
}
|
393
|
+
|
394
|
+
/*=======================================*/
|
395
|
+
/* Copy the new values to the defglobal. */
|
396
|
+
/*=======================================*/
|
397
|
+
|
398
|
+
NormalizeMultifield(theEnv,vPtr);
|
399
|
+
if (vPtr->header->type != MULTIFIELD_TYPE)
|
400
|
+
{ defglobalPtr->current.value = vPtr->value; }
|
401
|
+
else
|
402
|
+
{ defglobalPtr->current.value = CopyMultifield(theEnv,vPtr->multifieldValue); }
|
403
|
+
Retain(theEnv,defglobalPtr->current.header);
|
404
|
+
|
405
|
+
defglobalPtr->initial = AddHashedExpression(theEnv,ePtr);
|
406
|
+
ReturnExpression(theEnv,ePtr);
|
407
|
+
DefglobalData(theEnv)->ChangeToGlobals = true;
|
408
|
+
|
409
|
+
/*=================================*/
|
410
|
+
/* Restore the old watch value to */
|
411
|
+
/* the defglobal if redefined. */
|
412
|
+
/*=================================*/
|
413
|
+
|
414
|
+
#if DEBUGGING_FUNCTIONS
|
415
|
+
defglobalPtr->watch = globalHadWatch ? true : DefglobalData(theEnv)->WatchGlobals;
|
416
|
+
#endif
|
417
|
+
|
418
|
+
/*======================================*/
|
419
|
+
/* Save the name and pretty print form. */
|
420
|
+
/*======================================*/
|
421
|
+
|
422
|
+
defglobalPtr->header.name = name;
|
423
|
+
defglobalPtr->header.usrData = NULL;
|
424
|
+
defglobalPtr->header.constructType = DEFGLOBAL;
|
425
|
+
defglobalPtr->header.env = theEnv;
|
426
|
+
IncrementLexemeCount(name);
|
427
|
+
|
428
|
+
SavePPBuffer(theEnv,"\n");
|
429
|
+
if (GetConserveMemory(theEnv) == true)
|
430
|
+
{ defglobalPtr->header.ppForm = NULL; }
|
431
|
+
else
|
432
|
+
{ defglobalPtr->header.ppForm = CopyPPBuffer(theEnv); }
|
433
|
+
|
434
|
+
defglobalPtr->inScope = true;
|
435
|
+
|
436
|
+
/*=============================================*/
|
437
|
+
/* If the defglobal was redefined, we're done. */
|
438
|
+
/*=============================================*/
|
439
|
+
|
440
|
+
if (newGlobal == false) return;
|
441
|
+
|
442
|
+
/*===================================*/
|
443
|
+
/* Copy the defglobal variable name. */
|
444
|
+
/*===================================*/
|
445
|
+
|
446
|
+
defglobalPtr->busyCount = 0;
|
447
|
+
defglobalPtr->header.whichModule = (struct defmoduleItemHeader *)
|
448
|
+
GetModuleItem(theEnv,NULL,FindModuleItem(theEnv,"defglobal")->moduleIndex);
|
449
|
+
|
450
|
+
/*=============================================*/
|
451
|
+
/* Add the defglobal to the list of defglobals */
|
452
|
+
/* for the current module. */
|
453
|
+
/*=============================================*/
|
454
|
+
|
455
|
+
AddConstructToModule(&defglobalPtr->header);
|
456
|
+
}
|
457
|
+
|
458
|
+
/*****************************************************************/
|
459
|
+
/* ReplaceGlobalVariable: Replaces a global variable found in an */
|
460
|
+
/* expression with the appropriate primitive data type which */
|
461
|
+
/* can later be used to retrieve the global variable's value. */
|
462
|
+
/*****************************************************************/
|
463
|
+
bool ReplaceGlobalVariable(
|
464
|
+
Environment *theEnv,
|
465
|
+
struct expr *ePtr)
|
466
|
+
{
|
467
|
+
Defglobal *theGlobal;
|
468
|
+
unsigned int count;
|
469
|
+
|
470
|
+
/*=================================*/
|
471
|
+
/* Search for the global variable. */
|
472
|
+
/*=================================*/
|
473
|
+
|
474
|
+
theGlobal = (Defglobal *)
|
475
|
+
FindImportedConstruct(theEnv,"defglobal",NULL,ePtr->lexemeValue->contents,
|
476
|
+
&count,true,NULL);
|
477
|
+
|
478
|
+
/*=============================================*/
|
479
|
+
/* If it wasn't found, print an error message. */
|
480
|
+
/*=============================================*/
|
481
|
+
|
482
|
+
if (theGlobal == NULL)
|
483
|
+
{
|
484
|
+
GlobalReferenceErrorMessage(theEnv,ePtr->lexemeValue->contents);
|
485
|
+
return false;
|
486
|
+
}
|
487
|
+
|
488
|
+
/*========================================================*/
|
489
|
+
/* The current implementation of the defmodules shouldn't */
|
490
|
+
/* allow a construct to be defined which would cause an */
|
491
|
+
/* ambiguous reference, but we'll check for it anyway. */
|
492
|
+
/*========================================================*/
|
493
|
+
|
494
|
+
if (count > 1)
|
495
|
+
{
|
496
|
+
AmbiguousReferenceErrorMessage(theEnv,"defglobal",ePtr->lexemeValue->contents);
|
497
|
+
return false;
|
498
|
+
}
|
499
|
+
|
500
|
+
/*==============================================*/
|
501
|
+
/* Replace the symbolic reference of the global */
|
502
|
+
/* variable with a direct pointer reference. */
|
503
|
+
/*==============================================*/
|
504
|
+
|
505
|
+
ePtr->type = DEFGLOBAL_PTR;
|
506
|
+
ePtr->value = theGlobal;
|
507
|
+
|
508
|
+
return true;
|
509
|
+
}
|
510
|
+
|
511
|
+
#endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
|
512
|
+
|
513
|
+
/*****************************************************************/
|
514
|
+
/* GlobalReferenceErrorMessage: Prints an error message when a */
|
515
|
+
/* symbolic reference to a global variable cannot be resolved. */
|
516
|
+
/*****************************************************************/
|
517
|
+
void GlobalReferenceErrorMessage(
|
518
|
+
Environment *theEnv,
|
519
|
+
const char *variableName)
|
520
|
+
{
|
521
|
+
PrintErrorID(theEnv,"GLOBLPSR",1,true);
|
522
|
+
WriteString(theEnv,STDERR,"\nGlobal variable ?*");
|
523
|
+
WriteString(theEnv,STDERR,variableName);
|
524
|
+
WriteString(theEnv,STDERR,"* was referenced, but is not defined.\n");
|
525
|
+
}
|
526
|
+
|
527
|
+
#endif /* DEFGLOBAL_CONSTRUCT */
|
528
|
+
|
529
|
+
|
530
|
+
|