1//===-- CommandObjectSyntax.cpp ---------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/lldb-python.h" 11 12#include "CommandObjectSyntax.h" 13 14// C Includes 15// C++ Includes 16// Other libraries and framework includes 17// Project includes 18#include "lldb/Interpreter/Args.h" 19#include "lldb/Interpreter/Options.h" 20 21#include "lldb/Interpreter/CommandInterpreter.h" 22#include "lldb/Interpreter/CommandReturnObject.h" 23#include "lldb/Interpreter/CommandObjectMultiword.h" 24 25using namespace lldb; 26using namespace lldb_private; 27 28//------------------------------------------------------------------------- 29// CommandObjectSyntax 30//------------------------------------------------------------------------- 31 32CommandObjectSyntax::CommandObjectSyntax (CommandInterpreter &interpreter) : 33 CommandObjectParsed (interpreter, 34 "syntax", 35 "Shows the correct syntax for a given debugger command.", 36 "syntax <command>") 37{ 38 CommandArgumentEntry arg; 39 CommandArgumentData command_arg; 40 41 // Define the first (and only) variant of this arg. 42 command_arg.arg_type = eArgTypeCommandName; 43 command_arg.arg_repetition = eArgRepeatPlain; 44 45 // There is only one variant this argument could be; put it into the argument entry. 46 arg.push_back (command_arg); 47 48 // Push the data for the first argument into the m_arguments vector. 49 m_arguments.push_back (arg); 50} 51 52CommandObjectSyntax::~CommandObjectSyntax() 53{ 54} 55 56 57bool 58CommandObjectSyntax::DoExecute (Args& command, CommandReturnObject &result) 59{ 60 CommandObject::CommandMap::iterator pos; 61 CommandObject *cmd_obj; 62 const size_t argc = command.GetArgumentCount(); 63 64 if (argc > 0) 65 { 66 cmd_obj = m_interpreter.GetCommandObject (command.GetArgumentAtIndex(0)); 67 bool all_okay = true; 68 for (size_t i = 1; i < argc; ++i) 69 { 70 std::string sub_command = command.GetArgumentAtIndex (i); 71 if (!cmd_obj->IsMultiwordObject()) 72 all_okay = false; 73 else 74 { 75 cmd_obj = cmd_obj->GetSubcommandObject(sub_command.c_str()); 76 if (!cmd_obj) 77 all_okay = false; 78 } 79 } 80 81 if (all_okay && (cmd_obj != NULL)) 82 { 83 Stream &output_strm = result.GetOutputStream(); 84 if (cmd_obj->GetOptions() != NULL) 85 { 86 output_strm.Printf ("\nSyntax: %s\n", cmd_obj->GetSyntax()); 87 output_strm.Printf ("(Try 'help %s' for more information on command options syntax.)\n", 88 cmd_obj->GetCommandName()); 89 result.SetStatus (eReturnStatusSuccessFinishNoResult); 90 } 91 else 92 { 93 output_strm.Printf ("\nSyntax: %s\n", cmd_obj->GetSyntax()); 94 result.SetStatus (eReturnStatusSuccessFinishNoResult); 95 } 96 } 97 else 98 { 99 std::string cmd_string; 100 command.GetCommandString (cmd_string); 101 result.AppendErrorWithFormat ("'%s' is not a known command.\n", cmd_string.c_str()); 102 result.AppendError ("Try 'help' to see a current list of commands."); 103 result.SetStatus (eReturnStatusFailed); 104 } 105 } 106 else 107 { 108 result.AppendError ("Must call 'syntax' with a valid command."); 109 result.SetStatus (eReturnStatusFailed); 110 } 111 112 return result.Succeeded(); 113} 114