📄 classini.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* CLASS INITIALIZATION MODULE */ /*******************************************************//**************************************************************//* Purpose: Defclass Initialization Routines *//* *//* Principal Programmer(s): *//* Brian L. Donnell *//* *//* Contributing Programmer(s): *//* *//* Revision History: *//* *//**************************************************************/ /* ========================================= ***************************************** EXTERNAL DEFINITIONS ========================================= ***************************************** */#include "setup.h"#if OBJECT_SYSTEM#ifndef _CLIPS_STDIO_#define _CLIPS_STDIO_#include <stdio.h>#endif#include "classcom.h"#include "classexm.h"#include "classfun.h"#include "classinf.h"#include "classpsr.h"#include "clipsmem.h"#include "cstrccom.h"#include "cstrcpsr.h"#include "extnfunc.h"#include "inscom.h"#include "modulpsr.h"#include "modulutl.h"#include "msgcom.h"#include "watch.h"#if DEFINSTANCES_CONSTRUCT#include "defins.h"#endif#if INSTANCE_SET_QUERIES#include "insquery.h"#endif#if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY#include "objbin.h"#endif#if CONSTRUCT_COMPILER && (! RUN_TIME)#include "objcmp.h"#endif#if INSTANCE_PATTERN_MATCHING#include "objrtbld.h"#endif#if RUN_TIME#include "insfun.h"#include "msgfun.h"#endif#include "classini.h"/* ========================================= ***************************************** CONSTANTS ========================================= ***************************************** */#define SUPERCLASS_RLN "is-a"#define NAME_RLN "name"#define INITIAL_OBJECT_NAME "initial-object"/* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTION HEADERS ========================================= ***************************************** */#if ANSI_COMPILERstatic VOID SetupDefclasses(void);#if (! RUN_TIME)static DEFCLASS *AddSystemClass(char *,DEFCLASS *);static VOID *AllocateModule(void);static VOID FreeModule(VOID *);#endif#if (! BLOAD_ONLY) && (! RUN_TIME) && DEFMODULE_CONSTRUCTstatic VOID UpdateDefclassesScope(void);#endif#elsestatic VOID SetupDefclasses();#if (! RUN_TIME)static DEFCLASS *AddSystemClass();static VOID *AllocateModule();static VOID FreeModule();#endif#if (! BLOAD_ONLY) && (! RUN_TIME) && DEFMODULE_CONSTRUCTstatic VOID UpdateDefclassesScope();#endif#endif/* ========================================= ***************************************** INTERNALLY VISIBLE GLOBAL VARIABLES ========================================= ***************************************** */globle int DefclassModuleIndex;globle struct construct *DefclassConstruct; /* ========================================= ***************************************** INTERNALLY VISIBLE GLOBAL VARIABLES ========================================= ***************************************** */ static ENTITY_RECORD DefclassEntityRecord = { DEFCLASS_PTR,1,0,0, NULL,NULL,NULL,NULL,NULL, DecrementDefclassBusyCount, IncrementDefclassBusyCount, NULL,NULL,NULL,NULL };/* ========================================= ***************************************** EXTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** *//********************************************************** NAME : SetupObjectSystem DESCRIPTION : Initializes all COOL constructs, functions, and data structures INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : COOL initialized NOTES : Order of setup calls is important **********************************************************/globle VOID SetupObjectSystem() {#if ! RUN_TIME ISA_SYMBOL = (SYMBOL_HN *) AddSymbol(SUPERCLASS_RLN); IncrementSymbolCount(ISA_SYMBOL); NAME_SYMBOL = (SYMBOL_HN *) AddSymbol(NAME_RLN); IncrementSymbolCount(NAME_SYMBOL);#if INSTANCE_PATTERN_MATCHING INITIAL_OBJECT_SYMBOL = (SYMBOL_HN *) AddSymbol(INITIAL_OBJECT_NAME); IncrementSymbolCount(INITIAL_OBJECT_SYMBOL);#endif#endif SetupDefclasses(); SetupInstances(); SetupMessageHandlers(); #if DEFINSTANCES_CONSTRUCT SetupDefinstances();#endif#if INSTANCE_SET_QUERIES SetupQuery();#endif#if BLOAD_AND_BSAVE || BLOAD || BLOAD_ONLY SetupObjectsBload();#endif#if CONSTRUCT_COMPILER && (! RUN_TIME) SetupObjectsCompiler();#endif#if INSTANCE_PATTERN_MATCHING SetupObjectPatternStuff();#endif } #if RUN_TIME /*************************************************** NAME : ObjectsRunTimeInitialize DESCRIPTION : Initializes objects system lists in a run-time module INPUTS : 1) Pointer to new class hash table 2) Pointer to new slot name table RETURNS : Nothing useful SIDE EFFECTS : Global pointers set NOTES : None ***************************************************/globle VOID ObjectsRunTimeInitialize(ctable,sntable,cidmap,mid) DEFCLASS *ctable[]; SLOT_NAME *sntable[]; DEFCLASS **cidmap; unsigned mid; { DEFCLASS *cls; VOID *tmpexp; register int i,j; if (ClassTable != NULL) { for (j = 0 ; j < CLASS_TABLE_HASH_SIZE ; j++) for (cls = ClassTable[j] ; cls != NULL ; cls = cls->nxtHash) { for (i = 0 ; i < cls->slotCount ; i++) { /* ===================================================================== For static default values, the data object value needs to deinstalled and deallocated, and the expression needs to be restored (which was temporarily stored in the supplementalInfo field of the data object) ===================================================================== */ if ((cls->slots[i].defaultValue != NULL) && (cls->slots[i].dynamicDefault == 0)) { tmpexp = ((DATA_OBJECT *) cls->slots[i].defaultValue)->supplementalInfo; ValueDeinstall((DATA_OBJECT *) cls->slots[i].defaultValue); rtn_struct(dataObject,cls->slots[i].defaultValue); cls->slots[i].defaultValue = tmpexp; } } } } QUERY_DELIMETER_SYMBOL = FindSymbol(QUERY_DELIMETER_STRING); INIT_SYMBOL = FindSymbol(INIT_STRING); DELETE_SYMBOL = FindSymbol(DELETE_STRING); ISA_SYMBOL = FindSymbol(SUPERCLASS_RLN); NAME_SYMBOL = FindSymbol(NAME_RLN);#if INSTANCE_PATTERN_MATCHING INITIAL_OBJECT_SYMBOL = FindSymbol(INITIAL_OBJECT_NAME);#endif ClassTable = (DEFCLASS **) ctable; SlotNameTable = (SLOT_NAME **) sntable; ClassIDMap = (DEFCLASS **) cidmap; MaxClassID = (unsigned short) mid; PrimitiveClassMap[FLOAT] = LookupDefclassByMdlOrScope(FLOAT_TYPE_NAME); PrimitiveClassMap[INTEGER] = LookupDefclassByMdlOrScope(INTEGER_TYPE_NAME); PrimitiveClassMap[STRING] = LookupDefclassByMdlOrScope(STRING_TYPE_NAME); PrimitiveClassMap[SYMBOL] = LookupDefclassByMdlOrScope(SYMBOL_TYPE_NAME); PrimitiveClassMap[MULTIFIELD] = LookupDefclassByMdlOrScope(MULTIFIELD_TYPE_NAME); PrimitiveClassMap[EXTERNAL_ADDRESS] = LookupDefclassByMdlOrScope(EXTERNAL_ADDRESS_TYPE_NAME); PrimitiveClassMap[FACT_ADDRESS] = LookupDefclassByMdlOrScope(FACT_ADDRESS_TYPE_NAME); PrimitiveClassMap[INSTANCE_NAME] = LookupDefclassByMdlOrScope(INSTANCE_NAME_TYPE_NAME); PrimitiveClassMap[INSTANCE_ADDRESS] = LookupDefclassByMdlOrScope(INSTANCE_ADDRESS_TYPE_NAME); for (j = 0 ; j < CLASS_TABLE_HASH_SIZE ; j++) for (cls = ClassTable[j] ; cls != NULL ; cls = cls->nxtHash) { for (i = 0 ; i < cls->slotCount ; i++) { if ((cls->slots[i].defaultValue != NULL) && (cls->slots[i].dynamicDefault == 0)) { tmpexp = cls->slots[i].defaultValue; cls->slots[i].defaultValue = (VOID *) get_struct(dataObject); EvaluateAndStoreInDataObject((int) cls->slots[i].multiple,(EXPRESSION *) tmpexp, (DATA_OBJECT *) cls->slots[i].defaultValue); ValueInstall((DATA_OBJECT *) cls->slots[i].defaultValue); ((DATA_OBJECT *) cls->slots[i].defaultValue)->supplementalInfo = tmpexp; } } } }#else/*************************************************************** NAME : CreateSystemClasses DESCRIPTION : Creates the built-in system classes INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : System classes inserted in the class hash table NOTES : The binary/load save indices for the primitive types (integer, float, symbol and string, multifield, external-address and fact-address) are very important. Need to be able to refer to types with the same index regardless of whether the object system is installed or not. Thus, the bsave/blaod indices of these classes match their CLIPS integer codes. WARNING!!: Assumes no classes exist yet! ***************************************************************/globle VOID CreateSystemClasses() { DEFCLASS *user,*any,*primitive,*number,*lexeme,*address,*instance;#if INSTANCE_PATTERN_MATCHING DEFCLASS *initialObject;#endif /* =================================== Add canonical slot name entries for the is-a and name fields - used for object patterns =================================== */ AddSlotName(ISA_SYMBOL,ISA_ID,CLIPS_TRUE); AddSlotName(NAME_SYMBOL,NAME_ID,CLIPS_TRUE); /* ========================================================= Bsave Indices for non-primitive classes start at 9 Object is 9, Primitive is 10, Number is 11, Lexeme is 12, Address is 13, and Instance is 14. because: float = 0, integer = 1, symbol = 2, string = 3, multifield = 4, and external-address = 5 and fact-address = 6, instance-adress = 7 and instance-name = 8. ========================================================= */ any = AddSystemClass(OBJECT_TYPE_NAME,NULL); primitive = AddSystemClass(PRIMITIVE_TYPE_NAME,any); user = AddSystemClass(USER_TYPE_NAME,any); number = AddSystemClass(NUMBER_TYPE_NAME,primitive);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -