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,155 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 11/01/16 */
|
5
|
+
/* */
|
6
|
+
/* DEFFUNCTION HEADER FILE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* Gary D. Riley */
|
15
|
+
/* */
|
16
|
+
/* Contributing Programmer(s): */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
21
|
+
/* */
|
22
|
+
/* Corrected compilation errors for files */
|
23
|
+
/* generated by constructs-to-c. DR0861 */
|
24
|
+
/* */
|
25
|
+
/* Changed name of variable log to logName */
|
26
|
+
/* because of Unix compiler warnings of shadowed */
|
27
|
+
/* definitions. */
|
28
|
+
/* */
|
29
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
30
|
+
/* */
|
31
|
+
/* Corrected code to remove run-time program */
|
32
|
+
/* compiler warning. */
|
33
|
+
/* */
|
34
|
+
/* 6.30: Removed conditional code for unsupported */
|
35
|
+
/* compilers/operating systems (IBM_MCW, */
|
36
|
+
/* MAC_MCW, and IBM_TBC). */
|
37
|
+
/* */
|
38
|
+
/* Changed integer type/precision. */
|
39
|
+
/* */
|
40
|
+
/* Added missing initializer for ENTITY_RECORD. */
|
41
|
+
/* */
|
42
|
+
/* Added const qualifiers to remove C++ */
|
43
|
+
/* deprecation warnings. */
|
44
|
+
/* */
|
45
|
+
/* Converted API macros to function calls. */
|
46
|
+
/* */
|
47
|
+
/* Changed find construct functionality so that */
|
48
|
+
/* imported modules are search when locating a */
|
49
|
+
/* named construct. */
|
50
|
+
/* */
|
51
|
+
/* 6.40: Removed LOCALE definition. */
|
52
|
+
/* */
|
53
|
+
/* Pragma once and other inclusion changes. */
|
54
|
+
/* */
|
55
|
+
/* Added support for booleans with <stdbool.h>. */
|
56
|
+
/* */
|
57
|
+
/* Removed use of void pointers for specific */
|
58
|
+
/* data structures. */
|
59
|
+
/* */
|
60
|
+
/* ALLOW_ENVIRONMENT_GLOBALS no longer supported. */
|
61
|
+
/* */
|
62
|
+
/* UDF redesign. */
|
63
|
+
/* */
|
64
|
+
/*************************************************************/
|
65
|
+
|
66
|
+
#ifndef _H_dffnxfun
|
67
|
+
|
68
|
+
#pragma once
|
69
|
+
|
70
|
+
#define _H_dffnxfun
|
71
|
+
|
72
|
+
typedef struct deffunction Deffunction;
|
73
|
+
typedef struct deffunctionModuleData DeffunctionModuleData;
|
74
|
+
|
75
|
+
#include "entities.h"
|
76
|
+
#include "moduldef.h"
|
77
|
+
#include "constrct.h"
|
78
|
+
#include "evaluatn.h"
|
79
|
+
|
80
|
+
struct deffunctionModuleData
|
81
|
+
{
|
82
|
+
struct defmoduleItemHeader header;
|
83
|
+
};
|
84
|
+
|
85
|
+
struct deffunction
|
86
|
+
{
|
87
|
+
ConstructHeader header;
|
88
|
+
unsigned busy;
|
89
|
+
unsigned executing;
|
90
|
+
bool trace;
|
91
|
+
Expression *code;
|
92
|
+
unsigned short minNumberOfParameters;
|
93
|
+
unsigned short maxNumberOfParameters;
|
94
|
+
unsigned short numberOfLocalVars;
|
95
|
+
};
|
96
|
+
|
97
|
+
#define DEFFUNCTION_DATA 23
|
98
|
+
|
99
|
+
struct deffunctionData
|
100
|
+
{
|
101
|
+
Construct *DeffunctionConstruct;
|
102
|
+
unsigned DeffunctionModuleIndex;
|
103
|
+
EntityRecord DeffunctionEntityRecord;
|
104
|
+
#if DEBUGGING_FUNCTIONS
|
105
|
+
bool WatchDeffunctions;
|
106
|
+
#endif
|
107
|
+
struct CodeGeneratorItem *DeffunctionCodeItem;
|
108
|
+
Deffunction *ExecutingDeffunction;
|
109
|
+
};
|
110
|
+
|
111
|
+
#define DeffunctionData(theEnv) ((struct deffunctionData *) GetEnvironmentData(theEnv,DEFFUNCTION_DATA))
|
112
|
+
|
113
|
+
bool CheckDeffunctionCall(Environment *,Deffunction *,int);
|
114
|
+
void DeffunctionGetBind(UDFValue *);
|
115
|
+
void DFRtnUnknown(UDFValue *);
|
116
|
+
void DFWildargs(UDFValue *);
|
117
|
+
const char *DeffunctionModule(Deffunction *);
|
118
|
+
Deffunction *FindDeffunction(Environment *,const char *);
|
119
|
+
Deffunction *FindDeffunctionInModule(Environment *,const char *);
|
120
|
+
void GetDeffunctionList(Environment *,CLIPSValue *,Defmodule *);
|
121
|
+
const char *DeffunctionName(Deffunction *);
|
122
|
+
CLIPSLexeme *GetDeffunctionNamePointer(Environment *,Deffunction *);
|
123
|
+
const char *DeffunctionPPForm(Deffunction *);
|
124
|
+
Deffunction *GetNextDeffunction(Environment *,Deffunction *);
|
125
|
+
bool DeffunctionIsDeletable(Deffunction *);
|
126
|
+
void SetDeffunctionPPForm(Environment *,Deffunction *,const char *);
|
127
|
+
bool Undeffunction(Deffunction *,Environment *);
|
128
|
+
void GetDeffunctionListFunction(Environment *,UDFContext *,UDFValue *);
|
129
|
+
void GetDeffunctionModuleCommand(Environment *,UDFContext *,UDFValue *);
|
130
|
+
Deffunction *LookupDeffunctionByMdlOrScope(Environment *,const char *);
|
131
|
+
Deffunction *LookupDeffunctionInScope(Environment *,const char *);
|
132
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME)
|
133
|
+
void RemoveDeffunction(Environment *,Deffunction *);
|
134
|
+
#endif
|
135
|
+
void SetupDeffunctions(Environment *);
|
136
|
+
void UndeffunctionCommand(Environment *,UDFContext *,UDFValue *);
|
137
|
+
#if DEBUGGING_FUNCTIONS
|
138
|
+
bool DeffunctionGetWatch(Deffunction *);
|
139
|
+
void ListDeffunctions(Environment *,const char *,Defmodule *);
|
140
|
+
void DeffunctionSetWatch(Deffunction *,bool);
|
141
|
+
void ListDeffunctionsCommand(Environment *,UDFContext *,UDFValue *);
|
142
|
+
void PPDeffunctionCommand(Environment *,UDFContext *,UDFValue *);
|
143
|
+
#endif
|
144
|
+
|
145
|
+
#if RUN_TIME
|
146
|
+
void DeffunctionRunTimeInitialize(Environment *);
|
147
|
+
#endif
|
148
|
+
|
149
|
+
#endif /* _H_dffnxfun */
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
|
@@ -0,0 +1,514 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 07/23/20 */
|
5
|
+
/* */
|
6
|
+
/* */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Deffunction Parsing Routines */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* Gary D. Riley */
|
17
|
+
/* */
|
18
|
+
/* Revision History: */
|
19
|
+
/* */
|
20
|
+
/* 6.24: Renamed BOOLEAN macro type to intBool. */
|
21
|
+
/* */
|
22
|
+
/* If the last construct in a loaded file is a */
|
23
|
+
/* deffunction or defmethod with no closing right */
|
24
|
+
/* parenthesis, an error should be issued, but is */
|
25
|
+
/* not. DR0872 */
|
26
|
+
/* */
|
27
|
+
/* Added pragmas to prevent unused variable */
|
28
|
+
/* warnings. */
|
29
|
+
/* */
|
30
|
+
/* 6.30: Removed conditional code for unsupported */
|
31
|
+
/* compilers/operating systems (IBM_MCW, */
|
32
|
+
/* MAC_MCW, and IBM_TBC). */
|
33
|
+
/* */
|
34
|
+
/* ENVIRONMENT_API_ONLY no longer supported. */
|
35
|
+
/* */
|
36
|
+
/* GetConstructNameAndComment API change. */
|
37
|
+
/* */
|
38
|
+
/* Added const qualifiers to remove C++ */
|
39
|
+
/* deprecation warnings. */
|
40
|
+
/* */
|
41
|
+
/* Converted API macros to function calls. */
|
42
|
+
/* */
|
43
|
+
/* Changed find construct functionality so that */
|
44
|
+
/* imported modules are search when locating a */
|
45
|
+
/* named construct. */
|
46
|
+
/* */
|
47
|
+
/* 6.32: Fixed typo in error ID. */
|
48
|
+
/* */
|
49
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
50
|
+
/* */
|
51
|
+
/* Added support for booleans with <stdbool.h>. */
|
52
|
+
/* */
|
53
|
+
/* Removed use of void pointers for specific */
|
54
|
+
/* data structures. */
|
55
|
+
/* */
|
56
|
+
/*************************************************************/
|
57
|
+
|
58
|
+
/* =========================================
|
59
|
+
*****************************************
|
60
|
+
EXTERNAL DEFINITIONS
|
61
|
+
=========================================
|
62
|
+
***************************************** */
|
63
|
+
#include "setup.h"
|
64
|
+
|
65
|
+
#if DEFFUNCTION_CONSTRUCT && (! BLOAD_ONLY) && (! RUN_TIME)
|
66
|
+
|
67
|
+
#if BLOAD || BLOAD_AND_BSAVE
|
68
|
+
#include "bload.h"
|
69
|
+
#endif
|
70
|
+
|
71
|
+
#if DEFRULE_CONSTRUCT
|
72
|
+
#include "network.h"
|
73
|
+
#endif
|
74
|
+
|
75
|
+
#if DEFGENERIC_CONSTRUCT
|
76
|
+
#include "genrccom.h"
|
77
|
+
#endif
|
78
|
+
|
79
|
+
#include "constant.h"
|
80
|
+
#include "cstrccom.h"
|
81
|
+
#include "cstrcpsr.h"
|
82
|
+
#include "constrct.h"
|
83
|
+
#include "dffnxfun.h"
|
84
|
+
#include "envrnmnt.h"
|
85
|
+
#include "expressn.h"
|
86
|
+
#include "exprnpsr.h"
|
87
|
+
#include "memalloc.h"
|
88
|
+
#include "modulutl.h"
|
89
|
+
#include "pprint.h"
|
90
|
+
#include "prccode.h"
|
91
|
+
#include "prntutil.h"
|
92
|
+
#include "router.h"
|
93
|
+
#include "scanner.h"
|
94
|
+
#include "symbol.h"
|
95
|
+
|
96
|
+
#include "dffnxpsr.h"
|
97
|
+
|
98
|
+
/***************************************/
|
99
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
100
|
+
/***************************************/
|
101
|
+
|
102
|
+
static bool ValidDeffunctionName(Environment *,const char *);
|
103
|
+
static Deffunction *AddDeffunction(Environment *,CLIPSLexeme *,Expression *,unsigned short,unsigned short,unsigned short,bool);
|
104
|
+
|
105
|
+
/***************************************************************************
|
106
|
+
NAME : ParseDeffunction
|
107
|
+
DESCRIPTION : Parses the deffunction construct
|
108
|
+
INPUTS : The input logical name
|
109
|
+
RETURNS : False if successful parse, true otherwise
|
110
|
+
SIDE EFFECTS : Creates valid deffunction definition
|
111
|
+
NOTES : H/L Syntax :
|
112
|
+
(deffunction <name> [<comment>]
|
113
|
+
(<single-field-varible>* [<multifield-variable>])
|
114
|
+
<action>*)
|
115
|
+
***************************************************************************/
|
116
|
+
bool ParseDeffunction(
|
117
|
+
Environment *theEnv,
|
118
|
+
const char *readSource)
|
119
|
+
{
|
120
|
+
CLIPSLexeme *deffunctionName;
|
121
|
+
Expression *actions;
|
122
|
+
Expression *parameterList;
|
123
|
+
CLIPSLexeme *wildcard;
|
124
|
+
unsigned short min, max;
|
125
|
+
unsigned short lvars;
|
126
|
+
bool deffunctionError = false;
|
127
|
+
bool overwrite = false;
|
128
|
+
unsigned short owMin = 0, owMax = 0;
|
129
|
+
Deffunction *dptr;
|
130
|
+
struct token inputToken;
|
131
|
+
|
132
|
+
SetPPBufferStatus(theEnv,true);
|
133
|
+
|
134
|
+
FlushPPBuffer(theEnv);
|
135
|
+
SetIndentDepth(theEnv,3);
|
136
|
+
SavePPBuffer(theEnv,"(deffunction ");
|
137
|
+
|
138
|
+
#if BLOAD || BLOAD_AND_BSAVE
|
139
|
+
if ((Bloaded(theEnv) == true) && (! ConstructData(theEnv)->CheckSyntaxMode))
|
140
|
+
{
|
141
|
+
CannotLoadWithBloadMessage(theEnv,"deffunctions");
|
142
|
+
return true;
|
143
|
+
}
|
144
|
+
#endif
|
145
|
+
|
146
|
+
/*=======================================================*/
|
147
|
+
/* Parse the name and comment fields of the deffunction. */
|
148
|
+
/*=======================================================*/
|
149
|
+
|
150
|
+
deffunctionName = GetConstructNameAndComment(theEnv,readSource,&inputToken,"deffunction",
|
151
|
+
(FindConstructFunction *) FindDeffunctionInModule,
|
152
|
+
NULL,
|
153
|
+
"!",true,true,true,false);
|
154
|
+
|
155
|
+
if (deffunctionName == NULL)
|
156
|
+
{ return true; }
|
157
|
+
|
158
|
+
if (ValidDeffunctionName(theEnv,deffunctionName->contents) == false)
|
159
|
+
{ return true; }
|
160
|
+
|
161
|
+
/*==========================*/
|
162
|
+
/* Parse the argument list. */
|
163
|
+
/*==========================*/
|
164
|
+
|
165
|
+
parameterList = ParseProcParameters(theEnv,readSource,&inputToken,
|
166
|
+
NULL,&wildcard,&min,&max,&deffunctionError,NULL);
|
167
|
+
if (deffunctionError)
|
168
|
+
{ return true; }
|
169
|
+
|
170
|
+
/*===================================================================*/
|
171
|
+
/* Go ahead and add the deffunction so it can be recursively called. */
|
172
|
+
/*===================================================================*/
|
173
|
+
|
174
|
+
if (ConstructData(theEnv)->CheckSyntaxMode)
|
175
|
+
{
|
176
|
+
dptr = FindDeffunctionInModule(theEnv,deffunctionName->contents);
|
177
|
+
if (dptr == NULL)
|
178
|
+
{ dptr = AddDeffunction(theEnv,deffunctionName,NULL,min,max,0,true); }
|
179
|
+
else
|
180
|
+
{
|
181
|
+
overwrite = true;
|
182
|
+
owMin = dptr->minNumberOfParameters;
|
183
|
+
owMax = dptr->maxNumberOfParameters;
|
184
|
+
dptr->minNumberOfParameters = min;
|
185
|
+
dptr->maxNumberOfParameters = max;
|
186
|
+
}
|
187
|
+
}
|
188
|
+
else
|
189
|
+
{ dptr = AddDeffunction(theEnv,deffunctionName,NULL,min,max,0,true); }
|
190
|
+
|
191
|
+
if (dptr == NULL)
|
192
|
+
{
|
193
|
+
ReturnExpression(theEnv,parameterList);
|
194
|
+
return true;
|
195
|
+
}
|
196
|
+
|
197
|
+
/*==================================================*/
|
198
|
+
/* Parse the actions contained within the function. */
|
199
|
+
/*==================================================*/
|
200
|
+
|
201
|
+
PPCRAndIndent(theEnv);
|
202
|
+
|
203
|
+
ExpressionData(theEnv)->ReturnContext = true;
|
204
|
+
actions = ParseProcActions(theEnv,"deffunction",readSource,
|
205
|
+
&inputToken,parameterList,wildcard,
|
206
|
+
NULL,NULL,&lvars,NULL);
|
207
|
+
|
208
|
+
/*=============================================================*/
|
209
|
+
/* Check for the closing right parenthesis of the deffunction. */
|
210
|
+
/*=============================================================*/
|
211
|
+
|
212
|
+
if ((inputToken.tknType != RIGHT_PARENTHESIS_TOKEN) && /* DR0872 */
|
213
|
+
(actions != NULL))
|
214
|
+
{
|
215
|
+
SyntaxErrorMessage(theEnv,"deffunction");
|
216
|
+
|
217
|
+
ReturnExpression(theEnv,parameterList);
|
218
|
+
ReturnPackedExpression(theEnv,actions);
|
219
|
+
|
220
|
+
if (overwrite)
|
221
|
+
{
|
222
|
+
dptr->minNumberOfParameters = owMin;
|
223
|
+
dptr->maxNumberOfParameters = owMax;
|
224
|
+
}
|
225
|
+
|
226
|
+
if ((dptr->busy == 0) && (! overwrite))
|
227
|
+
{
|
228
|
+
RemoveConstructFromModule(theEnv,&dptr->header);
|
229
|
+
RemoveDeffunction(theEnv,dptr);
|
230
|
+
}
|
231
|
+
|
232
|
+
return true;
|
233
|
+
}
|
234
|
+
|
235
|
+
if (actions == NULL)
|
236
|
+
{
|
237
|
+
ReturnExpression(theEnv,parameterList);
|
238
|
+
if (overwrite)
|
239
|
+
{
|
240
|
+
dptr->minNumberOfParameters = owMin;
|
241
|
+
dptr->maxNumberOfParameters = owMax;
|
242
|
+
}
|
243
|
+
|
244
|
+
if ((dptr->busy == 0) && (! overwrite))
|
245
|
+
{
|
246
|
+
RemoveConstructFromModule(theEnv,&dptr->header);
|
247
|
+
RemoveDeffunction(theEnv,dptr);
|
248
|
+
}
|
249
|
+
return true;
|
250
|
+
}
|
251
|
+
|
252
|
+
/*==============================================*/
|
253
|
+
/* If we're only checking syntax, don't add the */
|
254
|
+
/* successfully parsed deffunction to the KB. */
|
255
|
+
/*==============================================*/
|
256
|
+
|
257
|
+
if (ConstructData(theEnv)->CheckSyntaxMode)
|
258
|
+
{
|
259
|
+
ReturnExpression(theEnv,parameterList);
|
260
|
+
ReturnPackedExpression(theEnv,actions);
|
261
|
+
if (overwrite)
|
262
|
+
{
|
263
|
+
dptr->minNumberOfParameters = owMin;
|
264
|
+
dptr->maxNumberOfParameters = owMax;
|
265
|
+
}
|
266
|
+
else
|
267
|
+
{
|
268
|
+
RemoveConstructFromModule(theEnv,&dptr->header);
|
269
|
+
RemoveDeffunction(theEnv,dptr);
|
270
|
+
}
|
271
|
+
return false;
|
272
|
+
}
|
273
|
+
|
274
|
+
/*=============================*/
|
275
|
+
/* Reformat the closing token. */
|
276
|
+
/*=============================*/
|
277
|
+
|
278
|
+
PPBackup(theEnv);
|
279
|
+
PPBackup(theEnv);
|
280
|
+
SavePPBuffer(theEnv,inputToken.printForm);
|
281
|
+
SavePPBuffer(theEnv,"\n");
|
282
|
+
|
283
|
+
/*======================*/
|
284
|
+
/* Add the deffunction. */
|
285
|
+
/*======================*/
|
286
|
+
|
287
|
+
AddDeffunction(theEnv,deffunctionName,actions,min,max,lvars,false);
|
288
|
+
|
289
|
+
ReturnExpression(theEnv,parameterList);
|
290
|
+
|
291
|
+
return(deffunctionError);
|
292
|
+
}
|
293
|
+
|
294
|
+
/* =========================================
|
295
|
+
*****************************************
|
296
|
+
INTERNALLY VISIBLE FUNCTIONS
|
297
|
+
=========================================
|
298
|
+
***************************************** */
|
299
|
+
|
300
|
+
/************************************************************
|
301
|
+
NAME : ValidDeffunctionName
|
302
|
+
DESCRIPTION : Determines if a new deffunction of the given
|
303
|
+
name can be defined in the current module
|
304
|
+
INPUTS : The new deffunction name
|
305
|
+
RETURNS : True if OK, false otherwise
|
306
|
+
SIDE EFFECTS : Error message printed if not OK
|
307
|
+
NOTES : GetConstructNameAndComment() (called before
|
308
|
+
this function) ensures that the deffunction
|
309
|
+
name does not conflict with one from
|
310
|
+
another module
|
311
|
+
************************************************************/
|
312
|
+
static bool ValidDeffunctionName(
|
313
|
+
Environment *theEnv,
|
314
|
+
const char *theDeffunctionName)
|
315
|
+
{
|
316
|
+
Deffunction *theDeffunction;
|
317
|
+
#if DEFGENERIC_CONSTRUCT
|
318
|
+
Defmodule *theModule;
|
319
|
+
Defgeneric *theDefgeneric;
|
320
|
+
#endif
|
321
|
+
|
322
|
+
/*==============================================*/
|
323
|
+
/* A deffunction cannot be named the same as a */
|
324
|
+
/* construct type, e.g, defclass, defrule, etc. */
|
325
|
+
/*==============================================*/
|
326
|
+
|
327
|
+
if (FindConstruct(theEnv,theDeffunctionName) != NULL)
|
328
|
+
{
|
329
|
+
PrintErrorID(theEnv,"DFFNXPSR",1,false);
|
330
|
+
WriteString(theEnv,STDERR,"Deffunctions are not allowed to replace constructs.\n");
|
331
|
+
return false;
|
332
|
+
}
|
333
|
+
|
334
|
+
/*========================================*/
|
335
|
+
/* A deffunction cannot be named the same */
|
336
|
+
/* as a pre-defined system function, e.g, */
|
337
|
+
/* watch, list-defrules, etc. */
|
338
|
+
/*========================================*/
|
339
|
+
|
340
|
+
if (FindFunction(theEnv,theDeffunctionName) != NULL)
|
341
|
+
{
|
342
|
+
PrintErrorID(theEnv,"DFFNXPSR",2,false);
|
343
|
+
WriteString(theEnv,STDERR,"Deffunctions are not allowed to replace external functions.\n");
|
344
|
+
return false;
|
345
|
+
}
|
346
|
+
|
347
|
+
#if DEFGENERIC_CONSTRUCT
|
348
|
+
|
349
|
+
/*===========================================*/
|
350
|
+
/* A deffunction cannot be named the same as */
|
351
|
+
/* a generic function (either in this module */
|
352
|
+
/* or imported from another). */
|
353
|
+
/*===========================================*/
|
354
|
+
|
355
|
+
theDefgeneric = LookupDefgenericInScope(theEnv,theDeffunctionName);
|
356
|
+
|
357
|
+
if (theDefgeneric != NULL)
|
358
|
+
{
|
359
|
+
theModule = GetConstructModuleItem(&theDefgeneric->header)->theModule;
|
360
|
+
if (theModule != GetCurrentModule(theEnv))
|
361
|
+
{
|
362
|
+
PrintErrorID(theEnv,"DFFNXPSR",5,false);
|
363
|
+
WriteString(theEnv,STDERR,"Defgeneric ");
|
364
|
+
WriteString(theEnv,STDERR,DefgenericName(theDefgeneric));
|
365
|
+
WriteString(theEnv,STDERR," imported from module ");
|
366
|
+
WriteString(theEnv,STDERR,DefmoduleName(theModule));
|
367
|
+
WriteString(theEnv,STDERR," conflicts with this deffunction.\n");
|
368
|
+
return false;
|
369
|
+
}
|
370
|
+
else
|
371
|
+
{
|
372
|
+
PrintErrorID(theEnv,"DFFNXPSR",3,false);
|
373
|
+
WriteString(theEnv,STDERR,"Deffunctions are not allowed to replace generic functions.\n");
|
374
|
+
}
|
375
|
+
return false;
|
376
|
+
}
|
377
|
+
#endif
|
378
|
+
|
379
|
+
theDeffunction = FindDeffunctionInModule(theEnv,theDeffunctionName);
|
380
|
+
if (theDeffunction != NULL)
|
381
|
+
{
|
382
|
+
/*=============================================*/
|
383
|
+
/* And a deffunction in the current module can */
|
384
|
+
/* only be redefined if it is not executing. */
|
385
|
+
/*=============================================*/
|
386
|
+
|
387
|
+
if (theDeffunction->executing)
|
388
|
+
{
|
389
|
+
PrintErrorID(theEnv,"DFFNXPSR",4,false);
|
390
|
+
WriteString(theEnv,STDERR,"Deffunction '");
|
391
|
+
WriteString(theEnv,STDERR,DeffunctionName(theDeffunction));
|
392
|
+
WriteString(theEnv,STDERR,"' may not be redefined while it is executing.\n");
|
393
|
+
return false;
|
394
|
+
}
|
395
|
+
}
|
396
|
+
return true;
|
397
|
+
}
|
398
|
+
|
399
|
+
/****************************************************
|
400
|
+
NAME : AddDeffunction
|
401
|
+
DESCRIPTION : Adds a deffunction to the list of
|
402
|
+
deffunctions
|
403
|
+
INPUTS : 1) The symbolic name
|
404
|
+
2) The action expressions
|
405
|
+
3) The minimum number of arguments
|
406
|
+
4) The maximum number of arguments
|
407
|
+
(can be -1)
|
408
|
+
5) The number of local variables
|
409
|
+
6) A flag indicating if this is
|
410
|
+
a header call so that the
|
411
|
+
deffunction can be recursively
|
412
|
+
called
|
413
|
+
RETURNS : The new deffunction (NULL on errors)
|
414
|
+
SIDE EFFECTS : Deffunction structures allocated
|
415
|
+
NOTES : Assumes deffunction is not executing
|
416
|
+
****************************************************/
|
417
|
+
static Deffunction *AddDeffunction(
|
418
|
+
Environment *theEnv,
|
419
|
+
CLIPSLexeme *name,
|
420
|
+
Expression *actions,
|
421
|
+
unsigned short min,
|
422
|
+
unsigned short max,
|
423
|
+
unsigned short lvars,
|
424
|
+
bool headerp)
|
425
|
+
{
|
426
|
+
Deffunction *dfuncPtr;
|
427
|
+
unsigned oldbusy;
|
428
|
+
#if DEBUGGING_FUNCTIONS
|
429
|
+
bool DFHadWatch = false;
|
430
|
+
#else
|
431
|
+
#if MAC_XCD
|
432
|
+
#pragma unused(headerp)
|
433
|
+
#endif
|
434
|
+
#endif
|
435
|
+
|
436
|
+
/*===============================================================*/
|
437
|
+
/* If the deffunction doesn't exist, create a new structure to */
|
438
|
+
/* contain it and add it to the List of deffunctions. Otherwise, */
|
439
|
+
/* use the existing structure and remove the pretty print form */
|
440
|
+
/* and interpretive code. */
|
441
|
+
/*===============================================================*/
|
442
|
+
|
443
|
+
dfuncPtr = FindDeffunctionInModule(theEnv,name->contents);
|
444
|
+
if (dfuncPtr == NULL)
|
445
|
+
{
|
446
|
+
dfuncPtr = get_struct(theEnv,deffunction);
|
447
|
+
InitializeConstructHeader(theEnv,"deffunction",DEFFUNCTION,&dfuncPtr->header,name);
|
448
|
+
IncrementLexemeCount(name);
|
449
|
+
dfuncPtr->code = NULL;
|
450
|
+
dfuncPtr->minNumberOfParameters = min;
|
451
|
+
dfuncPtr->maxNumberOfParameters = max;
|
452
|
+
dfuncPtr->numberOfLocalVars = lvars;
|
453
|
+
dfuncPtr->busy = 0;
|
454
|
+
dfuncPtr->executing = 0;
|
455
|
+
}
|
456
|
+
else
|
457
|
+
{
|
458
|
+
#if DEBUGGING_FUNCTIONS
|
459
|
+
DFHadWatch = DeffunctionGetWatch(dfuncPtr);
|
460
|
+
#endif
|
461
|
+
dfuncPtr->minNumberOfParameters = min;
|
462
|
+
dfuncPtr->maxNumberOfParameters = max;
|
463
|
+
dfuncPtr->numberOfLocalVars = lvars;
|
464
|
+
oldbusy = dfuncPtr->busy;
|
465
|
+
ExpressionDeinstall(theEnv,dfuncPtr->code);
|
466
|
+
dfuncPtr->busy = oldbusy;
|
467
|
+
ReturnPackedExpression(theEnv,dfuncPtr->code);
|
468
|
+
dfuncPtr->code = NULL;
|
469
|
+
SetDeffunctionPPForm(theEnv,dfuncPtr,NULL);
|
470
|
+
|
471
|
+
/*======================================*/
|
472
|
+
/* Remove the deffunction from the list */
|
473
|
+
/* so that it can be added at the end. */
|
474
|
+
/*======================================*/
|
475
|
+
|
476
|
+
RemoveConstructFromModule(theEnv,&dfuncPtr->header);
|
477
|
+
}
|
478
|
+
|
479
|
+
AddConstructToModule(&dfuncPtr->header);
|
480
|
+
|
481
|
+
/*====================================*/
|
482
|
+
/* Install the new interpretive code. */
|
483
|
+
/*====================================*/
|
484
|
+
|
485
|
+
if (actions != NULL)
|
486
|
+
{
|
487
|
+
/*=================================================*/
|
488
|
+
/* If a deffunction is recursive, do not increment */
|
489
|
+
/* its busy count based on self-references. */
|
490
|
+
/*=================================================*/
|
491
|
+
|
492
|
+
oldbusy = dfuncPtr->busy;
|
493
|
+
ExpressionInstall(theEnv,actions);
|
494
|
+
dfuncPtr->busy = oldbusy;
|
495
|
+
dfuncPtr->code = actions;
|
496
|
+
}
|
497
|
+
|
498
|
+
/*==================================*/
|
499
|
+
/* Install the pretty print form if */
|
500
|
+
/* memory is not being conserved. */
|
501
|
+
/*==================================*/
|
502
|
+
|
503
|
+
#if DEBUGGING_FUNCTIONS
|
504
|
+
DeffunctionSetWatch(dfuncPtr,DFHadWatch ? true : DeffunctionData(theEnv)->WatchDeffunctions);
|
505
|
+
|
506
|
+
if ((GetConserveMemory(theEnv) == false) && (headerp == false))
|
507
|
+
{ SetDeffunctionPPForm(theEnv,dfuncPtr,CopyPPBuffer(theEnv)); }
|
508
|
+
#endif
|
509
|
+
|
510
|
+
return dfuncPtr;
|
511
|
+
}
|
512
|
+
|
513
|
+
#endif /* DEFFUNCTION_CONSTRUCT && (! BLOAD_ONLY) && (! RUN_TIME) */
|
514
|
+
|