📄 cstrccom.c
字号:
tempSize = strlen(EnvGetDefmoduleName(theEnv,loopModule));
/*======================================================*/
/* The buffer must be large enough for the module name, */
/* the largest name of all the constructs, and the ::. */
/*======================================================*/
if ((tempSize + largestConstructNameSize + 5) > bufferSize)
{ bufferSize = tempSize + largestConstructNameSize + 5; }
/*=============================*/
/* Move on to the next module. */
/*=============================*/
if (allModules) loopModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,loopModule);
else loopModule = NULL;
}
/*===========================*/
/* Allocate the name buffer. */
/*===========================*/
buffer = (char *) genalloc(theEnv,bufferSize);
/*================================*/
/* Create the multifield value to */
/* store the construct names. */
/*================================*/
SetpType(returnValue,MULTIFIELD);
SetpDOBegin(returnValue,1);
SetpDOEnd(returnValue,(long) count);
theList = (struct multifield *) EnvCreateMultifield(theEnv,count);
SetpValue(returnValue,(void *) theList);
/*===========================*/
/* Store the construct names */
/* in the multifield value. */
/*===========================*/
loopModule = theModule;
count = 1;
while (loopModule != NULL)
{
/*============================*/
/* Set the current module to */
/* the module being examined. */
/*============================*/
EnvSetCurrentModule(theEnv,(void *) loopModule);
/*===============================*/
/* Add each construct name found */
/* in the module to the list. */
/*===============================*/
theConstruct = NULL;
while ((theConstruct = (*constructClass->getNextItemFunction)(theEnv,theConstruct)) != NULL)
{
theName = (*constructClass->getConstructNameFunction)((struct constructHeader *) theConstruct);
SetMFType(theList,count,SYMBOL);
if (allModules)
{
strcpy(buffer,EnvGetDefmoduleName(theEnv,loopModule));
strcat(buffer,"::");
strcat(buffer,ValueToString(theName));
SetMFValue(theList,count,EnvAddSymbol(theEnv,buffer));
}
else
{ SetMFValue(theList,count,EnvAddSymbol(theEnv,ValueToString(theName))); }
count++;
}
/*==================================*/
/* Move on to the next module (if */
/* the list is to contain the names */
/* of constructs from all modules). */
/*==================================*/
if (allModules) loopModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,loopModule);
else loopModule = NULL;
}
/*=========================*/
/* Return the name buffer. */
/*=========================*/
genfree(theEnv,buffer,bufferSize);
/*=============================*/
/* Restore the current module. */
/*=============================*/
RestoreCurrentModule(theEnv);
}
/*********************************************/
/* ListConstructCommand: Generic Routine for */
/* listing the constructs in a module. */
/*********************************************/
globle void ListConstructCommand(
void *theEnv,
char *functionName,
struct construct *constructClass)
{
struct defmodule *theModule;
DATA_OBJECT result;
int numArgs;
/*============================================*/
/* Check for the correct number of arguments. */
/*============================================*/
if ((numArgs = EnvArgCountCheck(theEnv,functionName,NO_MORE_THAN,1)) == -1) return;
/*====================================*/
/* If an argument was given, check to */
/* see that it's a valid module name. */
/*====================================*/
if (numArgs == 1)
{
/*======================================*/
/* Only symbols are valid module names. */
/*======================================*/
EnvRtnUnknown(theEnv,1,&result);
if (GetType(result) != SYMBOL)
{
ExpectedTypeError1(theEnv,functionName,1,"defmodule name");
return;
}
/*===========================================*/
/* Verify that the named module exists or is */
/* the symbol * (for obtaining the construct */
/* list for all modules). */
/*===========================================*/
if ((theModule = (struct defmodule *) EnvFindDefmodule(theEnv,DOToString(result))) == NULL)
{
if (strcmp("*",DOToString(result)) != 0)
{
ExpectedTypeError1(theEnv,functionName,1,"defmodule name");
return;
}
theModule = NULL;
}
}
/*=====================================*/
/* Otherwise use the current module to */
/* generate the construct list. */
/*=====================================*/
else
{ theModule = ((struct defmodule *) EnvGetCurrentModule(theEnv)); }
/*=========================*/
/* Call the driver routine */
/* to list the constructs. */
/*=========================*/
ListConstruct(theEnv,constructClass,WDISPLAY,theModule);
}
/*****************************************/
/* ListConstruct: Generic C Routine for */
/* listing the constructs in a module. */
/*****************************************/
globle void ListConstruct(
void *theEnv,
struct construct *constructClass,
char *logicalName,
struct defmodule *theModule)
{
void *constructPtr;
SYMBOL_HN *constructName;
long count = 0;
int allModules = FALSE;
/*==========================*/
/* Save the current module. */
/*==========================*/
SaveCurrentModule(theEnv);
/*=======================================*/
/* If the module specified is NULL, then */
/* list all constructs in all modules. */
/*=======================================*/
if (theModule == NULL)
{
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
allModules = TRUE;
}
/*==================================*/
/* Loop through all of the modules. */
/*==================================*/
while (theModule != NULL)
{
/*========================================*/
/* If we're printing the construct in all */
/* modules, then preface each module */
/* listing with the name of the module. */
/*========================================*/
if (allModules)
{
EnvPrintRouter(theEnv,logicalName,EnvGetDefmoduleName(theEnv,theModule));
EnvPrintRouter(theEnv,logicalName,":\n");
}
/*===============================*/
/* Set the current module to the */
/* module we're examining. */
/*===============================*/
EnvSetCurrentModule(theEnv,(void *) theModule);
/*===========================================*/
/* List all of the constructs in the module. */
/*===========================================*/
for (constructPtr = (*constructClass->getNextItemFunction)(theEnv,NULL);
constructPtr != NULL;
constructPtr = (*constructClass->getNextItemFunction)(theEnv,constructPtr))
{
if (EvaluationData(theEnv)->HaltExecution == TRUE) return;
constructName = (*constructClass->getConstructNameFunction)((struct constructHeader *) constructPtr);
if (constructName != NULL)
{
if (allModules) EnvPrintRouter(theEnv,WDISPLAY," ");
EnvPrintRouter(theEnv,logicalName,ValueToString(constructName));
EnvPrintRouter(theEnv,logicalName,"\n");
}
count++;
}
/*====================================*/
/* Move on to the next module (if the */
/* listing is to contain the names of */
/* constructs from all modules). */
/*====================================*/
if (allModules) theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule);
else theModule = NULL;
}
/*=================================================*/
/* Print the tally and restore the current module. */
/*=================================================*/
PrintTally(theEnv,WDISPLAY,count,constructClass->constructName,
constructClass->pluralName);
RestoreCurrentModule(theEnv);
}
/**********************************************************/
/* SetNextConstruct: Sets the next field of one construct */
/* to point to another construct of the same type. */
/**********************************************************/
globle void SetNextConstruct(
struct constructHeader *theConstruct,
struct constructHeader *targetConstruct)
{ theConstruct->next = targetConstruct; }
/********************************************************************/
/* GetConstructModuleItem: Returns the construct module for a given */
/* construct (note that this is a pointer to a data structure */
/* like the deffactsModule, not a pointer to an environment */
/* module which contains a number of types of constructs. */
/********************************************************************/
globle struct defmoduleItemHeader *GetConstructModuleItem(
struct constructHeader *theConstruct)
{ return(theConstruct->whichModule); }
/*************************************************/
/* GetConstructPPForm: Returns the pretty print */
/* representation for the specified construct. */
/*************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle char *GetConstructPPForm(
void *theEnv,
struct constructHeader *theConstruct)
{
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
return(theConstruct->ppForm);
}
/****************************************************/
/* GetNextConstructItem: Returns the next construct */
/* items from a list of constructs. */
/****************************************************/
globle struct constructHeader *GetNextConstructItem(
void *theEnv,
struct constructHeader *theConstruct,
int moduleIndex)
{
struct defmoduleItemHeader *theModuleItem;
if (theConstruct == NULL)
{
theModuleItem = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,NULL,moduleIndex);
if (theModuleItem == NULL) return(NULL);
return(theModuleItem->firstItem);
}
return(theConstruct->next);
}
/*******************************************************/
/* GetConstructModuleItemByIndex: Returns a pointer to */
/* the defmodule item for the specified construct. If */
/* theModule is NULL, then the construct module item */
/* for the current module is returned, otherwise the */
/* construct module item for the specified construct */
/* is returned. */
/*******************************************************/
globle struct defmoduleItemHeader *GetConstructModuleItemByIndex(
void *theEnv,
struct defmodule *theModule,
int moduleIndex)
{
if (theModule != NULL)
{
return((struct defmoduleItemHeader *)
GetModuleItem(theEnv,theModule,moduleIndex));
}
return((struct defmoduleItemHeader *)
GetModuleItem(theEnv,((struct defmodule *) EnvGetCurrentModule(theEnv)),moduleIndex));
}
/******************************************/
/* FreeConstructHeaderModule: Deallocates */
/* the data structures associated with */
/* the construct module item header. */
/******************************************/
globle void FreeConstructHeaderModule(
void *theEnv,
struct defmoduleItemHeader *theModuleItem,
struct construct *constructClass)
{
struct constructHeader *thisOne, *nextOne;
thisOne = theModuleItem->firstItem;
while (thisOne != NULL)
{
nextOne = thisOne->next;
(*constructClass->freeFunction)(theEnv,thisOne);
thisOne = nextOne;
}
}
/**********************************************/
/* DoForAllConstructs: Executes an action for */
/* all constructs of a specified type. */
/**********************************************/
globle long DoForAllConstructs(
void *theEnv,
void (*actionFunction)(void *,struct constructHeader *,void *),
int moduleItemIndex,
int interruptable,
void *userBuffer)
{
struct constructHeader *theConstruct;
struct defmoduleItemHeader *theModuleItem;
void *theModule;
long moduleCount = 0L;
/*==========================*/
/* Save the current module. */
/*==========================*/
SaveCurrentModule(theEnv);
/*==================================*/
/* Loop through all of the modules. */
/*==================================*/
for (theModule = EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = EnvGetNextDefmodule(theEnv,theModule), moduleCount++)
{
/*=============================*/
/* Set the current module to */
/* the module we're examining. */
/*=============================*/
EnvSetCurrentModule(theEnv,(void *) theModule);
/*================================================*/
/* Perform the action for each of the constructs. */
/*================================================*/
theModuleItem = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,(struct defmodule *) theModule,moduleItemIndex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -