📄 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) { genstrcpy(buffer,EnvGetDefmoduleName(theEnv,loopModule)); genstrcat(buffer,"::"); genstrcat(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#endifgloble 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 + -