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:
Greg Clayton 2011-06-17 23:50:44 +00:00
parent 1240f4e53a
commit 4e4294bdee
7 changed files with 13 additions and 4 deletions

View File

@ -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

View File

@ -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])

View File

@ -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;

View File

@ -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";

View File

@ -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

View File

@ -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"

View File

@ -788,6 +788,7 @@ ClangASTType::DumpTypeValue
case eFormatChar:
case eFormatCharPrintable:
case eFormatCharArray:
case eFormatBytes:
case eFormatBytesWithASCII:
item_count = (byte_size * item_count);