📄 textpro.c
字号:
{
if (strcmp(params->name,"t") == 0)
strcpy(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 */
*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;
int oldPos = 0;
unsigned oldMax = 0;
unsigned 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
#endif
static 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
#endif
static 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
#endif
static 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
#endif
static 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))
strncpy(tnode->name,DOToString(val),NAMESIZE-1);
else if (GetType(val) == FLOAT)
strncpy(tnode->name,FloatToString(theEnv,DOToDouble(val)),NAMESIZE-1);
else if (GetType(val) == INTEGER)
strncpy(tnode->name,LongIntegerToString(theEnv,DOToLong(val)),NAMESIZE-1);
else
strncpy(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_FUNCTIONS
static 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -