📄 textpro.c
字号:
/******************************************************************************//*FUNCTION HelpFunction : (H/L function help) *//* Input : Multiple or no topic requests may be passed to the help facility *//* from the top level via a "stack" accessed by the *//* system routines num_args() and rstring(). *//* Output : This function loads the help file specified in setup.h into a *//* a hierarchical tree structure using the routines of LOOKUP.C. *//* It then queries the user for topics, and, using the LOOKUP *//* routines, branches through the tree, displaying information where *//* appropriate. The function returns control once the user *//* has indicated an exit from the help tree. *//* *//* For usage see external documentation. *//******************************************************************************/#if HELP_FUNCTIONSgloble void HelpFunction( void *theEnv) { int status; /*Return code from the lookup routines */ FILE *fp; /*Pointer in to the help file stream */ struct topics *main_topic, /*Pointer to the first requested topic */ *tptr; /*Used in deallocating the topic list */ char buf[256], /*Buffer for storing input strings from the help file */ *menu[1]; /*Buffer for the name of the current main topic */#if ! WINDOW_INTERFACE char termbuf[2]; /*Buffer for storing the terminators of a scroll */ int line_cnt; /*Line count used for scrolling purposes */#endif if (TextProcessingData(theEnv)->HELP_INIT == FALSE) { if (TextProcessingData(theEnv)->help_file == NULL) { TextProcessingData(theEnv)->help_file = (char *) gm2(theEnv,strlen(HELP_DEFAULT) + 1); genstrcpy(TextProcessingData(theEnv)->help_file,HELP_DEFAULT); } EnvPrintRouter(theEnv,WDIALOG,"Loading help file entries from "); EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file); EnvPrintRouter(theEnv,WDIALOG,".\nPlease wait...\n"); status = TextLookupFetch(theEnv,TextProcessingData(theEnv)->help_file); if (status <= 0) { return; } else { /* ================================================================ Enables logical name "whelp" as the destination for all help I/O ================================================================ */ EnvAddRouter(theEnv,"whelp",10,RecognizeHelpRouters,HelpPrint, HelpGetc,HelpUngetc,NULL); TextProcessingData(theEnv)->HELP_INIT = TRUE; } } EnvActivateRouter(theEnv,"whelp"); /* ==================================================================== The root node of the help-tree is MAIN (see external documentation.) Add this node to the front of the initial topic request list given by the user on the top level command line. ==================================================================== */ main_topic = (struct topics *) gm2(theEnv,(int) sizeof(struct topics)); genstrcpy(main_topic->name,"MAIN"); main_topic->next = GetCommandLineTopics(theEnv); main_topic->end_list = NULL; EnvPrintRouter(theEnv,"whelp","\n"); /*============================*/ /*Process user topic requests */ /*============================*/ do { fp = FindTopicInEntries(theEnv,TextProcessingData(theEnv)->help_file,main_topic,menu,&status); if (status == NO_FILE) { PrintErrorID(theEnv,"TEXTPRO",1,FALSE); EnvPrintRouter(theEnv,WERROR,"Unable to access help file.\n"); break; } if (status == EXIT) break; if (status == NO_TOPIC) { if (fp == NULL) { /*===================================================*/ /*The lookup routines return the file location of the*/ /*current main topic if the requested topic is not */ /*found. The help-tree has one root: MAIN (see */ /*external docs). This topic should always be */ /*available. Thus, if the topic was not found and */ /*there is no current menu, the help-file has been */ /*tampered with and should be corrected. */ /*===================================================*/ EnvPrintRouter(theEnv,"whelp","Root entry \"MAIN\" not found in "); EnvPrintRouter(theEnv,"whelp",TextProcessingData(theEnv)->help_file); EnvPrintRouter(theEnv,"whelp",".\nSee external documentation.\n"); break; } EnvPrintRouter(theEnv,"whelp","\nSorry, no information available.\n\n"); } if (status != BRANCH_UP) {#if ! WINDOW_INTERFACE line_cnt = 0;#endif /*======================================================*/ /*Print lines from the information entry stopping after */ /*every screenful of lines. The user at that point has */ /*the option to continue or abort the entry to continue */ /*at the current menu level. */ /*======================================================*/ while (grab_string(theEnv,fp,buf,256) != NULL) {#if ! WINDOW_INTERFACE if (line_cnt >= (SCREEN_LN + 1)) { EnvPrintRouter(theEnv,"whelp","PRESS <RETURN> FOR MORE. "); EnvPrintRouter(theEnv,"whelp","PRESS <A>,<RETURN> TO ABORT."); RouterData(theEnv)->CommandBufferInputCount = 0; do { termbuf[0] = (char) EnvGetcRouter(theEnv,"whelp"); if (termbuf[0] != LNFEED) { if (termbuf[0] == 'a') termbuf[0] = 'A'; if (termbuf[0] != '\b') RouterData(theEnv)->CommandBufferInputCount++; else if (RouterData(theEnv)->CommandBufferInputCount != 0) RouterData(theEnv)->CommandBufferInputCount--; termbuf[1] = (char) EnvGetcRouter(theEnv,"whelp"); } } while ((termbuf[0] != LNFEED) && (termbuf[0] != 'A')); RouterData(theEnv)->CommandBufferInputCount = -1; line_cnt = 0; if (termbuf[0] == 'A') { GenClose(theEnv,fp); break; } } line_cnt++;#endif EnvPrintRouter(theEnv,"whelp",buf); } } else if (fp != NULL) /*==========================================================*/ /*If the user branched-up the help-tree, don't reprint that */ /*menu. However, the help file still needs to be closed. */ /*==========================================================*/ GenClose(theEnv,fp); main_topic = AskForNewHelpTopic(theEnv,main_topic,menu); if (EvaluationData(theEnv)->HaltExecution) { while (status != EXIT) if ((fp = GetEntries(theEnv,TextProcessingData(theEnv)->help_file,menu,NULL,&status)) != NULL) GenClose(theEnv,fp); } } while (status != EXIT); EnvDeactivateRouter(theEnv,"whelp"); /*========================================================*/ /*Release any space used by the user's topic request list */ /*========================================================*/ while (main_topic != NULL) { tptr = main_topic; main_topic = main_topic->next; rm(theEnv,(void *) tptr,(int) sizeof(struct topics)); } }/***************************************************************************//*FUNCTION HelpPathFunction : (function help-path) *//* Input : Via the argument "stack", the name of the new help entries *//* file, or no input. *//* Output : This function redefines the lookup file for the help facility. *//* If no argument is given, it displays the current file name. *//***************************************************************************/globle void HelpPathFunction( void *theEnv) { char *help_name; DATA_OBJECT arg_ptr; if (EnvRtnArgCount(theEnv) == 0) { EnvPrintRouter(theEnv,WDIALOG,"The current help entries file is "); if (TextProcessingData(theEnv)->help_file != NULL) EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file); else EnvPrintRouter(theEnv,WDIALOG,HELP_DEFAULT); EnvPrintRouter(theEnv,WDIALOG,"\n"); } else { if (TextProcessingData(theEnv)->help_file != NULL) { if (TextProcessingData(theEnv)->HELP_INIT == TRUE) { EnvPrintRouter(theEnv,WDIALOG,"Releasing help entries from file "); EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file); EnvPrintRouter(theEnv,WDIALOG,"...\n"); TextLookupToss(theEnv,TextProcessingData(theEnv)->help_file); EnvDeleteRouter(theEnv,"whelp"); TextProcessingData(theEnv)->HELP_INIT = FALSE; } rm(theEnv,(void *) TextProcessingData(theEnv)->help_file,strlen(TextProcessingData(theEnv)->help_file) + 1); } if (EnvArgTypeCheck(theEnv,"help-path",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE) return; help_name = DOToString(arg_ptr); TextProcessingData(theEnv)->help_file = (char *) gm2(theEnv,strlen(help_name) + 1); genstrcpy(TextProcessingData(theEnv)->help_file,help_name); EnvPrintRouter(theEnv,WDIALOG,"Help entries file reset to "); EnvPrintRouter(theEnv,WDIALOG,help_name); EnvPrintRouter(theEnv,WDIALOG,"\n"); } }#endif#if TEXTPRO_FUNCTIONS/***************************************************************************//*FUNCTION FetchCommand : (H/L function fetch) *//* Input : Name of the file to be stored in the lookup table - passed via *//* the argument "stack" and result buffer *//* Output : This function loads a file into the internal lookup table and *//* returns a (float) boolean flag indicating failure or success. *//***************************************************************************/globle void FetchCommand( void *theEnv, DATA_OBJECT *result) { int load_ct; /*Number of entries loaded */ DATA_OBJECT arg_ptr; result->type = SYMBOL; result->value = EnvFalseSymbol(theEnv); if (EnvArgTypeCheck(theEnv,"fetch",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE) return; load_ct = TextLookupFetch(theEnv,DOToString(arg_ptr)); if (load_ct <= 0) { if (load_ct == 0) { PrintErrorID(theEnv,"TEXTPRO",3,FALSE); EnvPrintRouter(theEnv,WERROR,"No entries found.\n"); } return; } result->type = INTEGER; result->value = (void *) EnvAddLong(theEnv,(long long) load_ct); }/******************************************************************************//*FUNCTION PrintRegionCommand : (H/L function print-region) *//* Input : Via the argument "stack", logical name for the output, the name of the *//* file to be accessed, and the name of the topic(s) to be looked up. *//* Output : This function accesses a previously loaded file and prints the *//* information of the topic entry requested to the screen. The tree *//* structure must currently be at the correct level in order for the *//* topic to be accessed. To branch down the tree, each topic in the *//* path to the one desired must be named. Multiple arguments are *//* allowed as in the help facility (see the external documentation.) *//* To branch up the tree, the special topic character `^' must be *//* specified for each upwards branch. Giving no topic name will *//* cause a single branch-up in the tree. The `?' character given at *//* the end of a path will return the current main topic menu. *//* *//* For usage, see the external documentation. *//******************************************************************************/globle int PrintRegionCommand( void *theEnv) { struct topics *params, /*Lookup file and list of topic requests */ *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 */ com_code; /*Completion flag */ params = GetCommandLineTopics(theEnv); fp = FindTopicInEntries(theEnv,params->next->name,params->next->next,menu,&status); if ((status != NO_FILE) && (status != NO_TOPIC) && (status != EXIT)) { if (strcmp(params->name,"t") == 0) genstrcpy(params->name,"stdout"); EnvPrintRouter(theEnv,params->name,"\n"); while (grab_string(theEnv,fp,buf,256) != NULL) EnvPrintRouter(theEnv,params->name,buf); com_code = TRUE; } 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); com_code = FALSE; } /* ======================================================= 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)); } return(com_code); }/******************************************************************************//*FUNCTION GetRegionCommand : (H/L functionget-region) *//******************************************************************************/globle void *GetRegionCommand( void *theEnv) { struct topics *params, /*Lookup file and list of topic requests */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -