📄 textpro.c
字号:
/*FUNCTION ATTACH_LEAF : *//* Input : 1) address of current NewFetchFile *//* 2) address of current topic entry-node *//* 3) file pointer *//* 4) name of file *//* 5) error message buffer *//* 6) size of error message buffer *//* 7) line count in the file *//* Output : *//*This function attaches the entry-node to its proper place in the tree of the*//*current file. The function returns a boolean flag indicating the success *//*(or lack thereof) of this connection. In the case of an error, an error *//*message is written to the caller's buffer, the file is closed, and the *//*previous file entries are deleted from the lookup table. *//******************************************************************************/static int AttachLeaf( void *theEnv, struct lists *lnode, struct entries *enode, FILE *fp, char *file, int line_ct) { int p_flag; /*Used in searching the tree for a parent*/ /*====================*/ /*First topic for file*/ /*====================*/ if (lnode->topics == NULL) lnode->topics = enode; /*================================*/ /*Subtopic - branch down the tree */ /*================================*/ else if (enode->level > TextProcessingData(theEnv)->parent->level) if (TextProcessingData(theEnv)->parent->type == MENU) { enode->parent = TextProcessingData(theEnv)->parent; TextProcessingData(theEnv)->parent->child = enode; } else { rm(theEnv,(void *) enode,(int) sizeof(struct entries)); GenClose(theEnv,fp); TextLookupToss(theEnv,file); PrintErrorID(theEnv,"TEXTPRO",7,FALSE); EnvPrintRouter(theEnv,WERROR,"Line "); PrintLongInteger(theEnv,WERROR,line_ct); EnvPrintRouter(theEnv,WERROR," : Non-menu entries cannot have subtopics.\n"); return(FALSE); } /*====================================*/ /*Brother-topic -- same level in tree */ /*====================================*/ else if (enode->level == TextProcessingData(theEnv)->parent->level) { enode->parent = TextProcessingData(theEnv)->parent->parent; enode->next = TextProcessingData(theEnv)->parent->next; TextProcessingData(theEnv)->parent->next = enode; } /*==========================================================*/ /*Topic is unrelated to previous topic - branch up the tree */ /*==========================================================*/ else { if (TextProcessingData(theEnv)->parent != NULL) p_flag = 1; else p_flag = 0; while (p_flag > 0) { TextProcessingData(theEnv)->parent = TextProcessingData(theEnv)->parent->parent; if (TextProcessingData(theEnv)->parent != NULL) if (enode->level < TextProcessingData(theEnv)->parent->level) p_flag = 1; else p_flag = 0; else p_flag = 0; } if (TextProcessingData(theEnv)->parent != NULL) /*========*/ /*Subtopic*/ /*========*/ if (TextProcessingData(theEnv)->parent->level < enode->level) { enode->parent = TextProcessingData(theEnv)->parent; enode->next = TextProcessingData(theEnv)->parent->child; TextProcessingData(theEnv)->parent->child = enode; } /*=============*/ /*Brother-topic*/ /*=============*/ else { enode->parent = TextProcessingData(theEnv)->parent->parent; enode->next = TextProcessingData(theEnv)->parent->next; TextProcessingData(theEnv)->parent->next = enode; } /*=========*/ /*Root Node*/ /*=========*/ else { enode->parent = NULL; enode->next = lnode->topics; lnode->topics = enode; } } TextProcessingData(theEnv)->parent = enode; return(TRUE); }/******************************************************************************//*FUNCTION LOOKUP : *//* Input : 1) name of entry-topic file to be used for reference *//* 2) caller allocated buffer to contain the main topic name *//* 3) name of the entry-topic to be found *//* 4) caller allocated buffer to store the return status *//* Output : 1) offset from the beginning of the entry-topic file stream to the*//* beginning of the requested topic (-1 if the topic not found) *//* 2) status code stored in caller's buffer indicating the result of *//* the lookup : NO_FILE, NO_TOPIC, BRANCH_UP, BRANCH_DOWN, EXIT, *//* or NORMAL. *//* *//* Notes : 1) If NULL is given as an entry-topic, the lookup routine branches *//* up one level in the tree (status BRANCH_UP). If the current *//* level of the tree is already the root, all paths are set to NULL*//* (status EXIT). *//* 2) If an entry-topic is not found, the file position of the current*//* main topic (or menu) is returned (status NO_TOPIC). *//******************************************************************************/static long int LookupEntry( void *theEnv, char *file, char **menu, char *name, int *code) { struct lists *lptr; /*Local pointers used to move through the tree*/ struct entries *eptr; int l_flag, e_flag; /*Flags used in looping to find entry-topics*/ /*===============================*/ /*Find named file in lookup list */ /*===============================*/ lptr = TextProcessingData(theEnv)->headings; if (lptr != NULL) if (strcmp(lptr->file,file) != 0) l_flag = 1; else l_flag = 0; else l_flag = 0; while (l_flag > 0) { lptr = lptr->next; if (lptr != NULL) if (strcmp(lptr->file,file) != 0) l_flag = 1; else l_flag = 0; else l_flag = 0; } if (lptr == NULL) { *code = NO_FILE; return(-1); } /*==================================================================*/ /*If entry-topic was NULL, branch up one-level in the tree, or exit */ /*the tree if already at the root. */ /*==================================================================*/ if (name == NULL) { if (lptr->curr_menu == NULL) { *code = EXIT; return(-1); } else { if (lptr->curr_menu->parent == NULL) { *code = EXIT; lptr->curr_menu = NULL; *menu = NULL; return(-1); } lptr->curr_menu = lptr->curr_menu->parent; *code = BRANCH_UP; *menu = lptr->curr_menu->name; return(lptr->curr_menu->offset); } } /*========================================*/ /*Find the topic in the file's topic tree */ /*========================================*/ upper(name); if (lptr->curr_menu != NULL) eptr = lptr->curr_menu->child; else eptr = lptr->topics; if (eptr != NULL) if (findstr(eptr->name,name) == 0) e_flag = 0; else e_flag = 1; else e_flag = 0; while (e_flag > 0) { eptr = eptr->next; if (eptr != NULL) if (findstr(eptr->name,name) == 0) e_flag = 0; else e_flag = 1; else e_flag = 0; } /*===================================================================*/ /*If the topic was not found, return the position of the current menu*/ /*===================================================================*/ if (eptr == NULL) { *code = NO_TOPIC; if (lptr->curr_menu != NULL) { *menu = lptr->curr_menu->name; return(lptr->curr_menu->offset); } return(-1); } /*===============================================================*/ /*If the requested topic has children, branch down to its level. */ /*===============================================================*/ if (eptr->type == MENU) { *code = BRANCH_DOWN; lptr->curr_menu = eptr; } else *code = NORMAL; if (lptr->curr_menu != NULL) *menu = lptr->curr_menu->name; return(eptr->offset); }/******************************************************************************//*FUNCTION TOSS : *//* Input : 1) entry-topic address *//* Output : This function recursively deletes a node and all child nodes *//******************************************************************************/static void TossFunction( void *theEnv, struct entries *eptr) { struct entries *prev; while (eptr != NULL) { if (eptr->child != NULL) TossFunction(theEnv,eptr->child); prev = eptr; eptr = eptr->next; rm(theEnv,(void *) prev,(int) sizeof(struct entries)); } }/****************************************************************************//****************************************************************************//* TEXT PROCESSING FUNCTIONS *//* *//* The functions contained in this file can be called to handle *//* external file referencing and accessing. FetchCommand() loads a file *//* onto an internal run-time lookup table, TossCommand() removes the file, *//* PrintRegionCommand accesses the loaded file to display a requested *//* entry, and HelpFunction() provides an on-line help facility *//* using the external help data file specified in the header file setup.h. *//* For information on the format of the data file(s) required, see the *//* internal documentation in LOOKUP.C and the external documentation. *//* *//* For usage of these functions, see the external documentation. *//****************************************************************************//****************************************************************************/#define SCREEN_LN 22 /*Typical terminal screen length -- 22 lines*/ /*Used for scrolling in the help facility *//*==========================================*//*Topic node for help facility's query list *//*==========================================*/struct topics { char name[NAMESIZE]; /*Name of the node */ struct topics *end_list; /*Pointer to end of query list */ struct topics *next; /*Pointer to next topic in the list*/ };/******************************************************************************//*============================================================================*//* FUNCTION DECLARATIONS *//*============================================================================*//******************************************************************************/#if HELP_FUNCTIONSstatic int RecognizeHelpRouters(void *,char *);static int HelpPrint(void *,char *,char *);static int HelpGetc(void *,char *);static int HelpUngetc(void *,int,char *);static struct topics *AskForNewHelpTopic(void *,struct topics *,char **);#endifstatic struct topics *GetCommandLineTopics(void *);static FILE *FindTopicInEntries(void *,char *,struct topics *,char **,int *);/******************************************************************************//*============================================================================*//* EXTERNAL ACCESS FUNCTIONS *//*============================================================================*//******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -