{
const wchar_t* head=name;
const wchar_t* reading=head;
while(*reading)
{
switch(*reading)
{
case L'<':
PrintString(file, head, reading-head);
PrintString(file, L"<");
head=reading+1;
reading=head;
break;
case L'>':
PrintString(file, head, reading-head);
PrintString(file, L">");
head=reading+1;
reading=head;
break;
case L'&':
PrintString(file, head, reading-head);
PrintString(file, L"&");
head=reading+1;
reading=head;
break;
case L'\"':
PrintString(file, head, reading-head);
PrintString(file, L""");
head=reading+1;
reading=head;
break;
default:
reading++;
}
}
PrintString(file, head, reading-head);
}
void PrintXMLOpen(
TextWriter& file, int level, const wchar_t* tagName, const wchar_t* symbolName
,const wchar_t* a1=0, const wchar_t* v1=0
,const wchar_t* a2=0, const wchar_t* v2=0
,const wchar_t* a3=0, const wchar_t* v3=0
)
{
PrintSpaces(file, level);
PrintString(file, L"<");
PrintString(file, tagName);
if(symbolName)
{
PrintString(file, L" name=\"");
PrintEscapedName(file, symbolName);
PrintString(file, L"\"");
}
if(a1)
{
PrintString(file, L" ");
PrintString(file, a1);
PrintString(file, L"=\"");
PrintEscapedName(file, v1);
PrintString(file, L"\"");
}
if(a2)
{
PrintString(file, L" ");
PrintString(file, a2);
PrintString(file, L"=\"");
PrintEscapedName(file, v2);
PrintString(file, L"\"");
}
if(a3)
{
PrintString(file, L" ");
PrintString(file, a3);
PrintString(file, L"=\"");
PrintEscapedName(file, v3);
PrintString(file, L"\"");
}
PrintString(file, L" >\r\n");
}
void PrintXMLClose(TextWriter& file, int level, const wchar_t* tagName)
{
PrintSpaces(file, level);
PrintString(file, L"");
PrintString(file, tagName);
PrintString(file, L">\r\n");
}
//--------------------------------------------------------------------
Dictionary
Dictionary
void AddOrRelease(Dictionary
{
// get name
BSTR nameBSTR=0;
if(SUCCEEDED(symbol->get_name(&nameBSTR)) && nameBSTR)
{
WString name=nameBSTR;
if(!symbols.Keys().Contains(name))
{
// record class symbol
symbols.Add(name, symbol);
symbol=0;
}
}
if(symbol) symbol->Release();
}
void AddUdtOrRelease(IDiaSymbol* udtType)
{
AddOrRelease(udtSymbols, udtType);
}
void AddFuncOrRelease(IDiaSymbol* funcSymbol)
{
AddOrRelease(funcSymbols, funcSymbol);
}
void FindClasses(IDiaSymbol* exeSymbol)
{
{