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 + -
显示快捷键?