1    /*******************************************************/
2    /*      "C" Language Integrated Production System      */
3    /*                                                     */
4    /*             CLIPS Version 6.30  08/16/14            */
5    /*                                                     */
6    /*                ENVRNMNT HEADER FILE                 */
7    /*******************************************************/
8 
9 /*************************************************************/
10 /* Purpose: Routines for supporting multiple environments.   */
11 /*                                                           */
12 /* Principal Programmer(s):                                  */
13 /*      Gary D. Riley                                        */
14 /*                                                           */
15 /* Revision History:                                         */
16 /*                                                           */
17 /*      6.24: Added code to CreateEnvironment to free        */
18 /*            already allocated data if one of the malloc    */
19 /*            calls fail.                                    */
20 /*                                                           */
21 /*            Modified AllocateEnvironmentData to print a    */
22 /*            message if it was unable to allocate memory.   */
23 /*                                                           */
24 /*            Renamed BOOLEAN macro type to intBool.         */
25 /*                                                           */
26 /*            Added CreateRuntimeEnvironment function.       */
27 /*                                                           */
28 /*            Added support for context information when an  */
29 /*            environment is created (i.e a pointer from the */
30 /*            CLIPS environment to its parent environment).  */
31 /*                                                           */
32 /*      6.30: Added support for passing context information  */
33 /*            to user defined functions and callback         */
34 /*            functions.                                     */
35 /*                                                           */
36 /*            Support for hashing EXTERNAL_ADDRESS data      */
37 /*            type.                                          */
38 /*                                                           */
39 /*            Added const qualifiers to remove C++           */
40 /*            deprecation warnings.                          */
41 /*                                                           */
42 /*************************************************************/
43 
44 #ifndef _H_envrnmnt
45 #define _H_envrnmnt
46 
47 #ifndef _H_symbol
48 #include "symbol.h"
49 #endif
50 
51 #ifdef LOCALE
52 #undef LOCALE
53 #endif
54 
55 #ifdef _ENVRNMNT_SOURCE_
56 #define LOCALE
57 #else
58 #define LOCALE extern
59 #endif
60 
61 #define USER_ENVIRONMENT_DATA 70
62 #define MAXIMUM_ENVIRONMENT_POSITIONS 100
63 
64 struct environmentCleanupFunction
65   {
66    const char *name;
67    void (*func)(void *);
68    int priority;
69    struct environmentCleanupFunction *next;
70   };
71 
72 struct environmentData
73   {
74    unsigned int initialized : 1;
75    unsigned long environmentIndex;
76    void *context;
77    void *routerContext;
78    void *functionContext;
79    void *callbackContext;
80    void **theData;
81    void (**cleanupFunctions)(void *);
82    struct environmentCleanupFunction *listOfCleanupEnvironmentFunctions;
83    struct environmentData *next;
84   };
85 
86 typedef struct environmentData ENVIRONMENT_DATA;
87 typedef struct environmentData * ENVIRONMENT_DATA_PTR;
88 
89 #define GetEnvironmentData(theEnv,position) (((struct environmentData *) theEnv)->theData[position])
90 #define SetEnvironmentData(theEnv,position,value) (((struct environmentData *) theEnv)->theData[position] = value)
91 
92    LOCALE intBool                        AllocateEnvironmentData(void *,unsigned int,unsigned long,void (*)(void *));
93    LOCALE intBool                        DeallocateEnvironmentData(void);
94 #if ALLOW_ENVIRONMENT_GLOBALS
95    LOCALE void                           SetCurrentEnvironment(void *);
96    LOCALE intBool                        SetCurrentEnvironmentByIndex(unsigned long);
97    LOCALE void                          *GetEnvironmentByIndex(unsigned long);
98    LOCALE void                          *GetCurrentEnvironment(void);
99    LOCALE unsigned long                  GetEnvironmentIndex(void *);
100 #endif
101    LOCALE void                          *CreateEnvironment(void);
102    LOCALE void                          *CreateRuntimeEnvironment(struct symbolHashNode **,struct floatHashNode **,
103                                                                   struct integerHashNode **,struct bitMapHashNode **);
104    LOCALE intBool                        DestroyEnvironment(void *);
105    LOCALE intBool                        AddEnvironmentCleanupFunction(void *,const char *,void (*)(void *),int);
106    LOCALE void                          *GetEnvironmentContext(void *);
107    LOCALE void                          *SetEnvironmentContext(void *,void *);
108    LOCALE void                          *GetEnvironmentRouterContext(void *);
109    LOCALE void                          *SetEnvironmentRouterContext(void *,void *);
110    LOCALE void                          *GetEnvironmentFunctionContext(void *);
111    LOCALE void                          *SetEnvironmentFunctionContext(void *,void *);
112    LOCALE void                          *GetEnvironmentCallbackContext(void *);
113    LOCALE void                          *SetEnvironmentCallbackContext(void *,void *);
114 
115 #endif /* _H_envrnmnt */
116 
117