📄 commline.c
字号:
/*=====================================================*/
default:
if (depth == 0)
{
if (isprint(inchar))
{
while ((inchar = mstring[i++]) != EOS)
{
if ((inchar == '\n') || (inchar == '\r'))
{
if (error) return(-1);
else return(1);
}
}
return(0);
}
}
break;
}
}
/*====================================================*/
/* Return 0 because a complete command was not found. */
/*====================================================*/
return(0);
}
/***********************************************************/
/* DoString: Skips over a string contained within a string */
/* until the closing quotation mark is encountered. */
/***********************************************************/
static int DoString(
char *str,
int pos,
int *complete)
{
int inchar;
/*=================================================*/
/* Process the string character by character until */
/* the closing quotation mark is found. */
/*=================================================*/
inchar = str[pos];
while (inchar != '"')
{
/*=====================================================*/
/* If a \ is found, then the next character is ignored */
/* even if it is a closing quotation mark. */
/*=====================================================*/
if (inchar == '\\')
{
pos++;
inchar = str[pos];
}
/*===================================================*/
/* If the end of input is reached before the closing */
/* quotation mark is found, the return the last */
/* position that was reached and indicate that a */
/* complete string was not found. */
/*===================================================*/
if (inchar == EOS)
{
*complete = FALSE;
return(pos);
}
/*================================*/
/* Move on to the next character. */
/*================================*/
pos++;
inchar = str[pos];
}
/*======================================================*/
/* Indicate that a complete string was found and return */
/* the position of the closing quotation mark. */
/*======================================================*/
pos++;
*complete = TRUE;
return(pos);
}
/*************************************************************/
/* DoComment: Skips over a comment contained within a string */
/* until a line feed or carriage return is encountered. */
/*************************************************************/
static int DoComment(
char *str,
int pos)
{
int inchar;
inchar = str[pos];
while ((inchar != '\n') && (inchar != '\r'))
{
if (inchar == EOS)
{ return(pos); }
pos++;
inchar = str[pos];
}
return(pos);
}
/**************************************************************/
/* DoWhiteSpace: Skips over white space consisting of spaces, */
/* tabs, and form feeds that is contained within a string. */
/**************************************************************/
static int DoWhiteSpace(
char *str,
int pos)
{
int inchar;
inchar = str[pos];
while ((inchar == ' ') || (inchar == '\f') || (inchar == '\t'))
{
pos++;
inchar = str[pos];
}
return(pos);
}
/********************************************************************/
/* CommandLoop: Endless loop which waits for user commands and then */
/* executes them. The command loop will bypass the EventFunction */
/* if there is an active batch file. */
/********************************************************************/
globle void CommandLoop(
void *theEnv)
{
int inchar;
EnvPrintRouter(theEnv,WPROMPT,CommandLineData(theEnv)->BannerString);
SetHaltExecution(theEnv,FALSE);
SetEvaluationError(theEnv,FALSE);
PeriodicCleanup(theEnv,TRUE,FALSE);
PrintPrompt(theEnv);
RouterData(theEnv)->CommandBufferInputCount = 0;
while (TRUE)
{
/*===================================================*/
/* If a batch file is active, grab the command input */
/* directly from the batch file, otherwise call the */
/* event function. */
/*===================================================*/
if (BatchActive(theEnv) == TRUE)
{
inchar = LLGetcBatch(theEnv,"stdin",TRUE);
if (inchar == EOF)
{ (*CommandLineData(theEnv)->EventFunction)(theEnv); }
else
{ ExpandCommandString(theEnv,(char) inchar); }
}
else
{ (*CommandLineData(theEnv)->EventFunction)(theEnv); }
/*=================================================*/
/* If execution was halted, then remove everything */
/* from the command buffer. */
/*=================================================*/
if (GetHaltExecution(theEnv) == TRUE)
{
SetHaltExecution(theEnv,FALSE);
SetEvaluationError(theEnv,FALSE);
FlushCommandString(theEnv);
#if ! WINDOW_INTERFACE
fflush(stdin);
#endif
EnvPrintRouter(theEnv,WPROMPT,"\n");
PrintPrompt(theEnv);
}
/*=========================================*/
/* If a complete command is in the command */
/* buffer, then execute it. */
/*=========================================*/
ExecuteIfCommandComplete(theEnv);
}
}
/***********************************************************/
/* CommandLoopBatch: Loop which waits for commands from a */
/* batch file and then executes them. Returns when there */
/* are no longer any active batch files. */
/***********************************************************/
globle void CommandLoopBatch(
void *theEnv)
{
SetHaltExecution(theEnv,FALSE);
SetEvaluationError(theEnv,FALSE);
PeriodicCleanup(theEnv,TRUE,FALSE);
PrintPrompt(theEnv);
RouterData(theEnv)->CommandBufferInputCount = 0;
CommandLoopBatchDriver(theEnv);
}
/************************************************************/
/* CommandLoopOnceThenBatch: Loop which waits for commands */
/* from a batch file and then executes them. Returns when */
/* there are no longer any active batch files. */
/************************************************************/
globle void CommandLoopOnceThenBatch(
void *theEnv)
{
if (! ExecuteIfCommandComplete(theEnv)) return;
CommandLoopBatchDriver(theEnv);
}
/*********************************************************/
/* CommandLoopBatchDriver: Loop which waits for commands */
/* from a batch file and then executes them. Returns */
/* when there are no longer any active batch files. */
/*********************************************************/
globle void CommandLoopBatchDriver(
void *theEnv)
{
int inchar;
while (TRUE)
{
if (GetHaltCommandLoopBatch(theEnv) == TRUE)
{
CloseAllBatchSources(theEnv);
SetHaltCommandLoopBatch(theEnv,FALSE);
}
/*===================================================*/
/* If a batch file is active, grab the command input */
/* directly from the batch file, otherwise call the */
/* event function. */
/*===================================================*/
if (BatchActive(theEnv) == TRUE)
{
inchar = LLGetcBatch(theEnv,"stdin",TRUE);
if (inchar == EOF)
{ return; }
else
{ ExpandCommandString(theEnv,(char) inchar); }
}
else
{ return; }
/*=================================================*/
/* If execution was halted, then remove everything */
/* from the command buffer. */
/*=================================================*/
if (GetHaltExecution(theEnv) == TRUE)
{
SetHaltExecution(theEnv,FALSE);
SetEvaluationError(theEnv,FALSE);
FlushCommandString(theEnv);
#if ! WINDOW_INTERFACE
fflush(stdin);
#endif
EnvPrintRouter(theEnv,WPROMPT,"\n");
PrintPrompt(theEnv);
}
/*=========================================*/
/* If a complete command is in the command */
/* buffer, then execute it. */
/*=========================================*/
ExecuteIfCommandComplete(theEnv);
}
}
/**********************************************************/
/* ExecuteIfCommandComplete: Checks to determine if there */
/* is a completed command and if so executes it. */
/**********************************************************/
globle intBool ExecuteIfCommandComplete(
void *theEnv)
{
if ((CompleteCommand(CommandLineData(theEnv)->CommandString) == 0) ||
(RouterData(theEnv)->CommandBufferInputCount <= 0))
{ return FALSE; }
FlushPPBuffer(theEnv);
SetPPBufferStatus(theEnv,OFF);
RouterData(theEnv)->CommandBufferInputCount = -1;
RouteCommand(theEnv,CommandLineData(theEnv)->CommandString,TRUE);
FlushPPBuffer(theEnv);
SetHaltExecution(theEnv,FALSE);
SetEvaluationError(theEnv,FALSE);
FlushCommandString(theEnv);
FlushBindList(theEnv);
PeriodicCleanup(theEnv,TRUE,FALSE);
PrintPrompt(theEnv);
return TRUE;
}
/*******************************************/
/* CommandCompleteAndNotEmpty: */
/*******************************************/
globle intBool CommandCompleteAndNotEmpty(
void *theEnv)
{
if ((CompleteCommand(CommandLineData(theEnv)->CommandString) == 0) ||
(RouterData(theEnv)->CommandBufferInputCount <= 0))
{ return FALSE; }
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -