📄 insmult.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 06/05/06 */
/* */
/* INSTANCE MULTIFIELD SLOT MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Access routines for Instance Multifield Slots */
/* */
/* Principal Programmer(s): */
/* Brian L. Donnell */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
/* */
/* 6.24: Renamed BOOLEAN macro type to intBool. */
/* */
/*************************************************************/
/* =========================================
*****************************************
EXTERNAL DEFINITIONS
=========================================
***************************************** */
#include "setup.h"
#if OBJECT_SYSTEM
#include "argacces.h"
#include "envrnmnt.h"
#include "extnfunc.h"
#include "insfun.h"
#include "msgfun.h"
#include "msgpass.h"
#include "multifun.h"
#include "router.h"
#define _INSMULT_SOURCE_
#include "insmult.h"
/* =========================================
*****************************************
CONSTANTS
=========================================
***************************************** */
#define INSERT 0
#define REPLACE 1
#define DELETE_OP 2
/* =========================================
*****************************************
INTERNALLY VISIBLE FUNCTION HEADERS
=========================================
***************************************** */
static INSTANCE_TYPE *CheckMultifieldSlotInstance(void *,char *);
static INSTANCE_SLOT *CheckMultifieldSlotModify(void *,int,char *,INSTANCE_TYPE *,
EXPRESSION *,int *,int *,DATA_OBJECT *);
static void AssignSlotToDataObject(DATA_OBJECT *,INSTANCE_SLOT *);
/* =========================================
*****************************************
EXTERNALLY VISIBLE FUNCTIONS
=========================================
***************************************** */
#if (! RUN_TIME)
/***************************************************
NAME : SetupInstanceMultifieldCommands
DESCRIPTION : Defines function interfaces for
manipulating instance multislots
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : Functions defined to KB
NOTES : None
***************************************************/
globle void SetupInstanceMultifieldCommands(
void *theEnv)
{
/* ===================================
Old version 5.1 compatibility names
=================================== */
EnvDefineFunction2(theEnv,"direct-mv-replace",'b',PTIEF DirectMVReplaceCommand,
"DirectMVReplaceCommand","4**wii");
EnvDefineFunction2(theEnv,"direct-mv-insert",'b',PTIEF DirectMVInsertCommand,
"DirectMVInsertCommand","3**wi");
EnvDefineFunction2(theEnv,"direct-mv-delete",'b',PTIEF DirectMVDeleteCommand,
"DirectMVDeleteCommand","33iw");
EnvDefineFunction2(theEnv,"mv-slot-replace",'u',PTIEF MVSlotReplaceCommand,
"MVSlotReplaceCommand","5*uewii");
EnvDefineFunction2(theEnv,"mv-slot-insert",'u',PTIEF MVSlotInsertCommand,
"MVSlotInsertCommand","4*uewi");
EnvDefineFunction2(theEnv,"mv-slot-delete",'u',PTIEF MVSlotDeleteCommand,
"MVSlotDeleteCommand","44iew");
/* =====================
New version 6.0 names
===================== */
EnvDefineFunction2(theEnv,"slot-direct-replace$",'b',PTIEF DirectMVReplaceCommand,
"DirectMVReplaceCommand","4**wii");
EnvDefineFunction2(theEnv,"slot-direct-insert$",'b',PTIEF DirectMVInsertCommand,
"DirectMVInsertCommand","3**wi");
EnvDefineFunction2(theEnv,"slot-direct-delete$",'b',PTIEF DirectMVDeleteCommand,
"DirectMVDeleteCommand","33iw");
EnvDefineFunction2(theEnv,"slot-replace$",'u',PTIEF MVSlotReplaceCommand,
"MVSlotReplaceCommand","5*uewii");
EnvDefineFunction2(theEnv,"slot-insert$",'u',PTIEF MVSlotInsertCommand,
"MVSlotInsertCommand","4*uewi");
EnvDefineFunction2(theEnv,"slot-delete$",'u',PTIEF MVSlotDeleteCommand,
"MVSlotDeleteCommand","44iew");
}
#endif
/***********************************************************************************
NAME : MVSlotReplaceCommand
DESCRIPTION : Allows user to replace a specified field of a multi-value slot
The slot is directly read (w/o a get- message) and the new
slot-value is placed via a put- message.
This function is not valid for single-value slots.
INPUTS : Caller's result buffer
RETURNS : TRUE if multi-value slot successfully modified,
FALSE otherwise
SIDE EFFECTS : Put messsage sent for slot
NOTES : H/L Syntax : (slot-replace$ <instance> <slot>
<range-begin> <range-end> <value>)
***********************************************************************************/
globle void MVSlotReplaceCommand(
void *theEnv,
DATA_OBJECT *result)
{
DATA_OBJECT newval,newseg,oldseg;
INSTANCE_TYPE *ins;
INSTANCE_SLOT *sp;
int rb,re;
EXPRESSION arg;
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
ins = CheckMultifieldSlotInstance(theEnv,"slot-replace$");
if (ins == NULL)
return;
sp = CheckMultifieldSlotModify(theEnv,REPLACE,"slot-replace$",ins,
GetFirstArgument()->nextArg,&rb,&re,&newval);
if (sp == NULL)
return;
AssignSlotToDataObject(&oldseg,sp);
if (ReplaceMultiValueField(theEnv,&newseg,&oldseg,rb,re,&newval,"slot-replace$") == FALSE)
return;
arg.type = MULTIFIELD;
arg.value = (void *) &newseg;
arg.nextArg = NULL;
arg.argList = NULL;
DirectMessage(theEnv,sp->desc->overrideMessage,ins,result,&arg);
}
/***********************************************************************************
NAME : MVSlotInsertCommand
DESCRIPTION : Allows user to insert a specified field of a multi-value slot
The slot is directly read (w/o a get- message) and the new
slot-value is placed via a put- message.
This function is not valid for single-value slots.
INPUTS : Caller's result buffer
RETURNS : TRUE if multi-value slot successfully modified, FALSE otherwise
SIDE EFFECTS : Put messsage sent for slot
NOTES : H/L Syntax : (slot-insert$ <instance> <slot> <index> <value>)
***********************************************************************************/
globle void MVSlotInsertCommand(
void *theEnv,
DATA_OBJECT *result)
{
DATA_OBJECT newval,newseg,oldseg;
INSTANCE_TYPE *ins;
INSTANCE_SLOT *sp;
int theIndex;
EXPRESSION arg;
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
ins = CheckMultifieldSlotInstance(theEnv,"slot-insert$");
if (ins == NULL)
return;
sp = CheckMultifieldSlotModify(theEnv,INSERT,"slot-insert$",ins,
GetFirstArgument()->nextArg,&theIndex,NULL,&newval);
if (sp == NULL)
return;
AssignSlotToDataObject(&oldseg,sp);
if (InsertMultiValueField(theEnv,&newseg,&oldseg,theIndex,&newval,"slot-insert$") == FALSE)
return;
arg.type = MULTIFIELD;
arg.value = (void *) &newseg;
arg.nextArg = NULL;
arg.argList = NULL;
DirectMessage(theEnv,sp->desc->overrideMessage,ins,result,&arg);
}
/***********************************************************************************
NAME : MVSlotDeleteCommand
DESCRIPTION : Allows user to delete a specified field of a multi-value slot
The slot is directly read (w/o a get- message) and the new
slot-value is placed via a put- message.
This function is not valid for single-value slots.
INPUTS : Caller's result buffer
RETURNS : TRUE if multi-value slot successfully modified, FALSE otherwise
SIDE EFFECTS : Put message sent for slot
NOTES : H/L Syntax : (slot-delete$ <instance> <slot>
<range-begin> <range-end>)
***********************************************************************************/
globle void MVSlotDeleteCommand(
void *theEnv,
DATA_OBJECT *result)
{
DATA_OBJECT newseg,oldseg;
INSTANCE_TYPE *ins;
INSTANCE_SLOT *sp;
int rb,re;
EXPRESSION arg;
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
ins = CheckMultifieldSlotInstance(theEnv,"slot-delete$");
if (ins == NULL)
return;
sp = CheckMultifieldSlotModify(theEnv,DELETE_OP,"slot-delete$",ins,
GetFirstArgument()->nextArg,&rb,&re,NULL);
if (sp == NULL)
return;
AssignSlotToDataObject(&oldseg,sp);
if (DeleteMultiValueField(theEnv,&newseg,&oldseg,rb,re,"slot-delete$") == FALSE)
return;
arg.type = MULTIFIELD;
arg.value = (void *) &newseg;
arg.nextArg = NULL;
arg.argList = NULL;
DirectMessage(theEnv,sp->desc->overrideMessage,ins,result,&arg);
}
/*****************************************************************
NAME : DirectMVReplaceCommand
DESCRIPTION : Directly replaces a slot's value
INPUTS : None
RETURNS : TRUE if put OK, FALSE otherwise
SIDE EFFECTS : Slot modified
NOTES : H/L Syntax: (direct-slot-replace$ <slot>
<range-begin> <range-end> <value>)
*****************************************************************/
globle intBool DirectMVReplaceCommand(
void *theEnv)
{
INSTANCE_SLOT *sp;
INSTANCE_TYPE *ins;
int rb,re;
DATA_OBJECT newval,newseg,oldseg;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -