📄 textpro.c
字号:
return(NULL);
}
/*===============================================================*/
/* For systems which have record file systems (such as VMS), */
/* the following statement is necessary to move the file pointer */
/* to the beginning of the next record. */
/*===============================================================*/
ungetc(getc(fp),fp);
enode->offset = ftell(fp);
enode->parent = NULL;
enode->child = NULL;
enode->next = NULL;
upper(enode->name);
return(enode);
}
/******************************************************************************/
/*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 */
/*==========================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -