• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Args.h --------------------------------------------------*- 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 #ifndef liblldb_Command_h_
11 #define liblldb_Command_h_
12 
13 // C Includes
14 #include <getopt.h>
15 
16 // C++ Includes
17 #include <list>
18 #include <string>
19 #include <vector>
20 #include <utility>
21 
22 // Other libraries and framework includes
23 // Project includes
24 #include "lldb/lldb-private-types.h"
25 #include "lldb/lldb-types.h"
26 #include "lldb/Core/Error.h"
27 
28 namespace lldb_private {
29 
30 typedef std::pair<int, std::string> OptionArgValue;
31 typedef std::pair<std::string, OptionArgValue> OptionArgPair;
32 typedef std::vector<OptionArgPair> OptionArgVector;
33 typedef std::shared_ptr<OptionArgVector> OptionArgVectorSP;
34 
35 struct OptionArgElement
36 {
37     enum {
38         eUnrecognizedArg = -1,
39         eBareDash = -2,
40         eBareDoubleDash = -3
41     };
42 
OptionArgElementOptionArgElement43     OptionArgElement (int defs_index, int pos, int arg_pos) :
44         opt_defs_index(defs_index),
45         opt_pos (pos),
46         opt_arg_pos (arg_pos)
47     {
48     }
49 
50     int opt_defs_index;
51     int opt_pos;
52     int opt_arg_pos;
53 };
54 
55 typedef std::vector<OptionArgElement> OptionElementVector;
56 
57 //----------------------------------------------------------------------
58 /// @class Args Args.h "lldb/Interpreter/Args.h"
59 /// @brief A command line argument class.
60 ///
61 /// The Args class is designed to be fed a command line. The
62 /// command line is copied into an internal buffer and then split up
63 /// into arguments. Arguments are space delimited if there are no quotes
64 /// (single, double, or backtick quotes) surrounding the argument. Spaces
65 /// can be escaped using a \ character to avoid having to surround an
66 /// argument that contains a space with quotes.
67 //----------------------------------------------------------------------
68 class Args
69 {
70 public:
71 
72     //------------------------------------------------------------------
73     /// Construct with an option command string.
74     ///
75     /// @param[in] command
76     ///     A NULL terminated command that will be copied and split up
77     ///     into arguments.
78     ///
79     /// @see Args::SetCommandString(const char *)
80     //------------------------------------------------------------------
81     Args (const char *command = NULL);
82 
83     Args (const char *command, size_t len);
84 
85     Args (const Args &rhs);
86 
87     const Args &
88     operator= (const Args &rhs);
89 
90     //------------------------------------------------------------------
91     /// Destructor.
92     //------------------------------------------------------------------
93     ~Args();
94 
95     //------------------------------------------------------------------
96     /// Dump all arguments to the stream \a s.
97     ///
98     /// @param[in] s
99     ///     The stream to which to dump all arguments in the argument
100     ///     vector.
101     //------------------------------------------------------------------
102     void
103     Dump (Stream *s);
104 
105     //------------------------------------------------------------------
106     /// Sets the command string contained by this object.
107     ///
108     /// The command string will be copied and split up into arguments
109     /// that can be accessed via the accessor functions.
110     ///
111     /// @param[in] command
112     ///     A NULL terminated command that will be copied and split up
113     ///     into arguments.
114     ///
115     /// @see Args::GetArgumentCount() const
116     /// @see Args::GetArgumentAtIndex (size_t) const
117     /// @see Args::GetArgumentVector ()
118     /// @see Args::Shift ()
119     /// @see Args::Unshift (const char *)
120     //------------------------------------------------------------------
121     void
122     SetCommandString (const char *command);
123 
124     void
125     SetCommandString (const char *command, size_t len);
126 
127     bool
128     GetCommandString (std::string &command) const;
129 
130     bool
131     GetQuotedCommandString (std::string &command) const;
132 
133     //------------------------------------------------------------------
134     /// Gets the number of arguments left in this command object.
135     ///
136     /// @return
137     ///     The number or arguments in this object.
138     //------------------------------------------------------------------
139     size_t
140     GetArgumentCount () const;
141 
142     //------------------------------------------------------------------
143     /// Gets the NULL terminated C string argument pointer for the
144     /// argument at index \a idx.
145     ///
146     /// @return
147     ///     The NULL terminated C string argument pointer if \a idx is a
148     ///     valid argument index, NULL otherwise.
149     //------------------------------------------------------------------
150     const char *
151     GetArgumentAtIndex (size_t idx) const;
152 
153     char
154     GetArgumentQuoteCharAtIndex (size_t idx) const;
155 
156     //------------------------------------------------------------------
157     /// Gets the argument vector.
158     ///
159     /// The value returned by this function can be used by any function
160     /// that takes and vector. The return value is just like \a argv
161     /// in the standard C entry point function:
162     ///     \code
163     ///         int main (int argc, const char **argv);
164     ///     \endcode
165     ///
166     /// @return
167     ///     An array of NULL terminated C string argument pointers that
168     ///     also has a terminating NULL C string pointer
169     //------------------------------------------------------------------
170     char **
171     GetArgumentVector ();
172 
173     //------------------------------------------------------------------
174     /// Gets the argument vector.
175     ///
176     /// The value returned by this function can be used by any function
177     /// that takes and vector. The return value is just like \a argv
178     /// in the standard C entry point function:
179     ///     \code
180     ///         int main (int argc, const char **argv);
181     ///     \endcode
182     ///
183     /// @return
184     ///     An array of NULL terminate C string argument pointers that
185     ///     also has a terminating NULL C string pointer
186     //------------------------------------------------------------------
187     const char **
188     GetConstArgumentVector () const;
189 
190 
191     //------------------------------------------------------------------
192     /// Appends a new argument to the end of the list argument list.
193     ///
194     /// @param[in] arg_cstr
195     ///     The new argument as a NULL terminated C string.
196     ///
197     /// @param[in] quote_char
198     ///     If the argument was originally quoted, put in the quote char here.
199     ///
200     /// @return
201     ///     The NULL terminated C string of the copy of \a arg_cstr.
202     //------------------------------------------------------------------
203     const char *
204     AppendArgument (const char *arg_cstr, char quote_char = '\0');
205 
206     void
207     AppendArguments (const Args &rhs);
208 
209     void
210     AppendArguments (const char **argv);
211 
212     //------------------------------------------------------------------
213     /// Insert the argument value at index \a idx to \a arg_cstr.
214     ///
215     /// @param[in] idx
216     ///     The index of where to insert the argument.
217     ///
218     /// @param[in] arg_cstr
219     ///     The new argument as a NULL terminated C string.
220     ///
221     /// @param[in] quote_char
222     ///     If the argument was originally quoted, put in the quote char here.
223     ///
224     /// @return
225     ///     The NULL terminated C string of the copy of \a arg_cstr.
226     //------------------------------------------------------------------
227     const char *
228     InsertArgumentAtIndex (size_t idx, const char *arg_cstr, char quote_char = '\0');
229 
230     //------------------------------------------------------------------
231     /// Replaces the argument value at index \a idx to \a arg_cstr
232     /// if \a idx is a valid argument index.
233     ///
234     /// @param[in] idx
235     ///     The index of the argument that will have its value replaced.
236     ///
237     /// @param[in] arg_cstr
238     ///     The new argument as a NULL terminated C string.
239     ///
240     /// @param[in] quote_char
241     ///     If the argument was originally quoted, put in the quote char here.
242     ///
243     /// @return
244     ///     The NULL terminated C string of the copy of \a arg_cstr if
245     ///     \a idx was a valid index, NULL otherwise.
246     //------------------------------------------------------------------
247     const char *
248     ReplaceArgumentAtIndex (size_t idx, const char *arg_cstr, char quote_char = '\0');
249 
250     //------------------------------------------------------------------
251     /// Deletes the argument value at index
252     /// if \a idx is a valid argument index.
253     ///
254     /// @param[in] idx
255     ///     The index of the argument that will have its value replaced.
256     ///
257     //------------------------------------------------------------------
258     void
259     DeleteArgumentAtIndex (size_t idx);
260 
261     //------------------------------------------------------------------
262     /// Sets the argument vector value, optionally copying all
263     /// arguments into an internal buffer.
264     ///
265     /// Sets the arguments to match those found in \a argv. All argument
266     /// strings will be copied into an internal buffers.
267     //
268     //  FIXME: Handle the quote character somehow.
269     //------------------------------------------------------------------
270     void
271     SetArguments (size_t argc, const char **argv);
272 
273     void
274     SetArguments (const char **argv);
275 
276     //------------------------------------------------------------------
277     /// Shifts the first argument C string value of the array off the
278     /// argument array.
279     ///
280     /// The string value will be freed, so a copy of the string should
281     /// be made by calling Args::GetArgumentAtIndex (size_t) const
282     /// first and copying the returned value before calling
283     /// Args::Shift().
284     ///
285     /// @see Args::GetArgumentAtIndex (size_t) const
286     //------------------------------------------------------------------
287     void
288     Shift ();
289 
290     //------------------------------------------------------------------
291     /// Inserts a class owned copy of \a arg_cstr at the beginning of
292     /// the argument vector.
293     ///
294     /// A copy \a arg_cstr will be made.
295     ///
296     /// @param[in] arg_cstr
297     ///     The argument to push on the front the the argument stack.
298     ///
299     /// @param[in] quote_char
300     ///     If the argument was originally quoted, put in the quote char here.
301     ///
302     /// @return
303     ///     A pointer to the copy of \a arg_cstr that was made.
304     //------------------------------------------------------------------
305     const char *
306     Unshift (const char *arg_cstr, char quote_char = '\0');
307 
308     //------------------------------------------------------------------
309     /// Parse the arguments in the contained arguments.
310     ///
311     /// The arguments that are consumed by the argument parsing process
312     /// will be removed from the argument vector. The arguements that
313     /// get processed start at the second argument. The first argument
314     /// is assumed to be the command and will not be touched.
315     ///
316     /// @see class Options
317     //------------------------------------------------------------------
318     Error
319     ParseOptions (Options &options);
320 
321     size_t
322     FindArgumentIndexForOption (struct option *long_options, int long_options_index);
323 
324     bool
325     IsPositionalArgument (const char *arg);
326 
327     // The following works almost identically to ParseOptions, except that no option is required to have arguments,
328     // and it builds up the option_arg_vector as it parses the options.
329 
330     void
331     ParseAliasOptions (Options &options, CommandReturnObject &result, OptionArgVector *option_arg_vector,
332                        std::string &raw_input_line);
333 
334     void
335     ParseArgsForCompletion (Options &options, OptionElementVector &option_element_vector, uint32_t cursor_index);
336 
337     //------------------------------------------------------------------
338     // Clear the arguments.
339     //
340     // For re-setting or blanking out the list of arguments.
341     //------------------------------------------------------------------
342     void
343     Clear ();
344 
345     static const char *
346     StripSpaces (std::string &s,
347                  bool leading = true,
348                  bool trailing = true,
349                  bool return_null_if_empty = true);
350 
351     static int32_t
352     StringToSInt32 (const char *s, int32_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
353 
354     static uint32_t
355     StringToUInt32 (const char *s, uint32_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
356 
357     static int64_t
358     StringToSInt64 (const char *s, int64_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
359 
360     static uint64_t
361     StringToUInt64 (const char *s, uint64_t fail_value = 0, int base = 0, bool *success_ptr = NULL);
362 
363     static bool
UInt64ValueIsValidForByteSize(uint64_t uval64,size_t total_byte_size)364     UInt64ValueIsValidForByteSize (uint64_t uval64, size_t total_byte_size)
365     {
366         if (total_byte_size > 8)
367             return false;
368 
369         if (total_byte_size == 8)
370             return true;
371 
372         const uint64_t max = ((uint64_t)1 << (uint64_t)(total_byte_size * 8)) - 1;
373         return uval64 <= max;
374     }
375 
376     static bool
SInt64ValueIsValidForByteSize(int64_t sval64,size_t total_byte_size)377     SInt64ValueIsValidForByteSize (int64_t sval64, size_t total_byte_size)
378     {
379         if (total_byte_size > 8)
380             return false;
381 
382         if (total_byte_size == 8)
383             return true;
384 
385         const int64_t max = ((int64_t)1 << (uint64_t)(total_byte_size * 8 - 1)) - 1;
386         const int64_t min = ~(max);
387         return min <= sval64 && sval64 <= max;
388     }
389 
390     static lldb::addr_t
391     StringToAddress (const ExecutionContext *exe_ctx,
392                      const char *s,
393                      lldb::addr_t fail_value,
394                      Error *error);
395 
396     static bool
397     StringToBoolean (const char *s, bool fail_value, bool *success_ptr);
398 
399     static int64_t
400     StringToOptionEnum (const char *s, OptionEnumValueElement *enum_values, int32_t fail_value, Error &error);
401 
402     static lldb::ScriptLanguage
403     StringToScriptLanguage (const char *s, lldb::ScriptLanguage fail_value, bool *success_ptr);
404 
405     static Error
406     StringToFormat (const char *s,
407                     lldb::Format &format,
408                     size_t *byte_size_ptr); // If non-NULL, then a byte size can precede the format character
409 
410     static lldb::Encoding
411     StringToEncoding (const char *s,
412                       lldb::Encoding fail_value = lldb::eEncodingInvalid);
413 
414     static uint32_t
415     StringToGenericRegister (const char *s);
416 
417     static const char *
418     StringToVersion (const char *s, uint32_t &major, uint32_t &minor, uint32_t &update);
419 
420     static const char *
421     GetShellSafeArgument (const char *unsafe_arg, std::string &safe_arg);
422 
423     // EncodeEscapeSequences will change the textual representation of common
424     // escape sequences like "\n" (two characters) into a single '\n'. It does
425     // this for all of the supported escaped sequences and for the \0ooo (octal)
426     // and \xXX (hex). The resulting "dst" string will contain the character
427     // versions of all supported escape sequences. The common supported escape
428     // sequences are: "\a", "\b", "\f", "\n", "\r", "\t", "\v", "\'", "\"", "\\".
429 
430     static void
431     EncodeEscapeSequences (const char *src, std::string &dst);
432 
433     // ExpandEscapeSequences will change a string of possibly non-printable
434     // characters and expand them into text. So '\n' will turn into two chracters
435     // like "\n" which is suitable for human reading. When a character is not
436     // printable and isn't one of the common in escape sequences listed in the
437     // help for EncodeEscapeSequences, then it will be encoded as octal. Printable
438     // characters are left alone.
439     static void
440     ExpandEscapedCharacters (const char *src, std::string &dst);
441 
442     // This one isn't really relevant to Arguments per se, but we're using the Args as a
443     // general strings container, so...
444     void
445     LongestCommonPrefix (std::string &common_prefix);
446 
447 protected:
448     //------------------------------------------------------------------
449     // Classes that inherit from Args can see and modify these
450     //------------------------------------------------------------------
451     typedef std::list<std::string> arg_sstr_collection;
452     typedef std::vector<const char *> arg_cstr_collection;
453     typedef std::vector<char> arg_quote_char_collection;
454     arg_sstr_collection m_args;
455     arg_cstr_collection m_argv; ///< The current argument vector.
456     arg_quote_char_collection m_args_quote_char;
457 
458     void
459     UpdateArgsAfterOptionParsing ();
460 
461     void
462     UpdateArgvFromArgs ();
463 };
464 
465 } // namespace lldb_private
466 
467 #endif  // liblldb_Command_h_
468