📄 textpro.c
字号:
*tptr; /*Used in deallocating the parameter list */ char buf[256]; /*Buffer for the topic entry strings */ FILE *fp; /*Stream for the input file */ char *menu[1]; /*Buffer for the current menu name */ int status; /*Lookup status return code */ char *theString = NULL; void *theResult; size_t oldPos = 0; size_t oldMax = 0; size_t sLength; params = GetCommandLineTopics(theEnv); fp = FindTopicInEntries(theEnv,params->name,params->next,menu,&status); if ((status != NO_FILE) && (status != NO_TOPIC) && (status != EXIT)) { while (grab_string(theEnv,fp,buf,256) != NULL) theString = AppendToString(theEnv,buf,theString,&oldPos,&oldMax); } else { /* ================================================================== On NO_TOPIC results, the file is left open to point to the current menu. This used as a check by the Help System. In the case of print-region, however, we need to always make sure the file is closed. ================================================================== */ if (fp != NULL) GenClose(theEnv,fp); } /* ======================================================= Release any space used by the user's topic request list ======================================================= */ while (params != NULL) { tptr = params; params = params->next; rm(theEnv,(void *) tptr,(int) sizeof(struct topics)); } if (theString == NULL) { theResult = EnvAddSymbol(theEnv,""); } else { sLength = strlen(theString); if ((sLength > 0) && (((theString[sLength-1] == '\r') && (theString[sLength-2] == '\n')) || ((theString[sLength-1] == '\n') && (theString[sLength-2] == '\r')))) { theString[sLength-2] = 0; } theResult = EnvAddSymbol(theEnv,theString); } if (theString != NULL) { genfree(theEnv,theString,oldMax); } return(theResult); }/***************************************************************************//*FUNCTION TossCommand : (H/L function toss) *//* Input : Name of the file to be deleted from the lookup table (passed via*//* the argument "stack") *//* Output : This function deletes the named file from the lookup table and *//* returns a (float) boolean flag indicating failure or success. *//***************************************************************************/globle int TossCommand( void *theEnv) { char *file; /*Name of the file */ DATA_OBJECT arg_ptr; if (EnvArgTypeCheck(theEnv,"toss",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE) return (FALSE); file = DOToString(arg_ptr);#if HELP_FUNCTIONS if (TextProcessingData(theEnv)->help_file != NULL) if ((strcmp(file,TextProcessingData(theEnv)->help_file) == 0) && (TextProcessingData(theEnv)->HELP_INIT == TRUE)) { rm(theEnv,(void *) TextProcessingData(theEnv)->help_file,strlen(TextProcessingData(theEnv)->help_file) + 1); TextProcessingData(theEnv)->help_file = NULL; TextProcessingData(theEnv)->HELP_INIT = FALSE; EnvDeleteRouter(theEnv,"whelp"); }#endif return(TextLookupToss(theEnv,file)); }#endif/******************************************************************************//* The following four functions are the router routines for the logical name *//* "whelp". Currently, all they do is direct all accesses to standard I/O. *//******************************************************************************/#if HELP_FUNCTIONS#if IBM_TBC#pragma argsused#endifstatic int RecognizeHelpRouters( void *theEnv, char *log_name) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif if (strcmp(log_name,"whelp") == 0) return(TRUE); return(FALSE); }#if IBM_TBC#pragma argsused#endifstatic int HelpPrint( void *theEnv, char *log_name, char *str) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif EnvPrintRouter(theEnv,"stdout",str); return(1); }#if IBM_TBC#pragma argsused#endifstatic int HelpGetc( void *theEnv, char *log_name) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif return(EnvGetcRouter(theEnv,"stdin")); }#if IBM_TBC#pragma argsused#endifstatic int HelpUngetc( void *theEnv, int ch, char *log_name) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif return(EnvUngetcRouter(theEnv,ch,"stdin")); }#endif/******************************************************************************//*============================================================================*//* INTERNAL ROUTINES *//*============================================================================*//******************************************************************************//******************************************************************************//*FUNCTION CMD_LINE_TOPICS : *//* Input : None *//* Output : This function builds a linked list of topics requested by the *//* user at the H/L level using the argument "stack" routines, *//* num_args() and rstring(). It returns the address of the top of *//* the list or NULL if there were no command line topics. *//******************************************************************************/static struct topics *GetCommandLineTopics( void *theEnv) { int topic_num, /*Number of topics specified by the user */ theIndex; /*Used to loop through the topic list */ struct topics *head, /*Address of the top of the topic list */ *tnode, /*Address of new topic node */ *tptr; /*Used to attach new node to the list */ DATA_OBJECT val; /*Unknown-type H/L data structure */ head = NULL; topic_num = EnvRtnArgCount(theEnv); for (theIndex = 1; theIndex <= topic_num; theIndex++) { tnode = (struct topics *) gm2(theEnv,(int) sizeof(struct topics)); EnvRtnUnknown(theEnv,theIndex,&val); if ((GetType(val) == SYMBOL) || (GetType(val) == STRING)) genstrncpy(tnode->name,DOToString(val),NAMESIZE-1); else if (GetType(val) == FLOAT) genstrncpy(tnode->name,FloatToString(theEnv,DOToDouble(val)),NAMESIZE-1); else if (GetType(val) == INTEGER) genstrncpy(tnode->name,LongIntegerToString(theEnv,DOToLong(val)),NAMESIZE-1); else genstrncpy(tnode->name,"***ERROR***",NAMESIZE-1); tnode->next = NULL; tnode->end_list = NULL; if (head == NULL) head = tnode; else { tptr = head; while (tptr->next != NULL) tptr = tptr->next; tptr->next = tnode; } } return(head); }/******************************************************************************//*FUNCTION QUERY_TOPIC : *//* Input : 1) The address of the old topic list (this routines writes over *//* previously allocated memory, if available) *//* 2) A buffer holding the name of the current menu in the tree *//* Output : This function prompts the user for a new set of topic(s) and *//* displays the name of the current menu. Each new topic is *//* delineated by white-space, and this function builds a linked list *//* of these topics. It returns the address of the top of this list. *//******************************************************************************/#if HELP_FUNCTIONSstatic struct topics *AskForNewHelpTopic( void *theEnv, struct topics *old_list, char **menu) { int theIndex, cnt; /*Indices of the user input buffer and topic name */ struct topics *tmain, /*Address of the top of the topic list */ *tnode, /*Address of the new topic node */ *tptr; /*Used to add the new node to the topic list */ char list[256], /*User input buffer */ name[NAMESIZE]; /*Name of the new topic in the list */ /*==================================================================*/ /*Read a line of input from the user (substituting blanks for tabs) */ /*==================================================================*/ EnvPrintRouter(theEnv,"whelp",*menu); EnvPrintRouter(theEnv,"whelp"," Topic? "); RouterData(theEnv)->CommandBufferInputCount = 0; for ( theIndex = 0; ((list[theIndex] = (char) EnvGetcRouter(theEnv,"whelp")) != LNFEED) && (theIndex < 254); theIndex++ , RouterData(theEnv)->CommandBufferInputCount++) { if (EvaluationData(theEnv)->HaltExecution) break; if (list[theIndex] == TAB) list[theIndex] = BLANK; else if ((list[theIndex] == '\b') && (theIndex != 0)) { theIndex -= 2; RouterData(theEnv)->CommandBufferInputCount -= 2; } }#if VAX_VMS EnvPrintRouter(theEnv,"whelp","\n");#endif RouterData(theEnv)->CommandBufferInputCount = -1; if (EvaluationData(theEnv)->HaltExecution) { EnvPrintRouter(theEnv,"whelp","\n"); old_list->end_list = old_list; return(old_list); } list[theIndex] = BLANK; list[theIndex+1] = NULLCHAR; /*=======================================*/ /*Parse user buffer into separate topics */ /*=======================================*/ tmain = old_list; theIndex = 0; cnt = 0; while (list[theIndex] != NULLCHAR) { if ((list[theIndex] != BLANK) && (cnt < NAMESIZE)) name[cnt++] = list[theIndex++]; else if (cnt > 0) { while ((list[theIndex] != BLANK) && (list[theIndex] != NULLCHAR)) theIndex++; name[cnt] = NULLCHAR; cnt = 0; /*==============================================*/ /*Write over previous topic lists, if available */ /*==============================================*/ if (old_list != NULL) { genstrcpy(old_list->name,name); old_list = old_list->next; } else { tnode = (struct topics *) gm2(theEnv,(int) sizeof(struct topics)); genstrcpy(tnode->name,name); tnode->next = NULL; tnode->end_list = NULL; if (tmain == NULL) tmain = tnode; else { tptr = tmain; while (tptr->next != NULL) tptr = tptr->next; tptr->next = tnode; } } } else theIndex++; } /*========================================================================*/ /*If the new list is shorter than the previous one, we must mark the end. */ /*========================================================================*/ tmain->end_list = old_list; return(tmain); }#endif/******************************************************************************//*FUNCTION FIND_TOPIC : *//* Input :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -