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,599 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 07/30/16 */
|
5
|
+
/* */
|
6
|
+
/* RULE DELETION MODULE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Provides routines for deleting a rule including */
|
11
|
+
/* freeing the defrule data structures and removing the */
|
12
|
+
/* appropriate joins from the join network. */
|
13
|
+
/* */
|
14
|
+
/* Principal Programmer(s): */
|
15
|
+
/* Gary D. Riley */
|
16
|
+
/* */
|
17
|
+
/* Contributing Programmer(s): */
|
18
|
+
/* */
|
19
|
+
/* Revision History: */
|
20
|
+
/* */
|
21
|
+
/* 6.24: Removed DYNAMIC_SALIENCE compilation flag. */
|
22
|
+
/* */
|
23
|
+
/* Renamed BOOLEAN macro type to intBool. */
|
24
|
+
/* */
|
25
|
+
/* 6.30: Removed conditional code for unsupported */
|
26
|
+
/* compilers/operating systems (IBM_MCW and */
|
27
|
+
/* MAC_MCW). */
|
28
|
+
/* */
|
29
|
+
/* Added support for hashed memories. */
|
30
|
+
/* */
|
31
|
+
/* Fixed linkage issue when BLOAD_ONLY compiler */
|
32
|
+
/* flag is set to 1. */
|
33
|
+
/* */
|
34
|
+
/* 6.40: Pragma once and other inclusion changes. */
|
35
|
+
/* */
|
36
|
+
/* Added support for booleans with <stdbool.h>. */
|
37
|
+
/* */
|
38
|
+
/* Removed use of void pointers for specific */
|
39
|
+
/* data structures. */
|
40
|
+
/* */
|
41
|
+
/*************************************************************/
|
42
|
+
|
43
|
+
#include "setup.h"
|
44
|
+
|
45
|
+
#if DEFRULE_CONSTRUCT
|
46
|
+
|
47
|
+
#include <stdio.h>
|
48
|
+
#include <string.h>
|
49
|
+
|
50
|
+
#include "agenda.h"
|
51
|
+
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
|
52
|
+
#include "bload.h"
|
53
|
+
#endif
|
54
|
+
#include "constrct.h"
|
55
|
+
#include "drive.h"
|
56
|
+
#include "engine.h"
|
57
|
+
#include "envrnmnt.h"
|
58
|
+
#include "memalloc.h"
|
59
|
+
#include "pattern.h"
|
60
|
+
#include "reteutil.h"
|
61
|
+
#include "retract.h"
|
62
|
+
|
63
|
+
#include "ruledlt.h"
|
64
|
+
|
65
|
+
/***************************************/
|
66
|
+
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
|
67
|
+
/***************************************/
|
68
|
+
|
69
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
70
|
+
static void RemoveIntranetworkLink(Environment *,struct joinNode *);
|
71
|
+
#endif
|
72
|
+
static void DetachJoins(Environment *,struct joinNode *,bool);
|
73
|
+
static void DetachJoinsDriver(Environment *,Defrule *,bool);
|
74
|
+
|
75
|
+
/**********************************************************************/
|
76
|
+
/* ReturnDefrule: Returns a defrule data structure and its associated */
|
77
|
+
/* data structures to the memory manager. Note that the first */
|
78
|
+
/* disjunct of a rule is the only disjunct which allocates storage */
|
79
|
+
/* for the rule's dynamic salience and pretty print form (so these */
|
80
|
+
/* are only deallocated for the first disjunct). */
|
81
|
+
/**********************************************************************/
|
82
|
+
void ReturnDefrule(
|
83
|
+
Environment *theEnv,
|
84
|
+
Defrule *theDefrule)
|
85
|
+
{
|
86
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
87
|
+
bool first = true;
|
88
|
+
Defrule *nextPtr, *tmpPtr;
|
89
|
+
|
90
|
+
if (theDefrule == NULL) return;
|
91
|
+
|
92
|
+
/*======================================*/
|
93
|
+
/* If a rule is redefined, then we want */
|
94
|
+
/* to save its breakpoint status. */
|
95
|
+
/*======================================*/
|
96
|
+
|
97
|
+
#if DEBUGGING_FUNCTIONS
|
98
|
+
DefruleData(theEnv)->DeletedRuleDebugFlags = 0;
|
99
|
+
if (theDefrule->afterBreakpoint) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,0);
|
100
|
+
if (theDefrule->watchActivation) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,1);
|
101
|
+
if (theDefrule->watchFiring) BitwiseSet(DefruleData(theEnv)->DeletedRuleDebugFlags,2);
|
102
|
+
#endif
|
103
|
+
|
104
|
+
/*================================*/
|
105
|
+
/* Clear the agenda of all the */
|
106
|
+
/* activations added by the rule. */
|
107
|
+
/*================================*/
|
108
|
+
|
109
|
+
ClearRuleFromAgenda(theEnv,theDefrule);
|
110
|
+
|
111
|
+
/*======================*/
|
112
|
+
/* Get rid of the rule. */
|
113
|
+
/*======================*/
|
114
|
+
|
115
|
+
while (theDefrule != NULL)
|
116
|
+
{
|
117
|
+
/*================================================*/
|
118
|
+
/* Remove the rule's joins from the join network. */
|
119
|
+
/*================================================*/
|
120
|
+
|
121
|
+
DetachJoinsDriver(theEnv,theDefrule,false);
|
122
|
+
|
123
|
+
/*=============================================*/
|
124
|
+
/* If this is the first disjunct, get rid of */
|
125
|
+
/* the dynamic salience and pretty print form. */
|
126
|
+
/*=============================================*/
|
127
|
+
|
128
|
+
if (first)
|
129
|
+
{
|
130
|
+
if (theDefrule->dynamicSalience != NULL)
|
131
|
+
{
|
132
|
+
ExpressionDeinstall(theEnv,theDefrule->dynamicSalience);
|
133
|
+
ReturnPackedExpression(theEnv,theDefrule->dynamicSalience);
|
134
|
+
theDefrule->dynamicSalience = NULL;
|
135
|
+
}
|
136
|
+
if (theDefrule->header.ppForm != NULL)
|
137
|
+
{
|
138
|
+
rm(theEnv,(void *) theDefrule->header.ppForm,strlen(theDefrule->header.ppForm) + 1);
|
139
|
+
theDefrule->header.ppForm = NULL;
|
140
|
+
|
141
|
+
/*=======================================================*/
|
142
|
+
/* All of the rule disjuncts share the same pretty print */
|
143
|
+
/* form, so we want to avoid deleting it again. */
|
144
|
+
/*=======================================================*/
|
145
|
+
|
146
|
+
for (tmpPtr = theDefrule->disjunct; tmpPtr != NULL; tmpPtr = tmpPtr->disjunct)
|
147
|
+
{ tmpPtr->header.ppForm = NULL; }
|
148
|
+
}
|
149
|
+
|
150
|
+
first = false;
|
151
|
+
}
|
152
|
+
|
153
|
+
/*===========================*/
|
154
|
+
/* Get rid of any user data. */
|
155
|
+
/*===========================*/
|
156
|
+
|
157
|
+
if (theDefrule->header.usrData != NULL)
|
158
|
+
{ ClearUserDataList(theEnv,theDefrule->header.usrData); }
|
159
|
+
|
160
|
+
/*===========================================*/
|
161
|
+
/* Decrement the count for the defrule name. */
|
162
|
+
/*===========================================*/
|
163
|
+
|
164
|
+
ReleaseLexeme(theEnv,theDefrule->header.name);
|
165
|
+
|
166
|
+
/*========================================*/
|
167
|
+
/* Get rid of the the rule's RHS actions. */
|
168
|
+
/*========================================*/
|
169
|
+
|
170
|
+
if (theDefrule->actions != NULL)
|
171
|
+
{
|
172
|
+
ExpressionDeinstall(theEnv,theDefrule->actions);
|
173
|
+
ReturnPackedExpression(theEnv,theDefrule->actions);
|
174
|
+
}
|
175
|
+
|
176
|
+
/*===============================*/
|
177
|
+
/* Move on to the next disjunct. */
|
178
|
+
/*===============================*/
|
179
|
+
|
180
|
+
nextPtr = theDefrule->disjunct;
|
181
|
+
rtn_struct(theEnv,defrule,theDefrule);
|
182
|
+
theDefrule = nextPtr;
|
183
|
+
}
|
184
|
+
|
185
|
+
/*==========================*/
|
186
|
+
/* Free up partial matches. */
|
187
|
+
/*==========================*/
|
188
|
+
|
189
|
+
if (EngineData(theEnv)->ExecutingRule == NULL) FlushGarbagePartialMatches(theEnv);
|
190
|
+
#endif
|
191
|
+
}
|
192
|
+
|
193
|
+
/********************************************************/
|
194
|
+
/* DestroyDefrule: Action used to remove defrules */
|
195
|
+
/* as a result of DestroyEnvironment. */
|
196
|
+
/********************************************************/
|
197
|
+
void DestroyDefrule(
|
198
|
+
Environment *theEnv,
|
199
|
+
Defrule *theDefrule)
|
200
|
+
{
|
201
|
+
Defrule *nextDisjunct;
|
202
|
+
bool first = true;
|
203
|
+
|
204
|
+
if (theDefrule == NULL) return;
|
205
|
+
|
206
|
+
while (theDefrule != NULL)
|
207
|
+
{
|
208
|
+
DetachJoinsDriver(theEnv,theDefrule,true);
|
209
|
+
|
210
|
+
if (first)
|
211
|
+
{
|
212
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME)
|
213
|
+
if (theDefrule->dynamicSalience != NULL)
|
214
|
+
{ ReturnPackedExpression(theEnv,theDefrule->dynamicSalience); }
|
215
|
+
|
216
|
+
if (theDefrule->header.ppForm != NULL)
|
217
|
+
{
|
218
|
+
Defrule *tmpPtr;
|
219
|
+
|
220
|
+
rm(theEnv,(void *) theDefrule->header.ppForm,strlen(theDefrule->header.ppForm) + 1);
|
221
|
+
|
222
|
+
/*=======================================================*/
|
223
|
+
/* All of the rule disjuncts share the same pretty print */
|
224
|
+
/* form, so we want to avoid deleting it again. */
|
225
|
+
/*=======================================================*/
|
226
|
+
|
227
|
+
for (tmpPtr = theDefrule->disjunct; tmpPtr != NULL; tmpPtr = tmpPtr->disjunct)
|
228
|
+
{ tmpPtr->header.ppForm = NULL; }
|
229
|
+
}
|
230
|
+
#endif
|
231
|
+
|
232
|
+
first = false;
|
233
|
+
}
|
234
|
+
|
235
|
+
if (theDefrule->header.usrData != NULL)
|
236
|
+
{ ClearUserDataList(theEnv,theDefrule->header.usrData); }
|
237
|
+
|
238
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME)
|
239
|
+
if (theDefrule->actions != NULL)
|
240
|
+
{ ReturnPackedExpression(theEnv,theDefrule->actions); }
|
241
|
+
#endif
|
242
|
+
|
243
|
+
nextDisjunct = theDefrule->disjunct;
|
244
|
+
|
245
|
+
#if (! BLOAD_ONLY) && (! RUN_TIME)
|
246
|
+
rtn_struct(theEnv,defrule,theDefrule);
|
247
|
+
#endif
|
248
|
+
|
249
|
+
theDefrule = nextDisjunct;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
/**********************/
|
254
|
+
/* DetachJoinsDriver: */
|
255
|
+
/**********************/
|
256
|
+
static void DetachJoinsDriver(
|
257
|
+
Environment *theEnv,
|
258
|
+
Defrule *theRule,
|
259
|
+
bool destroy)
|
260
|
+
{
|
261
|
+
struct joinNode *join;
|
262
|
+
|
263
|
+
/*==================================*/
|
264
|
+
/* Find the last join for the rule. */
|
265
|
+
/*==================================*/
|
266
|
+
|
267
|
+
join = theRule->lastJoin;
|
268
|
+
theRule->lastJoin = NULL;
|
269
|
+
if (join == NULL) return;
|
270
|
+
|
271
|
+
/*===================================================*/
|
272
|
+
/* Remove the activation link from the last join. If */
|
273
|
+
/* there are joins below this join, then all of the */
|
274
|
+
/* joins for this rule were shared with another rule */
|
275
|
+
/* and thus no joins can be deleted. */
|
276
|
+
/*===================================================*/
|
277
|
+
|
278
|
+
join->ruleToActivate = NULL;
|
279
|
+
if (join->nextLinks != NULL) return;
|
280
|
+
|
281
|
+
DetachJoins(theEnv,join,destroy);
|
282
|
+
}
|
283
|
+
|
284
|
+
/**********************************************************************/
|
285
|
+
/* DetachJoins: Removes a join node and all of its parent nodes from */
|
286
|
+
/* the join network. Nodes are only removed if they are no required */
|
287
|
+
/* by other rules (the same join can be shared by multiple rules). */
|
288
|
+
/* Any partial matches associated with the join are also removed. */
|
289
|
+
/* A rule's joins are typically removed by removing the bottom most */
|
290
|
+
/* join used by the rule and then removing any parent joins which */
|
291
|
+
/* are not shared by other rules. */
|
292
|
+
/**********************************************************************/
|
293
|
+
static void DetachJoins(
|
294
|
+
Environment *theEnv,
|
295
|
+
struct joinNode *join,
|
296
|
+
bool destroy)
|
297
|
+
{
|
298
|
+
struct joinNode *prevJoin, *rightJoin;
|
299
|
+
struct joinLink *lastLink, *theLink;
|
300
|
+
unsigned lastMark;
|
301
|
+
|
302
|
+
/*===========================*/
|
303
|
+
/* Begin removing the joins. */
|
304
|
+
/*===========================*/
|
305
|
+
|
306
|
+
while (join != NULL)
|
307
|
+
{
|
308
|
+
if (join->marked) return;
|
309
|
+
|
310
|
+
/*==========================================================*/
|
311
|
+
/* Remember the join "above" this join (the one that enters */
|
312
|
+
/* from the left). If the join is entered from the right by */
|
313
|
+
/* another join, remember the right entering join as well. */
|
314
|
+
/*==========================================================*/
|
315
|
+
|
316
|
+
prevJoin = join->lastLevel;
|
317
|
+
if (join->joinFromTheRight)
|
318
|
+
{ rightJoin = (struct joinNode *) join->rightSideEntryStructure; }
|
319
|
+
else
|
320
|
+
{ rightJoin = NULL; }
|
321
|
+
|
322
|
+
/*=================================================*/
|
323
|
+
/* If the join was attached to a pattern, remove */
|
324
|
+
/* any structures associated with the pattern that */
|
325
|
+
/* are no longer needed. */
|
326
|
+
/*=================================================*/
|
327
|
+
|
328
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
329
|
+
if (! destroy)
|
330
|
+
{
|
331
|
+
if ((join->rightSideEntryStructure != NULL) && (join->joinFromTheRight == false))
|
332
|
+
{ RemoveIntranetworkLink(theEnv,join); }
|
333
|
+
}
|
334
|
+
#endif
|
335
|
+
|
336
|
+
/*======================================*/
|
337
|
+
/* Remove any partial matches contained */
|
338
|
+
/* in the beta memory of the join. */
|
339
|
+
/*======================================*/
|
340
|
+
|
341
|
+
if (destroy)
|
342
|
+
{
|
343
|
+
DestroyBetaMemory(theEnv,join,LHS);
|
344
|
+
DestroyBetaMemory(theEnv,join,RHS);
|
345
|
+
}
|
346
|
+
else
|
347
|
+
{
|
348
|
+
FlushBetaMemory(theEnv,join,LHS);
|
349
|
+
FlushBetaMemory(theEnv,join,RHS);
|
350
|
+
}
|
351
|
+
|
352
|
+
ReturnLeftMemory(theEnv,join);
|
353
|
+
ReturnRightMemory(theEnv,join);
|
354
|
+
|
355
|
+
/*===================================*/
|
356
|
+
/* Remove the expressions associated */
|
357
|
+
/* with the join. */
|
358
|
+
/*===================================*/
|
359
|
+
|
360
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
361
|
+
if (! destroy)
|
362
|
+
{
|
363
|
+
RemoveHashedExpression(theEnv,join->networkTest);
|
364
|
+
RemoveHashedExpression(theEnv,join->secondaryNetworkTest);
|
365
|
+
RemoveHashedExpression(theEnv,join->leftHash);
|
366
|
+
RemoveHashedExpression(theEnv,join->rightHash);
|
367
|
+
}
|
368
|
+
#endif
|
369
|
+
|
370
|
+
/*============================*/
|
371
|
+
/* Fix the right prime links. */
|
372
|
+
/*============================*/
|
373
|
+
|
374
|
+
if (join->firstJoin && (join->rightSideEntryStructure == NULL))
|
375
|
+
{
|
376
|
+
lastLink = NULL;
|
377
|
+
|
378
|
+
theLink = DefruleData(theEnv)->RightPrimeJoins;
|
379
|
+
while (theLink != NULL)
|
380
|
+
{
|
381
|
+
if (theLink->join == join)
|
382
|
+
{
|
383
|
+
if (lastLink == NULL)
|
384
|
+
{ DefruleData(theEnv)->RightPrimeJoins = theLink->next; }
|
385
|
+
else
|
386
|
+
{ lastLink->next = theLink->next; }
|
387
|
+
|
388
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
389
|
+
rtn_struct(theEnv,joinLink,theLink);
|
390
|
+
#endif
|
391
|
+
|
392
|
+
theLink = NULL;
|
393
|
+
}
|
394
|
+
else
|
395
|
+
{
|
396
|
+
lastLink = theLink;
|
397
|
+
theLink = lastLink->next;
|
398
|
+
}
|
399
|
+
}
|
400
|
+
}
|
401
|
+
|
402
|
+
/*===========================*/
|
403
|
+
/* Fix the left prime links. */
|
404
|
+
/*===========================*/
|
405
|
+
|
406
|
+
if (join->firstJoin && (join->patternIsNegated || join->joinFromTheRight) && (! join->patternIsExists))
|
407
|
+
{
|
408
|
+
lastLink = NULL;
|
409
|
+
theLink = DefruleData(theEnv)->LeftPrimeJoins;
|
410
|
+
while (theLink != NULL)
|
411
|
+
{
|
412
|
+
if (theLink->join == join)
|
413
|
+
{
|
414
|
+
if (lastLink == NULL)
|
415
|
+
{ DefruleData(theEnv)->LeftPrimeJoins = theLink->next; }
|
416
|
+
else
|
417
|
+
{ lastLink->next = theLink->next; }
|
418
|
+
|
419
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
420
|
+
rtn_struct(theEnv,joinLink,theLink);
|
421
|
+
#endif
|
422
|
+
|
423
|
+
theLink = NULL;
|
424
|
+
}
|
425
|
+
else
|
426
|
+
{
|
427
|
+
lastLink = theLink;
|
428
|
+
theLink = theLink->next;
|
429
|
+
}
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
/*==================================================*/
|
434
|
+
/* Remove the link to the join from the join above. */
|
435
|
+
/*==================================================*/
|
436
|
+
|
437
|
+
if (prevJoin != NULL)
|
438
|
+
{
|
439
|
+
lastLink = NULL;
|
440
|
+
theLink = prevJoin->nextLinks;
|
441
|
+
while (theLink != NULL)
|
442
|
+
{
|
443
|
+
if (theLink->join == join)
|
444
|
+
{
|
445
|
+
if (lastLink == NULL)
|
446
|
+
{ prevJoin->nextLinks = theLink->next; }
|
447
|
+
else
|
448
|
+
{ lastLink->next = theLink->next; }
|
449
|
+
|
450
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
451
|
+
rtn_struct(theEnv,joinLink,theLink);
|
452
|
+
#endif
|
453
|
+
|
454
|
+
theLink = NULL;
|
455
|
+
}
|
456
|
+
else
|
457
|
+
{
|
458
|
+
lastLink = theLink;
|
459
|
+
theLink = theLink->next;
|
460
|
+
}
|
461
|
+
}
|
462
|
+
}
|
463
|
+
|
464
|
+
/*==========================================*/
|
465
|
+
/* Remove the right join link if it exists. */
|
466
|
+
/*==========================================*/
|
467
|
+
|
468
|
+
if (rightJoin != NULL)
|
469
|
+
{
|
470
|
+
lastLink = NULL;
|
471
|
+
theLink = rightJoin->nextLinks;
|
472
|
+
while (theLink != NULL)
|
473
|
+
{
|
474
|
+
if (theLink->join == join)
|
475
|
+
{
|
476
|
+
if (lastLink == NULL)
|
477
|
+
{ rightJoin->nextLinks = theLink->next; }
|
478
|
+
else
|
479
|
+
{ lastLink->next = theLink->next; }
|
480
|
+
|
481
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
482
|
+
rtn_struct(theEnv,joinLink,theLink);
|
483
|
+
#endif
|
484
|
+
theLink = NULL;
|
485
|
+
}
|
486
|
+
else
|
487
|
+
{
|
488
|
+
lastLink = theLink;
|
489
|
+
theLink = theLink->next;
|
490
|
+
}
|
491
|
+
}
|
492
|
+
|
493
|
+
if ((rightJoin->nextLinks == NULL) &&
|
494
|
+
(rightJoin->ruleToActivate == NULL))
|
495
|
+
{
|
496
|
+
if (prevJoin != NULL)
|
497
|
+
{
|
498
|
+
lastMark = prevJoin->marked;
|
499
|
+
prevJoin->marked = true;
|
500
|
+
DetachJoins(theEnv,rightJoin,destroy);
|
501
|
+
prevJoin->marked = lastMark;
|
502
|
+
}
|
503
|
+
else
|
504
|
+
{ DetachJoins(theEnv,rightJoin,destroy); }
|
505
|
+
}
|
506
|
+
}
|
507
|
+
|
508
|
+
/*==================*/
|
509
|
+
/* Delete the join. */
|
510
|
+
/*==================*/
|
511
|
+
|
512
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
513
|
+
rtn_struct(theEnv,joinNode,join);
|
514
|
+
#endif
|
515
|
+
|
516
|
+
/*===========================================================*/
|
517
|
+
/* Move on to the next join to be removed. All the joins of */
|
518
|
+
/* a rule can be deleted by following the right joins links */
|
519
|
+
/* (when these links exist) and then following the left join */
|
520
|
+
/* links. This works because if join A enters join B from */
|
521
|
+
/* the right, the right/left links of join A eventually lead */
|
522
|
+
/* to the join which enters join B from the left. */
|
523
|
+
/*===========================================================*/
|
524
|
+
|
525
|
+
if (prevJoin == NULL)
|
526
|
+
{ return; }
|
527
|
+
else if (prevJoin->ruleToActivate != NULL)
|
528
|
+
{ return; }
|
529
|
+
else if (prevJoin->nextLinks == NULL)
|
530
|
+
{ join = prevJoin; }
|
531
|
+
else
|
532
|
+
{ return; }
|
533
|
+
}
|
534
|
+
}
|
535
|
+
|
536
|
+
#if (! RUN_TIME) && (! BLOAD_ONLY)
|
537
|
+
|
538
|
+
/***********************************************************************/
|
539
|
+
/* RemoveIntranetworkLink: Removes the link between a join node in the */
|
540
|
+
/* join network and its corresponding pattern node in the pattern */
|
541
|
+
/* network. If the pattern node is then no longer associated with */
|
542
|
+
/* any other joins, it is removed using the function DetachPattern. */
|
543
|
+
/***********************************************************************/
|
544
|
+
static void RemoveIntranetworkLink(
|
545
|
+
Environment *theEnv,
|
546
|
+
struct joinNode *join)
|
547
|
+
{
|
548
|
+
struct patternNodeHeader *patternPtr;
|
549
|
+
struct joinNode *joinPtr, *lastJoin;
|
550
|
+
|
551
|
+
/*================================================*/
|
552
|
+
/* Determine the pattern that enters this join. */
|
553
|
+
/* Determine the list of joins which this pattern */
|
554
|
+
/* enters from the right. */
|
555
|
+
/*================================================*/
|
556
|
+
|
557
|
+
patternPtr = (struct patternNodeHeader *) join->rightSideEntryStructure;
|
558
|
+
joinPtr = patternPtr->entryJoin;
|
559
|
+
lastJoin = NULL;
|
560
|
+
|
561
|
+
/*=================================================*/
|
562
|
+
/* Loop through the list of joins that the pattern */
|
563
|
+
/* enters until the join being removed is found. */
|
564
|
+
/* Remove this join from the list. */
|
565
|
+
/*=================================================*/
|
566
|
+
|
567
|
+
while (joinPtr != NULL)
|
568
|
+
{
|
569
|
+
if (joinPtr == join)
|
570
|
+
{
|
571
|
+
if (lastJoin == NULL)
|
572
|
+
{ patternPtr->entryJoin = joinPtr->rightMatchNode; }
|
573
|
+
else
|
574
|
+
{ lastJoin->rightMatchNode = joinPtr->rightMatchNode; }
|
575
|
+
|
576
|
+
joinPtr = NULL;
|
577
|
+
}
|
578
|
+
else
|
579
|
+
{
|
580
|
+
lastJoin = joinPtr;
|
581
|
+
joinPtr = joinPtr->rightMatchNode;
|
582
|
+
}
|
583
|
+
}
|
584
|
+
|
585
|
+
/*===================================================*/
|
586
|
+
/* If the terminal node of the pattern doesn't point */
|
587
|
+
/* to any joins, then start removing the pattern. */
|
588
|
+
/*===================================================*/
|
589
|
+
|
590
|
+
if (patternPtr->entryJoin == NULL)
|
591
|
+
{ DetachPattern(theEnv,join->rhsType,patternPtr); }
|
592
|
+
}
|
593
|
+
|
594
|
+
#endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
|
595
|
+
|
596
|
+
#endif /* DEFRULE_CONSTRUCT */
|
597
|
+
|
598
|
+
|
599
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 07/30/16 */
|
5
|
+
/* */
|
6
|
+
/* RULE DELETION MODULE HEADER FILE */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Provides routines for deleting a rule including */
|
11
|
+
/* freeing the defrule data structures and removing the */
|
12
|
+
/* appropriate joins from the join network. */
|
13
|
+
/* */
|
14
|
+
/* Principal Programmer(s): */
|
15
|
+
/* Gary D. Riley */
|
16
|
+
/* */
|
17
|
+
/* Contributing Programmer(s): */
|
18
|
+
/* */
|
19
|
+
/* Revision History: */
|
20
|
+
/* */
|
21
|
+
/* 6.24: Removed DYNAMIC_SALIENCE compilation flag. */
|
22
|
+
/* */
|
23
|
+
/* Renamed BOOLEAN macro type to intBool. */
|
24
|
+
/* */
|
25
|
+
/* 6.30: Removed conditional code for unsupported */
|
26
|
+
/* compilers/operating systems (IBM_MCW and */
|
27
|
+
/* MAC_MCW). */
|
28
|
+
/* */
|
29
|
+
/* Added support for hashed memories. */
|
30
|
+
/* */
|
31
|
+
/* Fixed linkage issue when BLOAD_ONLY compiler */
|
32
|
+
/* flag is set to 1. */
|
33
|
+
/* */
|
34
|
+
/* 6.40: Removed LOCALE definition. */
|
35
|
+
/* */
|
36
|
+
/* Pragma once and other inclusion changes. */
|
37
|
+
/* */
|
38
|
+
/* Removed use of void pointers for specific */
|
39
|
+
/* data structures. */
|
40
|
+
/* */
|
41
|
+
/*************************************************************/
|
42
|
+
|
43
|
+
#ifndef _H_ruledlt
|
44
|
+
|
45
|
+
#pragma once
|
46
|
+
|
47
|
+
#define _H_ruledlt
|
48
|
+
|
49
|
+
void ReturnDefrule(Environment *,Defrule *);
|
50
|
+
void DestroyDefrule(Environment *,Defrule *);
|
51
|
+
|
52
|
+
#endif /* _H_ruledlt */
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|