1*30fdc8d8SChris Lattner //===-- CommandObjectApropos.cpp ---------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "CommandObjectApropos.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner // C Includes
13*30fdc8d8SChris Lattner // C++ Includes
14*30fdc8d8SChris Lattner // Other libraries and framework includes
15*30fdc8d8SChris Lattner // Project includes
16*30fdc8d8SChris Lattner #include "lldb/Core/Args.h"
17*30fdc8d8SChris Lattner #include "lldb/Core/Options.h"
18*30fdc8d8SChris Lattner 
19*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
20*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
21*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandObjectMultiword.h"
22*30fdc8d8SChris Lattner 
23*30fdc8d8SChris Lattner using namespace lldb;
24*30fdc8d8SChris Lattner using namespace lldb_private;
25*30fdc8d8SChris Lattner 
26*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
27*30fdc8d8SChris Lattner // CommandObjectApropos
28*30fdc8d8SChris Lattner //-------------------------------------------------------------------------
29*30fdc8d8SChris Lattner 
30*30fdc8d8SChris Lattner CommandObjectApropos::CommandObjectApropos () :
31*30fdc8d8SChris Lattner     CommandObject ("apropos",
32*30fdc8d8SChris Lattner                      "Finds a list of debugger commands related to a particular word/subject.",
33*30fdc8d8SChris Lattner                      "apropos <search-word>")
34*30fdc8d8SChris Lattner {
35*30fdc8d8SChris Lattner }
36*30fdc8d8SChris Lattner 
37*30fdc8d8SChris Lattner CommandObjectApropos::~CommandObjectApropos()
38*30fdc8d8SChris Lattner {
39*30fdc8d8SChris Lattner }
40*30fdc8d8SChris Lattner 
41*30fdc8d8SChris Lattner 
42*30fdc8d8SChris Lattner bool
43*30fdc8d8SChris Lattner CommandObjectApropos::Execute (Args &command, CommandContext *context, CommandInterpreter *interpreter,
44*30fdc8d8SChris Lattner                               CommandReturnObject &result)
45*30fdc8d8SChris Lattner {
46*30fdc8d8SChris Lattner     const int argc = command.GetArgumentCount ();
47*30fdc8d8SChris Lattner 
48*30fdc8d8SChris Lattner     if (argc == 1)
49*30fdc8d8SChris Lattner     {
50*30fdc8d8SChris Lattner         const char *search_word = command.GetArgumentAtIndex(0);
51*30fdc8d8SChris Lattner         if ((search_word != NULL)
52*30fdc8d8SChris Lattner             && (strlen (search_word) > 0))
53*30fdc8d8SChris Lattner         {
54*30fdc8d8SChris Lattner             // The bulk of the work must be done inside the Command Interpreter, since the command dictionary
55*30fdc8d8SChris Lattner             // is private.
56*30fdc8d8SChris Lattner             StringList commands_found;
57*30fdc8d8SChris Lattner             StringList commands_help;
58*30fdc8d8SChris Lattner             interpreter->FindCommandsForApropos (search_word, commands_found, commands_help);
59*30fdc8d8SChris Lattner             if (commands_found.GetSize() == 0)
60*30fdc8d8SChris Lattner             {
61*30fdc8d8SChris Lattner                 result.AppendMessageWithFormat ("No commands found pertaining to '%s'.", search_word);
62*30fdc8d8SChris Lattner                 result.AppendMessage ("Try 'help' to see a complete list of debugger commands.");
63*30fdc8d8SChris Lattner             }
64*30fdc8d8SChris Lattner             else
65*30fdc8d8SChris Lattner             {
66*30fdc8d8SChris Lattner                 result.AppendMessageWithFormat ("The following commands may relate to '%s':\n", search_word);
67*30fdc8d8SChris Lattner                 size_t max_len = 0;
68*30fdc8d8SChris Lattner 
69*30fdc8d8SChris Lattner                 for (int i = 0; i < commands_found.GetSize(); ++i)
70*30fdc8d8SChris Lattner                 {
71*30fdc8d8SChris Lattner                     int len = strlen (commands_found.GetStringAtIndex (i));
72*30fdc8d8SChris Lattner                     if (len > max_len)
73*30fdc8d8SChris Lattner                         max_len = len;
74*30fdc8d8SChris Lattner                 }
75*30fdc8d8SChris Lattner 
76*30fdc8d8SChris Lattner                 for (int i = 0; i < commands_found.GetSize(); ++i)
77*30fdc8d8SChris Lattner                     interpreter->OutputFormattedHelpText (result.GetOutputStream(), commands_found.GetStringAtIndex(i),
78*30fdc8d8SChris Lattner                                                          "--", commands_help.GetStringAtIndex(i), max_len);
79*30fdc8d8SChris Lattner 
80*30fdc8d8SChris Lattner             }
81*30fdc8d8SChris Lattner             result.SetStatus (eReturnStatusSuccessFinishNoResult);
82*30fdc8d8SChris Lattner         }
83*30fdc8d8SChris Lattner         else
84*30fdc8d8SChris Lattner         {
85*30fdc8d8SChris Lattner             result.AppendError ("'' is not a valid search word.\n");
86*30fdc8d8SChris Lattner             result.SetStatus (eReturnStatusFailed);
87*30fdc8d8SChris Lattner         }
88*30fdc8d8SChris Lattner     }
89*30fdc8d8SChris Lattner     else
90*30fdc8d8SChris Lattner     {
91*30fdc8d8SChris Lattner         result.AppendError ("'apropos' must be called with exactly one argument.\n");
92*30fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
93*30fdc8d8SChris Lattner     }
94*30fdc8d8SChris Lattner 
95*30fdc8d8SChris Lattner     return result.Succeeded();
96*30fdc8d8SChris Lattner }
97