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,62 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 10/18/16 */
|
5
|
+
/* */
|
6
|
+
/* */
|
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: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
20
|
+
/* */
|
21
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
22
|
+
/* */
|
23
|
+
/* 6.30: Added const qualifiers to remove C++ */
|
24
|
+
/* deprecation warnings. */
|
25
|
+
/* */
|
26
|
+
/* Changed integer type/precision. */
|
27
|
+
/* */
|
28
|
+
/* 6.40: Removed LOCALE definition. */
|
29
|
+
/* */
|
30
|
+
/* Pragma once and other inclusion changes. */
|
31
|
+
/* */
|
32
|
+
/* Added support for booleans with <stdbool.h>. */
|
33
|
+
/* */
|
34
|
+
/* Removed use of void pointers for specific */
|
35
|
+
/* data structures. */
|
36
|
+
/* */
|
37
|
+
/* UDF redesign. */
|
38
|
+
/* */
|
39
|
+
/* Eval support for run time and bload only. */
|
40
|
+
/* */
|
41
|
+
/*************************************************************/
|
42
|
+
|
43
|
+
#ifndef _H_insmult
|
44
|
+
|
45
|
+
#pragma once
|
46
|
+
|
47
|
+
#define _H_insmult
|
48
|
+
|
49
|
+
#include "evaluatn.h"
|
50
|
+
|
51
|
+
void SetupInstanceMultifieldCommands(Environment *);
|
52
|
+
void MVSlotReplaceCommand(Environment *,UDFContext *,UDFValue *);
|
53
|
+
void MVSlotInsertCommand(Environment *,UDFContext *,UDFValue *);
|
54
|
+
void MVSlotDeleteCommand(Environment *,UDFContext *,UDFValue *);
|
55
|
+
void DirectMVReplaceCommand(Environment *,UDFContext *,UDFValue *);
|
56
|
+
void DirectMVInsertCommand(Environment *,UDFContext *,UDFValue *);
|
57
|
+
void DirectMVDeleteCommand(Environment *,UDFContext *,UDFValue *);
|
58
|
+
|
59
|
+
#endif /* _H_insmult */
|
60
|
+
|
61
|
+
|
62
|
+
|
@@ -0,0 +1,602 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.41 05/28/21 */
|
5
|
+
/* */
|
6
|
+
/* INSTANCE PARSER MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Instance Function Parsing Routines */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* */
|
17
|
+
/* Revision History: */
|
18
|
+
/* */
|
19
|
+
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
20
|
+
/* */
|
21
|
+
/* Changed name of variable exp to theExp */
|
22
|
+
/* because of Unix compiler warnings of shadowed */
|
23
|
+
/* definitions. */
|
24
|
+
/* */
|
25
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
26
|
+
/* */
|
27
|
+
/* 6.30: Added const qualifiers to remove C++ */
|
28
|
+
/* deprecation warnings. */
|
29
|
+
/* */
|
30
|
+
/* Fixed ParseSlotOverrides memory release issue. */
|
31
|
+
/* */
|
32
|
+
/* It's now possible to create an instance of a */
|
33
|
+
/* class that's not in scope if the module name */
|
34
|
+
/* is specified. */
|
35
|
+
/* */
|
36
|
+
/* Added code to keep track of pointers to */
|
37
|
+
/* constructs that are contained externally to */
|
38
|
+
/* to constructs, DanglingConstructs. */
|
39
|
+
/* */
|
40
|
+
/* 6.40: Added Env prefix to GetEvaluationError and */
|
41
|
+
/* SetEvaluationError functions. */
|
42
|
+
/* */
|
43
|
+
/* Pragma once and other inclusion changes. */
|
44
|
+
/* */
|
45
|
+
/* Added support for booleans with <stdbool.h>. */
|
46
|
+
/* */
|
47
|
+
/* Removed use of void pointers for specific */
|
48
|
+
/* data structures. */
|
49
|
+
/* */
|
50
|
+
/* Eval support for run time and bload only. */
|
51
|
+
/* */
|
52
|
+
/* 6.41: Disallowed creation of instances when their */
|
53
|
+
/* class is being redefined. */
|
54
|
+
/* */
|
55
|
+
/*************************************************************/
|
56
|
+
|
57
|
+
/* =========================================
|
58
|
+
*****************************************
|
59
|
+
EXTERNAL DEFINITIONS
|
60
|
+
=========================================
|
61
|
+
***************************************** */
|
62
|
+
#include "setup.h"
|
63
|
+
|
64
|
+
#if OBJECT_SYSTEM
|
65
|
+
|
66
|
+
#include <stdio.h>
|
67
|
+
#include <string.h>
|
68
|
+
|
69
|
+
#include "classcom.h"
|
70
|
+
#include "classfun.h"
|
71
|
+
#include "classinf.h"
|
72
|
+
#include "constant.h"
|
73
|
+
#include "envrnmnt.h"
|
74
|
+
#include "evaluatn.h"
|
75
|
+
#include "exprnpsr.h"
|
76
|
+
#include "moduldef.h"
|
77
|
+
#include "pprint.h"
|
78
|
+
#include "prntutil.h"
|
79
|
+
#include "router.h"
|
80
|
+
|
81
|
+
#include "inspsr.h"
|
82
|
+
|
83
|
+
/* =========================================
|
84
|
+
*****************************************
|
85
|
+
CONSTANTS
|
86
|
+
=========================================
|
87
|
+
***************************************** */
|
88
|
+
#define MAKE_TYPE 0
|
89
|
+
#define INITIALIZE_TYPE 1
|
90
|
+
#define MODIFY_TYPE 2
|
91
|
+
#define DUPLICATE_TYPE 3
|
92
|
+
|
93
|
+
#define CLASS_RLN "of"
|
94
|
+
#define DUPLICATE_NAME_REF "to"
|
95
|
+
|
96
|
+
/***************************************/
|
97
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
98
|
+
/***************************************/
|
99
|
+
|
100
|
+
static bool ReplaceClassNameWithReference(Environment *,Expression *);
|
101
|
+
|
102
|
+
/* =========================================
|
103
|
+
*****************************************
|
104
|
+
EXTERNALLY VISIBLE FUNCTIONS
|
105
|
+
=========================================
|
106
|
+
***************************************** */
|
107
|
+
|
108
|
+
/*************************************************************************************
|
109
|
+
NAME : ParseInitializeInstance
|
110
|
+
DESCRIPTION : Parses initialize-instance and make-instance function
|
111
|
+
calls into an Expression form that
|
112
|
+
can later be evaluated with EvaluateExpression(theEnv,)
|
113
|
+
INPUTS : 1) The address of the top node of the expression
|
114
|
+
containing the initialize-instance function call
|
115
|
+
2) The logical name of the input source
|
116
|
+
RETURNS : The address of the modified expression, or NULL
|
117
|
+
if there is an error
|
118
|
+
SIDE EFFECTS : The expression is enhanced to include all
|
119
|
+
aspects of the initialize-instance call
|
120
|
+
(slot-overrides etc.)
|
121
|
+
The "top" expression is deleted on errors.
|
122
|
+
NOTES : This function parses a initialize-instance call into
|
123
|
+
an expression of the following form :
|
124
|
+
|
125
|
+
(initialize-instance <instance-name> <slot-override>*)
|
126
|
+
where <slot-override> ::= (<slot-name> <expression>+)
|
127
|
+
|
128
|
+
goes to -->
|
129
|
+
|
130
|
+
initialize-instance
|
131
|
+
|
|
132
|
+
V
|
133
|
+
<instance or name>-><slot-name>-><dummy-node>...
|
134
|
+
|
|
135
|
+
V
|
136
|
+
<value-expression>...
|
137
|
+
|
138
|
+
(make-instance <instance> of <class> <slot-override>*)
|
139
|
+
goes to -->
|
140
|
+
|
141
|
+
make-instance
|
142
|
+
|
|
143
|
+
V
|
144
|
+
<instance-name>-><class-name>-><slot-name>-><dummy-node>...
|
145
|
+
|
|
146
|
+
V
|
147
|
+
<value-expression>...
|
148
|
+
|
149
|
+
(make-instance of <class> <slot-override>*)
|
150
|
+
goes to -->
|
151
|
+
|
152
|
+
make-instance
|
153
|
+
|
|
154
|
+
V
|
155
|
+
(gensym*)-><class-name>-><slot-name>-><dummy-node>...
|
156
|
+
|
|
157
|
+
V
|
158
|
+
<value-expression>...
|
159
|
+
|
160
|
+
(modify-instance <instance> <slot-override>*)
|
161
|
+
goes to -->
|
162
|
+
|
163
|
+
modify-instance
|
164
|
+
|
|
165
|
+
V
|
166
|
+
<instance or name>-><slot-name>-><dummy-node>...
|
167
|
+
|
|
168
|
+
V
|
169
|
+
<value-expression>...
|
170
|
+
|
171
|
+
(duplicate-instance <instance> [to <new-name>] <slot-override>*)
|
172
|
+
goes to -->
|
173
|
+
|
174
|
+
duplicate-instance
|
175
|
+
|
|
176
|
+
V
|
177
|
+
<instance or name>-><new-name>-><slot-name>-><dummy-node>...
|
178
|
+
OR |
|
179
|
+
(gensym*) V
|
180
|
+
<value-expression>...
|
181
|
+
|
182
|
+
*************************************************************************************/
|
183
|
+
Expression *ParseInitializeInstance(
|
184
|
+
Environment *theEnv,
|
185
|
+
Expression *top,
|
186
|
+
const char *readSource)
|
187
|
+
{
|
188
|
+
bool error;
|
189
|
+
int fcalltype;
|
190
|
+
bool readclass;
|
191
|
+
|
192
|
+
if ((top->value == FindFunction(theEnv,"make-instance")) ||
|
193
|
+
(top->value == FindFunction(theEnv,"active-make-instance")))
|
194
|
+
fcalltype = MAKE_TYPE;
|
195
|
+
else if ((top->value == FindFunction(theEnv,"initialize-instance")) ||
|
196
|
+
(top->value == FindFunction(theEnv,"active-initialize-instance")))
|
197
|
+
fcalltype = INITIALIZE_TYPE;
|
198
|
+
else if ((top->value == FindFunction(theEnv,"modify-instance")) ||
|
199
|
+
(top->value == FindFunction(theEnv,"active-modify-instance")) ||
|
200
|
+
(top->value == FindFunction(theEnv,"message-modify-instance")) ||
|
201
|
+
(top->value == FindFunction(theEnv,"active-message-modify-instance")))
|
202
|
+
fcalltype = MODIFY_TYPE;
|
203
|
+
else
|
204
|
+
fcalltype = DUPLICATE_TYPE;
|
205
|
+
IncrementIndentDepth(theEnv,3);
|
206
|
+
error = false;
|
207
|
+
if (top->type == UNKNOWN_VALUE)
|
208
|
+
top->type = FCALL;
|
209
|
+
else
|
210
|
+
SavePPBuffer(theEnv," ");
|
211
|
+
top->argList = ArgumentParse(theEnv,readSource,&error);
|
212
|
+
if (error)
|
213
|
+
goto ParseInitializeInstanceError;
|
214
|
+
else if (top->argList == NULL)
|
215
|
+
{
|
216
|
+
SyntaxErrorMessage(theEnv,"instance");
|
217
|
+
goto ParseInitializeInstanceError;
|
218
|
+
}
|
219
|
+
SavePPBuffer(theEnv," ");
|
220
|
+
|
221
|
+
if (fcalltype == MAKE_TYPE)
|
222
|
+
{
|
223
|
+
/* ======================================
|
224
|
+
Handle the case of anonymous instances
|
225
|
+
where the name was not specified
|
226
|
+
====================================== */
|
227
|
+
if ((top->argList->type != SYMBOL_TYPE) ? false :
|
228
|
+
(strcmp(top->argList->lexemeValue->contents,CLASS_RLN) == 0))
|
229
|
+
{
|
230
|
+
top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
|
231
|
+
if (error == true)
|
232
|
+
goto ParseInitializeInstanceError;
|
233
|
+
if (top->argList->nextArg == NULL)
|
234
|
+
{
|
235
|
+
SyntaxErrorMessage(theEnv,"instance class");
|
236
|
+
goto ParseInitializeInstanceError;
|
237
|
+
}
|
238
|
+
if ((top->argList->nextArg->type != SYMBOL_TYPE) ? true :
|
239
|
+
(strcmp(top->argList->nextArg->lexemeValue->contents,CLASS_RLN) != 0))
|
240
|
+
{
|
241
|
+
top->argList->type = FCALL;
|
242
|
+
top->argList->value = FindFunction(theEnv,"gensym*");
|
243
|
+
readclass = false;
|
244
|
+
}
|
245
|
+
else
|
246
|
+
readclass = true;
|
247
|
+
}
|
248
|
+
else
|
249
|
+
{
|
250
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
251
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
|
252
|
+
(strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) != 0))
|
253
|
+
{
|
254
|
+
SyntaxErrorMessage(theEnv,"make-instance");
|
255
|
+
goto ParseInitializeInstanceError;
|
256
|
+
}
|
257
|
+
SavePPBuffer(theEnv," ");
|
258
|
+
readclass = true;
|
259
|
+
}
|
260
|
+
if (readclass)
|
261
|
+
{
|
262
|
+
top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
|
263
|
+
if (error)
|
264
|
+
goto ParseInitializeInstanceError;
|
265
|
+
if (top->argList->nextArg == NULL)
|
266
|
+
{
|
267
|
+
SyntaxErrorMessage(theEnv,"instance class");
|
268
|
+
goto ParseInitializeInstanceError;
|
269
|
+
}
|
270
|
+
}
|
271
|
+
|
272
|
+
/* ==============================================
|
273
|
+
If the class name is a constant, go ahead and
|
274
|
+
look it up now and replace it with the pointer
|
275
|
+
============================================== */
|
276
|
+
if (ReplaceClassNameWithReference(theEnv,top->argList->nextArg) == false)
|
277
|
+
goto ParseInitializeInstanceError;
|
278
|
+
|
279
|
+
PPCRAndIndent(theEnv);
|
280
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
281
|
+
top->argList->nextArg->nextArg =
|
282
|
+
ParseSlotOverrides(theEnv,readSource,&error);
|
283
|
+
}
|
284
|
+
else
|
285
|
+
{
|
286
|
+
PPCRAndIndent(theEnv);
|
287
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
288
|
+
if (fcalltype == DUPLICATE_TYPE)
|
289
|
+
{
|
290
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? false :
|
291
|
+
(strcmp(DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents,DUPLICATE_NAME_REF) == 0))
|
292
|
+
{
|
293
|
+
PPBackup(theEnv);
|
294
|
+
PPBackup(theEnv);
|
295
|
+
SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
|
296
|
+
SavePPBuffer(theEnv," ");
|
297
|
+
top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);
|
298
|
+
if (error)
|
299
|
+
goto ParseInitializeInstanceError;
|
300
|
+
if (top->argList->nextArg == NULL)
|
301
|
+
{
|
302
|
+
SyntaxErrorMessage(theEnv,"instance name");
|
303
|
+
goto ParseInitializeInstanceError;
|
304
|
+
}
|
305
|
+
PPCRAndIndent(theEnv);
|
306
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
307
|
+
}
|
308
|
+
else
|
309
|
+
top->argList->nextArg = GenConstant(theEnv,FCALL,FindFunction(theEnv,"gensym*"));
|
310
|
+
top->argList->nextArg->nextArg = ParseSlotOverrides(theEnv,readSource,&error);
|
311
|
+
}
|
312
|
+
else
|
313
|
+
top->argList->nextArg = ParseSlotOverrides(theEnv,readSource,&error);
|
314
|
+
}
|
315
|
+
if (error)
|
316
|
+
goto ParseInitializeInstanceError;
|
317
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
318
|
+
{
|
319
|
+
SyntaxErrorMessage(theEnv,"slot-override");
|
320
|
+
goto ParseInitializeInstanceError;
|
321
|
+
}
|
322
|
+
DecrementIndentDepth(theEnv,3);
|
323
|
+
return(top);
|
324
|
+
|
325
|
+
ParseInitializeInstanceError:
|
326
|
+
SetEvaluationError(theEnv,true);
|
327
|
+
ReturnExpression(theEnv,top);
|
328
|
+
DecrementIndentDepth(theEnv,3);
|
329
|
+
return NULL;
|
330
|
+
}
|
331
|
+
|
332
|
+
/********************************************************************************
|
333
|
+
NAME : ParseSlotOverrides
|
334
|
+
DESCRIPTION : Forms expressions for slot-overrides
|
335
|
+
INPUTS : 1) The logical name of the input
|
336
|
+
2) Caller's buffer for error flkag
|
337
|
+
RETURNS : Address override expressions, NULL
|
338
|
+
if none or error.
|
339
|
+
SIDE EFFECTS : Slot-expression built
|
340
|
+
Caller's error flag set
|
341
|
+
NOTES : <slot-override> ::= (<slot-name> <value>*)*
|
342
|
+
|
343
|
+
goes to
|
344
|
+
|
345
|
+
<slot-name> --> <dummy-node> --> <slot-name> --> <dummy-node>...
|
346
|
+
|
|
347
|
+
V
|
348
|
+
<value-expression> --> <value-expression> --> ...
|
349
|
+
|
350
|
+
Assumes first token has already been scanned
|
351
|
+
********************************************************************************/
|
352
|
+
Expression *ParseSlotOverrides(
|
353
|
+
Environment *theEnv,
|
354
|
+
const char *readSource,
|
355
|
+
bool *error)
|
356
|
+
{
|
357
|
+
Expression *top = NULL,*bot = NULL,*theExp;
|
358
|
+
Expression *theExpNext;
|
359
|
+
|
360
|
+
while (DefclassData(theEnv)->ObjectParseToken.tknType == LEFT_PARENTHESIS_TOKEN)
|
361
|
+
{
|
362
|
+
*error = false;
|
363
|
+
theExp = ArgumentParse(theEnv,readSource,error);
|
364
|
+
if (*error == true)
|
365
|
+
{
|
366
|
+
ReturnExpression(theEnv,top);
|
367
|
+
return NULL;
|
368
|
+
}
|
369
|
+
else if (theExp == NULL)
|
370
|
+
{
|
371
|
+
SyntaxErrorMessage(theEnv,"slot-override");
|
372
|
+
*error = true;
|
373
|
+
ReturnExpression(theEnv,top);
|
374
|
+
SetEvaluationError(theEnv,true);
|
375
|
+
return NULL;
|
376
|
+
}
|
377
|
+
theExpNext = GenConstant(theEnv,SYMBOL_TYPE,TrueSymbol(theEnv));
|
378
|
+
if (CollectArguments(theEnv,theExpNext,readSource) == NULL)
|
379
|
+
{
|
380
|
+
*error = true;
|
381
|
+
ReturnExpression(theEnv,top);
|
382
|
+
ReturnExpression(theEnv,theExp);
|
383
|
+
return NULL;
|
384
|
+
}
|
385
|
+
theExp->nextArg = theExpNext;
|
386
|
+
if (top == NULL)
|
387
|
+
top = theExp;
|
388
|
+
else
|
389
|
+
bot->nextArg = theExp;
|
390
|
+
bot = theExp->nextArg;
|
391
|
+
PPCRAndIndent(theEnv);
|
392
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
393
|
+
}
|
394
|
+
PPBackup(theEnv);
|
395
|
+
PPBackup(theEnv);
|
396
|
+
SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);
|
397
|
+
return(top);
|
398
|
+
}
|
399
|
+
|
400
|
+
/****************************************************************************
|
401
|
+
NAME : ParseSimpleInstance
|
402
|
+
DESCRIPTION : Parses instances from file for load-instances
|
403
|
+
into an Expression forms that
|
404
|
+
can later be evaluated with EvaluateExpression(theEnv,)
|
405
|
+
INPUTS : 1) The address of the top node of the expression
|
406
|
+
containing the make-instance function call
|
407
|
+
2) The logical name of the input source
|
408
|
+
RETURNS : The address of the modified expression, or NULL
|
409
|
+
if there is an error
|
410
|
+
SIDE EFFECTS : The expression is enhanced to include all
|
411
|
+
aspects of the make-instance call
|
412
|
+
(slot-overrides etc.)
|
413
|
+
The "top" expression is deleted on errors.
|
414
|
+
NOTES : The name, class, values etc. must be constants.
|
415
|
+
|
416
|
+
This function parses a make-instance call into
|
417
|
+
an expression of the following form :
|
418
|
+
|
419
|
+
(make-instance <instance> of <class> <slot-override>*)
|
420
|
+
where <slot-override> ::= (<slot-name> <expression>+)
|
421
|
+
|
422
|
+
goes to -->
|
423
|
+
|
424
|
+
make-instance
|
425
|
+
|
|
426
|
+
V
|
427
|
+
<instance-name>-><class-name>-><slot-name>-><dummy-node>...
|
428
|
+
|
|
429
|
+
V
|
430
|
+
<value-expression>...
|
431
|
+
|
432
|
+
****************************************************************************/
|
433
|
+
Expression *ParseSimpleInstance(
|
434
|
+
Environment *theEnv,
|
435
|
+
Expression *top,
|
436
|
+
const char *readSource)
|
437
|
+
{
|
438
|
+
Expression *theExp,*vals = NULL,*vbot,*tval;
|
439
|
+
TokenType type;
|
440
|
+
|
441
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
442
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType != INSTANCE_NAME_TOKEN) &&
|
443
|
+
(DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN))
|
444
|
+
goto MakeInstanceError;
|
445
|
+
|
446
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType == SYMBOL_TOKEN) &&
|
447
|
+
(strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) == 0))
|
448
|
+
{
|
449
|
+
top->argList = GenConstant(theEnv,FCALL,
|
450
|
+
(void *) FindFunction(theEnv,"gensym*"));
|
451
|
+
}
|
452
|
+
else
|
453
|
+
{
|
454
|
+
top->argList = GenConstant(theEnv,INSTANCE_NAME_TYPE,
|
455
|
+
DefclassData(theEnv)->ObjectParseToken.value);
|
456
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
457
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
|
458
|
+
(strcmp(CLASS_RLN,DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents) != 0))
|
459
|
+
goto MakeInstanceError;
|
460
|
+
}
|
461
|
+
|
462
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
463
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
|
464
|
+
goto MakeInstanceError;
|
465
|
+
top->argList->nextArg =
|
466
|
+
GenConstant(theEnv,SYMBOL_TYPE,DefclassData(theEnv)->ObjectParseToken.value);
|
467
|
+
theExp = top->argList->nextArg;
|
468
|
+
if (ReplaceClassNameWithReference(theEnv,theExp) == false)
|
469
|
+
goto MakeInstanceError;
|
470
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
471
|
+
while (DefclassData(theEnv)->ObjectParseToken.tknType == LEFT_PARENTHESIS_TOKEN)
|
472
|
+
{
|
473
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
474
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN)
|
475
|
+
goto SlotOverrideError;
|
476
|
+
theExp->nextArg = GenConstant(theEnv,SYMBOL_TYPE,DefclassData(theEnv)->ObjectParseToken.value);
|
477
|
+
theExp->nextArg->nextArg = GenConstant(theEnv,SYMBOL_TYPE,TrueSymbol(theEnv));
|
478
|
+
theExp = theExp->nextArg->nextArg;
|
479
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
480
|
+
vbot = NULL;
|
481
|
+
while (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
482
|
+
{
|
483
|
+
type = DefclassData(theEnv)->ObjectParseToken.tknType;
|
484
|
+
if (type == LEFT_PARENTHESIS_TOKEN)
|
485
|
+
{
|
486
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
487
|
+
if ((DefclassData(theEnv)->ObjectParseToken.tknType != SYMBOL_TOKEN) ? true :
|
488
|
+
(strcmp(DefclassData(theEnv)->ObjectParseToken.lexemeValue->contents,"create$") != 0))
|
489
|
+
goto SlotOverrideError;
|
490
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
491
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
492
|
+
goto SlotOverrideError;
|
493
|
+
tval = GenConstant(theEnv,FCALL,FindFunction(theEnv,"create$"));
|
494
|
+
}
|
495
|
+
else
|
496
|
+
{
|
497
|
+
if ((type != SYMBOL_TOKEN) && (type != STRING_TOKEN) &&
|
498
|
+
(type != FLOAT_TOKEN) && (type != INTEGER_TOKEN) && (type != INSTANCE_NAME_TOKEN))
|
499
|
+
goto SlotOverrideError;
|
500
|
+
tval = GenConstant(theEnv,TokenTypeToType(type),DefclassData(theEnv)->ObjectParseToken.value);
|
501
|
+
}
|
502
|
+
if (vals == NULL)
|
503
|
+
vals = tval;
|
504
|
+
else
|
505
|
+
vbot->nextArg = tval;
|
506
|
+
vbot = tval;
|
507
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
508
|
+
}
|
509
|
+
theExp->argList = vals;
|
510
|
+
GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);
|
511
|
+
vals = NULL;
|
512
|
+
}
|
513
|
+
if (DefclassData(theEnv)->ObjectParseToken.tknType != RIGHT_PARENTHESIS_TOKEN)
|
514
|
+
goto SlotOverrideError;
|
515
|
+
return(top);
|
516
|
+
|
517
|
+
MakeInstanceError:
|
518
|
+
SyntaxErrorMessage(theEnv,"make-instance");
|
519
|
+
SetEvaluationError(theEnv,true);
|
520
|
+
ReturnExpression(theEnv,top);
|
521
|
+
return NULL;
|
522
|
+
|
523
|
+
SlotOverrideError:
|
524
|
+
SyntaxErrorMessage(theEnv,"slot-override");
|
525
|
+
SetEvaluationError(theEnv,true);
|
526
|
+
ReturnExpression(theEnv,top);
|
527
|
+
ReturnExpression(theEnv,vals);
|
528
|
+
return NULL;
|
529
|
+
}
|
530
|
+
|
531
|
+
/* =========================================
|
532
|
+
*****************************************
|
533
|
+
INTERNALLY VISIBLE FUNCTIONS
|
534
|
+
=========================================
|
535
|
+
***************************************** */
|
536
|
+
|
537
|
+
/***************************************************
|
538
|
+
NAME : ReplaceClassNameWithReference
|
539
|
+
DESCRIPTION : In parsing a make instance call,
|
540
|
+
this function replaces a constant
|
541
|
+
class name with an actual pointer
|
542
|
+
to the class
|
543
|
+
INPUTS : The expression
|
544
|
+
RETURNS : True if all OK, false
|
545
|
+
if class cannot be found
|
546
|
+
SIDE EFFECTS : The expression type and value are
|
547
|
+
modified if class is found
|
548
|
+
NOTES : Searches current nd imported
|
549
|
+
modules for reference
|
550
|
+
CHANGES : It's now possible to create an instance of a
|
551
|
+
class that's not in scope if the module name
|
552
|
+
is specified.
|
553
|
+
***************************************************/
|
554
|
+
static bool ReplaceClassNameWithReference(
|
555
|
+
Environment *theEnv,
|
556
|
+
Expression *theExp)
|
557
|
+
{
|
558
|
+
const char *theClassName;
|
559
|
+
Defclass *theDefclass;
|
560
|
+
|
561
|
+
if (theExp->type == SYMBOL_TYPE)
|
562
|
+
{
|
563
|
+
theClassName = theExp->lexemeValue->contents;
|
564
|
+
//theDefclass = (void *) LookupDefclassInScope(theEnv,theClassName);
|
565
|
+
theDefclass = LookupDefclassByMdlOrScope(theEnv,theClassName); // Module or scope is now allowed
|
566
|
+
if (theDefclass == NULL)
|
567
|
+
{
|
568
|
+
CantFindItemErrorMessage(theEnv,"class",theClassName,true);
|
569
|
+
return false;
|
570
|
+
}
|
571
|
+
if (ClassAbstractP(theDefclass))
|
572
|
+
{
|
573
|
+
PrintErrorID(theEnv,"INSMNGR",3,false);
|
574
|
+
WriteString(theEnv,STDERR,"Cannot create instances of abstract class '");
|
575
|
+
WriteString(theEnv,STDERR,theClassName);
|
576
|
+
WriteString(theEnv,STDERR,"'.\n");
|
577
|
+
return false;
|
578
|
+
}
|
579
|
+
if (theDefclass == DefclassData(theEnv)->RedefiningClass)
|
580
|
+
{
|
581
|
+
PrintErrorID(theEnv,"INSMNGR",17,false);
|
582
|
+
WriteString(theEnv,STDERR,"Cannot reference class '");
|
583
|
+
WriteString(theEnv,STDERR,theClassName);
|
584
|
+
WriteString(theEnv,STDERR,"' while it's being redefined.\n");
|
585
|
+
return false;
|
586
|
+
}
|
587
|
+
|
588
|
+
theExp->type = DEFCLASS_PTR;
|
589
|
+
theExp->value = theDefclass;
|
590
|
+
|
591
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
592
|
+
if (! ConstructData(theEnv)->ParsingConstruct)
|
593
|
+
{ ConstructData(theEnv)->DanglingConstructs++; }
|
594
|
+
#endif
|
595
|
+
}
|
596
|
+
return true;
|
597
|
+
}
|
598
|
+
|
599
|
+
#endif
|
600
|
+
|
601
|
+
|
602
|
+
|