CommandObject.cpp revision 802f8b0e11525a61f6becfd3562222b2cfaea965
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObject.cpp ---------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandObject.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <ctype.h> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 2084cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// These are for the Sourcename completers. 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: Make a separate file for the completers. 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpec.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpecList.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreter.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreterPython.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObject 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::CommandObject (const char *name, const char *help, const char *syntax, uint32_t flags) : 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_name (name), 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_help_short (), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_help_long (), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_syntax (), 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags (flags) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (help && help[0]) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_help_short = help; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (syntax && syntax[0]) 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_syntax = syntax; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::~CommandObject () 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelp () 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_cmd_help_short.c_str(); 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelpLong () 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_cmd_help_long.c_str(); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetSyntax () 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_cmd_syntax.c_str(); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::Translate () 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //return m_cmd_func_name.c_str(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "This function is currently not implemented."; 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetCommandName () 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_cmd_name.c_str(); 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetCommandName (const char *name) 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_name = name; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelp (const char *cstr) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_help_short = cstr; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelpLong (const char *cstr) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_help_long = cstr; 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetSyntax (const char *cstr) 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_cmd_syntax = cstr; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerOptions * 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetOptions () 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // By default commands don't have options unless this virtual function 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is overridden by base classes. 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags& 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetFlags() 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_flags; 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags& 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetFlags() const 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_flags; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ExecuteCommandString 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 13663094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *command_line, 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args command_args(command_line); 14263094e0bb161580564954dee512955c1c79d3476Greg Clayton return ExecuteWithOptions (interpreter, command_args, result); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ParseOptions 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 14863094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args& args, 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if the subclass has options? 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options *options = GetOptions(); 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (options != NULL) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner options->ResetOptionValues(); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // ParseOptions calls getopt_long, which always skips the zero'th item in the array and starts at position 1, 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so we need to push a dummy value into position zero. 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner args.Unshift("dummy_string"); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = args.ParseOptions (*options); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The "dummy_string" will have already been removed by ParseOptions, 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so no need to remove it. 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail() || !options->VerifyOptions (result)) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_cstr = error.AsCString(); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_cstr) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We got an error string, lets use that 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetErrorStream().PutCString(error_cstr); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No error string, output the usage information into result 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner options->GenerateOptionUsage (result.GetErrorStream(), this); 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the return status to failed (this was an error). 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ExecuteWithOptions 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 19163094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args& args, 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < args.GetArgumentCount(); ++i) 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *tmp_str = args.GetArgumentAtIndex (i); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tmp_str[0] == '`') // back-quote 20063094e0bb161580564954dee512955c1c79d3476Greg Clayton args.ReplaceArgumentAtIndex (i, interpreter.ProcessEmbeddedScriptCommands (tmp_str)); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20363094e0bb161580564954dee512955c1c79d3476Greg Clayton Process *process = interpreter.GetDebugger().GetExecutionContext().process; 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused)) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("Process must exist."); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->GetState(); 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched)) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("Process must be launched."); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFlags().IsSet(CommandObject::eFlagProcessMustBePaused)) 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("Process is running. Use 'process interrupt' to pause execution."); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24963094e0bb161580564954dee512955c1c79d3476Greg Clayton if (!ParseOptions (interpreter, args, result)) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Call the command-specific version of 'Execute', passing it the already processed arguments. 25363094e0bb161580564954dee512955c1c79d3476Greg Clayton return Execute (interpreter, args, result); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandDictCommandPartialMatch 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandDictCommandPartialMatch (const char *match_str) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_match_str = match_str; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // A NULL or empty string matches everything. 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_match_str == NULL || *m_match_str == '\0') 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t found = map_element.first.find (m_match_str, 0); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (found == std::string::npos) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return found == 0; 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner private: 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *m_match_str; 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str, 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList &matches) 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int number_added = 0; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandDictCommandPartialMatch matcher(cmd_str); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (matching_cmds != in_map.end()) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++number_added; 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matches.AppendString((*matching_cmds).first.c_str()); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);; 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return number_added; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::HandleCompletion 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 30163094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args &input, 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int &cursor_index, 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int &cursor_char_position, 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int match_start_point, 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int max_return_elements, 307802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham bool &word_complete, 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList &matches 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (WantsRawCommandString()) 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Abstract telling the completion to insert the completion character. 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matches.Clear(); 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Can we do anything generic with the options? 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options *cur_options = GetOptions(); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject result; 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionElementVector opt_element_vector; 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cur_options != NULL) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Re-insert the dummy command name string which will have been 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stripped off: 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.Unshift ("dummy-string"); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cursor_index++; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // I stick an element on the end of the input, because if the last element is 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // option that requires an argument, getopt_long will freak out. 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.AppendArgument ("<FAKE-VALUE>"); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool handled_by_options; 34263094e0bb161580564954dee512955c1c79d3476Greg Clayton handled_by_options = cur_options->HandleOptionCompletion (interpreter, 34363094e0bb161580564954dee512955c1c79d3476Greg Clayton input, 34463094e0bb161580564954dee512955c1c79d3476Greg Clayton opt_element_vector, 34563094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_index, 34663094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_char_position, 34763094e0bb161580564954dee512955c1c79d3476Greg Clayton match_start_point, 34863094e0bb161580564954dee512955c1c79d3476Greg Clayton max_return_elements, 349802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham word_complete, 35063094e0bb161580564954dee512955c1c79d3476Greg Clayton matches); 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (handled_by_options) 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return matches.GetSize(); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we got here, the last word is not an option or an option argument. 35663094e0bb161580564954dee512955c1c79d3476Greg Clayton return HandleArgumentCompletion (interpreter, 35763094e0bb161580564954dee512955c1c79d3476Greg Clayton input, 35863094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_index, 35963094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_char_position, 36063094e0bb161580564954dee512955c1c79d3476Greg Clayton opt_element_vector, 36163094e0bb161580564954dee512955c1c79d3476Greg Clayton match_start_point, 36263094e0bb161580564954dee512955c1c79d3476Greg Clayton max_return_elements, 363802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham word_complete, 36463094e0bb161580564954dee512955c1c79d3476Greg Clayton matches); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Case insensitive version of ::strstr() 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if s2 is contained within s1. 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnercontains_string (const char *s1, const char *s2) 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *locase_s1 = (char *) malloc (strlen (s1) + 1); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *locase_s2 = (char *) malloc (strlen (s2) + 1); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int i; 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i = 0; s1 && s1[i] != '\0'; i++) 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner locase_s1[i] = ::tolower (s1[i]); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner locase_s1[i] = '\0'; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i = 0; s2 && s2[i] != '\0'; i++) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner locase_s2[i] = ::tolower (s2[i]); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner locase_s2[i] = '\0'; 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *result = ::strstr (locase_s1, locase_s2); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (locase_s1); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (locase_s2); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 'result' points into freed memory - but we're not 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // deref'ing it so hopefully current/future compilers 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // won't complain.. 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (result == NULL) 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::HelpTextContainsWord (const char *search_word) 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *short_help; 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *long_help; 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *syntax_help; 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string options_usage_help; 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool found_word = false; 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner short_help = GetHelp(); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner long_help = GetHelpLong(); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner syntax_help = GetSyntax(); 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (contains_string (short_help, search_word)) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner found_word = true; 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (contains_string (long_help, search_word)) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner found_word = true; 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (contains_string (syntax_help, search_word)) 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner found_word = true; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!found_word 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && GetOptions() != NULL) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString usage_help; 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions()->GenerateOptionUsage (usage_help, this); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (usage_help.GetSize() > 0) 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *usage_text = usage_help.GetData(); 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (contains_string (usage_text, search_word)) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner found_word = true; 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return found_word; 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 434