📄 textpro.c
字号:
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_FUNCTIONS
static 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 **);
#endif
static struct topics *GetCommandLineTopics(void *);
static FILE *FindTopicInEntries(void *,char *,struct topics *,char **,int *);
/******************************************************************************/
/*============================================================================*/
/* EXTERNAL ACCESS FUNCTIONS */
/*============================================================================*/
/******************************************************************************/
/******************************************************************************/
/*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_FUNCTIONS
globle 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);
strcpy(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));
strcpy(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);
strcpy(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) 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))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -