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,698 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 04/04/19 */
|
5
|
+
/* */
|
6
|
+
/* MESSAGE-HANDLER PARSER FUNCTIONS */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* */
|
17
|
+
/* Revision History: */
|
18
|
+
/* */
|
19
|
+
/* 6.23: Changed name of variable exp to theExp */
|
20
|
+
/* because of Unix compiler warnings of shadowed */
|
21
|
+
/* definitions. */
|
22
|
+
/* */
|
23
|
+
/* 6.24: Removed IMPERATIVE_MESSAGE_HANDLERS */
|
24
|
+
/* compilation flag. */
|
25
|
+
/* */
|
26
|
+
/* 6.30: Renamed BOOLEAN macro type to intBool. */
|
27
|
+
/* */
|
28
|
+
/* GetConstructNameAndComment API change. */
|
29
|
+
/* */
|
30
|
+
/* Changed integer type/precision. */
|
31
|
+
/* */
|
32
|
+
/* Used gensprintf instead of sprintf. */
|
33
|
+
/* */
|
34
|
+
/* Added const qualifiers to remove C++ */
|
35
|
+
/* deprecation warnings. */
|
36
|
+
/* */
|
37
|
+
/* Fixed linkage issue when BLOAD_AND_SAVE */
|
38
|
+
/* compiler flag is set to 0. */
|
39
|
+
/* */
|
40
|
+
/* 6.31: Compiler warning fix. */
|
41
|
+
/* */
|
42
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
43
|
+
/* */
|
44
|
+
/* Added support for booleans with <stdbool.h>. */
|
45
|
+
/* */
|
46
|
+
/* Removed use of void pointers for specific */
|
47
|
+
/* data structures. */
|
48
|
+
/* */
|
49
|
+
/* Static constraint checking is always enabled. */
|
50
|
+
/* */
|
51
|
+
/*************************************************************/
|
52
|
+
|
53
|
+
/* =========================================
|
54
|
+
*****************************************
|
55
|
+
EXTERNAL DEFINITIONS
|
56
|
+
=========================================
|
57
|
+
***************************************** */
|
58
|
+
#include "setup.h"
|
59
|
+
|
60
|
+
#if OBJECT_SYSTEM && (! BLOAD_ONLY) && (! RUN_TIME)
|
61
|
+
|
62
|
+
#include <string.h>
|
63
|
+
|
64
|
+
#if BLOAD || BLOAD_AND_BSAVE
|
65
|
+
#include "bload.h"
|
66
|
+
#endif
|
67
|
+
|
68
|
+
#include "classcom.h"
|
69
|
+
#include "classfun.h"
|
70
|
+
#include "constrct.h"
|
71
|
+
#include "cstrcpsr.h"
|
72
|
+
#include "cstrnchk.h"
|
73
|
+
#include "envrnmnt.h"
|
74
|
+
#include "exprnpsr.h"
|
75
|
+
#include "insfun.h"
|
76
|
+
#include "memalloc.h"
|
77
|
+
#include "modulutl.h"
|
78
|
+
#include "msgcom.h"
|
79
|
+
#include "msgfun.h"
|
80
|
+
#include "pprint.h"
|
81
|
+
#include "prccode.h"
|
82
|
+
#include "prntutil.h"
|
83
|
+
#include "router.h"
|
84
|
+
#include "scanner.h"
|
85
|
+
#include "strngrtr.h"
|
86
|
+
#include "sysdep.h"
|
87
|
+
|
88
|
+
#include "msgpsr.h"
|
89
|
+
|
90
|
+
/* =========================================
|
91
|
+
*****************************************
|
92
|
+
CONSTANTS
|
93
|
+
=========================================
|
94
|
+
***************************************** */
|
95
|
+
#define SELF_LEN 4
|
96
|
+
#define SELF_SLOT_REF ':'
|
97
|
+
|
98
|
+
/***************************************/
|
99
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
100
|
+
/***************************************/
|
101
|
+
|
102
|
+
static bool IsParameterSlotReference(Environment *,const char *);
|
103
|
+
static int SlotReferenceVar(Environment *,Expression *,void *);
|
104
|
+
static int BindSlotReference(Environment *,Expression *,void *);
|
105
|
+
static SlotDescriptor *CheckSlotReference(Environment *,Defclass *,int,void *,bool,Expression *);
|
106
|
+
static void GenHandlerSlotReference(Environment *,Expression *,unsigned short,SlotDescriptor *);
|
107
|
+
|
108
|
+
/* =========================================
|
109
|
+
*****************************************
|
110
|
+
EXTERNALLY VISIBLE FUNCTIONS
|
111
|
+
=========================================
|
112
|
+
***************************************** */
|
113
|
+
|
114
|
+
/***********************************************************************
|
115
|
+
NAME : ParseDefmessageHandler
|
116
|
+
DESCRIPTION : Parses a message-handler for a class of objects
|
117
|
+
INPUTS : The logical name of the input source
|
118
|
+
RETURNS : False if successful parse, true otherwise
|
119
|
+
SIDE EFFECTS : Handler allocated and inserted into class
|
120
|
+
NOTES : H/L Syntax:
|
121
|
+
|
122
|
+
(defmessage-handler <class> <name> [<type>] [<comment>]
|
123
|
+
(<params>)
|
124
|
+
<action>*)
|
125
|
+
|
126
|
+
<params> ::= <var>* | <var>* $?<name>
|
127
|
+
***********************************************************************/
|
128
|
+
bool ParseDefmessageHandler(
|
129
|
+
Environment *theEnv,
|
130
|
+
const char *readSource)
|
131
|
+
{
|
132
|
+
Defclass *cls;
|
133
|
+
CLIPSLexeme *cname, *mname, *wildcard;
|
134
|
+
unsigned mtype = MPRIMARY;
|
135
|
+
unsigned short min, max;
|
136
|
+
unsigned short lvars;
|
137
|
+
bool error;
|
138
|
+
Expression *hndParams,*actions;
|
139
|
+
DefmessageHandler *hnd;
|
140
|
+
|
141
|
+
SetPPBufferStatus(theEnv,true);
|
142
|
+
FlushPPBuffer(theEnv);
|
143
|
+
SetIndentDepth(theEnv,3);
|
144
|
+
SavePPBuffer(theEnv,"(defmessage-handler ");
|
145
|
+
|
146
|
+
#if BLOAD || BLOAD_AND_BSAVE
|
147
|
+
if ((Bloaded(theEnv)) && (! ConstructData(theEnv)->CheckSyntaxMode))
|
148
|
+
{
|
149
|
+
CannotLoadWithBloadMessage(theEnv,"defmessage-handler");
|
150
|
+
return true;
|
151
|
+
}
|
152
|
+
#endif
|
153
|
+
cname = GetConstructNameAndComment(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken,"defmessage-handler",
|
154
|
+
NULL,NULL,"~",true,false,true,false);
|
155
|
+
if (cname == NULL)
|
156
|
+
return true;
|
157
|
+
cls = LookupDefclassByMdlOrScope(theEnv,cname->contents);
|
158
|
+
if (cls == NULL)
|
159
|
+
{
|
160
|
+
PrintErrorID(theEnv,"MSGPSR",1,false);
|
161
|
+
WriteString(theEnv,STDERR,"A class must be defined before its message-handlers.\n");
|
162
|
+
return true;
|
163
|
+
}
|
164
|
+
if ((cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]) ||
|
165
|
+
(cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_ADDRESS_TYPE]) ||
|
166
|
+
(cls == DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]->directSuperclasses.classArray[0]))
|
167
|
+
{
|
168
|
+
PrintErrorID(theEnv,"MSGPSR",8,false);
|
169
|
+
WriteString(theEnv,STDERR,"Message-handlers cannot be attached to the class '");
|
170
|
+
WriteString(theEnv,STDERR,DefclassName(cls));
|
171
|
+
WriteString(theEnv,STDERR,"'.\n");
|
172
|
+
return true;
|
173
|
+
}
|
174
|
+
if (HandlersExecuting(cls))
|
175
|
+
{
|
176
|
+
PrintErrorID(theEnv,"MSGPSR",2,false);
|
177
|
+
WriteString(theEnv,STDERR,"Cannot (re)define message-handlers during execution of ");
|
178
|
+
WriteString(theEnv,STDERR,"other message-handlers for the same class.\n");
|
179
|
+
return true;
|
180
|
+
}
|
181
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
|
182
|
+
{
|
183
|
+
SyntaxErrorMessage(theEnv,"defmessage-handler");
|
184
|
+
return true;
|
185
|
+
}
|
186
|
+
PPBackup(theEnv);
|
187
|
+
PPBackup(theEnv);
|
188
|
+
SavePPBuffer(theEnv," ");
|
189
|
+
SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
|
190
|
+
SavePPBuffer(theEnv," ");
|
191
|
+
mname = DefclassData(theEnv)->ObjectParseToken.lexemeValue;
|
192
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
193
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != LEFT_PARENTHESIS_TOKEN)
|
194
|
+
{
|
195
|
+
SavePPBuffer(theEnv," ");
|
196
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != STRING_TOKEN)
|
197
|
+
{
|
198
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
|
199
|
+
{
|
200
|
+
SyntaxErrorMessage(theEnv,"defmessage-handler");
|
201
|
+
return true;
|
202
|
+
}
|
203
|
+
mtype = HandlerType(theEnv,"defmessage-handler",false,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents);
|
204
|
+
if (mtype == MERROR)
|
205
|
+
return true;
|
206
|
+
|
207
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
208
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType == STRING_TOKEN)
|
209
|
+
{
|
210
|
+
SavePPBuffer(theEnv," ");
|
211
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
else
|
215
|
+
{
|
216
|
+
SavePPBuffer(theEnv," ");
|
217
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
218
|
+
}
|
219
|
+
}
|
220
|
+
PPBackup(theEnv);
|
221
|
+
PPBackup(theEnv);
|
222
|
+
PPCRAndIndent(theEnv);
|
223
|
+
SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
|
224
|
+
|
225
|
+
hnd = FindHandlerByAddress(cls,mname,mtype);
|
226
|
+
if (GetPrintWhileLoading(theEnv) && GetCompilationsWatch(theEnv))
|
227
|
+
{
|
228
|
+
WriteString(theEnv,STDOUT," Handler ");
|
229
|
+
WriteString(theEnv,STDOUT,mname->contents);
|
230
|
+
WriteString(theEnv,STDOUT," ");
|
231
|
+
WriteString(theEnv,STDOUT,MessageHandlerData(theEnv)->hndquals[mtype]);
|
232
|
+
if (hnd == NULL)
|
233
|
+
WriteString(theEnv,STDOUT," defined.\n");
|
234
|
+
else
|
235
|
+
WriteString(theEnv,STDOUT," redefined.\n");
|
236
|
+
}
|
237
|
+
|
238
|
+
if ((hnd != NULL) ? hnd->system : false)
|
239
|
+
{
|
240
|
+
PrintErrorID(theEnv,"MSGPSR",3,false);
|
241
|
+
WriteString(theEnv,STDERR,"System message-handlers may not be modified.\n");
|
242
|
+
return true;
|
243
|
+
}
|
244
|
+
|
245
|
+
hndParams = GenConstant(theEnv,SYMBOL_TYPE,MessageHandlerData(theEnv)->SELF_SYMBOL);
|
246
|
+
hndParams = ParseProcParameters(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken,hndParams,
|
247
|
+
&wildcard,&min,&max,&error,IsParameterSlotReference);
|
248
|
+
if (error)
|
249
|
+
return true;
|
250
|
+
PPCRAndIndent(theEnv);
|
251
|
+
ExpressionData(theEnv)->ReturnContext = true;
|
252
|
+
actions = ParseProcActions(theEnv,"message-handler",readSource,
|
253
|
+
&DefclassData(theEnv)->ObjectParseToken,hndParams,wildcard,
|
254
|
+
SlotReferenceVar,BindSlotReference,&lvars,
|
255
|
+
cls);
|
256
|
+
if (actions == NULL)
|
257
|
+
{
|
258
|
+
ReturnExpression(theEnv,hndParams);
|
259
|
+
return true;
|
260
|
+
}
|
261
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
262
|
+
{
|
263
|
+
SyntaxErrorMessage(theEnv,"defmessage-handler");
|
264
|
+
ReturnExpression(theEnv,hndParams);
|
265
|
+
ReturnPackedExpression(theEnv,actions);
|
266
|
+
return true;
|
267
|
+
}
|
268
|
+
PPBackup(theEnv);
|
269
|
+
PPBackup(theEnv);
|
270
|
+
SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
|
271
|
+
SavePPBuffer(theEnv,"\n");
|
272
|
+
|
273
|
+
/* ===================================================
|
274
|
+
If we're only checking syntax, don't add the
|
275
|
+
successfully parsed defmessage-handler to the KB.
|
276
|
+
=================================================== */
|
277
|
+
|
278
|
+
if (ConstructData(theEnv)->CheckSyntaxMode)
|
279
|
+
{
|
280
|
+
ReturnExpression(theEnv,hndParams);
|
281
|
+
ReturnPackedExpression(theEnv,actions);
|
282
|
+
return false;
|
283
|
+
}
|
284
|
+
|
285
|
+
if (hnd != NULL)
|
286
|
+
{
|
287
|
+
ExpressionDeinstall(theEnv,hnd->actions);
|
288
|
+
ReturnPackedExpression(theEnv,hnd->actions);
|
289
|
+
if (hnd->header.ppForm != NULL)
|
290
|
+
rm(theEnv,(void *) hnd->header.ppForm,
|
291
|
+
(sizeof(char) * (strlen(hnd->header.ppForm)+1)));
|
292
|
+
}
|
293
|
+
else
|
294
|
+
{
|
295
|
+
hnd = InsertHandlerHeader(theEnv,cls,mname,mtype);
|
296
|
+
IncrementLexemeCount(hnd->header.name);
|
297
|
+
}
|
298
|
+
ReturnExpression(theEnv,hndParams);
|
299
|
+
|
300
|
+
hnd->minParams = min;
|
301
|
+
hnd->maxParams = max;
|
302
|
+
hnd->localVarCount = lvars;
|
303
|
+
hnd->actions = actions;
|
304
|
+
ExpressionInstall(theEnv,hnd->actions);
|
305
|
+
#if DEBUGGING_FUNCTIONS
|
306
|
+
|
307
|
+
/* ===================================================
|
308
|
+
Old handler trace status is automatically preserved
|
309
|
+
=================================================== */
|
310
|
+
if (GetConserveMemory(theEnv) == false)
|
311
|
+
hnd->header.ppForm = CopyPPBuffer(theEnv);
|
312
|
+
else
|
313
|
+
#endif
|
314
|
+
hnd->header.ppForm = NULL;
|
315
|
+
return false;
|
316
|
+
}
|
317
|
+
|
318
|
+
/*******************************************************************************
|
319
|
+
NAME : CreateGetAndPutHandlers
|
320
|
+
DESCRIPTION : Creates two message-handlers with
|
321
|
+
the following syntax for the slot:
|
322
|
+
|
323
|
+
(defmessage-handler <class> get-<slot-name> primary ()
|
324
|
+
?self:<slot-name>)
|
325
|
+
|
326
|
+
For single-field slots:
|
327
|
+
|
328
|
+
(defmessage-handler <class> put-<slot-name> primary (?value)
|
329
|
+
(bind ?self:<slot-name> ?value))
|
330
|
+
|
331
|
+
For multifield slots:
|
332
|
+
|
333
|
+
(defmessage-handler <class> put-<slot-name> primary ($?value)
|
334
|
+
(bind ?self:<slot-name> ?value))
|
335
|
+
|
336
|
+
INPUTS : The class slot descriptor
|
337
|
+
RETURNS : Nothing useful
|
338
|
+
SIDE EFFECTS : Message-handlers created
|
339
|
+
NOTES : A put handler is not created for read-only slots
|
340
|
+
*******************************************************************************/
|
341
|
+
void CreateGetAndPutHandlers(
|
342
|
+
Environment *theEnv,
|
343
|
+
SlotDescriptor *sd)
|
344
|
+
{
|
345
|
+
const char *className,*slotName;
|
346
|
+
size_t bufsz;
|
347
|
+
char *buf;
|
348
|
+
const char *handlerRouter = "*** Default Public Handlers ***";
|
349
|
+
bool oldPWL,oldCM;
|
350
|
+
const char *oldRouter;
|
351
|
+
const char *oldString;
|
352
|
+
long oldIndex;
|
353
|
+
|
354
|
+
if ((sd->createReadAccessor == 0) && (sd->createWriteAccessor == 0))
|
355
|
+
return;
|
356
|
+
className = sd->cls->header.name->contents;
|
357
|
+
slotName = sd->slotName->name->contents;
|
358
|
+
|
359
|
+
bufsz = (sizeof(char) * (strlen(className) + (strlen(slotName) * 2) + 80));
|
360
|
+
buf = (char *) gm2(theEnv,bufsz);
|
361
|
+
|
362
|
+
oldPWL = GetPrintWhileLoading(theEnv);
|
363
|
+
SetPrintWhileLoading(theEnv,false);
|
364
|
+
oldCM = SetConserveMemory(theEnv,true);
|
365
|
+
|
366
|
+
if (sd->createReadAccessor)
|
367
|
+
{
|
368
|
+
gensprintf(buf,"%s get-%s () ?self:%s)",className,slotName,slotName);
|
369
|
+
|
370
|
+
oldRouter = RouterData(theEnv)->FastCharGetRouter;
|
371
|
+
oldString = RouterData(theEnv)->FastCharGetString;
|
372
|
+
oldIndex = RouterData(theEnv)->FastCharGetIndex;
|
373
|
+
|
374
|
+
RouterData(theEnv)->FastCharGetRouter = handlerRouter;
|
375
|
+
RouterData(theEnv)->FastCharGetIndex = 0;
|
376
|
+
RouterData(theEnv)->FastCharGetString = buf;
|
377
|
+
|
378
|
+
ParseDefmessageHandler(theEnv,handlerRouter);
|
379
|
+
DestroyPPBuffer(theEnv);
|
380
|
+
/*
|
381
|
+
if (OpenStringSource(theEnv,handlerRouter,buf,0))
|
382
|
+
{
|
383
|
+
ParseDefmessageHandler(handlerRouter);
|
384
|
+
DestroyPPBuffer();
|
385
|
+
CloseStringSource(theEnv,handlerRouter);
|
386
|
+
}
|
387
|
+
*/
|
388
|
+
RouterData(theEnv)->FastCharGetRouter = oldRouter;
|
389
|
+
RouterData(theEnv)->FastCharGetIndex = oldIndex;
|
390
|
+
RouterData(theEnv)->FastCharGetString = oldString;
|
391
|
+
}
|
392
|
+
|
393
|
+
if (sd->createWriteAccessor)
|
394
|
+
{
|
395
|
+
gensprintf(buf,"%s put-%s ($?value) (bind ?self:%s ?value))",
|
396
|
+
className,slotName,slotName);
|
397
|
+
|
398
|
+
oldRouter = RouterData(theEnv)->FastCharGetRouter;
|
399
|
+
oldString = RouterData(theEnv)->FastCharGetString;
|
400
|
+
oldIndex = RouterData(theEnv)->FastCharGetIndex;
|
401
|
+
|
402
|
+
RouterData(theEnv)->FastCharGetRouter = handlerRouter;
|
403
|
+
RouterData(theEnv)->FastCharGetIndex = 0;
|
404
|
+
RouterData(theEnv)->FastCharGetString = buf;
|
405
|
+
|
406
|
+
ParseDefmessageHandler(theEnv,handlerRouter);
|
407
|
+
DestroyPPBuffer(theEnv);
|
408
|
+
|
409
|
+
/*
|
410
|
+
if (OpenStringSource(theEnv,handlerRouter,buf,0))
|
411
|
+
{
|
412
|
+
ParseDefmessageHandler(handlerRouter);
|
413
|
+
DestroyPPBuffer();
|
414
|
+
CloseStringSource(theEnv,handlerRouter);
|
415
|
+
}
|
416
|
+
*/
|
417
|
+
RouterData(theEnv)->FastCharGetRouter = oldRouter;
|
418
|
+
RouterData(theEnv)->FastCharGetIndex = oldIndex;
|
419
|
+
RouterData(theEnv)->FastCharGetString = oldString;
|
420
|
+
}
|
421
|
+
|
422
|
+
SetPrintWhileLoading(theEnv,oldPWL);
|
423
|
+
SetConserveMemory(theEnv,oldCM);
|
424
|
+
|
425
|
+
rm(theEnv,buf,bufsz);
|
426
|
+
}
|
427
|
+
|
428
|
+
/* =========================================
|
429
|
+
*****************************************
|
430
|
+
INTERNALLY VISIBLE FUNCTIONS
|
431
|
+
=========================================
|
432
|
+
***************************************** */
|
433
|
+
|
434
|
+
/*****************************************************************
|
435
|
+
NAME : IsParameterSlotReference
|
436
|
+
DESCRIPTION : Determines if a message-handler parameter is of
|
437
|
+
the form ?self:<name>, which is not allowed since
|
438
|
+
this is slot reference syntax
|
439
|
+
INPUTS : The paramter name
|
440
|
+
RETURNS : True if the parameter is a slot reference,
|
441
|
+
false otherwise
|
442
|
+
SIDE EFFECTS : None
|
443
|
+
NOTES : None
|
444
|
+
*****************************************************************/
|
445
|
+
static bool IsParameterSlotReference(
|
446
|
+
Environment *theEnv,
|
447
|
+
const char *pname)
|
448
|
+
{
|
449
|
+
if ((strncmp(pname,SELF_STRING,SELF_LEN) == 0) ?
|
450
|
+
(pname[SELF_LEN] == SELF_SLOT_REF) : false)
|
451
|
+
{
|
452
|
+
PrintErrorID(theEnv,"MSGPSR",4,false);
|
453
|
+
WriteString(theEnv,STDERR,"Illegal slot reference in parameter list.\n");
|
454
|
+
return true;
|
455
|
+
}
|
456
|
+
return false;
|
457
|
+
}
|
458
|
+
|
459
|
+
/****************************************************************************
|
460
|
+
NAME : SlotReferenceVar
|
461
|
+
DESCRIPTION : Replaces direct slot references in handler body
|
462
|
+
with special function calls to reference active instance
|
463
|
+
at run-time
|
464
|
+
The slot in in the class bound at parse-time is always
|
465
|
+
referenced (early binding).
|
466
|
+
Slot references of the form ?self:<name> directly reference
|
467
|
+
ProcParamArray[0] (the message object - ?self) to
|
468
|
+
find the specified slot at run-time
|
469
|
+
INPUTS : 1) Variable expression
|
470
|
+
2) The class of the handler being parsed
|
471
|
+
RETURNS : 0 if not recognized, 1 if so, -1 on errors
|
472
|
+
SIDE EFFECTS : Handler body SF_VARIABLE and MF_VARIABLE replaced with
|
473
|
+
direct slot access function
|
474
|
+
NOTES : Objects are allowed to directly access their own slots
|
475
|
+
without sending a message to themselves. Since the object
|
476
|
+
is "within the boundary of its internals", this does not
|
477
|
+
violate the encapsulation principle of OOP.
|
478
|
+
****************************************************************************/
|
479
|
+
static int SlotReferenceVar(
|
480
|
+
Environment *theEnv,
|
481
|
+
Expression *varexp,
|
482
|
+
void *userBuffer)
|
483
|
+
{
|
484
|
+
struct token itkn;
|
485
|
+
bool oldpp;
|
486
|
+
SlotDescriptor *sd;
|
487
|
+
|
488
|
+
if ((varexp->type != SF_VARIABLE) && (varexp->type != MF_VARIABLE))
|
489
|
+
{ return 0; }
|
490
|
+
if ((strncmp(varexp->lexemeValue->contents,SELF_STRING,SELF_LEN) == 0) ?
|
491
|
+
(varexp->lexemeValue->contents[SELF_LEN] == SELF_SLOT_REF) : false)
|
492
|
+
{
|
493
|
+
OpenStringSource(theEnv,"hnd-var",varexp->lexemeValue->contents + SELF_LEN + 1,0);
|
494
|
+
oldpp = GetPPBufferStatus(theEnv);
|
495
|
+
SetPPBufferStatus(theEnv,false);
|
496
|
+
GetToken(theEnv,"hnd-var",&itkn);
|
497
|
+
SetPPBufferStatus(theEnv,oldpp);
|
498
|
+
CloseStringSource(theEnv,"hnd-var");
|
499
|
+
if (itkn.tknType != STOP_TOKEN)
|
500
|
+
{
|
501
|
+
sd = CheckSlotReference(theEnv,(Defclass *) userBuffer,TokenTypeToType(itkn.tknType),itkn.value,
|
502
|
+
false,NULL);
|
503
|
+
if (sd == NULL)
|
504
|
+
{ return -1; }
|
505
|
+
GenHandlerSlotReference(theEnv,varexp,HANDLER_GET,sd);
|
506
|
+
return 1;
|
507
|
+
}
|
508
|
+
}
|
509
|
+
|
510
|
+
return 0;
|
511
|
+
}
|
512
|
+
|
513
|
+
/****************************************************************************
|
514
|
+
NAME : BindSlotReference
|
515
|
+
DESCRIPTION : Replaces direct slot binds in handler body with special
|
516
|
+
function calls to reference active instance at run-time
|
517
|
+
The slot in in the class bound at parse-time is always
|
518
|
+
referenced (early binding).
|
519
|
+
Slot references of the form ?self:<name> directly reference
|
520
|
+
ProcParamArray[0] (the message object - ?self) to
|
521
|
+
find the specified slot at run-time
|
522
|
+
INPUTS : 1) Variable expression
|
523
|
+
2) The class for the message-handler being parsed
|
524
|
+
RETURNS : 0 if not recognized, 1 if so, -1 on errors
|
525
|
+
SIDE EFFECTS : Handler body "bind" call replaced with direct slot access
|
526
|
+
function
|
527
|
+
NOTES : Objects are allowed to directly access their own slots
|
528
|
+
without sending a message to themselves. Since the object
|
529
|
+
is "within the boundary of its internals", this does not
|
530
|
+
violate the encapsulation principle of OOP.
|
531
|
+
****************************************************************************/
|
532
|
+
static int BindSlotReference(
|
533
|
+
Environment *theEnv,
|
534
|
+
Expression *bindExp,
|
535
|
+
void *userBuffer)
|
536
|
+
{
|
537
|
+
const char *bindName;
|
538
|
+
struct token itkn;
|
539
|
+
bool oldpp;
|
540
|
+
SlotDescriptor *sd;
|
541
|
+
Expression *saveExp;
|
542
|
+
|
543
|
+
bindName = bindExp->argList->lexemeValue->contents;
|
544
|
+
if (strcmp(bindName,SELF_STRING) == 0)
|
545
|
+
{
|
546
|
+
PrintErrorID(theEnv,"MSGPSR",5,false);
|
547
|
+
WriteString(theEnv,STDERR,"Active instance parameter cannot be changed.\n");
|
548
|
+
return -1;
|
549
|
+
}
|
550
|
+
if ((strncmp(bindName,SELF_STRING,SELF_LEN) == 0) ?
|
551
|
+
(bindName[SELF_LEN] == SELF_SLOT_REF) : false)
|
552
|
+
{
|
553
|
+
OpenStringSource(theEnv,"hnd-var",bindName + SELF_LEN + 1,0);
|
554
|
+
oldpp = GetPPBufferStatus(theEnv);
|
555
|
+
SetPPBufferStatus(theEnv,false);
|
556
|
+
GetToken(theEnv,"hnd-var",&itkn);
|
557
|
+
SetPPBufferStatus(theEnv,oldpp);
|
558
|
+
CloseStringSource(theEnv,"hnd-var");
|
559
|
+
if (itkn.tknType != STOP_TOKEN)
|
560
|
+
{
|
561
|
+
saveExp = bindExp->argList->nextArg;
|
562
|
+
sd = CheckSlotReference(theEnv,(Defclass *) userBuffer,TokenTypeToType(itkn.tknType),itkn.value,
|
563
|
+
true,saveExp);
|
564
|
+
if (sd == NULL)
|
565
|
+
{ return -1; }
|
566
|
+
GenHandlerSlotReference(theEnv,bindExp,HANDLER_PUT,sd);
|
567
|
+
bindExp->argList->nextArg = NULL;
|
568
|
+
ReturnExpression(theEnv,bindExp->argList);
|
569
|
+
bindExp->argList = saveExp;
|
570
|
+
return 1;
|
571
|
+
}
|
572
|
+
}
|
573
|
+
return 0;
|
574
|
+
}
|
575
|
+
|
576
|
+
/*********************************************************
|
577
|
+
NAME : CheckSlotReference
|
578
|
+
DESCRIPTION : Examines a ?self:<slot-name> reference
|
579
|
+
If the reference is a single-field or
|
580
|
+
global variable, checking and evaluation
|
581
|
+
is delayed until run-time. If the
|
582
|
+
reference is a symbol, this routine
|
583
|
+
verifies that the slot is a legal
|
584
|
+
slot for the reference (i.e., it exists
|
585
|
+
in the class to which the message-handler
|
586
|
+
is being attached, it is visible and it
|
587
|
+
is writable for write reference)
|
588
|
+
INPUTS : 1) A buffer holding the class
|
589
|
+
of the handler being parsed
|
590
|
+
2) The type of the slot reference
|
591
|
+
3) The value of the slot reference
|
592
|
+
4) A flag indicating if this is a read
|
593
|
+
or write access
|
594
|
+
5) Value expression for write
|
595
|
+
RETURNS : Class slot on success, NULL on errors
|
596
|
+
SIDE EFFECTS : Messages printed on errors.
|
597
|
+
NOTES : For static references, this function
|
598
|
+
insures that the slot is either
|
599
|
+
publicly visible or that the handler
|
600
|
+
is being attached to the same class in
|
601
|
+
which the private slot is defined.
|
602
|
+
*********************************************************/
|
603
|
+
static SlotDescriptor *CheckSlotReference(
|
604
|
+
Environment *theEnv,
|
605
|
+
Defclass *theDefclass,
|
606
|
+
int theType,
|
607
|
+
void *theValue,
|
608
|
+
bool writeFlag,
|
609
|
+
Expression *writeExpression)
|
610
|
+
{
|
611
|
+
int slotIndex;
|
612
|
+
SlotDescriptor *sd;
|
613
|
+
ConstraintViolationType vCode;
|
614
|
+
|
615
|
+
if (theType != SYMBOL_TYPE)
|
616
|
+
{
|
617
|
+
PrintErrorID(theEnv,"MSGPSR",7,false);
|
618
|
+
WriteString(theEnv,STDERR,"Illegal value for ?self reference.\n");
|
619
|
+
return NULL;
|
620
|
+
}
|
621
|
+
slotIndex = FindInstanceTemplateSlot(theEnv,theDefclass,(CLIPSLexeme *) theValue);
|
622
|
+
if (slotIndex == -1)
|
623
|
+
{
|
624
|
+
PrintErrorID(theEnv,"MSGPSR",6,false);
|
625
|
+
WriteString(theEnv,STDERR,"No such slot '");
|
626
|
+
WriteString(theEnv,STDERR,((CLIPSLexeme *) theValue)->contents);
|
627
|
+
WriteString(theEnv,STDERR,"' in class '");
|
628
|
+
WriteString(theEnv,STDERR,DefclassName(theDefclass));
|
629
|
+
WriteString(theEnv,STDERR,"' for ?self reference.\n");
|
630
|
+
return NULL;
|
631
|
+
}
|
632
|
+
sd = theDefclass->instanceTemplate[slotIndex];
|
633
|
+
if ((sd->publicVisibility == 0) && (sd->cls != theDefclass))
|
634
|
+
{
|
635
|
+
SlotVisibilityViolationError(theEnv,sd,theDefclass,true);
|
636
|
+
return NULL;
|
637
|
+
}
|
638
|
+
if (! writeFlag)
|
639
|
+
return(sd);
|
640
|
+
|
641
|
+
/* =================================================
|
642
|
+
If a slot is initialize-only, the WithinInit flag
|
643
|
+
still needs to be checked at run-time, for the
|
644
|
+
handler could be called out of the context of
|
645
|
+
an init.
|
646
|
+
================================================= */
|
647
|
+
if (sd->noWrite && (sd->initializeOnly == 0))
|
648
|
+
{
|
649
|
+
SlotAccessViolationError(theEnv,((CLIPSLexeme *) theValue)->contents,
|
650
|
+
NULL,theDefclass);
|
651
|
+
return NULL;
|
652
|
+
}
|
653
|
+
|
654
|
+
vCode = ConstraintCheckExpressionChain(theEnv,writeExpression,sd->constraint);
|
655
|
+
if (vCode != NO_VIOLATION)
|
656
|
+
{
|
657
|
+
PrintErrorID(theEnv,"CSTRNCHK",1,false);
|
658
|
+
WriteString(theEnv,STDERR,"Expression for ");
|
659
|
+
PrintSlot(theEnv,STDERR,sd,NULL,"direct slot write");
|
660
|
+
ConstraintViolationErrorMessage(theEnv,NULL,NULL,0,0,NULL,0,
|
661
|
+
vCode,sd->constraint,false);
|
662
|
+
return NULL;
|
663
|
+
}
|
664
|
+
return(sd);
|
665
|
+
}
|
666
|
+
|
667
|
+
/***************************************************
|
668
|
+
NAME : GenHandlerSlotReference
|
669
|
+
DESCRIPTION : Creates a bitmap of the class id
|
670
|
+
and slot index for the get or put
|
671
|
+
operation. The bitmap and operation
|
672
|
+
type are stored in the given
|
673
|
+
expression.
|
674
|
+
INPUTS : 1) The expression
|
675
|
+
2) The operation type
|
676
|
+
3) The class slot
|
677
|
+
RETURNS : Nothing useful
|
678
|
+
SIDE EFFECTS : Bitmap created and expression
|
679
|
+
initialized
|
680
|
+
NOTES : None
|
681
|
+
***************************************************/
|
682
|
+
static void GenHandlerSlotReference(
|
683
|
+
Environment *theEnv,
|
684
|
+
Expression *theExp,
|
685
|
+
unsigned short theType,
|
686
|
+
SlotDescriptor *sd)
|
687
|
+
{
|
688
|
+
HANDLER_SLOT_REFERENCE handlerReference;
|
689
|
+
|
690
|
+
ClearBitString(&handlerReference,sizeof(HANDLER_SLOT_REFERENCE));
|
691
|
+
handlerReference.classID = sd->cls->id;
|
692
|
+
handlerReference.slotID = sd->slotName->id;
|
693
|
+
theExp->type = theType;
|
694
|
+
theExp->value = AddBitMap(theEnv,&handlerReference,
|
695
|
+
sizeof(HANDLER_SLOT_REFERENCE));
|
696
|
+
}
|
697
|
+
|
698
|
+
#endif
|