forked from OSchip/llvm-project
Added a new format for displaying an array of characters: eFormatCharArray
This us useful because sometomes you have to show a single character as: 'a' (using eFormatChar) and other times you might have an array of single charcters for display as: 'a' 'b' 'c', and other times you might want to show the contents of buffer of characters that can contain non printable chars: "\0\x22\n123". This also fixes an issue that currently happens when you have a single character C string (const char *a = "a"; or char b[1] = { 'b' };) that was being output as "'a'" incorrectly due to the way the eFormatChar format output worked. llvm-svn: 133316
This commit is contained in:
parent
1240f4e53a
commit
4e4294bdee
|
@ -92,6 +92,7 @@ namespace lldb {
|
|||
eFormatBytesWithASCII,
|
||||
eFormatChar,
|
||||
eFormatCharPrintable, // Only printable characters, space if not printable
|
||||
eFormatCharArray, // Print characters with no single quotes, used for character arrays that can contain non printable characters
|
||||
eFormatComplex, // Floating point complex type
|
||||
eFormatComplexFloat = eFormatComplex,
|
||||
eFormatCString, // NULL terminated C strings
|
||||
|
|
|
@ -210,6 +210,7 @@ public:
|
|||
if (!count_option_set)
|
||||
m_count = 32;
|
||||
break;
|
||||
case eFormatCharArray:
|
||||
case eFormatChar:
|
||||
case eFormatCharPrintable:
|
||||
if (!byte_size_option_set)
|
||||
|
@ -1062,6 +1063,7 @@ public:
|
|||
buffer.PutMaxHex64 (uval64, item_byte_size);
|
||||
break;
|
||||
|
||||
case eFormatCharArray:
|
||||
case eFormatChar:
|
||||
case eFormatCString:
|
||||
if (value_str[0])
|
||||
|
|
|
@ -1354,6 +1354,7 @@ DataExtractor::Dump
|
|||
else
|
||||
if (item_format != eFormatChar &&
|
||||
item_format != eFormatCharPrintable &&
|
||||
item_format != eFormatCharArray &&
|
||||
count > 0)
|
||||
{
|
||||
s->PutChar(' ');
|
||||
|
@ -1397,6 +1398,7 @@ DataExtractor::Dump
|
|||
|
||||
case eFormatChar:
|
||||
case eFormatCharPrintable:
|
||||
case eFormatCharArray:
|
||||
{
|
||||
// If we are only printing one character surround it with single
|
||||
// quotes
|
||||
|
@ -1406,7 +1408,7 @@ DataExtractor::Dump
|
|||
uint32_t ch = GetMaxU64(&offset, item_byte_size);
|
||||
if (isprint(ch))
|
||||
s->Printf ("%c", ch);
|
||||
else if (item_format == eFormatChar)
|
||||
else if (item_format != eFormatCharPrintable)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
|
@ -1608,7 +1610,7 @@ DataExtractor::Dump
|
|||
|
||||
case eFormatVectorOfChar:
|
||||
s->PutChar('{');
|
||||
offset = Dump (s, start_offset, eFormatChar, 1, item_byte_size, item_byte_size, LLDB_INVALID_ADDRESS, 0, 0);
|
||||
offset = Dump (s, start_offset, eFormatCharArray, 1, item_byte_size, item_byte_size, LLDB_INVALID_ADDRESS, 0, 0);
|
||||
s->PutChar('}');
|
||||
break;
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ lldb_private::GetFormatAsCString (lldb::Format format)
|
|||
case eFormatBytes: return "bytes";
|
||||
case eFormatBytesWithASCII: return "bytes with ASCII";
|
||||
case eFormatChar: return "character";
|
||||
case eFormatCharArray: return "character array";
|
||||
case eFormatCharPrintable: return "printable character";
|
||||
case eFormatComplexFloat: return "complet float";
|
||||
case eFormatCString: return "c-string";
|
||||
|
|
|
@ -505,7 +505,7 @@ ValueObject::GetSummaryAsCString ()
|
|||
sstr << '"';
|
||||
data.Dump (&sstr,
|
||||
0, // Start offset in "data"
|
||||
eFormatChar, // Print as characters
|
||||
eFormatCharArray, // Print as characters
|
||||
1, // Size of item (1 byte for a char!)
|
||||
bytes_read, // How many bytes to print?
|
||||
UINT32_MAX, // num per line
|
||||
|
@ -535,7 +535,7 @@ ValueObject::GetSummaryAsCString ()
|
|||
|
||||
data.Dump (&sstr,
|
||||
0, // Start offset in "data"
|
||||
eFormatChar, // Print as characters
|
||||
eFormatCharArray, // Print as characters
|
||||
1, // Size of item (1 byte for a char!)
|
||||
len, // How many bytes to print?
|
||||
UINT32_MAX, // num per line
|
||||
|
|
|
@ -908,6 +908,7 @@ Args::StringToFormat
|
|||
case 'Y': format = eFormatBytesWithASCII; break;
|
||||
case 'b': format = eFormatBinary; break;
|
||||
case 'B': format = eFormatBoolean; break;
|
||||
case 'a': format = eFormatCharArray; break;
|
||||
case 'c': format = eFormatChar; break;
|
||||
case 'C': format = eFormatCharPrintable; break;
|
||||
case 'o': format = eFormatOctal; break;
|
||||
|
@ -930,6 +931,7 @@ Args::StringToFormat
|
|||
}
|
||||
if (!success)
|
||||
error.SetErrorStringWithFormat ("Invalid format specification '%s'. Valid values are:\n"
|
||||
" a - char buffer\n"
|
||||
" b - binary\n"
|
||||
" B - boolean\n"
|
||||
" c - char\n"
|
||||
|
|
|
@ -788,6 +788,7 @@ ClangASTType::DumpTypeValue
|
|||
|
||||
case eFormatChar:
|
||||
case eFormatCharPrintable:
|
||||
case eFormatCharArray:
|
||||
case eFormatBytes:
|
||||
case eFormatBytesWithASCII:
|
||||
item_count = (byte_size * item_count);
|
||||
|
|
Loading…
Reference in New Issue