📄 genrccom.c
字号:
DEFGENERIC *gfunc;
int mi;
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
gfunc = (DEFGENERIC *) ptr;
mi = FindMethodByIndex(gfunc,theIndex);
PrintMethod(theEnv,buf,buflen,&gfunc->methods[mi]);
}
/*********************************************************
NAME : EnvGetDefgenericWatch
DESCRIPTION : Determines if trace messages are
gnerated when executing generic function
INPUTS : A pointer to the generic
RETURNS : TRUE if a trace is active,
FALSE otherwise
SIDE EFFECTS : None
NOTES : None
*********************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle unsigned EnvGetDefgenericWatch(
void *theEnv,
void *theGeneric)
{
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
return(((DEFGENERIC *) theGeneric)->trace);
}
/*********************************************************
NAME : EnvSetDefgenericWatch
DESCRIPTION : Sets the trace to ON/OFF for the
generic function
INPUTS : 1) TRUE to set the trace on,
FALSE to set it off
2) A pointer to the generic
RETURNS : Nothing useful
SIDE EFFECTS : Watch flag for the generic set
NOTES : None
*********************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle void EnvSetDefgenericWatch(
void *theEnv,
unsigned newState,
void *theGeneric)
{
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
((DEFGENERIC *) theGeneric)->trace = newState;
}
/*********************************************************
NAME : EnvGetDefmethodWatch
DESCRIPTION : Determines if trace messages for calls
to this method will be generated or not
INPUTS : 1) A pointer to the generic
2) The index of the method
RETURNS : TRUE if a trace is active,
FALSE otherwise
SIDE EFFECTS : None
NOTES : None
*********************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle unsigned EnvGetDefmethodWatch(
void *theEnv,
void *theGeneric,
unsigned theIndex)
{
DEFGENERIC *gfunc;
int mi;
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
gfunc = (DEFGENERIC *) theGeneric;
mi = FindMethodByIndex(gfunc,theIndex);
return(gfunc->methods[mi].trace);
}
/*********************************************************
NAME : EnvSetDefmethodWatch
DESCRIPTION : Sets the trace to ON/OFF for the
calling of the method
INPUTS : 1) TRUE to set the trace on,
FALSE to set it off
2) A pointer to the generic
3) The index of the method
RETURNS : Nothing useful
SIDE EFFECTS : Watch flag for the method set
NOTES : None
*********************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle void EnvSetDefmethodWatch(
void *theEnv,
unsigned newState,
void *theGeneric,
unsigned theIndex)
{
DEFGENERIC *gfunc;
int mi;
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
gfunc = (DEFGENERIC *) theGeneric;
mi = FindMethodByIndex(gfunc,theIndex);
gfunc->methods[mi].trace = newState;
}
/********************************************************
NAME : PPDefgenericCommand
DESCRIPTION : Displays the pretty-print form of
a generic function header
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : None
NOTES : H/L Syntax: (ppdefgeneric <name>)
********************************************************/
globle void PPDefgenericCommand(
void *theEnv)
{
PPConstructCommand(theEnv,"ppdefgeneric",DefgenericData(theEnv)->DefgenericConstruct);
}
/**********************************************************
NAME : PPDefmethodCommand
DESCRIPTION : Displays the pretty-print form of
a method
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : None
NOTES : H/L Syntax: (ppdefmethod <name> <index>)
**********************************************************/
globle void PPDefmethodCommand(
void *theEnv)
{
DATA_OBJECT temp;
char *gname;
DEFGENERIC *gfunc;
int gi;
if (EnvArgTypeCheck(theEnv,"ppdefmethod",1,SYMBOL,&temp) == FALSE)
return;
gname = DOToString(temp);
if (EnvArgTypeCheck(theEnv,"ppdefmethod",2,INTEGER,&temp) == FALSE)
return;
gfunc = CheckGenericExists(theEnv,"ppdefmethod",gname);
if (gfunc == NULL)
return;
gi = CheckMethodExists(theEnv,"ppdefmethod",gfunc,DOToInteger(temp));
if (gi == -1)
return;
if (gfunc->methods[gi].ppForm != NULL)
PrintInChunks(theEnv,WDISPLAY,gfunc->methods[gi].ppForm);
}
/******************************************************
NAME : ListDefmethodsCommand
DESCRIPTION : Lists a brief description of methods
for a particular generic function
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : None
NOTES : H/L Syntax: (list-defmethods <name>)
******************************************************/
globle void ListDefmethodsCommand(
void *theEnv)
{
DATA_OBJECT temp;
DEFGENERIC *gfunc;
if (EnvRtnArgCount(theEnv) == 0)
EnvListDefmethods(theEnv,WDISPLAY,NULL);
else
{
if (EnvArgTypeCheck(theEnv,"list-defmethods",1,SYMBOL,&temp) == FALSE)
return;
gfunc = CheckGenericExists(theEnv,"list-defmethods",DOToString(temp));
if (gfunc != NULL)
EnvListDefmethods(theEnv,WDISPLAY,(void *) gfunc);
}
}
/***************************************************************
NAME : EnvGetDefmethodPPForm
DESCRIPTION : Getsa generic function method pretty print form
INPUTS : 1) Address of the generic function
2) Index of the method
RETURNS : Method ppform
SIDE EFFECTS : None
NOTES : None
***************************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle char *EnvGetDefmethodPPForm(
void *theEnv,
void *ptr,
unsigned theIndex)
{
DEFGENERIC *gfunc;
int mi;
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
gfunc = (DEFGENERIC *) ptr;
mi = FindMethodByIndex(gfunc,theIndex);
return(gfunc->methods[mi].ppForm);
}
/***************************************************
NAME : ListDefgenericsCommand
DESCRIPTION : Displays all defgeneric names
INPUTS : None
RETURNS : Nothing useful
SIDE EFFECTS : Defgeneric names printed
NOTES : H/L Interface
***************************************************/
globle void ListDefgenericsCommand(
void *theEnv)
{
ListConstructCommand(theEnv,"list-defgenerics",DefgenericData(theEnv)->DefgenericConstruct);
}
/***************************************************
NAME : EnvListDefgenerics
DESCRIPTION : Displays all defgeneric names
INPUTS : 1) The logical name of the output
2) The module
RETURNS : Nothing useful
SIDE EFFECTS : Defgeneric names printed
NOTES : C Interface
***************************************************/
globle void EnvListDefgenerics(
void *theEnv,
char *logicalName,
struct defmodule *theModule)
{
ListConstruct(theEnv,DefgenericData(theEnv)->DefgenericConstruct,logicalName,theModule);
}
/******************************************************
NAME : EnvListDefmethods
DESCRIPTION : Lists a brief description of methods
for a particular generic function
INPUTS : 1) The logical name of the output
2) Generic function to list methods for
(NULL means list all methods)
RETURNS : Nothing useful
SIDE EFFECTS : None
NOTES : None
******************************************************/
globle void EnvListDefmethods(
void *theEnv,
char *logicalName,
void *vptr)
{
DEFGENERIC *gfunc;
long count;
if (vptr != NULL)
count = ListMethodsForGeneric(theEnv,logicalName,(DEFGENERIC *) vptr);
else
{
count = 0L;
for (gfunc = (DEFGENERIC *) EnvGetNextDefgeneric(theEnv,NULL) ;
gfunc != NULL ;
gfunc = (DEFGENERIC *) EnvGetNextDefgeneric(theEnv,(void *) gfunc))
{
count += ListMethodsForGeneric(theEnv,logicalName,gfunc);
if (EnvGetNextDefgeneric(theEnv,(void *) gfunc) != NULL)
EnvPrintRouter(theEnv,logicalName,"\n");
}
}
PrintTally(theEnv,logicalName,count,"method","methods");
}
#endif
/***************************************************************
NAME : GetDefgenericListFunction
DESCRIPTION : Groups all defgeneric names into
a multifield list
INPUTS : A data object buffer to hold
the multifield result
RETURNS : Nothing useful
SIDE EFFECTS : Multifield allocated and filled
NOTES : H/L Syntax: (get-defgeneric-list [<module>])
***************************************************************/
globle void GetDefgenericListFunction(
void *theEnv,
DATA_OBJECT*returnValue)
{
GetConstructListFunction(theEnv,"get-defgeneric-list",returnValue,DefgenericData(theEnv)->DefgenericConstruct);
}
/***************************************************************
NAME : EnvGetDefgenericList
DESCRIPTION : Groups all defgeneric names into
a multifield list
INPUTS : 1) A data object buffer to hold
the multifield result
2) The module from which to obtain defgenerics
RETURNS : Nothing useful
SIDE EFFECTS : Multifield allocated and filled
NOTES : External C access
***************************************************************/
globle void EnvGetDefgenericList(
void *theEnv,
DATA_OBJECT *returnValue,
struct defmodule *theModule)
{
GetConstructList(theEnv,returnValue,DefgenericData(theEnv)->DefgenericConstruct,theModule);
}
/***********************************************************
NAME : GetDefmethodListCommand
DESCRIPTION : Groups indices of all methdos for a generic
function into a multifield variable
(NULL means get methods for all generics)
INPUTS : A data object buffer
RETURNS : Nothing useful
SIDE EFFECTS : Multifield set to list of method indices
NOTES : None
***********************************************************/
globle void GetDefmethodListCommand(
void *theEnv,
DATA_OBJECT_PTR returnValue)
{
DATA_OBJECT temp;
DEFGENERIC *gfunc;
if (EnvRtnArgCount(theEnv) == 0)
EnvGetDefmethodList(theEnv,NULL,returnValue);
else
{
if (EnvArgTypeCheck(theEnv,"get-defmethod-list",1,SYMBOL,&temp) == FALSE)
{
EnvSetMultifieldErrorValue(theEnv,returnValue);
return;
}
gfunc = CheckGenericExists(theEnv,"get-defmethod-list",DOToString(temp));
if (gfunc != NULL)
EnvGetDefmethodList(theEnv,(void *) gfunc,returnValue);
else
EnvSetMultifieldErrorValue(theEnv,returnValue);
}
}
/***********************************************************
NAME : EnvGetDefmethodList
DESCRIPTION : Groups indices of all methdos for a generic
function into a multifield variable
(NULL means get methods for all generics)
INPUTS : 1) A pointer to a generic function
2) A data object buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -