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