blob: 1f6b03ddac1ac2db1de346215fe378d7ab37aa18 [file] [log] [blame]
Greg Clayton73844aa2012-08-22 17:17:09 +00001//===-- OptionValue.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/Interpreter/OptionValue.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Core/StringList.h"
17#include "lldb/Interpreter/OptionValues.h"
18
19using namespace lldb;
20using namespace lldb_private;
21
22
23//-------------------------------------------------------------------------
24// Get this value as a uint64_t value if it is encoded as a boolean,
25// uint64_t or int64_t. Other types will cause "fail_value" to be
26// returned
27//-------------------------------------------------------------------------
28uint64_t
29OptionValue::GetUInt64Value (uint64_t fail_value, bool *success_ptr)
30{
31 if (success_ptr)
32 *success_ptr = true;
33 switch (GetType())
34 {
35 case OptionValue::eTypeBoolean: return static_cast<OptionValueBoolean *>(this)->GetCurrentValue();
36 case OptionValue::eTypeSInt64: return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue();
37 case OptionValue::eTypeUInt64: return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue();
38 default:
39 break;
40 }
41 if (success_ptr)
42 *success_ptr = false;
43 return fail_value;
44}
45
46Error
47OptionValue::SetSubValue (const ExecutionContext *exe_ctx,
48 VarSetOperationType op,
49 const char *name,
50 const char *value)
51{
52 Error error;
53 error.SetErrorStringWithFormat("SetSubValue is not supported");
54 return error;
55}
56
57
58OptionValueBoolean *
59OptionValue::GetAsBoolean ()
60{
61 if (GetType () == OptionValue::eTypeBoolean)
62 return static_cast<OptionValueBoolean *>(this);
63 return NULL;
64}
65
66const OptionValueBoolean *
67OptionValue::GetAsBoolean () const
68{
69 if (GetType () == OptionValue::eTypeBoolean)
70 return static_cast<const OptionValueBoolean *>(this);
71 return NULL;
72}
73
74
75OptionValueFileSpec *
76OptionValue::GetAsFileSpec ()
77{
78 if (GetType () == OptionValue::eTypeFileSpec)
79 return static_cast<OptionValueFileSpec *>(this);
80 return NULL;
81
82}
83
84const OptionValueFileSpec *
85OptionValue::GetAsFileSpec () const
86{
87 if (GetType () == OptionValue::eTypeFileSpec)
88 return static_cast<const OptionValueFileSpec *>(this);
89 return NULL;
90
91}
92
93OptionValueFileSpecList *
94OptionValue::GetAsFileSpecList ()
95{
96 if (GetType () == OptionValue::eTypeFileSpecList)
97 return static_cast<OptionValueFileSpecList *>(this);
98 return NULL;
99
100}
101
102const OptionValueFileSpecList *
103OptionValue::GetAsFileSpecList () const
104{
105 if (GetType () == OptionValue::eTypeFileSpecList)
106 return static_cast<const OptionValueFileSpecList *>(this);
107 return NULL;
108
109}
110
111OptionValueArch *
112OptionValue::GetAsArch ()
113{
114 if (GetType () == OptionValue::eTypeArch)
115 return static_cast<OptionValueArch *>(this);
116 return NULL;
117}
118
119
120const OptionValueArch *
121OptionValue::GetAsArch () const
122{
123 if (GetType () == OptionValue::eTypeArch)
124 return static_cast<const OptionValueArch *>(this);
125 return NULL;
126}
127
128OptionValueArray *
129OptionValue::GetAsArray ()
130{
131 if (GetType () == OptionValue::eTypeArray)
132 return static_cast<OptionValueArray *>(this);
133 return NULL;
134}
135
136
137const OptionValueArray *
138OptionValue::GetAsArray () const
139{
140 if (GetType () == OptionValue::eTypeArray)
141 return static_cast<const OptionValueArray *>(this);
142 return NULL;
143}
144
145OptionValueArgs *
146OptionValue::GetAsArgs ()
147{
148 if (GetType () == OptionValue::eTypeArgs)
149 return static_cast<OptionValueArgs *>(this);
150 return NULL;
151}
152
153
154const OptionValueArgs *
155OptionValue::GetAsArgs () const
156{
157 if (GetType () == OptionValue::eTypeArgs)
158 return static_cast<const OptionValueArgs *>(this);
159 return NULL;
160}
161
162OptionValueDictionary *
163OptionValue::GetAsDictionary ()
164{
165 if (GetType () == OptionValue::eTypeDictionary)
166 return static_cast<OptionValueDictionary *>(this);
167 return NULL;
168}
169
170const OptionValueDictionary *
171OptionValue::GetAsDictionary () const
172{
173 if (GetType () == OptionValue::eTypeDictionary)
174 return static_cast<const OptionValueDictionary *>(this);
175 return NULL;
176}
177
178OptionValueEnumeration *
179OptionValue::GetAsEnumeration ()
180{
181 if (GetType () == OptionValue::eTypeEnum)
182 return static_cast<OptionValueEnumeration *>(this);
183 return NULL;
184}
185
186const OptionValueEnumeration *
187OptionValue::GetAsEnumeration () const
188{
189 if (GetType () == OptionValue::eTypeEnum)
190 return static_cast<const OptionValueEnumeration *>(this);
191 return NULL;
192}
193
194OptionValueFormat *
195OptionValue::GetAsFormat ()
196{
197 if (GetType () == OptionValue::eTypeFormat)
198 return static_cast<OptionValueFormat *>(this);
199 return NULL;
200}
201
202const OptionValueFormat *
203OptionValue::GetAsFormat () const
204{
205 if (GetType () == OptionValue::eTypeFormat)
206 return static_cast<const OptionValueFormat *>(this);
207 return NULL;
208}
209
210OptionValuePathMappings *
211OptionValue::GetAsPathMappings ()
212{
213 if (GetType () == OptionValue::eTypePathMap)
214 return static_cast<OptionValuePathMappings *>(this);
215 return NULL;
216}
217
218const OptionValuePathMappings *
219OptionValue::GetAsPathMappings () const
220{
221 if (GetType () == OptionValue::eTypePathMap)
222 return static_cast<const OptionValuePathMappings *>(this);
223 return NULL;
224}
225
226OptionValueProperties *
227OptionValue::GetAsProperties ()
228{
229 if (GetType () == OptionValue::eTypeProperties)
230 return static_cast<OptionValueProperties *>(this);
231 return NULL;
232}
233
234const OptionValueProperties *
235OptionValue::GetAsProperties () const
236{
237 if (GetType () == OptionValue::eTypeProperties)
238 return static_cast<const OptionValueProperties *>(this);
239 return NULL;
240}
241
242OptionValueRegex *
243OptionValue::GetAsRegex ()
244{
245 if (GetType () == OptionValue::eTypeRegex)
246 return static_cast<OptionValueRegex *>(this);
247 return NULL;
248}
249
250const OptionValueRegex *
251OptionValue::GetAsRegex () const
252{
253 if (GetType () == OptionValue::eTypeRegex)
254 return static_cast<const OptionValueRegex *>(this);
255 return NULL;
256}
257
258OptionValueSInt64 *
259OptionValue::GetAsSInt64 ()
260{
261 if (GetType () == OptionValue::eTypeSInt64)
262 return static_cast<OptionValueSInt64 *>(this);
263 return NULL;
264}
265
266const OptionValueSInt64 *
267OptionValue::GetAsSInt64 () const
268{
269 if (GetType () == OptionValue::eTypeSInt64)
270 return static_cast<const OptionValueSInt64 *>(this);
271 return NULL;
272}
273
274OptionValueString *
275OptionValue::GetAsString ()
276{
277 if (GetType () == OptionValue::eTypeString)
278 return static_cast<OptionValueString *>(this);
279 return NULL;
280}
281
282const OptionValueString *
283OptionValue::GetAsString () const
284{
285 if (GetType () == OptionValue::eTypeString)
286 return static_cast<const OptionValueString *>(this);
287 return NULL;
288}
289
290OptionValueUInt64 *
291OptionValue::GetAsUInt64 ()
292{
293 if (GetType () == OptionValue::eTypeUInt64)
294 return static_cast<OptionValueUInt64 *>(this);
295 return NULL;
296}
297
298const OptionValueUInt64 *
299OptionValue::GetAsUInt64 () const
300{
301 if (GetType () == OptionValue::eTypeUInt64)
302 return static_cast<const OptionValueUInt64 *>(this);
303 return NULL;
304}
305
306OptionValueUUID *
307OptionValue::GetAsUUID ()
308{
309 if (GetType () == OptionValue::eTypeUUID)
310 return static_cast<OptionValueUUID *>(this);
311 return NULL;
312
313}
314
315const OptionValueUUID *
316OptionValue::GetAsUUID () const
317{
318 if (GetType () == OptionValue::eTypeUUID)
319 return static_cast<const OptionValueUUID *>(this);
320 return NULL;
321
322}
323
324bool
325OptionValue::GetBooleanValue (bool fail_value) const
326{
327 const OptionValueBoolean *option_value = GetAsBoolean ();
328 if (option_value)
329 return option_value->GetCurrentValue();
330 return fail_value;
331}
332
333bool
334OptionValue::SetBooleanValue (bool new_value)
335{
336 OptionValueBoolean *option_value = GetAsBoolean ();
337 if (option_value)
338 {
339 option_value->SetCurrentValue(new_value);
340 return true;
341 }
342 return false;
343}
344
345int64_t
346OptionValue::GetEnumerationValue (int64_t fail_value) const
347{
348 const OptionValueEnumeration *option_value = GetAsEnumeration();
349 if (option_value)
Greg Clayton49ce8962012-08-29 21:13:06 +0000350 return option_value->GetCurrentValue();
Greg Clayton73844aa2012-08-22 17:17:09 +0000351 return fail_value;
352}
353
354bool
355OptionValue::SetEnumerationValue (int64_t value)
356{
357 OptionValueEnumeration *option_value = GetAsEnumeration();
358 if (option_value)
359 {
360 option_value->SetCurrentValue(value);
361 return true;
362 }
363 return false;
364}
365
366FileSpec
367OptionValue::GetFileSpecValue () const
368{
369 const OptionValueFileSpec *option_value = GetAsFileSpec ();
370 if (option_value)
371 return option_value->GetCurrentValue();
372 return FileSpec();
373}
374
375
376bool
377OptionValue::SetFileSpecValue (const FileSpec &file_spec)
378{
379 OptionValueFileSpec *option_value = GetAsFileSpec ();
380 if (option_value)
381 {
Greg Claytonc6e82e42012-08-22 18:39:03 +0000382 option_value->SetCurrentValue(file_spec, false);
Greg Clayton73844aa2012-08-22 17:17:09 +0000383 return true;
384 }
385 return false;
386}
387
388FileSpecList
389OptionValue::GetFileSpecListValue () const
390{
391 const OptionValueFileSpecList *option_value = GetAsFileSpecList ();
392 if (option_value)
393 return option_value->GetCurrentValue();
394 return FileSpecList();
395}
396
397
398lldb::Format
399OptionValue::GetFormatValue (lldb::Format fail_value) const
400{
401 const OptionValueFormat *option_value = GetAsFormat ();
402 if (option_value)
403 return option_value->GetCurrentValue();
404 return fail_value;
405}
406
407bool
408OptionValue::SetFormatValue (lldb::Format new_value)
409{
410 OptionValueFormat *option_value = GetAsFormat ();
411 if (option_value)
412 {
413 option_value->SetCurrentValue(new_value);
414 return true;
415 }
416 return false;
417}
418
419const RegularExpression *
420OptionValue::GetRegexValue () const
421{
422 const OptionValueRegex *option_value = GetAsRegex ();
423 if (option_value)
424 return option_value->GetCurrentValue();
425 return NULL;
426}
427
428
429int64_t
430OptionValue::GetSInt64Value (int64_t fail_value) const
431{
432 const OptionValueSInt64 *option_value = GetAsSInt64 ();
433 if (option_value)
434 return option_value->GetCurrentValue();
435 return fail_value;
436}
437
438bool
439OptionValue::SetSInt64Value (int64_t new_value)
440{
441 OptionValueSInt64 *option_value = GetAsSInt64 ();
442 if (option_value)
443 {
444 option_value->SetCurrentValue(new_value);
445 return true;
446 }
447 return false;
448}
449
450const char *
451OptionValue::GetStringValue (const char *fail_value) const
452{
453 const OptionValueString *option_value = GetAsString ();
454 if (option_value)
455 return option_value->GetCurrentValue();
456 return fail_value;
457}
458
459bool
460OptionValue::SetStringValue (const char *new_value)
461{
462 OptionValueString *option_value = GetAsString ();
463 if (option_value)
464 {
465 option_value->SetCurrentValue(new_value);
466 return true;
467 }
468 return false;
469}
470
471uint64_t
472OptionValue::GetUInt64Value (uint64_t fail_value) const
473{
474 const OptionValueUInt64 *option_value = GetAsUInt64 ();
475 if (option_value)
476 return option_value->GetCurrentValue();
477 return fail_value;
478}
479
480bool
481OptionValue::SetUInt64Value (uint64_t new_value)
482{
483 OptionValueUInt64 *option_value = GetAsUInt64 ();
484 if (option_value)
485 {
486 option_value->SetCurrentValue(new_value);
487 return true;
488 }
489 return false;
490}
491
492UUID
493OptionValue::GetUUIDValue () const
494{
495 const OptionValueUUID *option_value = GetAsUUID();
496 if (option_value)
497 return option_value->GetCurrentValue();
498 return UUID();
499}
500
501bool
502OptionValue::SetUUIDValue (const UUID &uuid)
503{
504 OptionValueUUID *option_value = GetAsUUID();
505 if (option_value)
506 {
507 option_value->SetCurrentValue(uuid);
508 return true;
509 }
510 return false;
511}
512
513const char *
514OptionValue::GetBuiltinTypeAsCString (Type t)
515{
516 switch (t)
517 {
518 case eTypeInvalid: return "invalid";
519 case eTypeArch: return "arch";
520 case eTypeArgs: return "arguments";
521 case eTypeArray: return "array";
522 case eTypeBoolean: return "boolean";
523 case eTypeDictionary: return "dictionary";
524 case eTypeEnum: return "enum";
525 case eTypeFileSpec: return "file";
526 case eTypeFileSpecList: return "file-list";
527 case eTypeFormat: return "format";
528 case eTypePathMap: return "path-map";
529 case eTypeProperties: return "properties";
530 case eTypeRegex: return "regex";
531 case eTypeSInt64: return "int";
532 case eTypeString: return "string";
533 case eTypeUInt64: return "unsigned";
534 case eTypeUUID: return "uuid";
535 }
536 return NULL;
537}
538
539
540lldb::OptionValueSP
541OptionValue::CreateValueFromCStringForTypeMask (const char *value_cstr, uint32_t type_mask, Error &error)
542{
543 // If only 1 bit is set in the type mask for a dictionary or array
544 // then we know how to decode a value from a cstring
545 lldb::OptionValueSP value_sp;
546 switch (type_mask)
547 {
548 case 1u << eTypeArch: value_sp.reset(new OptionValueArch()); break;
549 case 1u << eTypeBoolean: value_sp.reset(new OptionValueBoolean(false)); break;
550 case 1u << eTypeFileSpec: value_sp.reset(new OptionValueFileSpec()); break;
551 case 1u << eTypeFormat: value_sp.reset(new OptionValueFormat(eFormatInvalid)); break;
552 case 1u << eTypeSInt64: value_sp.reset(new OptionValueSInt64()); break;
553 case 1u << eTypeString: value_sp.reset(new OptionValueString()); break;
554 case 1u << eTypeUInt64: value_sp.reset(new OptionValueUInt64()); break;
555 case 1u << eTypeUUID: value_sp.reset(new OptionValueUUID()); break;
556 }
557
558 if (value_sp)
559 error = value_sp->SetValueFromCString (value_cstr, eVarSetOperationAssign);
560 else
561 error.SetErrorString("unsupported type mask");
562 return value_sp;
563}
564
565bool
566OptionValue::DumpQualifiedName (Stream &strm) const
567{
568 bool dumped_something = false;
569 lldb::OptionValueSP m_parent_sp(m_parent_wp.lock());
570 if (m_parent_sp)
571 {
572 if (m_parent_sp->DumpQualifiedName(strm))
573 dumped_something = true;
574 }
575 ConstString name (GetName());
576 if (name)
577 {
578 if (dumped_something)
579 strm.PutChar('.');
580 else
581 dumped_something = true;
582 strm << name;
583 }
584 return dumped_something;
585}
586
587size_t
588OptionValue::AutoComplete (CommandInterpreter &interpreter,
589 const char *s,
590 int match_start_point,
591 int max_return_elements,
592 bool &word_complete,
593 StringList &matches)
594{
595 word_complete = false;
596 matches.Clear();
597 return matches.GetSize();
598}
599
600Error
601OptionValue::SetValueFromCString (const char *value, VarSetOperationType op)
602{
603 Error error;
604 switch (op)
605 {
606 case eVarSetOperationReplace:
607 error.SetErrorStringWithFormat ("%s objects do not support the 'replace' operation", GetTypeAsCString());
608 break;
609 case eVarSetOperationInsertBefore:
610 error.SetErrorStringWithFormat ("%s objects do not support the 'insert-before' operation", GetTypeAsCString());
611 break;
612 case eVarSetOperationInsertAfter:
613 error.SetErrorStringWithFormat ("%s objects do not support the 'insert-after' operation", GetTypeAsCString());
614 break;
615 case eVarSetOperationRemove:
616 error.SetErrorStringWithFormat ("%s objects do not support the 'remove' operation", GetTypeAsCString());
617 break;
618 case eVarSetOperationAppend:
619 error.SetErrorStringWithFormat ("%s objects do not support the 'append' operation", GetTypeAsCString());
620 break;
621 case eVarSetOperationClear:
622 error.SetErrorStringWithFormat ("%s objects do not support the 'clear' operation", GetTypeAsCString());
623 break;
624 case eVarSetOperationAssign:
625 error.SetErrorStringWithFormat ("%s objects do not support the 'assign' operation", GetTypeAsCString());
626 break;
627 case eVarSetOperationInvalid:
628 error.SetErrorStringWithFormat ("invalid operation performed on a %s object", GetTypeAsCString());
629 break;
630 }
631 return error;
632}
633