commline.c
来自「clips源代码」· C语言 代码 · 共 997 行 · 第 1/3 页
C
997 行
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; } if (CommandLineData(theEnv)->BeforeCommandExecutionFunction != NULL) { if (! (*CommandLineData(theEnv)->BeforeCommandExecutionFunction)(theEnv)) { 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; } /*******************************************//* PrintPrompt: Prints the command prompt. *//*******************************************/globle void PrintPrompt( void *theEnv) { EnvPrintRouter(theEnv,WPROMPT,COMMAND_PROMPT);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?