rewrote assertion output function to remove dependency on sio
This commit is contained in:
parent
61a6cf281f
commit
3c5b45571e
@ -1194,6 +1194,7 @@ int qse_main (int argc, qse_achar_t* argv[])
|
|||||||
#else
|
#else
|
||||||
/* nothing special */
|
/* nothing special */
|
||||||
#endif
|
#endif
|
||||||
|
QSE_ASSERT (1 == 3);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
codepage = GetConsoleOutputCP();
|
codepage = GetConsoleOutputCP();
|
||||||
|
@ -57,57 +57,93 @@
|
|||||||
# include "syscall.h"
|
# include "syscall.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NTOC(n) (QSE_MT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n])
|
|
||||||
#define WRITE_CHAR(sio,c) \
|
|
||||||
do { \
|
|
||||||
qse_mchar_t __xxx_c = c; \
|
|
||||||
if (qse_sio_putmbsn (sio, &__xxx_c, 1) != 1) return -1; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
static int write_num (qse_sio_t* sio, qse_size_t x, int base)
|
|
||||||
{
|
|
||||||
qse_size_t last = x % base;
|
|
||||||
qse_size_t y = 0;
|
|
||||||
int dig = 0;
|
|
||||||
|
|
||||||
x = x / base;
|
|
||||||
|
|
||||||
while (x > 0)
|
|
||||||
{
|
|
||||||
y = y * base + (x % base);
|
|
||||||
x = x / base;
|
|
||||||
dig++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (y > 0)
|
|
||||||
{
|
|
||||||
WRITE_CHAR (sio, NTOC(y % base));
|
|
||||||
y = y / base;
|
|
||||||
dig--;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (dig > 0)
|
|
||||||
{
|
|
||||||
dig--;
|
|
||||||
WRITE_CHAR (sio, QSE_T('0'));
|
|
||||||
}
|
|
||||||
WRITE_CHAR (sio, NTOC(last));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void qse_assert_failed (
|
void qse_assert_failed (
|
||||||
const qse_char_t* expr, const qse_char_t* desc,
|
const qse_char_t* expr, const qse_char_t* desc,
|
||||||
const qse_char_t* file, qse_size_t line)
|
const qse_char_t* file, qse_size_t line)
|
||||||
{
|
{
|
||||||
#if defined(macintosh)
|
#if defined(_WIN32)
|
||||||
|
HANDLE stderr;
|
||||||
|
|
||||||
|
stderr = GetStdHandle (STD_ERROR_HANDLE);
|
||||||
|
if (stderr != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD mode;
|
||||||
|
if (GetConsoleMode (stderr, &mode) == FALSE)
|
||||||
|
stderr = INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stderr == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
/* Use a message box if stderr is not available */
|
||||||
|
|
||||||
|
qse_char_t tmp[1024];
|
||||||
|
qse_strxfmt (tmp, QSE_COUNTOF(tmp),
|
||||||
|
QSE_T("FILE %s LINE %lu - %s%s%s"),
|
||||||
|
file, line, expr,
|
||||||
|
(desc? QSE_T("\n\n"): QSE_T("")),
|
||||||
|
(desc? desc: QSE_T(""))
|
||||||
|
);
|
||||||
|
MessageBox (QSE_NULL, tmp, QSE_T("ASSERTION FAILURE"), MB_OK | MB_ICONERROR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qse_char_t tmp[1024];
|
||||||
|
DWORD written;
|
||||||
|
|
||||||
|
WriteConsole (stderr, QSE_T("[ASSERTION FAILURE]\r\n"), 21, &written, STIO_NULL);
|
||||||
|
|
||||||
|
qse_strxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %s LINE %lu\r\n"), file, (unsigned long)line);
|
||||||
|
WriteConsole (stderr, tmp, qse_strlen(tmp), &written, STIO_NULL);
|
||||||
|
|
||||||
|
WriteConsoel (stderr, QSE_T("[EXPRESSION] "), 13, &written, STIO_NULL);
|
||||||
|
WriteConsole (stderr, expr, qse_strlen(expr), &written, STIO_NULL);
|
||||||
|
WriteConsole (stderr, QSE_T("\r\n"), 2, &written, STIO_NULL);
|
||||||
|
|
||||||
|
if (desc)
|
||||||
|
{
|
||||||
|
WriteConsole (stderr, QSE_T("[DESCRIPTION] "), 14, &written, STIO_NULL);
|
||||||
|
WriteConsole (stderr, desc, qse_strlen(desc), &written, STIO_NULL);
|
||||||
|
WriteConsole (stderr, QSE_T("\r\n"), 2, &written, STIO_NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
HFILE stderr = (HFILE)2;
|
||||||
|
USHORT written;
|
||||||
|
qse_mchar_t tmp[1024];
|
||||||
|
|
||||||
|
DosWrite (stderr, QSE_T("[ASSERTION FAILURE]\r\n"), 21, &written);
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %hs LINE %lu\n"), file, (unsigned long)line);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %ls LINE %lu\n"), file, (unsigned long)line);
|
||||||
|
#endif
|
||||||
|
DosWrite (stderr, tmp, qse_mbslen(tmp), &written);
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %hs\n"), expr);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %ls\n"), expr);
|
||||||
|
#endif
|
||||||
|
DosWrite (stderr, tmp, qse_mbslen(tmp), &written);
|
||||||
|
|
||||||
|
if (desc)
|
||||||
|
{
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %hs\n"), desc);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %ls\n"), desc);
|
||||||
|
#endif
|
||||||
|
DosWrite (stderr, tmp, qse_mbslen(tmp), &written);
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(macintosh)
|
||||||
/* note 'desc' is not used for macintosh at this moment.
|
/* note 'desc' is not used for macintosh at this moment.
|
||||||
* TODO: include 'desc' in the message */
|
* TODO: include 'desc' in the message */
|
||||||
|
|
||||||
Str255 ptitle;
|
Str255 ptitle;
|
||||||
Str255 ptext;
|
Str255 ptext;
|
||||||
SInt16 res;
|
SInt16 res;
|
||||||
|
|
||||||
{
|
|
||||||
qse_mchar_t tmp[256];
|
qse_mchar_t tmp[256];
|
||||||
|
|
||||||
#if defined(QSE_CHAR_IS_MCHAR)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
@ -123,114 +159,89 @@ void qse_assert_failed (
|
|||||||
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("%ls"), expr);
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("%ls"), expr);
|
||||||
CopyCStringToPascal (tmp, ptext);
|
CopyCStringToPascal (tmp, ptext);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
InitCursor ();
|
InitCursor ();
|
||||||
StandardAlert (kAlertStopAlert, ptitle, ptext, nil, &res);
|
StandardAlert (kAlertStopAlert, ptitle, ptext, nil, &res);
|
||||||
|
|
||||||
#else /* macintosh */
|
/*
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
WHAT TO DO????
|
||||||
|
*/
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#if defined(HAVE_BACKTRACE)
|
static qse_mchar_t* static_msg[] =
|
||||||
|
{
|
||||||
|
QSE_MT("=[ASSERTION FAILURE]============================================================\n"),
|
||||||
|
QSE_MT(" __ \n"),
|
||||||
|
QSE_MT(" _____ _____ _____ _____| |\n"),
|
||||||
|
QSE_MT("| | | _ | __| |\n"),
|
||||||
|
QSE_MT("| | | | | __|__ |__|\n"),
|
||||||
|
QSE_MT("|_____|_____|__| |_____|__|\n"),
|
||||||
|
QSE_MT(" \n")
|
||||||
|
};
|
||||||
|
static qse_mchar_t* static_bthdr = QSE_MT("=[BACKTRACES]===================================================================\n");
|
||||||
|
static qse_mchar_t* static_footer= QSE_MT("================================================================================\n");
|
||||||
|
|
||||||
|
qse_mchar_t tmp[1024];
|
||||||
|
qse_size_t i;
|
||||||
|
|
||||||
|
#if defined(HAVE_BACKTRACE)
|
||||||
void* btarray[128];
|
void* btarray[128];
|
||||||
qse_size_t btsize, i;
|
qse_size_t btsize;
|
||||||
char** btsyms;
|
char** btsyms;
|
||||||
#endif
|
|
||||||
qse_sio_t* sio, siobuf;
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
{
|
|
||||||
HANDLE stderr;
|
|
||||||
|
|
||||||
stderr = GetStdHandle (STD_ERROR_HANDLE);
|
|
||||||
if (stderr != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
DWORD mode;
|
|
||||||
if (GetConsoleMode (stderr, &mode) == FALSE)
|
|
||||||
stderr = INVALID_HANDLE_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stderr == INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
/* Use a message box if stderr is not available */
|
|
||||||
|
|
||||||
qse_char_t tmp[512];
|
|
||||||
qse_strxfmt (tmp, QSE_COUNTOF(tmp),
|
|
||||||
QSE_T("FILE %s LINE %lu - %s%s%s"),
|
|
||||||
file, line, expr,
|
|
||||||
(desc? QSE_T("\n\n"): QSE_T("")),
|
|
||||||
(desc? desc: QSE_T(""))
|
|
||||||
);
|
|
||||||
MessageBox (QSE_NULL, tmp, QSE_T("ASSERTION FAILURE"), MB_OK | MB_ICONERROR);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sio = &siobuf;
|
for (i = 0; i < QSE_COUNTOF(static_msg); i++)
|
||||||
qse_sio_initstd (
|
|
||||||
sio, QSE_MMGR_GETDFL(), QSE_SIO_STDERR,
|
|
||||||
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_NOAUTOFLUSH);
|
|
||||||
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("=[ASSERTION FAILURE]============================================================\n"));
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" __ \n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" _____ _____ _____ _____| |\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("| | | _ | __| |\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("| | | | | __|__ |__|\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("|_____|_____|__| |_____|__|\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" \n"));
|
|
||||||
#else
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" __ \n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" _____ _____ _____ _____ | |\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("| | | _ | __| | |\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("| | | | | __|__ | |__|\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("|_____|_____|__| |_____| |__|\n"));
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" __ \n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("FILE: "));
|
|
||||||
qse_sio_putstr (sio, file);
|
|
||||||
qse_sio_putmbs (sio, QSE_MT(" LINE: "));
|
|
||||||
|
|
||||||
write_num (sio, line, 10);
|
|
||||||
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("\nEXPRESSION: "));
|
|
||||||
qse_sio_putstr (sio, expr);
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("\n"));
|
|
||||||
|
|
||||||
if (desc != QSE_NULL)
|
|
||||||
{
|
{
|
||||||
qse_sio_putmbs (sio, QSE_MT("DESCRIPTION: "));
|
write (2, static_msg[i], qse_mbslen(static_msg[i]));
|
||||||
qse_sio_putstr (sio, desc);
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("\n"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_BACKTRACE)
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %hs LINE %lu\n"), file, (unsigned long)line);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("FILE %ls LINE %lu\n"), file, (unsigned long)line);
|
||||||
|
#endif
|
||||||
|
write (2, tmp, qse_mbslen(tmp));
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %hs\n"), expr);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[EXPRESSION] %ls\n"), expr);
|
||||||
|
#endif
|
||||||
|
write (2, tmp, qse_mbslen(tmp));
|
||||||
|
|
||||||
|
if (desc)
|
||||||
|
{
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %hs\n"), desc);
|
||||||
|
#else
|
||||||
|
qse_mbsxfmt (tmp, QSE_COUNTOF(tmp), QSE_MT("[DESCRIPTION] %ls\n"), desc);
|
||||||
|
#endif
|
||||||
|
write (2, tmp, qse_mbslen(tmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_BACKTRACE)
|
||||||
btsize = backtrace (btarray, QSE_COUNTOF(btarray));
|
btsize = backtrace (btarray, QSE_COUNTOF(btarray));
|
||||||
btsyms = backtrace_symbols (btarray, btsize);
|
btsyms = backtrace_symbols (btarray, btsize);
|
||||||
if (btsyms != QSE_NULL)
|
if (btsyms != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_sio_putmbs (sio, QSE_MT("=[BACKTRACES]===================================================================\n"));
|
write (2, static_bthdr, qse_mbslen(static_bthdr));
|
||||||
|
|
||||||
for (i = 0; i < btsize; i++)
|
for (i = 0; i < btsize; i++)
|
||||||
{
|
{
|
||||||
qse_sio_putmbs (sio, btsyms[i]);
|
write (2, btsyms[i], qse_mbslen(btsyms[i]));
|
||||||
qse_sio_putmbs (sio, QSE_MT("\n"));
|
write (2, QSE_MT("\n"), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
free (btsyms);
|
free (btsyms);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
write (2, static_footer, qse_mbslen(static_footer));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qse_sio_putmbs (sio, QSE_MT("================================================================================\n"));
|
|
||||||
qse_sio_flush (sio);
|
|
||||||
qse_sio_fini (sio);
|
|
||||||
#endif /* macintosh */
|
|
||||||
|
|
||||||
done:
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
ExitProcess (249);
|
ExitProcess (249);
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user