124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Args.h --------------------------------------------------*- 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#ifndef liblldb_Command_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Command_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <utility>
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
24b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-private-types.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-types.h"
26b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/Core/Error.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3044c841d68a439da13e3f170427675bff8c7f2731Caroline Ticetypedef std::pair<int, std::string> OptionArgValue;
3144c841d68a439da13e3f170427675bff8c7f2731Caroline Ticetypedef std::pair<std::string, OptionArgValue> OptionArgPair;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef std::vector<OptionArgPair> OptionArgVector;
33102b2c2681c9a830afe25bfea35557421905e42cGreg Claytontypedef std::shared_ptr<OptionArgVector> OptionArgVectorSP;
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstruct OptionArgElement
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham    enum {
38adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham        eUnrecognizedArg = -1,
39adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham        eBareDash = -2,
40adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham        eBareDoubleDash = -3
41adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham    };
42adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgElement (int defs_index, int pos, int arg_pos) :
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        opt_defs_index(defs_index),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        opt_pos (pos),
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        opt_arg_pos (arg_pos)
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int opt_defs_index;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int opt_pos;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int opt_arg_pos;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnertypedef std::vector<OptionArgElement> OptionElementVector;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham/// @class Args Args.h "lldb/Interpreter/Args.h"
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A command line argument class.
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The Args class is designed to be fed a command line. The
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// command line is copied into an internal buffer and then split up
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// into arguments. Arguments are space delimited if there are no quotes
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// (single, double, or backtick quotes) surrounding the argument. Spaces
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// can be escaped using a \ character to avoid having to surround an
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// argument that contains a space with quotes.
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Args
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Construct with an option command string.
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] command
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A NULL terminated command that will be copied and split up
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     into arguments.
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::SetCommandString(const char *)
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args (const char *command = NULL);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args (const char *command, size_t len);
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Args (const Args &rhs);
86b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
87b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const Args &
88b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    operator= (const Args &rhs);
89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Destructor.
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Args();
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Dump all arguments to the stream \a s.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The stream to which to dump all arguments in the argument
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     vector.
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream *s);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Sets the command string contained by this object.
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The command string will be copied and split up into arguments
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// that can be accessed via the accessor functions.
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] command
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A NULL terminated command that will be copied and split up
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     into arguments.
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::GetArgumentCount() const
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::GetArgumentAtIndex (size_t) const
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::GetArgumentVector ()
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::Shift ()
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::Unshift (const char *)
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCommandString (const char *command);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetCommandString (const char *command, size_t len);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
128431d26daf9c89fd34310f39dbc00f26ee39c520fGreg Clayton    GetCommandString (std::string &command) const;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130d9105c2f5e1a4b6bb1a9d424e3f1631e0e6296cdCaroline Tice    bool
131431d26daf9c89fd34310f39dbc00f26ee39c520fGreg Clayton    GetQuotedCommandString (std::string &command) const;
132d9105c2f5e1a4b6bb1a9d424e3f1631e0e6296cdCaroline Tice
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the number of arguments left in this command object.
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The number or arguments in this object.
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentCount () const;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the NULL terminated C string argument pointer for the
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// argument at index \a idx.
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The NULL terminated C string argument pointer if \a idx is a
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     valid argument index, NULL otherwise.
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentAtIndex (size_t idx) const;
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentQuoteCharAtIndex (size_t idx) const;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the argument vector.
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The value returned by this function can be used by any function
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// that takes and vector. The return value is just like \a argv
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// in the standard C entry point function:
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \code
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///         int main (int argc, const char **argv);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \endcode
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An array of NULL terminated C string argument pointers that
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     also has a terminating NULL C string pointer
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char **
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArgumentVector ();
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the argument vector.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The value returned by this function can be used by any function
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// that takes and vector. The return value is just like \a argv
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// in the standard C entry point function:
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \code
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///         int main (int argc, const char **argv);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \endcode
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     An array of NULL terminate C string argument pointers that
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     also has a terminating NULL C string pointer
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char **
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetConstArgumentVector () const;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Appends a new argument to the end of the list argument list.
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] arg_cstr
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The new argument as a NULL terminated C string.
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] quote_char
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If the argument was originally quoted, put in the quote char here.
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The NULL terminated C string of the copy of \a arg_cstr.
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AppendArgument (const char *arg_cstr, char quote_char = '\0');
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AppendArguments (const Args &rhs);
20836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton
20936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    void
21036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    AppendArguments (const char **argv);
21136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Insert the argument value at index \a idx to \a arg_cstr.
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] idx
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index of where to insert the argument.
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] arg_cstr
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The new argument as a NULL terminated C string.
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] quote_char
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If the argument was originally quoted, put in the quote char here.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The NULL terminated C string of the copy of \a arg_cstr.
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InsertArgumentAtIndex (size_t idx, const char *arg_cstr, char quote_char = '\0');
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Replaces the argument value at index \a idx to \a arg_cstr
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// if \a idx is a valid argument index.
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] idx
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index of the argument that will have its value replaced.
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] arg_cstr
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The new argument as a NULL terminated C string.
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] quote_char
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If the argument was originally quoted, put in the quote char here.
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The NULL terminated C string of the copy of \a arg_cstr if
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \a idx was a valid index, NULL otherwise.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReplaceArgumentAtIndex (size_t idx, const char *arg_cstr, char quote_char = '\0');
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Deletes the argument value at index
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// if \a idx is a valid argument index.
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] idx
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index of the argument that will have its value replaced.
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DeleteArgumentAtIndex (size_t idx);
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Sets the argument vector value, optionally copying all
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// arguments into an internal buffer.
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Sets the arguments to match those found in \a argv. All argument
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// strings will be copied into an internal buffers.
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  FIXME: Handle the quote character somehow.
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
27136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    SetArguments (size_t argc, const char **argv);
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    void
27436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    SetArguments (const char **argv);
27536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Shifts the first argument C string value of the array off the
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// argument array.
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The string value will be freed, so a copy of the string should
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// be made by calling Args::GetArgumentAtIndex (size_t) const
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// first and copying the returned value before calling
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Args::Shift().
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::GetArgumentAtIndex (size_t) const
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Shift ();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Inserts a class owned copy of \a arg_cstr at the beginning of
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// the argument vector.
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// A copy \a arg_cstr will be made.
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] arg_cstr
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The argument to push on the front the the argument stack.
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] quote_char
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     If the argument was originally quoted, put in the quote char here.
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the copy of \a arg_cstr that was made.
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Unshift (const char *arg_cstr, char quote_char = '\0');
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Parse the arguments in the contained arguments.
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The arguments that are consumed by the argument parsing process
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// will be removed from the argument vector. The arguements that
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// get processed start at the second argument. The first argument
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// is assumed to be the command and will not be touched.
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see class Options
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ParseOptions (Options &options);
32044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
32144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    size_t
32244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    FindArgumentIndexForOption (struct option *long_options, int long_options_index);
32344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
32444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    bool
32544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    IsPositionalArgument (const char *arg);
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The following works almost identically to ParseOptions, except that no option is required to have arguments,
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // and it builds up the option_arg_vector as it parses the options.
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
331e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    ParseAliasOptions (Options &options, CommandReturnObject &result, OptionArgVector *option_arg_vector,
332e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                       std::string &raw_input_line);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
335adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham    ParseArgsForCompletion (Options &options, OptionElementVector &option_element_vector, uint32_t cursor_index);
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the arguments.
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For re-setting or blanking out the list of arguments.
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear ();
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton    static const char *
346b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton    StripSpaces (std::string &s,
347b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton                 bool leading = true,
348b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton                 bool trailing = true,
349b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton                 bool return_null_if_empty = true);
350b4b4081ade73ef2d35474bee5d249ed8507874b5Greg Clayton
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int32_t
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToSInt32 (const char *s, int32_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static uint32_t
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToUInt32 (const char *s, uint32_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int64_t
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToSInt64 (const char *s, int64_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static uint64_t
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToUInt64 (const char *s, uint64_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    static bool
364061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    UInt64ValueIsValidForByteSize (uint64_t uval64, size_t total_byte_size)
365061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (total_byte_size > 8)
367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            return false;
368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
369061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (total_byte_size == 8)
370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            return true;
371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        const uint64_t max = ((uint64_t)1 << (uint64_t)(total_byte_size * 8)) - 1;
373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return uval64 <= max;
374061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    static bool
377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SInt64ValueIsValidForByteSize (int64_t sval64, size_t total_byte_size)
378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    {
379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (total_byte_size > 8)
380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            return false;
381061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
382061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (total_byte_size == 8)
383061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            return true;
384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
385061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        const int64_t max = ((int64_t)1 << (uint64_t)(total_byte_size * 8 - 1)) - 1;
386061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        const int64_t min = ~(max);
387061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        return min <= sval64 && sval64 <= max;
388061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    }
389061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb::addr_t
39149d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton    StringToAddress (const ExecutionContext *exe_ctx,
39249d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton                     const char *s,
39349d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton                     lldb::addr_t fail_value,
39449d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton                     Error *error);
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToBoolean (const char *s, bool fail_value, bool *success_ptr);
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    static int64_t
40061aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton    StringToOptionEnum (const char *s, OptionEnumValueElement *enum_values, int32_t fail_value, Error &error);
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb::ScriptLanguage
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringToScriptLanguage (const char *s, lldb::ScriptLanguage fail_value, bool *success_ptr);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static Error
40656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton    StringToFormat (const char *s,
40756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton                    lldb::Format &format,
40836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    size_t *byte_size_ptr); // If non-NULL, then a byte size can precede the format character
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    static lldb::Encoding
41188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    StringToEncoding (const char *s,
41288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton                      lldb::Encoding fail_value = lldb::eEncodingInvalid);
41388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
41488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    static uint32_t
41588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    StringToGenericRegister (const char *s);
41688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    static const char *
418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    StringToVersion (const char *s, uint32_t &major, uint32_t &minor, uint32_t &update);
419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
420527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    static const char *
421527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton    GetShellSafeArgument (const char *unsafe_arg, std::string &safe_arg);
422527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton
4233b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // EncodeEscapeSequences will change the textual representation of common
4243b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // escape sequences like "\n" (two characters) into a single '\n'. It does
4253b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // this for all of the supported escaped sequences and for the \0ooo (octal)
4263b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // and \xXX (hex). The resulting "dst" string will contain the character
4273b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // versions of all supported escape sequences. The common supported escape
4283b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // sequences are: "\a", "\b", "\f", "\n", "\r", "\t", "\v", "\'", "\"", "\\".
4293b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton
4303b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    static void
4313b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    EncodeEscapeSequences (const char *src, std::string &dst);
4323b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton
4333b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // ExpandEscapeSequences will change a string of possibly non-printable
4343b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // characters and expand them into text. So '\n' will turn into two chracters
4353b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // like "\n" which is suitable for human reading. When a character is not
4363b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // printable and isn't one of the common in escape sequences listed in the
4373b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // help for EncodeEscapeSequences, then it will be encoded as octal. Printable
4383b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    // characters are left alone.
4393b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    static void
4403b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton    ExpandEscapedCharacters (const char *src, std::string &dst);
4413b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This one isn't really relevant to Arguments per se, but we're using the Args as a
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // general strings container, so...
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LongestCommonPrefix (std::string &common_prefix);
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Args can see and modify these
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::list<std::string> arg_sstr_collection;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<const char *> arg_cstr_collection;
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<char> arg_quote_char_collection;
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    arg_sstr_collection m_args;
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    arg_cstr_collection m_argv; ///< The current argument vector.
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    arg_quote_char_collection m_args_quote_char;
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateArgsAfterOptionParsing ();
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateArgvFromArgs ();
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Command_h_
468