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