📄 commline.c
字号:
/*******************************************/
/* PrintPrompt: Prints the command prompt. */
/*******************************************/
globle void PrintPrompt(
void *theEnv)
{
EnvPrintRouter(theEnv,WPROMPT,COMMAND_PROMPT);
if (CommandLineData(theEnv)->AfterPromptFunction != NULL)
{ (*CommandLineData(theEnv)->AfterPromptFunction)(theEnv); }
}
/*****************************************/
/* PrintBanner: Prints the CLIPS banner. */
/*****************************************/
globle void PrintBanner(
void *theEnv)
{
EnvPrintRouter(theEnv,WPROMPT,CommandLineData(theEnv)->BannerString);
}
/************************************************/
/* SetAfterPromptFunction: Replaces the current */
/* value of AfterPromptFunction. */
/************************************************/
globle void SetAfterPromptFunction(
void *theEnv,
int (*funptr)(void *))
{
CommandLineData(theEnv)->AfterPromptFunction = funptr;
}
/************************************************/
/* RouteCommand: Processes a completed command. */
/************************************************/
globle intBool RouteCommand(
void *theEnv,
char *command,
int printResult)
{
DATA_OBJECT result;
struct expr *top;
char *commandName;
struct token theToken;
if (command == NULL)
{ return(0); }
/*========================================*/
/* Open a string input source and get the */
/* first token from that source. */
/*========================================*/
OpenStringSource(theEnv,"command",command,0);
GetToken(theEnv,"command",&theToken);
/*=====================*/
/* Evaluate constants. */
/*=====================*/
if ((theToken.type == SYMBOL) || (theToken.type == STRING) ||
(theToken.type == FLOAT) || (theToken.type == INTEGER) ||
(theToken.type == INSTANCE_NAME))
{
CloseStringSource(theEnv,"command");
if (printResult)
{
PrintAtom(theEnv,"stdout",theToken.type,theToken.value);
EnvPrintRouter(theEnv,"stdout","\n");
}
return(1);
}
/*============================*/
/* Evaluate global variables. */
/*============================*/
if (theToken.type == GBL_VARIABLE)
{
CloseStringSource(theEnv,"command");
top = GenConstant(theEnv,theToken.type,theToken.value);
EvaluateExpression(theEnv,top,&result);
rtn_struct(theEnv,expr,top);
if (printResult)
{
PrintDataObject(theEnv,"stdout",&result);
EnvPrintRouter(theEnv,"stdout","\n");
}
return(1);
}
/*========================================================*/
/* If the next token isn't the beginning left parenthesis */
/* of a command or construct, then whatever was entered */
/* cannot be evaluated at the command prompt. */
/*========================================================*/
if (theToken.type != LPAREN)
{
PrintErrorID(theEnv,"COMMLINE",1,FALSE);
EnvPrintRouter(theEnv,WERROR,"Expected a '(', constant, or global variable\n");
CloseStringSource(theEnv,"command");
return(0);
}
/*===========================================================*/
/* The next token must be a function name or construct type. */
/*===========================================================*/
GetToken(theEnv,"command",&theToken);
if (theToken.type != SYMBOL)
{
PrintErrorID(theEnv,"COMMLINE",2,FALSE);
EnvPrintRouter(theEnv,WERROR,"Expected a command.\n");
CloseStringSource(theEnv,"command");
return(0);
}
commandName = ValueToString(theToken.value);
/*======================*/
/* Evaluate constructs. */
/*======================*/
#if (! RUN_TIME) && (! BLOAD_ONLY)
{
int errorFlag;
errorFlag = ParseConstruct(theEnv,commandName,"command");
if (errorFlag != -1)
{
CloseStringSource(theEnv,"command");
if (errorFlag == 1)
{
EnvPrintRouter(theEnv,WERROR,"\nERROR:\n");
PrintInChunks(theEnv,WERROR,GetPPBuffer(theEnv));
EnvPrintRouter(theEnv,WERROR,"\n");
}
DestroyPPBuffer(theEnv);
return(errorFlag);
}
}
#endif
/*========================*/
/* Parse a function call. */
/*========================*/
CommandLineData(theEnv)->ParsingTopLevelCommand = TRUE;
top = Function2Parse(theEnv,"command",commandName);
CommandLineData(theEnv)->ParsingTopLevelCommand = FALSE;
ClearParsedBindNames(theEnv);
/*================================*/
/* Close the string input source. */
/*================================*/
CloseStringSource(theEnv,"command");
/*=========================*/
/* Evaluate function call. */
/*=========================*/
if (top == NULL) return(0);
CommandLineData(theEnv)->EvaluatingTopLevelCommand = TRUE;
ExpressionInstall(theEnv,top);
EvaluateExpression(theEnv,top,&result);
ExpressionDeinstall(theEnv,top);
CommandLineData(theEnv)->EvaluatingTopLevelCommand = FALSE;
ReturnExpression(theEnv,top);
if ((result.type != RVOID) && printResult)
{
PrintDataObject(theEnv,"stdout",&result);
EnvPrintRouter(theEnv,"stdout","\n");
}
return(1);
}
/*****************************************************************/
/* DefaultGetNextEvent: Default event-handling function. Handles */
/* only keyboard events by first calling GetcRouter to get a */
/* character and then calling ExpandCommandString to add the */
/* character to the CommandString. */
/*****************************************************************/
static int DefaultGetNextEvent(
void *theEnv)
{
int inchar;
inchar = EnvGetcRouter(theEnv,"stdin");
if (inchar == EOF) inchar = '\n';
ExpandCommandString(theEnv,(char) inchar);
return 0;
}
/*************************************/
/* SetEventFunction: Replaces the */
/* current value of EventFunction. */
/*************************************/
globle int (*SetEventFunction(void *theEnv,int (*theFunction)(void *)))(void *)
{
int (*tmp_ptr)(void *);
tmp_ptr = CommandLineData(theEnv)->EventFunction;
CommandLineData(theEnv)->EventFunction = theFunction;
return(tmp_ptr);
}
/****************************************/
/* TopLevelCommand: Indicates whether a */
/* top-level command is being parsed. */
/****************************************/
globle intBool TopLevelCommand(
void *theEnv)
{
return(CommandLineData(theEnv)->ParsingTopLevelCommand);
}
/***********************************************************/
/* GetCommandCompletionString: Returns the last token in a */
/* string if it is a valid token for command completion. */
/***********************************************************/
globle char *GetCommandCompletionString(
void *theEnv,
char *theString,
unsigned maxPosition)
{
struct token lastToken;
struct token theToken;
char lastChar;
char *rs;
unsigned length;
/*=========================*/
/* Get the command string. */
/*=========================*/
if (theString == NULL) return("");
/*=========================================================================*/
/* If the last character in the command string is a space, character */
/* return, or quotation mark, then the command completion can be anything. */
/*=========================================================================*/
lastChar = theString[maxPosition - 1];
if ((lastChar == ' ') || (lastChar == '"') ||
(lastChar == '\t') || (lastChar == '\f') ||
(lastChar == '\n') || (lastChar == '\r'))
{ return(""); }
/*============================================*/
/* Find the last token in the command string. */
/*============================================*/
OpenTextSource(theEnv,"CommandCompletion",theString,0,maxPosition);
ScannerData(theEnv)->IgnoreCompletionErrors = TRUE;
GetToken(theEnv,"CommandCompletion",&theToken);
CopyToken(&lastToken,&theToken);
while (theToken.type != STOP)
{
CopyToken(&lastToken,&theToken);
GetToken(theEnv,"CommandCompletion",&theToken);
}
CloseStringSource(theEnv,"CommandCompletion");
ScannerData(theEnv)->IgnoreCompletionErrors = FALSE;
/*===============================================*/
/* Determine if the last token can be completed. */
/*===============================================*/
if (lastToken.type == SYMBOL)
{
rs = ValueToString(lastToken.value);
if (rs[0] == '[') return (&rs[1]);
return(ValueToString(lastToken.value));
}
else if (lastToken.type == SF_VARIABLE)
{ return(ValueToString(lastToken.value)); }
else if (lastToken.type == MF_VARIABLE)
{ return(ValueToString(lastToken.value)); }
else if ((lastToken.type == GBL_VARIABLE) || (lastToken.type == MF_GBL_VARIABLE) ||
(lastToken.type == INSTANCE_NAME))
{ return(NULL); }
else if (lastToken.type == STRING)
{
length = strlen(ValueToString(lastToken.value));
return(GetCommandCompletionString(theEnv,ValueToString(lastToken.value),length));
}
else if ((lastToken.type == FLOAT) || (lastToken.type == INTEGER))
{ return(NULL); }
return("");
}
/****************************************************************/
/* SetHaltCommandLoopBatch: Sets the HaltCommandLoopBatch flag. */
/****************************************************************/
globle void SetHaltCommandLoopBatch(
void *theEnv,
int value)
{
CommandLineData(theEnv)->HaltCommandLoopBatch = value;
}
/*******************************************************************/
/* GetHaltCommandLoopBatch: Returns the HaltCommandLoopBatch flag. */
/*******************************************************************/
globle int GetHaltCommandLoopBatch(
void *theEnv)
{
return(CommandLineData(theEnv)->HaltCommandLoopBatch);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -