szCond - text form of the condition which failed
szMsg - optional message explaining the reason
*/
+
+ /* this version is for compatibility with wx 2.8: */
extern void WXDLLIMPEXP_BASE wxOnAssert(const wxChar *szFile,
int nLine,
const char *szFunc,
const wxChar *szCond,
const wxChar *szMsg = NULL);
+#if wxUSE_UNICODE
+ /* char versions are used by debugging macros; we have to provide
+ wxChar* szMsg version because it's common to use _T() in the macros
+ and finally, we can't use const wx(char)* szMsg = NULL, because that
+ would be ambiguous: */
+ extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond);
+
+ extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond,
+ const char *szMsg);
+
+ extern void WXDLLIMPEXP_BASE wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond,
+ const wxChar *szMsg);
+#endif // wxUSE_UNICODE
+
+ class WXDLLIMPEXP_BASE wxString;
+ /* these two work when szMsg passed to debug macro is a string: */
+ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& szFile,
+ int nLine,
+ const wxString& szFunc,
+ const wxString& szCond,
+ const wxString& szMsg);
+
+ extern void WXDLLIMPEXP_BASE wxOnAssert(const wxString& szFile,
+ int nLine,
+ const wxString& szFunc,
+ const wxString& szCond);
+
/* call this function to break into the debugger unconditionally (assuming */
/* the program is running under debugger, of course) */
extern void WXDLLIMPEXP_BASE wxTrap();
/* generic assert macro */
- #define wxASSERT(cond) wxASSERT_MSG(cond, NULL)
+ #define wxASSERT(cond) wxASSERT_MSG(cond, (const char*)NULL)
/* assert with additional message explaining its cause */
if ( cond ) \
{} \
else \
- wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg)
+ wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg)
#else
#define wxASSERT_MSG(cond, msg) \
if ( cond ) \
; \
else \
- wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(#cond), msg)
+ wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, #cond, msg)
#endif
/* special form of assert: always triggers it (in debug mode) */
- #define wxFAIL wxFAIL_MSG(NULL)
+ #define wxFAIL wxFAIL_MSG((const char*)NULL)
/* FAIL with some message */
#define wxFAIL_MSG(msg) wxFAIL_COND_MSG("wxAssertFailure", msg)
/* FAIL with some message and a condition */
#define wxFAIL_COND_MSG(cond, msg) \
- wxOnAssert(__TFILE__, __LINE__, __WXFUNCTION__, _T(cond), msg)
+ wxOnAssert(__FILE__, __LINE__, __WXFUNCTION__, cond, msg)
/* An assert helper used to avoid warning when testing constant expressions, */
/* i.e. wxASSERT( sizeof(int) == 4 ) can generate a compiler warning about */
*/
/* check that expression is true, "return" if not (also FAILs in debug mode) */
-#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, NULL)
+#define wxCHECK(cond, rc) wxCHECK_MSG(cond, rc, (const char*)NULL)
/* as wxCHECK but with a message explaining why we fail */
#define wxCHECK_MSG(cond, rc, msg) wxCHECK2_MSG(cond, return rc, msg)
/* check that expression is true, perform op if not */
-#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, NULL)
+#define wxCHECK2(cond, op) wxCHECK2_MSG(cond, op, (const char*)NULL)
/* as wxCHECK2 but with a message explaining why we fail */
#ifdef __VISUALC__
#define wxLogApiError(api, rc) \
wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \
- __TFILE__, __LINE__, api, \
+ __FILE__, __LINE__, api, \
(long)rc, wxSysErrorMsg(rc))
#else // !VC++
#define wxLogApiError(api, rc) \
wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \
wxT("error 0x%08lx (%s)."), \
- __TFILE__, __LINE__, api, \
+ __FILE__, __LINE__, api, \
(long)rc, wxSysErrorMsg(rc))
#endif // VC++/!VC++
// prepare for showing the assert dialog, use the given traits or
// DoShowAssertDialog() as last fallback to really show it
static
- void ShowAssertDialog(const wxChar *szFile,
+ void ShowAssertDialog(const wxString& szFile,
int nLine,
- const wxChar *szFunc,
- const wxChar *szCond,
- const wxChar *szMsg,
+ const wxString& szFunc,
+ const wxString& szCond,
+ const wxString& szMsg,
wxAppTraits *traits = NULL);
// turn on the trace masks specified in the env variable WXTRACE
}
// this function is called when an assert fails
-void wxOnAssert(const wxChar *szFile,
- int nLine,
- const char *szFunc,
- const wxChar *szCond,
- const wxChar *szMsg)
+static void wxDoOnAssert(const wxString& szFile,
+ int nLine,
+ const wxString& szFunc,
+ const wxString& szCond,
+ const wxString& szMsg = wxEmptyString)
{
// FIXME MT-unsafe
static bool s_bInAssert = false;
s_bInAssert = true;
- // __FUNCTION__ is always in ASCII, convert it to wide char if needed
- const wxString strFunc = wxString::FromAscii(szFunc);
-
if ( !wxTheApp )
{
// by default, show the assert dialog box -- we can't customize this
// behaviour
- ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg);
+ ShowAssertDialog(szFile, nLine, szFunc, szCond, szMsg);
}
else
{
// let the app process it as it wants
- wxTheApp->OnAssertFailure(szFile, nLine, strFunc, szCond, szMsg);
+ // FIXME-UTF8: use wc_str(), not c_str(), when ANSI build is removed
+ wxTheApp->OnAssertFailure(szFile.c_str(), nLine, szFunc.c_str(),
+ szCond.c_str(), szMsg.c_str());
}
s_bInAssert = false;
}
+void wxOnAssert(const wxString& szFile,
+ int nLine,
+ const wxString& szFunc,
+ const wxString& szCond,
+ const wxString& szMsg)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg);
+}
+
+void wxOnAssert(const wxString& szFile,
+ int nLine,
+ const wxString& szFunc,
+ const wxString& szCond)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond);
+}
+
+void wxOnAssert(const wxChar *szFile,
+ int nLine,
+ const char *szFunc,
+ const wxChar *szCond,
+ const wxChar *szMsg)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg);
+}
+
+#if wxUSE_UNICODE
+void wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond);
+}
+
+void wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond,
+ const char *szMsg)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg);
+}
+
+void wxOnAssert(const char *szFile,
+ int nLine,
+ const char *szFunc,
+ const char *szCond,
+ const wxChar *szMsg)
+{
+ wxDoOnAssert(szFile, nLine, szFunc, szCond, szMsg);
+}
+#endif // wxUSE_UNICODE
+
#endif // __WXDEBUG__
// ============================================================================
// show the assert modal dialog
static
-void ShowAssertDialog(const wxChar *szFile,
+void ShowAssertDialog(const wxString& szFile,
int nLine,
- const wxChar *szFunc,
- const wxChar *szCond,
- const wxChar *szMsg,
+ const wxString& szFunc,
+ const wxString& szCond,
+ const wxString& szMsg,
wxAppTraits *traits)
{
// this variable can be set to true to suppress "assert failure" messages
msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond);
// add the function name, if any
- if ( szFunc && *szFunc )
+ if ( !szFunc.empty() )
msg << _T(" in ") << szFunc << _T("()");
// and the message itself
- if ( szMsg )
+ if ( !szMsg.empty() )
{
msg << _T(": ") << szMsg;
}