fix VC6 builds by removing variadic macros; use standard wxLogXXX functions instead, together with a new wxLog-derived target to print everything on stdout
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56717 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -70,6 +70,19 @@ static const wxCmdLineEntryDesc g_cmdLineDesc[] =
|
|||||||
wxCMD_LINE_DESC_END
|
wxCMD_LINE_DESC_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IfaceCheckLog : public wxLog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IfaceCheckLog() {}
|
||||||
|
|
||||||
|
void DoLog(wxLogLevel level, const wxString& msg, time_t stamp)
|
||||||
|
{
|
||||||
|
wxPrintf(msg);
|
||||||
|
wxPrintf("\n");
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class IfaceCheckApp : public wxAppConsole
|
class IfaceCheckApp : public wxAppConsole
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -84,7 +97,6 @@ public:
|
|||||||
bool FixMethod(const wxString& header, const wxMethod* iface, const wxMethod* api);
|
bool FixMethod(const wxString& header, const wxMethod* iface, const wxMethod* api);
|
||||||
bool StringContainsMethodName(const wxString& str, const wxMethod* m);
|
bool StringContainsMethodName(const wxString& str, const wxMethod* m);
|
||||||
|
|
||||||
void ShowProgress();
|
|
||||||
void PrintStatistics(long secs);
|
void PrintStatistics(long secs);
|
||||||
|
|
||||||
bool IsToProcess(const wxString& headername) const
|
bool IsToProcess(const wxString& headername) const
|
||||||
@@ -117,6 +129,10 @@ int IfaceCheckApp::OnRun()
|
|||||||
wxString::Format("wxWidgets Interface checker utility (built %s against %s)",
|
wxString::Format("wxWidgets Interface checker utility (built %s against %s)",
|
||||||
__DATE__, wxVERSION_STRING));
|
__DATE__, wxVERSION_STRING));
|
||||||
|
|
||||||
|
// make the output more readable:
|
||||||
|
wxLog::SetActiveTarget(new IfaceCheckLog);
|
||||||
|
wxLog::DisableTimestamp();
|
||||||
|
|
||||||
// parse the command line...
|
// parse the command line...
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
wxString preprocFile;
|
wxString preprocFile;
|
||||||
@@ -145,14 +161,14 @@ int IfaceCheckApp::OnRun()
|
|||||||
!m_doxyInterface.Parse(parser.GetParam(1)))
|
!m_doxyInterface.Parse(parser.GetParam(1)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
g_bLogEnabled = true;
|
// g_bLogEnabled = true;
|
||||||
|
|
||||||
if (parser.Found(DUMP_SWITCH))
|
if (parser.Found(DUMP_SWITCH))
|
||||||
{
|
{
|
||||||
LogMessage("Dumping real API to '%s'...", API_DUMP_FILE);
|
wxLogMessage("Dumping real API to '%s'...", API_DUMP_FILE);
|
||||||
m_gccInterface.Dump(API_DUMP_FILE);
|
m_gccInterface.Dump(API_DUMP_FILE);
|
||||||
|
|
||||||
LogMessage("Dumping interface API to '%s'...", INTERFACE_DUMP_FILE);
|
wxLogMessage("Dumping interface API to '%s'...", INTERFACE_DUMP_FILE);
|
||||||
m_doxyInterface.Dump(INTERFACE_DUMP_FILE);
|
m_doxyInterface.Dump(INTERFACE_DUMP_FILE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -192,23 +208,17 @@ int IfaceCheckApp::OnRun()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IfaceCheckApp::ShowProgress()
|
|
||||||
{
|
|
||||||
wxPrint(".");
|
|
||||||
//fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IfaceCheckApp::Compare()
|
bool IfaceCheckApp::Compare()
|
||||||
{
|
{
|
||||||
const wxClassArray& interfaces = m_doxyInterface.GetClasses();
|
const wxClassArray& interfaces = m_doxyInterface.GetClasses();
|
||||||
const wxClass* c;
|
const wxClass* c;
|
||||||
int mcount = 0, ccount = 0;
|
int mcount = 0, ccount = 0;
|
||||||
|
|
||||||
LogMessage("Comparing the interface API to the real API (%d classes to compare)...",
|
wxLogMessage("Comparing the interface API to the real API (%d classes to compare)...",
|
||||||
interfaces.GetCount());
|
interfaces.GetCount());
|
||||||
|
|
||||||
if (!m_strToMatch.IsEmpty())
|
if (!m_strToMatch.IsEmpty())
|
||||||
LogMessage("Processing only header files matching '%s' expression.", m_strToMatch);
|
wxLogMessage("Processing only header files matching '%s' expression.", m_strToMatch);
|
||||||
|
|
||||||
for (unsigned int i=0; i<interfaces.GetCount(); i++)
|
for (unsigned int i=0; i<interfaces.GetCount(); i++)
|
||||||
{
|
{
|
||||||
@@ -218,7 +228,7 @@ bool IfaceCheckApp::Compare()
|
|||||||
(interfaces[i].GetAvailability() & m_gccInterface.GetInterfacePort()) == 0) {
|
(interfaces[i].GetAvailability() & m_gccInterface.GetInterfacePort()) == 0) {
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("skipping class '%s' since it's not available for the %s port.",
|
wxLogMessage("skipping class '%s' since it's not available for the %s port.",
|
||||||
interfaces[i].GetName(), m_gccInterface.GetInterfacePortName());
|
interfaces[i].GetName(), m_gccInterface.GetInterfacePortName());
|
||||||
|
|
||||||
continue; // skip this method
|
continue; // skip this method
|
||||||
@@ -259,15 +269,15 @@ bool IfaceCheckApp::Compare()
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
LogMessage("%s: couldn't find the real interface for the '%s' class",
|
wxLogMessage("%s: couldn't find the real interface for the '%s' class",
|
||||||
header, cname);
|
header, cname);
|
||||||
ccount++;
|
ccount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogMessage("%d on a total of %d methods (%.1f%%) of the interface headers do not exist in the real headers",
|
wxLogMessage("%d on a total of %d methods (%.1f%%) of the interface headers do not exist in the real headers",
|
||||||
mcount, m_doxyInterface.GetMethodCount(), (float)(100.0 * mcount/m_doxyInterface.GetMethodCount()));
|
mcount, m_doxyInterface.GetMethodCount(), (float)(100.0 * mcount/m_doxyInterface.GetMethodCount()));
|
||||||
LogMessage("%d on a total of %d classes (%.1f%%) of the interface headers do not exist in the real headers",
|
wxLogMessage("%d on a total of %d classes (%.1f%%) of the interface headers do not exist in the real headers",
|
||||||
ccount, m_doxyInterface.GetClassesCount(), (float)(100.0 * ccount/m_doxyInterface.GetClassesCount()));
|
ccount, m_doxyInterface.GetClassesCount(), (float)(100.0 * ccount/m_doxyInterface.GetClassesCount()));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -293,7 +303,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
(m.GetAvailability() & m_gccInterface.GetInterfacePort()) == 0) {
|
(m.GetAvailability() & m_gccInterface.GetInterfacePort()) == 0) {
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("skipping method '%s' since it's not available for the %s port.",
|
wxLogMessage("skipping method '%s' since it's not available for the %s port.",
|
||||||
m.GetAsString(), m_gccInterface.GetInterfacePortName());
|
m.GetAsString(), m_gccInterface.GetInterfacePortName());
|
||||||
|
|
||||||
continue; // skip this method
|
continue; // skip this method
|
||||||
@@ -349,7 +359,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
|
|
||||||
// modify interface header
|
// modify interface header
|
||||||
if (FixMethod(iface->GetHeader(), &m, &tmp))
|
if (FixMethod(iface->GetHeader(), &m, &tmp))
|
||||||
LogMessage("Adjusted attributes of '%s' method", m.GetAsString());
|
wxLogMessage("Adjusted attributes of '%s' method", m.GetAsString());
|
||||||
|
|
||||||
proceed = false;
|
proceed = false;
|
||||||
break;
|
break;
|
||||||
@@ -360,7 +370,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
{
|
{
|
||||||
if (overloads.GetCount()==0)
|
if (overloads.GetCount()==0)
|
||||||
{
|
{
|
||||||
LogMessage("%s: real '%s' class and their parents have no method '%s'",
|
wxLogMessage("%s: real '%s' class and their parents have no method '%s'",
|
||||||
header, api->GetName(), m.GetAsString());
|
header, api->GetName(), m.GetAsString());
|
||||||
// we've found no overloads
|
// we've found no overloads
|
||||||
}
|
}
|
||||||
@@ -383,7 +393,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
for (unsigned int j=0; j<overloads.GetCount(); j++)
|
for (unsigned int j=0; j<overloads.GetCount(); j++)
|
||||||
warning += "\n\treal header: " + overloads[j]->GetAsString(true, true, true, true);
|
warning += "\n\treal header: " + overloads[j]->GetAsString(true, true, true, true);
|
||||||
|
|
||||||
wxPrint(warning + "\n");
|
wxLogWarning(warning);
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if (overloads.GetCount()>1)
|
if (overloads.GetCount()>1)
|
||||||
@@ -391,7 +401,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
// TODO: decide which of these overloads is the most "similar" to m
|
// TODO: decide which of these overloads is the most "similar" to m
|
||||||
// and eventually modify it
|
// and eventually modify it
|
||||||
if (m_modify)
|
if (m_modify)
|
||||||
wxPrint("\tmanual fix is required\n");
|
wxLogWarning("\tmanual fix is required");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -399,7 +409,7 @@ int IfaceCheckApp::CompareClasses(const wxClass* iface, const wxClass* api)
|
|||||||
|
|
||||||
if (m_modify || m.IsCtor())
|
if (m_modify || m.IsCtor())
|
||||||
{
|
{
|
||||||
wxPrint("\tfixing it...\n");
|
wxLogWarning("\tfixing it...");
|
||||||
|
|
||||||
// try to modify it!
|
// try to modify it!
|
||||||
FixMethod(iface->GetHeader(), &m, overloads[0]);
|
FixMethod(iface->GetHeader(), &m, overloads[0]);
|
||||||
@@ -427,7 +437,7 @@ bool IfaceCheckApp::FixMethod(const wxString& header, const wxMethod* iface, con
|
|||||||
|
|
||||||
wxTextFile file;
|
wxTextFile file;
|
||||||
if (!file.Open(header)) {
|
if (!file.Open(header)) {
|
||||||
LogError("\tcan't open the '%s' header file.", header);
|
wxLogError("\tcan't open the '%s' header file.", header);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,13 +445,13 @@ bool IfaceCheckApp::FixMethod(const wxString& header, const wxMethod* iface, con
|
|||||||
// i.e. the line containing the semicolon at the end of the declaration.
|
// i.e. the line containing the semicolon at the end of the declaration.
|
||||||
int end = iface->GetLocation()-1;
|
int end = iface->GetLocation()-1;
|
||||||
if (end <= 0 || end >= (int)file.GetLineCount()) {
|
if (end <= 0 || end >= (int)file.GetLineCount()) {
|
||||||
LogWarning("\tinvalid location info for method '%s': %d.",
|
wxLogWarning("\tinvalid location info for method '%s': %d.",
|
||||||
iface->GetAsString(), iface->GetLocation());
|
iface->GetAsString(), iface->GetLocation());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file.GetLine(end).Contains(";")) {
|
if (!file.GetLine(end).Contains(";")) {
|
||||||
LogWarning("\tinvalid location info for method '%s': %d.",
|
wxLogWarning("\tinvalid location info for method '%s': %d.",
|
||||||
iface->GetAsString(), iface->GetLocation());
|
iface->GetAsString(), iface->GetLocation());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -476,7 +486,7 @@ bool IfaceCheckApp::FixMethod(const wxString& header, const wxMethod* iface, con
|
|||||||
|
|
||||||
if (start <= 0 || !founddecl)
|
if (start <= 0 || !founddecl)
|
||||||
{
|
{
|
||||||
LogError("\tcan't find the beginning of the declaration of '%s' method in '%s' header looking backwards from line %d; I arrived at %d and gave up",
|
wxLogError("\tcan't find the beginning of the declaration of '%s' method in '%s' header looking backwards from line %d; I arrived at %d and gave up",
|
||||||
iface->GetAsString(), header, end+1 /* zero-based => 1-based */, start);
|
iface->GetAsString(), header, end+1 /* zero-based => 1-based */, start);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -557,7 +567,7 @@ bool IfaceCheckApp::FixMethod(const wxString& header, const wxMethod* iface, con
|
|||||||
|
|
||||||
// now save the modification
|
// now save the modification
|
||||||
if (!file.Write()) {
|
if (!file.Write()) {
|
||||||
LogError("\tcan't save the '%s' header file.", header);
|
wxLogError("\tcan't save the '%s' header file.", header);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,7 +577,7 @@ bool IfaceCheckApp::FixMethod(const wxString& header, const wxMethod* iface, con
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("\tthe final row offset for following methods is %d lines.", nOffset);
|
wxLogMessage("\tthe final row offset for following methods is %d lines.", nOffset);
|
||||||
|
|
||||||
// update the other method's locations for those methods which belong to the modified header
|
// update the other method's locations for those methods which belong to the modified header
|
||||||
// and are placed _below_ the modified method
|
// and are placed _below_ the modified method
|
||||||
@@ -592,7 +602,7 @@ bool IfaceCheckApp::ParsePreprocessorOutput(const wxString& filename)
|
|||||||
{
|
{
|
||||||
wxTextFile tf;
|
wxTextFile tf;
|
||||||
if (!tf.Open(filename)) {
|
if (!tf.Open(filename)) {
|
||||||
LogError("can't open the '%s' preprocessor output file.", filename);
|
wxLogError("can't open the '%s' preprocessor output file.", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,7 +615,7 @@ bool IfaceCheckApp::ParsePreprocessorOutput(const wxString& filename)
|
|||||||
// the format of this line should be:
|
// the format of this line should be:
|
||||||
// #define DEFNAME DEFVALUE
|
// #define DEFNAME DEFVALUE
|
||||||
if (!line.StartsWith("#define ")) {
|
if (!line.StartsWith("#define ")) {
|
||||||
LogError("unexpected content in '%s' at line %d.", filename, i+1);
|
wxLogError("unexpected content in '%s' at line %d.", filename, i+1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -634,7 +644,7 @@ bool IfaceCheckApp::ParsePreprocessorOutput(const wxString& filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogMessage("Parsed %d preprocessor #defines from '%s' which will be used later...",
|
wxLogMessage("Parsed %d preprocessor #defines from '%s' which will be used later...",
|
||||||
useful, filename);
|
useful, filename);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -645,9 +655,9 @@ void IfaceCheckApp::PrintStatistics(long secs)
|
|||||||
// these stats, for what regards the gcc XML, are all referred to the wxWidgets
|
// these stats, for what regards the gcc XML, are all referred to the wxWidgets
|
||||||
// classes only!
|
// classes only!
|
||||||
|
|
||||||
LogMessage("wx real headers contains declaration of %d classes (%d methods)",
|
wxLogMessage("wx real headers contains declaration of %d classes (%d methods)",
|
||||||
m_gccInterface.GetClassesCount(), m_gccInterface.GetMethodCount());
|
m_gccInterface.GetClassesCount(), m_gccInterface.GetMethodCount());
|
||||||
LogMessage("wx interface headers contains declaration of %d classes (%d methods)",
|
wxLogMessage("wx interface headers contains declaration of %d classes (%d methods)",
|
||||||
m_doxyInterface.GetClassesCount(), m_doxyInterface.GetMethodCount());
|
m_doxyInterface.GetClassesCount(), m_doxyInterface.GetMethodCount());
|
||||||
|
|
||||||
// build a list of the undocumented wx classes
|
// build a list of the undocumented wx classes
|
||||||
@@ -664,7 +674,7 @@ void IfaceCheckApp::PrintStatistics(long secs)
|
|||||||
list.RemoveLast();
|
list.RemoveLast();
|
||||||
list.RemoveLast();
|
list.RemoveLast();
|
||||||
|
|
||||||
LogMessage("the list of the %d undocumented wx classes is: %s", undoc, list);
|
wxLogMessage("the list of the %d undocumented wx classes is: %s", undoc, list);
|
||||||
LogMessage("total processing took %d seconds.", secs);
|
wxLogMessage("total processing took %d seconds.", secs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// Name: xmlparser.cpp
|
// Name: xmlparser.cpp
|
||||||
// Purpose: Parser of the API/interface XML files
|
// Purpose: Parser of the API/interface XML files
|
||||||
// Author: Francesco Montorsi
|
// Author: Francesco Montorsi
|
||||||
@@ -135,8 +135,8 @@ bool wxType::operator==(const wxType& m) const
|
|||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
{
|
{
|
||||||
LogMessage("Type '%s' does not match type '%s'", m_strType, m.m_strType);
|
wxLogMessage("Type '%s' does not match type '%s'", m_strType, m.m_strType);
|
||||||
LogMessage(" => TypeClean %s / %s; IsConst %d / %d; IsStatic %d / %d; IsPointer %d / %d; IsReference %d / %d",
|
wxLogMessage(" => TypeClean %s / %s; IsConst %d / %d; IsStatic %d / %d; IsPointer %d / %d; IsReference %d / %d",
|
||||||
m_strTypeClean, m.m_strTypeClean, IsConst(), m.IsConst(),
|
m_strTypeClean, m.m_strTypeClean, IsConst(), m.IsConst(),
|
||||||
IsStatic(), m.IsStatic(), IsPointer(), m.IsPointer(),
|
IsStatic(), m.IsStatic(), IsPointer(), m.IsPointer(),
|
||||||
IsReference(), m.IsReference());
|
IsReference(), m.IsReference());
|
||||||
@@ -226,7 +226,7 @@ bool wxArgumentType::operator==(const wxArgumentType& m) const
|
|||||||
(m.m_strDefaultValueForCmp.IsNumber() && m_strDefaultValueForCmp.StartsWith("wx")))
|
(m.m_strDefaultValueForCmp.IsNumber() && m_strDefaultValueForCmp.StartsWith("wx")))
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("Supposing '%s' default value to be the same of '%s'...",
|
wxLogMessage("Supposing '%s' default value to be the same of '%s'...",
|
||||||
m_strDefaultValueForCmp, m.m_strDefaultValueForCmp);
|
m_strDefaultValueForCmp, m.m_strDefaultValueForCmp);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -247,7 +247,7 @@ bool wxArgumentType::operator==(const wxArgumentType& m) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("Argument type '%s = %s' has different default value from '%s = %s'",
|
wxLogMessage("Argument type '%s = %s' has different default value from '%s = %s'",
|
||||||
m_strType, m_strDefaultValueForCmp, m.m_strType, m.m_strDefaultValueForCmp);
|
m_strType, m_strDefaultValueForCmp, m.m_strType, m.m_strDefaultValueForCmp);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -267,7 +267,7 @@ bool wxMethod::IsOk() const
|
|||||||
// NOTE: m_retType can be a wxEmptyType, and means that this method
|
// NOTE: m_retType can be a wxEmptyType, and means that this method
|
||||||
// is a ctor or a dtor.
|
// is a ctor or a dtor.
|
||||||
if (!m_retType.IsOk() && m_retType!=wxEmptyType) {
|
if (!m_retType.IsOk() && m_retType!=wxEmptyType) {
|
||||||
LogError("'%s' method has invalid return type: %s", m_retType.GetAsString());
|
wxLogError("'%s' method has invalid return type: %s", m_retType.GetAsString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,7 +276,7 @@ bool wxMethod::IsOk() const
|
|||||||
|
|
||||||
// a function can't be both const and static or virtual and static!
|
// a function can't be both const and static or virtual and static!
|
||||||
if ((m_bConst && m_bStatic) || ((m_bVirtual || m_bPureVirtual) && m_bStatic)) {
|
if ((m_bConst && m_bStatic) || ((m_bVirtual || m_bPureVirtual) && m_bStatic)) {
|
||||||
LogError("'%s' method can't be both const/static or virtual/static", m_strName);
|
wxLogError("'%s' method can't be both const/static or virtual/static", m_strName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +284,7 @@ bool wxMethod::IsOk() const
|
|||||||
|
|
||||||
for (unsigned int i=0; i<m_args.GetCount(); i++)
|
for (unsigned int i=0; i<m_args.GetCount(); i++)
|
||||||
if (!m_args[i].IsOk()) {
|
if (!m_args[i].IsOk()) {
|
||||||
LogError("'%s' method has invalid %d-th argument type: %s",
|
wxLogError("'%s' method has invalid %d-th argument type: %s",
|
||||||
m_strName, i+1, m_args[i].GetAsString());
|
m_strName, i+1, m_args[i].GetAsString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -298,7 +298,7 @@ bool wxMethod::IsOk() const
|
|||||||
for (unsigned int i=1; i<m_args.GetCount(); i++)
|
for (unsigned int i=1; i<m_args.GetCount(); i++)
|
||||||
{
|
{
|
||||||
if (previousArgHasDefault && !m_args[i].HasDefaultValue()) {
|
if (previousArgHasDefault && !m_args[i].HasDefaultValue()) {
|
||||||
LogError("'%s' method has %d-th argument which has no default value "
|
wxLogError("'%s' method has %d-th argument which has no default value "
|
||||||
"(while the previous one had one!)",
|
"(while the previous one had one!)",
|
||||||
m_strName, i+1);
|
m_strName, i+1);
|
||||||
return false;
|
return false;
|
||||||
@@ -317,13 +317,13 @@ bool wxMethod::MatchesExceptForAttributes(const wxMethod& m) const
|
|||||||
GetName() != m.GetName())
|
GetName() != m.GetName())
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("The method '%s' does not match method '%s'; different names/rettype", GetName(), m.GetName());
|
wxLogMessage("The method '%s' does not match method '%s'; different names/rettype", GetName(), m.GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_args.GetCount()!=m.m_args.GetCount()) {
|
if (m_args.GetCount()!=m.m_args.GetCount()) {
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("Method '%s' has %d arguments while '%s' has %d arguments",
|
wxLogMessage("Method '%s' has %d arguments while '%s' has %d arguments",
|
||||||
m_strName, m_args.GetCount(), m_strName, m.m_args.GetCount());
|
m_strName, m_args.GetCount(), m_strName, m.m_args.GetCount());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -359,7 +359,7 @@ bool wxMethod::operator==(const wxMethod& m) const
|
|||||||
GetAccessSpecifier() != m.GetAccessSpecifier())
|
GetAccessSpecifier() != m.GetAccessSpecifier())
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("The method '%s' does not match method '%s'; different attributes", GetName(), m.GetName());
|
wxLogMessage("The method '%s' does not match method '%s'; different attributes", GetName(), m.GetName());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -509,7 +509,7 @@ bool wxClass::CheckConsistency() const
|
|||||||
for (unsigned int j=0; j<m_methods.GetCount(); j++)
|
for (unsigned int j=0; j<m_methods.GetCount(); j++)
|
||||||
if (i!=j && m_methods[i] == m_methods[j])
|
if (i!=j && m_methods[i] == m_methods[j])
|
||||||
{
|
{
|
||||||
LogError("class %s has two methods with the same prototype: '%s'",
|
wxLogError("class %s has two methods with the same prototype: '%s'",
|
||||||
m_strName, m_methods[i].GetAsString());
|
m_strName, m_methods[i].GetAsString());
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -546,7 +546,7 @@ const wxMethod* wxClass::RecursiveUpwardFindMethod(const wxMethod& m,
|
|||||||
{
|
{
|
||||||
const wxClass *parent = allclasses->FindClass(m_parents[i]);
|
const wxClass *parent = allclasses->FindClass(m_parents[i]);
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
LogError("Could not find parent '%s' of class '%s'...",
|
wxLogError("Could not find parent '%s' of class '%s'...",
|
||||||
m_parents[i], GetName());
|
m_parents[i], GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -589,7 +589,7 @@ wxMethodPtrArray wxClass::RecursiveUpwardFindMethodsNamed(const wxString& name,
|
|||||||
{
|
{
|
||||||
const wxClass *parent = allclasses->FindClass(m_parents[i]);
|
const wxClass *parent = allclasses->FindClass(m_parents[i]);
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
LogError("Could not find parent '%s' of class '%s'...",
|
wxLogError("Could not find parent '%s' of class '%s'...",
|
||||||
m_parents[i], GetName());
|
m_parents[i], GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -632,13 +632,23 @@ void wxXmlInterface::Dump(const wxString& filename)
|
|||||||
sorted[i]->Dump(apiout);
|
sorted[i]->Dump(apiout);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxXmlInterface::CheckParseResults() const
|
bool wxXmlInterface::CheckConsistency() const
|
||||||
{
|
{
|
||||||
// this check can be quite slow, so do it only for debug releases:
|
// this check can be quite slow, so do it only for debug releases:
|
||||||
//#ifdef __WXDEBUG__
|
//#ifdef __WXDEBUG__
|
||||||
for (unsigned int i=0; i<m_classes.GetCount(); i++)
|
for (unsigned int i=0; i<m_classes.GetCount(); i++)
|
||||||
|
{
|
||||||
if (!m_classes[i].CheckConsistency())
|
if (!m_classes[i].CheckConsistency())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
for (unsigned int j=0; j<m_classes.GetCount(); j++)
|
||||||
|
if (i!=j && m_classes[i].GetName() == m_classes[j].GetName())
|
||||||
|
{
|
||||||
|
wxLogError("two classes have the same name: %s",
|
||||||
|
m_classes[i].GetName());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -775,16 +785,16 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
wxXmlNode *child;
|
wxXmlNode *child;
|
||||||
int nodes = 0;
|
int nodes = 0;
|
||||||
|
|
||||||
LogMessage("Parsing %s...", filename);
|
wxLogMessage("Parsing %s...", filename);
|
||||||
|
|
||||||
if (!doc.Load(filename)) {
|
if (!doc.Load(filename)) {
|
||||||
LogError("can't load %s", filename);
|
wxLogError("can't load %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// start processing the XML file
|
// start processing the XML file
|
||||||
if (doc.GetRoot()->GetName() != "GCC_XML") {
|
if (doc.GetRoot()->GetName() != "GCC_XML") {
|
||||||
LogError("invalid root node for %s", filename);
|
wxLogError("invalid root node for %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,7 +817,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
|
|
||||||
if (old)
|
if (old)
|
||||||
{
|
{
|
||||||
LogError("The version of GCC-XML used for the creation of %s is too old; "
|
wxLogError("The version of GCC-XML used for the creation of %s is too old; "
|
||||||
"the cvs_revision attribute of the root node reports '%s', "
|
"the cvs_revision attribute of the root node reports '%s', "
|
||||||
"minimal required is 1.%d.", filename, version, MIN_REVISION);
|
"minimal required is 1.%d.", filename, version, MIN_REVISION);
|
||||||
return false;
|
return false;
|
||||||
@@ -833,7 +843,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
|
|
||||||
// NOTE: <File> nodes can have an id == "f0"...
|
// NOTE: <File> nodes can have an id == "f0"...
|
||||||
|
|
||||||
LogError("Invalid id for node %s: %s", n, child->GetAttribute("id"));
|
wxLogError("Invalid id for node %s: %s", n, child->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -841,7 +851,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
wxString cname = child->GetAttribute("name");
|
wxString cname = child->GetAttribute("name");
|
||||||
if (cname.IsEmpty()) {
|
if (cname.IsEmpty()) {
|
||||||
LogError("Invalid empty name for '%s' node", n);
|
wxLogError("Invalid empty name for '%s' node", n);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -870,7 +880,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
if (ids.IsEmpty())
|
if (ids.IsEmpty())
|
||||||
{
|
{
|
||||||
if (child->GetAttribute("incomplete") != "1") {
|
if (child->GetAttribute("incomplete") != "1") {
|
||||||
LogError("Invalid member IDs for '%s' class node: %s",
|
wxLogError("Invalid member IDs for '%s' class node: %s",
|
||||||
cname, child->GetAttribute("id"));
|
cname, child->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -881,7 +891,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
// decode the non-empty list of IDs:
|
// decode the non-empty list of IDs:
|
||||||
if (!getMemberIDs(&members, newClass, ids)) {
|
if (!getMemberIDs(&members, newClass, ids)) {
|
||||||
LogError("Invalid member IDs for '%s' class node: %s",
|
wxLogError("Invalid member IDs for '%s' class node: %s",
|
||||||
cname, child->GetAttribute("id"));
|
cname, child->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -895,7 +905,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
unsigned long typeId = 0;
|
unsigned long typeId = 0;
|
||||||
if (!getID(&typeId, child->GetAttribute("type"))) {
|
if (!getID(&typeId, child->GetAttribute("type"))) {
|
||||||
LogError("Invalid type for node %s: %s", n, child->GetAttribute("type"));
|
wxLogError("Invalid type for node %s: %s", n, child->GetAttribute("type"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -913,7 +923,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
unsigned long type = 0;
|
unsigned long type = 0;
|
||||||
if (!getID(&type, child->GetAttribute("type")) || type == 0) {
|
if (!getID(&type, child->GetAttribute("type")) || type == 0) {
|
||||||
LogError("Invalid type for node %s: %s", n, child->GetAttribute("type"));
|
wxLogError("Invalid type for node %s: %s", n, child->GetAttribute("type"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -959,7 +969,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
else if (n == "File")
|
else if (n == "File")
|
||||||
{
|
{
|
||||||
if (!child->GetAttribute("id").StartsWith("f")) {
|
if (!child->GetAttribute("id").StartsWith("f")) {
|
||||||
LogError("Unexpected file ID: %s", child->GetAttribute("id"));
|
wxLogError("Unexpected file ID: %s", child->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -984,7 +994,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
// they're never used as return/argument types by wxWidgets methods
|
// they're never used as return/argument types by wxWidgets methods
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogWarning("Type node '%s' with ID '%s' does not have name attribute",
|
wxLogWarning("Type node '%s' with ID '%s' does not have name attribute",
|
||||||
n, child->GetAttribute("id"));
|
n, child->GetAttribute("id"));
|
||||||
|
|
||||||
types[id] = "TOFIX";
|
types[id] = "TOFIX";
|
||||||
@@ -1003,7 +1013,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
while (toResolveTypes.size()>0)
|
while (toResolveTypes.size()>0)
|
||||||
{
|
{
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("%d types were collected; %d types need yet to be resolved...",
|
wxLogMessage("%d types were collected; %d types need yet to be resolved...",
|
||||||
types.size(), toResolveTypes.size());
|
types.size(), toResolveTypes.size());
|
||||||
|
|
||||||
for (wxToResolveTypeHashMap::iterator i = toResolveTypes.begin();
|
for (wxToResolveTypeHashMap::iterator i = toResolveTypes.begin();
|
||||||
@@ -1057,7 +1067,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogError("Cannot solve '%d' reference type!", referenced);
|
wxLogError("Cannot solve '%d' reference type!", referenced);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1069,7 +1079,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
unsigned long fileID = 0;
|
unsigned long fileID = 0;
|
||||||
if (!getID(&fileID, m_classes[i].GetHeader()) || fileID == 0) {
|
if (!getID(&fileID, m_classes[i].GetHeader()) || fileID == 0) {
|
||||||
LogError("invalid header id: %s", m_classes[i].GetHeader());
|
wxLogError("invalid header id: %s", m_classes[i].GetHeader());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1078,7 +1088,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
if (idx == files.end())
|
if (idx == files.end())
|
||||||
{
|
{
|
||||||
// this is an error!
|
// this is an error!
|
||||||
LogError("couldn't find file ID '%s'", m_classes[i].GetHeader());
|
wxLogError("couldn't find file ID '%s'", m_classes[i].GetHeader());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_classes[i].SetHeader(idx->second);
|
m_classes[i].SetHeader(idx->second);
|
||||||
@@ -1092,7 +1102,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
unsigned long id;
|
unsigned long id;
|
||||||
|
|
||||||
if (!getID(&id, m_classes[i].GetParent(k))) {
|
if (!getID(&id, m_classes[i].GetParent(k))) {
|
||||||
LogError("invalid parent class ID for '%s'", m_classes[i].GetName());
|
wxLogError("invalid parent class ID for '%s'", m_classes[i].GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1100,7 +1110,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
if (idx == types.end())
|
if (idx == types.end())
|
||||||
{
|
{
|
||||||
// this is an error!
|
// this is an error!
|
||||||
LogError("couldn't find parent class ID '%d'", id);
|
wxLogError("couldn't find parent class ID '%d'", id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// replace k-th parent with its true name:
|
// replace k-th parent with its true name:
|
||||||
@@ -1120,7 +1130,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
{
|
{
|
||||||
unsigned long id = 0;
|
unsigned long id = 0;
|
||||||
if (!getID(&id, child->GetAttribute("id"))) {
|
if (!getID(&id, child->GetAttribute("id"))) {
|
||||||
LogError("invalid ID for node '%s' with ID '%s'", n, child->GetAttribute("id"));
|
wxLogError("invalid ID for node '%s' with ID '%s'", n, child->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1132,7 +1142,7 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
// this <Method> node is a method of the i-th class!
|
// this <Method> node is a method of the i-th class!
|
||||||
wxMethod newfunc;
|
wxMethod newfunc;
|
||||||
if (!ParseMethod(child, types, newfunc)) {
|
if (!ParseMethod(child, types, newfunc)) {
|
||||||
LogError("The method '%s' could not be added to class '%s'",
|
wxLogError("The method '%s' could not be added to class '%s'",
|
||||||
child->GetAttribute("demangled"), p->GetName());
|
child->GetAttribute("demangled"), p->GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1140,12 +1150,12 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
// do some additional check that we can do only here:
|
// do some additional check that we can do only here:
|
||||||
|
|
||||||
if (newfunc.IsCtor() && !p->IsValidCtorForThisClass(newfunc)) {
|
if (newfunc.IsCtor() && !p->IsValidCtorForThisClass(newfunc)) {
|
||||||
LogError("The method '%s' does not seem to be a ctor for '%s'",
|
wxLogError("The method '%s' does not seem to be a ctor for '%s'",
|
||||||
newfunc.GetName(), p->GetName());
|
newfunc.GetName(), p->GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (newfunc.IsDtor() && !p->IsValidDtorForThisClass(newfunc)) {
|
if (newfunc.IsDtor() && !p->IsValidDtorForThisClass(newfunc)) {
|
||||||
LogError("The method '%s' does not seem to be a dtor for '%s'",
|
wxLogError("The method '%s' does not seem to be a dtor for '%s'",
|
||||||
newfunc.GetName(), p->GetName());
|
newfunc.GetName(), p->GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1160,8 +1170,8 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
|
|||||||
if ((++nodes%PROGRESS_RATE)==0) ShowProgress();
|
if ((++nodes%PROGRESS_RATE)==0) ShowProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CheckParseResults())
|
if (!CheckConsistency())
|
||||||
return false;
|
return false; // the check failed
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1183,7 +1193,7 @@ bool wxXmlGccInterface::ParseMethod(const wxXmlNode *p,
|
|||||||
if (!getID(&retid, p->GetAttribute("returns")) || retid == 0)
|
if (!getID(&retid, p->GetAttribute("returns")) || retid == 0)
|
||||||
{
|
{
|
||||||
if (p->GetName() != "Destructor" && p->GetName() != "Constructor") {
|
if (p->GetName() != "Destructor" && p->GetName() != "Constructor") {
|
||||||
LogError("Empty return ID for method '%s', with ID '%s'",
|
wxLogError("Empty return ID for method '%s', with ID '%s'",
|
||||||
name, p->GetAttribute("id"));
|
name, p->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1192,13 +1202,13 @@ bool wxXmlGccInterface::ParseMethod(const wxXmlNode *p,
|
|||||||
{
|
{
|
||||||
wxTypeIdHashMap::const_iterator retidx = types.find(retid);
|
wxTypeIdHashMap::const_iterator retidx = types.find(retid);
|
||||||
if (retidx == types.end()) {
|
if (retidx == types.end()) {
|
||||||
LogError("Could not find return type ID '%s'", retid);
|
wxLogError("Could not find return type ID '%s'", retid);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wxType(retidx->second);
|
ret = wxType(retidx->second);
|
||||||
if (!ret.IsOk()) {
|
if (!ret.IsOk()) {
|
||||||
LogError("Invalid return type '%s' for method '%s', with ID '%s'",
|
wxLogError("Invalid return type '%s' for method '%s', with ID '%s'",
|
||||||
retidx->second, name, p->GetAttribute("id"));
|
retidx->second, name, p->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1213,14 +1223,14 @@ bool wxXmlGccInterface::ParseMethod(const wxXmlNode *p,
|
|||||||
{
|
{
|
||||||
unsigned long id = 0;
|
unsigned long id = 0;
|
||||||
if (!getID(&id, arg->GetAttribute("type")) || id == 0) {
|
if (!getID(&id, arg->GetAttribute("type")) || id == 0) {
|
||||||
LogError("Invalid argument type ID '%s' for method '%s' with ID %s",
|
wxLogError("Invalid argument type ID '%s' for method '%s' with ID %s",
|
||||||
arg->GetAttribute("type"), name, p->GetAttribute("id"));
|
arg->GetAttribute("type"), name, p->GetAttribute("id"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTypeIdHashMap::const_iterator idx = types.find(id);
|
wxTypeIdHashMap::const_iterator idx = types.find(id);
|
||||||
if (idx == types.end()) {
|
if (idx == types.end()) {
|
||||||
LogError("Could not find argument type ID '%s'", id);
|
wxLogError("Could not find argument type ID '%s'", id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1256,7 +1266,7 @@ bool wxXmlGccInterface::ParseMethod(const wxXmlNode *p,
|
|||||||
m.SetAccessSpecifier(wxMAS_PRIVATE);
|
m.SetAccessSpecifier(wxMAS_PRIVATE);
|
||||||
|
|
||||||
if (!m.IsOk()) {
|
if (!m.IsOk()) {
|
||||||
LogError("The prototype '%s' is not valid!", m.GetAsString());
|
wxLogError("The prototype '%s' is not valid!", m.GetAsString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1294,7 +1304,7 @@ static wxString GetTextFromChildren(const wxXmlNode *n)
|
|||||||
else if (ref->GetType() == wxXML_TEXT_NODE)
|
else if (ref->GetType() == wxXML_TEXT_NODE)
|
||||||
text += ref->GetContent();
|
text += ref->GetContent();
|
||||||
else
|
else
|
||||||
LogWarning("Unexpected node type while getting text from '%s' node", n->GetName());
|
wxLogWarning("Unexpected node type while getting text from '%s' node", n->GetName());
|
||||||
|
|
||||||
ref = ref->GetNext();
|
ref = ref->GetNext();
|
||||||
}
|
}
|
||||||
@@ -1368,7 +1378,7 @@ int GetAvailabilityFor(const wxXmlNode *node)
|
|||||||
for (unsigned int i=0; i < ports.GetCount(); i++)
|
for (unsigned int i=0; i < ports.GetCount(); i++)
|
||||||
{
|
{
|
||||||
if (!ports[i].StartsWith("wx")) {
|
if (!ports[i].StartsWith("wx")) {
|
||||||
LogError("unexpected port ID '%s'", ports[i]);
|
wxLogError("unexpected port ID '%s'", ports[i]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1388,16 +1398,16 @@ bool wxXmlDoxygenInterface::Parse(const wxString& filename)
|
|||||||
wxXmlDocument index;
|
wxXmlDocument index;
|
||||||
wxXmlNode *compound;
|
wxXmlNode *compound;
|
||||||
|
|
||||||
LogMessage("Parsing %s...", filename);
|
wxLogMessage("Parsing %s...", filename);
|
||||||
|
|
||||||
if (!index.Load(filename)) {
|
if (!index.Load(filename)) {
|
||||||
LogError("can't load %s", filename);
|
wxLogError("can't load %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// start processing the index:
|
// start processing the index:
|
||||||
if (index.GetRoot()->GetName() != "doxygenindex") {
|
if (index.GetRoot()->GetName() != "doxygenindex") {
|
||||||
LogError("invalid root node for %s", filename);
|
wxLogError("invalid root node for %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1428,8 +1438,8 @@ bool wxXmlDoxygenInterface::Parse(const wxString& filename)
|
|||||||
}
|
}
|
||||||
//wxPrint("\n");
|
//wxPrint("\n");
|
||||||
|
|
||||||
if (!CheckParseResults())
|
if (!CheckConsistency())
|
||||||
return false;
|
return false; // the check failed
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1442,16 +1452,16 @@ bool wxXmlDoxygenInterface::ParseCompoundDefinition(const wxString& filename)
|
|||||||
int nodes = 0;
|
int nodes = 0;
|
||||||
|
|
||||||
if (g_verbose)
|
if (g_verbose)
|
||||||
LogMessage("Parsing %s...", filename);
|
wxLogMessage("Parsing %s...", filename);
|
||||||
|
|
||||||
if (!doc.Load(filename)) {
|
if (!doc.Load(filename)) {
|
||||||
LogError("can't load %s", filename);
|
wxLogError("can't load %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// start processing this compound definition XML
|
// start processing this compound definition XML
|
||||||
if (doc.GetRoot()->GetName() != "doxygen") {
|
if (doc.GetRoot()->GetName() != "doxygen") {
|
||||||
LogError("invalid root node for %s", filename);
|
wxLogError("invalid root node for %s", filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1485,7 +1495,7 @@ bool wxXmlDoxygenInterface::ParseCompoundDefinition(const wxString& filename)
|
|||||||
|
|
||||||
wxMethod m;
|
wxMethod m;
|
||||||
if (!ParseMethod(membernode, m, header)) {
|
if (!ParseMethod(membernode, m, header)) {
|
||||||
LogError("The method '%s' could not be added to class '%s'",
|
wxLogError("The method '%s' could not be added to class '%s'",
|
||||||
m.GetName(), klass.GetName());
|
m.GetName(), klass.GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1501,7 +1511,7 @@ bool wxXmlDoxygenInterface::ParseCompoundDefinition(const wxString& filename)
|
|||||||
absoluteFile = header;
|
absoluteFile = header;
|
||||||
else if (header != absoluteFile)
|
else if (header != absoluteFile)
|
||||||
{
|
{
|
||||||
LogError("The method '%s' is documented in a different "
|
wxLogError("The method '%s' is documented in a different "
|
||||||
"file from others (which belong to '%s') ?",
|
"file from others (which belong to '%s') ?",
|
||||||
header, absoluteFile);
|
header, absoluteFile);
|
||||||
return false;
|
return false;
|
||||||
@@ -1547,8 +1557,8 @@ bool wxXmlDoxygenInterface::ParseCompoundDefinition(const wxString& filename)
|
|||||||
if (klass.IsOk())
|
if (klass.IsOk())
|
||||||
m_classes.Add(klass);
|
m_classes.Add(klass);
|
||||||
else if (g_verbose)
|
else if (g_verbose)
|
||||||
LogWarning("discarding class '%s' with %d methods...",
|
wxLogWarning("discarding class '%s' with %d methods...",
|
||||||
klass.GetName(), klass.GetMethodCount());
|
klass.GetName(), klass.GetMethodCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
child = child->GetNext();
|
child = child->GetNext();
|
||||||
@@ -1593,7 +1603,7 @@ bool wxXmlDoxygenInterface::ParseMethod(const wxXmlNode* p, wxMethod& m, wxStrin
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (typestr.IsEmpty()) {
|
if (typestr.IsEmpty()) {
|
||||||
LogError("cannot find type node for a param in method '%s'", m.GetName());
|
wxLogError("cannot find type node for a param in method '%s'", m.GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1641,7 +1651,7 @@ bool wxXmlDoxygenInterface::ParseMethod(const wxXmlNode* p, wxMethod& m, wxStrin
|
|||||||
m.SetPureVirtual(p->GetAttribute("virt")=="pure-virtual");
|
m.SetPureVirtual(p->GetAttribute("virt")=="pure-virtual");
|
||||||
|
|
||||||
if (!m.IsOk()) {
|
if (!m.IsOk()) {
|
||||||
LogError("The prototype '%s' is not valid!", m.GetAsString());
|
wxLogError("The prototype '%s' is not valid!", m.GetAsString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include <wx/dynarray.h>
|
#include <wx/dynarray.h>
|
||||||
#include <wx/xml/xml.h>
|
#include <wx/xml/xml.h>
|
||||||
#include <wx/platinfo.h>
|
#include <wx/platinfo.h>
|
||||||
|
#include <wx/log.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -30,24 +31,8 @@
|
|||||||
// ...fix description...
|
// ...fix description...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// NOTE: all messages in this way are printed on the stderr
|
||||||
|
//#define wxLogWarning wxLogMessage
|
||||||
// helper macros
|
|
||||||
#define LogMessage(fmt, ...) { if (g_bLogEnabled) { wxPrintf(fmt "\n", __VA_ARGS__); fflush(stdout); }}
|
|
||||||
#define LogWarning(fmt, ...) { if (g_bLogEnabled) { wxPrintf(fmt "\n", __VA_ARGS__); fflush(stdout); }}
|
|
||||||
#define LogError(fmt, ...) { if (g_bLogEnabled) { wxPrintf("ERROR: " fmt "\n", __VA_ARGS__); fflush(stdout); }}
|
|
||||||
#define wxPrint(str) { wxPrintf(str); fflush(stdout); }
|
|
||||||
|
|
||||||
// enable/disable logging
|
|
||||||
extern bool g_bLogEnabled;
|
|
||||||
|
|
||||||
class LogNull
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LogNull() { g_bLogEnabled = false; }
|
|
||||||
~LogNull() { g_bLogEnabled = true; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -445,9 +430,10 @@ public:
|
|||||||
wxClassPtrArray FindClassesDefinedIn(const wxString& headerfile) const;
|
wxClassPtrArray FindClassesDefinedIn(const wxString& headerfile) const;
|
||||||
|
|
||||||
void ShowProgress()
|
void ShowProgress()
|
||||||
{ /*wxPrint(".");*/ }
|
{ /*wxFprintf(stderr, ".");*/ }
|
||||||
|
|
||||||
bool CheckParseResults() const;
|
// is this interface coherent?
|
||||||
|
bool CheckConsistency() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxClassArray m_classes;
|
wxClassArray m_classes;
|
||||||
|
Reference in New Issue
Block a user