FormatManager.cpp revision 54890a32efd3a6ffd2bfe38f7398c0a63b5913d5
15c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton//===-- FormatManager.cpp -------------------------------------------*- C++ -*-===// 25c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// 35c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// The LLVM Compiler Infrastructure 45c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// 55c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// This file is distributed under the University of Illinois Open Source 65c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// License. See LICENSE.TXT for details. 75c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// 85c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton//===----------------------------------------------------------------------===// 95c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 105c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/FormatManager.h" 115c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 125c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// C Includes 135c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// C++ Includes 145c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// Other libraries and framework includes 155c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton// Project includes 165c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 175c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Claytonusing namespace lldb; 185c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Claytonusing namespace lldb_private; 195c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 203182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 213182effd150f2e0381d7c6867236737ac69ad846Greg Claytonstruct FormatInfo 223182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 233182effd150f2e0381d7c6867236737ac69ad846Greg Clayton Format format; 243182effd150f2e0381d7c6867236737ac69ad846Greg Clayton const char format_char; // One or more format characters that can be used for this format. 253182effd150f2e0381d7c6867236737ac69ad846Greg Clayton const char *format_name; // Long format name that can be used to specify the current format 263182effd150f2e0381d7c6867236737ac69ad846Greg Clayton}; 273182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 283182effd150f2e0381d7c6867236737ac69ad846Greg Claytonstatic FormatInfo 293182effd150f2e0381d7c6867236737ac69ad846Greg Claytong_format_infos[] = 303182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 313182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatDefault , '\0' , "default" }, 323182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatBoolean , 'B' , "boolean" }, 333182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatBinary , 'b' , "binary" }, 343182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatBytes , 'y' , "bytes" }, 353182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatBytesWithASCII , 'Y' , "bytes with ASCII" }, 363182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatChar , 'c' , "character" }, 373182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatCharPrintable , 'C' , "printable character" }, 383182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatComplexFloat , 'F' , "complex float" }, 393182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatCString , 's' , "c-string" }, 403182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatDecimal , 'i' , "signed decimal" }, 413182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatEnum , 'E' , "enumeration" }, 423182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatHex , 'x' , "hex" }, 433182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatFloat , 'f' , "float" }, 443182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatOctal , 'o' , "octal" }, 453182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatOSType , 'O' , "OSType" }, 463182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatUnicode16 , 'U' , "unicode16" }, 473182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatUnicode32 , '\0' , "unicode32" }, 483182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatUnsigned , 'u' , "unsigned decimal" }, 493182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatPointer , 'p' , "pointer" }, 503182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfChar , '\0' , "char[]" }, 513182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfSInt8 , '\0' , "int8_t[]" }, 523182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfUInt8 , '\0' , "uint8_t[]" }, 533182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfSInt16 , '\0' , "int16_t[]" }, 543182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfUInt16 , '\0' , "uint16_t[]" }, 5554890a32efd3a6ffd2bfe38f7398c0a63b5913d5Enrico Granata { eFormatVectorOfSInt32 , '\0' , "int32_t[]" }, 5654890a32efd3a6ffd2bfe38f7398c0a63b5913d5Enrico Granata { eFormatVectorOfUInt32 , '\0' , "uint32_t[]" }, 5754890a32efd3a6ffd2bfe38f7398c0a63b5913d5Enrico Granata { eFormatVectorOfSInt64 , '\0' , "int64_t[]" }, 5854890a32efd3a6ffd2bfe38f7398c0a63b5913d5Enrico Granata { eFormatVectorOfUInt64 , '\0' , "uint64_t[]" }, 593182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfFloat32, '\0' , "float32[]" }, 603182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfFloat64, '\0' , "float64[]" }, 613182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatVectorOfUInt128, '\0' , "uint128_t[]" }, 623182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatComplexInteger , 'I' , "complex integer" }, 633182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { eFormatCharArray , 'a' , "character array" } 643182effd150f2e0381d7c6867236737ac69ad846Greg Clayton}; 653182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 663182effd150f2e0381d7c6867236737ac69ad846Greg Claytonstatic uint32_t 673182effd150f2e0381d7c6867236737ac69ad846Greg Claytong_num_format_infos = sizeof(g_format_infos)/sizeof(FormatInfo); 683182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 693182effd150f2e0381d7c6867236737ac69ad846Greg Claytonstatic bool 703182effd150f2e0381d7c6867236737ac69ad846Greg ClaytonGetFormatFromFormatChar (char format_char, Format &format) 713182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 723182effd150f2e0381d7c6867236737ac69ad846Greg Clayton for (uint32_t i=0; i<g_num_format_infos; ++i) 733182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 743182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (g_format_infos[i].format_char == format_char) 753182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 763182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = g_format_infos[i].format; 773182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return true; 783182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 793182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 803182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = eFormatInvalid; 813182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return false; 823182effd150f2e0381d7c6867236737ac69ad846Greg Clayton} 833182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 843182effd150f2e0381d7c6867236737ac69ad846Greg Claytonstatic bool 853182effd150f2e0381d7c6867236737ac69ad846Greg ClaytonGetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format) 863182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 873182effd150f2e0381d7c6867236737ac69ad846Greg Clayton uint32_t i; 883182effd150f2e0381d7c6867236737ac69ad846Greg Clayton for (i=0; i<g_num_format_infos; ++i) 893182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 903182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (strcasecmp (g_format_infos[i].format_name, format_name) == 0) 913182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 923182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = g_format_infos[i].format; 933182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return true; 943182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 953182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 963182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 973182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (partial_match_ok) 983182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 993182effd150f2e0381d7c6867236737ac69ad846Greg Clayton for (i=0; i<g_num_format_infos; ++i) 1003182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 1013182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name) 1023182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 1033182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = g_format_infos[i].format; 1043182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return true; 1053182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1063182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1073182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1083182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = eFormatInvalid; 1093182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return false; 1103182effd150f2e0381d7c6867236737ac69ad846Greg Clayton} 1113182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1123182effd150f2e0381d7c6867236737ac69ad846Greg Claytonbool 1133182effd150f2e0381d7c6867236737ac69ad846Greg ClaytonFormatManager::GetFormatFromCString (const char *format_cstr, 1143182effd150f2e0381d7c6867236737ac69ad846Greg Clayton bool partial_match_ok, 1153182effd150f2e0381d7c6867236737ac69ad846Greg Clayton lldb::Format &format) 1163182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 1173182effd150f2e0381d7c6867236737ac69ad846Greg Clayton bool success = false; 1183182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (format_cstr && format_cstr[0]) 1193182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 1203182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (format_cstr[1] == '\0') 1213182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 1223182effd150f2e0381d7c6867236737ac69ad846Greg Clayton success = GetFormatFromFormatChar (format_cstr[0], format); 1233182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (success) 1243182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return true; 1253182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1263182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1273182effd150f2e0381d7c6867236737ac69ad846Greg Clayton success = GetFormatFromFormatName (format_cstr, partial_match_ok, format); 1283182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1293182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (!success) 1303182effd150f2e0381d7c6867236737ac69ad846Greg Clayton format = eFormatInvalid; 1313182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return success; 1323182effd150f2e0381d7c6867236737ac69ad846Greg Clayton} 1333182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1343182effd150f2e0381d7c6867236737ac69ad846Greg Claytonchar 1353182effd150f2e0381d7c6867236737ac69ad846Greg ClaytonFormatManager::GetFormatAsFormatChar (lldb::Format format) 1363182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 1373182effd150f2e0381d7c6867236737ac69ad846Greg Clayton for (uint32_t i=0; i<g_num_format_infos; ++i) 1383182effd150f2e0381d7c6867236737ac69ad846Greg Clayton { 1393182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (g_format_infos[i].format == format) 1403182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return g_format_infos[i].format_char; 1413182effd150f2e0381d7c6867236737ac69ad846Greg Clayton } 1423182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return '\0'; 1433182effd150f2e0381d7c6867236737ac69ad846Greg Clayton} 1443182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1453182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1463182effd150f2e0381d7c6867236737ac69ad846Greg Clayton 1473182effd150f2e0381d7c6867236737ac69ad846Greg Claytonconst char * 1483182effd150f2e0381d7c6867236737ac69ad846Greg ClaytonFormatManager::GetFormatAsCString (Format format) 1493182effd150f2e0381d7c6867236737ac69ad846Greg Clayton{ 1503182effd150f2e0381d7c6867236737ac69ad846Greg Clayton if (format >= eFormatDefault && format < kNumFormats) 1513182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return g_format_infos[format].format_name; 1523182effd150f2e0381d7c6867236737ac69ad846Greg Clayton return NULL; 1533182effd150f2e0381d7c6867236737ac69ad846Greg Clayton} 154886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 155886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatatemplate<> 156886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatabool 157886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataFormatNavigator<std::map<lldb::RegularExpressionSP, SummaryFormat::SharedPointer>, SummaryFormat::RegexSummaryCallback>::Get(const char* key, 158886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata SummaryFormat::SharedPointer& value) 159886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 160886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata Mutex::Locker(m_map_mutex); 161886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata MapIterator pos, end = m_map.end(); 162886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata for (pos = m_map.begin(); pos != end; pos++) 163886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 164886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::RegularExpressionSP regex = pos->first; 165886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if (regex->Execute(key)) 166886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 167886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata value = pos->second; 168886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return true; 169886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 170886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 171886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return false; 172886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 173886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata 174886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatatemplate<> 175886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatabool 176886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataFormatNavigator<std::map<lldb::RegularExpressionSP, SummaryFormat::SharedPointer>, SummaryFormat::RegexSummaryCallback>::Delete(const char* type) 177886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 178886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata Mutex::Locker(m_map_mutex); 179886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata MapIterator pos, end = m_map.end(); 180886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata for (pos = m_map.begin(); pos != end; pos++) 181886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 182886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata lldb::RegularExpressionSP regex = pos->first; 183886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata if ( ::strcmp(type,regex->GetText()) == 0) 184886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata { 185886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata m_map.erase(pos); 186886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return true; 187886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 188886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata } 189886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return false; 190886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 191