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