1    /*******************************************************/
2    /*      "C" Language Integrated Production System      */
3    /*                                                     */
4    /*             CLIPS Version 6.30  08/16/14            */
5    /*                                                     */
6    /*           DEFRULE BSAVE/BLOAD HEADER FILE           */
7    /*******************************************************/
8 
9 /*************************************************************/
10 /* Purpose: Implements the binary save/load feature for the  */
11 /*    defrule construct.                                     */
12 /*                                                           */
13 /* Principal Programmer(s):                                  */
14 /*      Gary D. Riley                                        */
15 /*                                                           */
16 /* Contributing Programmer(s):                               */
17 /*      Brian L. Dantes                                      */
18 /*                                                           */
19 /* Revision History:                                         */
20 /*                                                           */
21 /*      6.24: Removed CONFLICT_RESOLUTION_STRATEGIES,        */
22 /*            DYNAMIC_SALIENCE, and LOGICAL_DEPENDENCIES     */
23 /*            compilation flags.                             */
24 /*                                                           */
25 /*      6.30: Changed integer type/precision.                */
26 /*                                                           */
27 /*            Added support for alpha memories.              */
28 /*                                                           */
29 /*            Added salience groups to improve performance   */
30 /*            with large numbers of activations of different */
31 /*            saliences.                                     */
32 /*                                                           */
33 /*************************************************************/
34 
35 #if (! RUN_TIME)
36 #ifndef _H_rulebin
37 
38 #define _H_rulebin
39 
40 #include "modulbin.h"
41 #include "cstrcbin.h"
42 #ifndef _H_network
43 #include "network.h"
44 #endif
45 
46 struct bsaveDefrule
47   {
48    struct bsaveConstructHeader header;
49    int salience;
50    int localVarCnt;
51    unsigned int complexity      : 12;
52    unsigned int autoFocus       :  1;
53    long dynamicSalience;
54    long actions;
55    long logicalJoin;
56    long lastJoin;
57    long disjunct;
58   };
59 
60 struct bsavePatternNodeHeader
61   {
62    long entryJoin;
63    long rightHash;
64    unsigned int singlefieldNode : 1;
65    unsigned int multifieldNode : 1;
66    unsigned int stopNode : 1;
67    unsigned int blocked : 1;
68    unsigned int initialize : 1;
69    unsigned int marked : 1;
70    unsigned int beginSlot : 1;
71    unsigned int endSlot : 1;
72    unsigned int selector : 1;
73   };
74 
75 struct bsaveDefruleModule
76   {
77    struct bsaveDefmoduleItemHeader header;
78   };
79 
80 struct bsaveJoinLink
81   {
82    char enterDirection;
83    long join;
84    long next;
85   };
86 
87 struct bsaveJoinNode
88   {
89    unsigned int firstJoin : 1;
90    unsigned int logicalJoin : 1;
91    unsigned int joinFromTheRight : 1;
92    unsigned int patternIsNegated : 1;
93    unsigned int patternIsExists : 1;
94    unsigned int rhsType : 3;
95    unsigned int depth : 7;
96    long networkTest;
97    long secondaryNetworkTest;
98    long leftHash;
99    long rightHash;
100    long rightSideEntryStructure;
101    long nextLinks;
102    long lastLevel;
103    long rightMatchNode;
104    long ruleToActivate;
105   };
106 
107 #define RULEBIN_DATA 20
108 
109 struct defruleBinaryData
110   {
111    long NumberOfDefruleModules;
112    long NumberOfDefrules;
113    long NumberOfJoins;
114    long NumberOfLinks;
115    long RightPrimeIndex;
116    long LeftPrimeIndex;
117    struct defruleModule *ModuleArray;
118    struct defrule *DefruleArray;
119    struct joinNode *JoinArray;
120    struct joinLink *LinkArray;
121   };
122 
123 #define DefruleBinaryData(theEnv) ((struct defruleBinaryData *) GetEnvironmentData(theEnv,RULEBIN_DATA))
124 
125 #define BloadDefrulePointer(x,i) ((struct defrule *) ((i == -1L) ? NULL : &x[i]))
126 #define BsaveJoinIndex(joinPtr) ((joinPtr == NULL) ? -1L :  ((struct joinNode *) joinPtr)->bsaveID)
127 #define BloadJoinPointer(i) ((struct joinNode *) ((i == -1L) ? NULL : &DefruleBinaryData(theEnv)->JoinArray[i]))
128 #define BsaveJoinLinkIndex(linkPtr) ((linkPtr == NULL) ? -1L :  ((struct joinLink *) linkPtr)->bsaveID)
129 #define BloadJoinLinkPointer(i) ((struct joinLink *) ((i == -1L) ? NULL : &DefruleBinaryData(theEnv)->LinkArray[i]))
130 
131 #ifdef LOCALE
132 #undef LOCALE
133 #endif
134 
135 #ifdef _RULEBIN_SOURCE_
136 #define LOCALE
137 #else
138 #define LOCALE extern
139 #endif
140 
141    LOCALE void                           DefruleBinarySetup(void *);
142    LOCALE void                           UpdatePatternNodeHeader(void *,struct patternNodeHeader *,
143                                                                  struct bsavePatternNodeHeader *);
144    LOCALE void                           AssignBsavePatternHeaderValues(void *,struct bsavePatternNodeHeader *,
145                                                                         struct patternNodeHeader *);
146    LOCALE void                          *BloadDefruleModuleReference(void *,int);
147 
148 #endif /* _H_rulebin */
149 
150 #endif /* (! RUN_TIME) */
151 
152 
153 
154 
155