Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 26, 2008, 3:08:39 AM (16 years ago)
Author:
landauf
Message:

CommandExecutor seems to work very well right now. yet to come: autocompletion lists

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/console/src/core/CommandExecutor.cc

    r1424 r1427  
    146146    void CommandExecutor::parse(const std::string& command, bool bInitialize)
    147147    {
    148 std::cout << "parse: command: >" << command << "<" << std::endl;
     148std::cout << "parse (" << bInitialize << "): command: >" << command << "<" << std::endl;
    149149        if (bInitialize)
    150150            CommandExecutor::getEvaluation().initialize(command);
     
    185185                    {
    186186                        // It's a shortcut
    187                         CommandExecutor::getEvaluation().state_ = CS_Params;
     187                        CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
    188188                        CommandExecutor::getEvaluation().functionclass_ = 0;
    189189                        // Move on to next case
     
    224224                            CommandExecutor::getEvaluation().bCommandChanged_ = true;
    225225                        }
    226                         CommandExecutor::getEvaluation().state_ = CS_Params;
     226                        CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
    227227                        CommandExecutor::getEvaluation().functionclass_ = 0;
    228228                        CommandExecutor::getEvaluation().command_ = CommandExecutor::getEvaluation().function_->getName();
    229229                        if (CommandExecutor::getEvaluation().function_->getParamCount() > 0)
     230                        {
    230231                            CommandExecutor::getEvaluation().command_ += " ";
     232                            CommandExecutor::getEvaluation().bCommandChanged_ = true;
     233                        }
    231234                        // Move on to next case
    232235                    }
     
    263266                        CommandExecutor::getEvaluation().function_ = CommandExecutor::getPossibleCommand(CommandExecutor::getArgument(0));
    264267                        CommandExecutor::getEvaluation().functionclass_ = CommandExecutor::getPossibleIdentifier(CommandExecutor::getArgument(0));
     268                        CommandExecutor::getEvaluation().bCommandChanged_ = true;
    265269                        return;
    266270                    }
     
    280284                        {
    281285                            // It's a function
    282                             CommandExecutor::getEvaluation().state_ = CS_Params;
     286                            CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
    283287                            // Move on to next case
    284288                        }
     
    308312                                CommandExecutor::getEvaluation().bCommandChanged_ = true;
    309313                            }
    310                             CommandExecutor::getEvaluation().state_ = CS_Params;
     314                            CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
    311315                            CommandExecutor::getEvaluation().command_ = CommandExecutor::getEvaluation().functionclass_->getName() + " " + CommandExecutor::getEvaluation().function_->getName();
    312316                            if (CommandExecutor::getEvaluation().function_->getParamCount() > 0)
     317                            {
    313318                                CommandExecutor::getEvaluation().command_ += " ";
     319                                CommandExecutor::getEvaluation().bCommandChanged_ = true;
     320                            }
    314321                            // Move on to next case
    315322                        }
     
    327334                            CommandExecutor::getEvaluation().command_ = CommandExecutor::getEvaluation().functionclass_->getName() + " " + CommandExecutor::getCommonBegin(CommandExecutor::getEvaluation().listOfPossibleFunctions_);
    328335                            CommandExecutor::getEvaluation().function_ = CommandExecutor::getPossibleCommand(CommandExecutor::getArgument(1), CommandExecutor::getEvaluation().functionclass_);
     336                            CommandExecutor::getEvaluation().bCommandChanged_ = true;
    329337                            return;
    330338                        }
     
    333341                else
    334342                {
    335                     // There is no classname - move on to CS_Shortcut_Params
    336                 }
    337             }
    338 std::cout << "Waiting for arguments" << std::endl;
     343                    // There is no classname - move on to CS_ParamPreparation
     344                }
     345            }
     346std::cout << "1\n";
     347            case CS_ParamPreparation:
     348std::cout << "2\n";
     349            {
     350                if (CommandExecutor::getEvaluation().function_->getParamCount() == 0 || CommandExecutor::enoughArgumentsGiven(CommandExecutor::getEvaluation().function_))
     351                {
     352                    CommandExecutor::getEvaluation().state_ = CS_Finished;
     353                    return;
     354                }
     355                else
     356                {
     357                    unsigned int argumentNumber = CommandExecutor::argumentsGiven() - 1;
     358                    if (CommandExecutor::getEvaluation().functionclass_)
     359                        argumentNumber -= 1;
     360
     361                    CommandExecutor::createListOfPossibleArguments(CommandExecutor::getLastArgument(), CommandExecutor::getEvaluation().function_, argumentNumber);
     362                    CommandExecutor::getEvaluation().state_ = CS_Params;
     363
     364                    if (CommandExecutor::getEvaluation().bCommandChanged_)
     365                    {
     366                        // Don't do more than one change
     367                        return;
     368                    }
     369                }
     370            }
    339371            case CS_Params:
    340             {
     372std::cout << "3\n";
     373            {
     374                if (CommandExecutor::getEvaluation().listOfPossibleArguments_.size() == 1)
     375                {
     376std::cout << "3_1\n";
     377                    // There is exactly one possible argument
     378                    CommandExecutor::getEvaluation().argument_ = *(*CommandExecutor::getEvaluation().listOfPossibleArguments_.begin()).second;
     379                    CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
     380                    return;
     381                }
     382                else if (CommandExecutor::getEvaluation().listOfPossibleArguments_.size() == 0)
     383                {
     384std::cout << "3_2\n";
     385                    // The user tries something new - we let him do
     386                    CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
     387                    CommandExecutor::getEvaluation().argument_ = CommandExecutor::getLastArgument();
     388                    return;
     389                }
     390                else
     391                {
     392std::cout << "3_3\n";
     393                    // There are several possibilities
     394                    unsigned int argumentNumber = CommandExecutor::argumentsGiven() - 1;
     395                    if (CommandExecutor::getEvaluation().functionclass_)
     396                        argumentNumber -= 1;
     397
     398                    CommandExecutor::getEvaluation().argument_ = CommandExecutor::getCommonBegin(CommandExecutor::getEvaluation().listOfPossibleArguments_);
     399                    CommandExecutor::getEvaluation().possibleArgument_ = CommandExecutor::getPossibleArgument(CommandExecutor::getLastArgument(), CommandExecutor::getEvaluation().function_, argumentNumber);
     400                    CommandExecutor::getEvaluation().state_ = CS_ParamPreparation;
     401                    return;
     402                }
    341403            }
    342404            case CS_Finished:
     405std::cout << "4\n";
    343406            {
    344407                // Nothing more to do
     
    373436    {
    374437        if (CommandExecutor::getEvaluation().functionclass_)
    375             return (CommandExecutor::getEvaluation().commandTokens_.size() >= (2 + command->getParamCount()));
    376         else
    377             return (CommandExecutor::getEvaluation().commandTokens_.size() >= (1 + command->getParamCount()));
     438            return (CommandExecutor::argumentsGiven() > (2 + command->getParamCount()));
     439        else
     440            return (CommandExecutor::argumentsGiven() > (1 + command->getParamCount()));
    378441    }
    379442
     
    388451    std::string CommandExecutor::getLastArgument()
    389452    {
    390         return CommandExecutor::getArgument(CommandExecutor::argumentsGiven());
     453        return CommandExecutor::getArgument(CommandExecutor::argumentsGiven() - 1);
    391454    }
    392455
     
    462525    }
    463526
    464     const std::string* CommandExecutor::getPossibleArgument(const std::string& name, ConsoleCommand* command, unsigned int param)
     527    std::string CommandExecutor::getPossibleArgument(const std::string& name, ConsoleCommand* command, unsigned int param)
    465528    {
    466529        std::string lowercase = getLowercase(name);
    467530        for (std::list<std::pair<std::string, std::string> >::const_iterator it = command->getArgumentCompletionListBegin(param); it != command->getArgumentCompletionListEnd(param); ++it)
    468531            if ((*it).first == lowercase)
    469                 return &(*it).second;
     532                return (*it).second;
    470533
    471534        return 0;
Note: See TracChangeset for help on using the changeset viewer.