added QSE_SIO_NOAUTOFLUSH.

fixed a bug in qse_tio_writew()
changed how assert() prints messages.
This commit is contained in:
2011-12-12 14:46:22 +00:00
parent 0b4c66cbf5
commit 57683c9396
6 changed files with 107 additions and 68 deletions

View File

@ -23,7 +23,9 @@
#ifndef NDEBUG
#include <stdio.h>
#include <qse/cmn/sio.h>
#include "mem.h"
#ifdef HAVE_EXECINFO_H
# include <execinfo.h>
@ -43,14 +45,14 @@
# include "syscall.h"
#endif
#define NTOC(n) (QSE_T("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n])
#define WRITE_CHAR(c) \
#define NTOC(n) (QSE_MT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n])
#define WRITE_CHAR(sio,c) \
do { \
qse_char_t __xxx_c = c; \
if (qse_sio_putsn (QSE_SIO_ERR, &__xxx_c, 1) != 1) return -1; \
qse_mchar_t __xxx_c = c; \
if (qse_sio_putmsn (sio, &__xxx_c, 1) != 1) return -1; \
} while (0)
static int write_num (qse_size_t x, int base)
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;
@ -67,7 +69,7 @@ static int write_num (qse_size_t x, int base)
while (y > 0)
{
WRITE_CHAR (NTOC(y % base));
WRITE_CHAR (sio, NTOC(y % base));
y = y / base;
dig--;
}
@ -75,9 +77,9 @@ static int write_num (qse_size_t x, int base)
while (dig > 0)
{
dig--;
WRITE_CHAR (QSE_T('0'));
WRITE_CHAR (sio, QSE_T('0'));
}
WRITE_CHAR (NTOC(last));
WRITE_CHAR (sio, NTOC(last));
return 0;
}
@ -90,38 +92,45 @@ void qse_assert_failed (
qse_size_t btsize, i;
char **btsyms;
#endif
qse_sio_t* sio, siobuf;
qse_sio_puts (QSE_SIO_ERR, QSE_T("=[ASSERTION FAILURE]============================================================\n"));
sio = &siobuf;
if (qse_sio_initstd (sio, QSE_MMGR_GETDFL(), QSE_SIO_STDERR, QSE_SIO_NOAUTOFLUSH) <= -1)
sio = QSE_SIO_ERR;
qse_sio_putms (sio, QSE_MT("=[ASSERTION FAILURE]============================================================\n"));
#if 1
qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____| |\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| |\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ |__|\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____|__|\n"));
qse_sio_putms (sio, QSE_MT(" __ \n"));
qse_sio_putms (sio, QSE_MT(" _____ _____ _____ _____| |\n"));
qse_sio_putms (sio, QSE_MT("| | | _ | __| |\n"));
qse_sio_putms (sio, QSE_MT("| | | | | __|__ |__|\n"));
qse_sio_putms (sio, QSE_MT("|_____|_____|__| |_____|__|\n"));
qse_sio_putms (sio, QSE_MT(" \n"));
#else
qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____ | |\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| | |\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ | |__|\n"));
qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____| |__|\n"));
qse_sio_putms (sio, QSE_MT(" __ \n"));
qse_sio_putms (sio, QSE_MT(" _____ _____ _____ _____ | |\n"));
qse_sio_putms (sio, QSE_MT("| | | _ | __| | |\n"));
qse_sio_putms (sio, QSE_MT("| | | | | __|__ | |__|\n"));
qse_sio_putms (sio, QSE_MT("|_____|_____|__| |_____| |__|\n"));
qse_sio_putms (sio, QSE_MT(" __ \n"));
#endif
qse_sio_puts (QSE_SIO_ERR, QSE_T("FILE "));
qse_sio_puts (QSE_SIO_ERR, file);
qse_sio_puts (QSE_SIO_ERR, QSE_T(" LINE "));
qse_sio_putms (sio, QSE_MT("FILE: "));
qse_sio_puts (sio, file);
qse_sio_putms (sio, QSE_MT(" LINE: "));
write_num (line, 10);
write_num (sio, line, 10);
qse_sio_puts (QSE_SIO_ERR, QSE_T(": "));
qse_sio_puts (QSE_SIO_ERR, expr);
qse_sio_puts (QSE_SIO_ERR, QSE_T("\n"));
qse_sio_putms (sio, QSE_MT("\nEXPRESSION: "));
qse_sio_puts (sio, expr);
qse_sio_putms (sio, QSE_MT("\n"));
if (desc != QSE_NULL)
{
qse_sio_puts (QSE_SIO_ERR, QSE_T("DESCRIPTION: "));
qse_sio_puts (QSE_SIO_ERR, desc);
qse_sio_puts (QSE_SIO_ERR, QSE_T("\n"));
qse_sio_putms (sio, QSE_MT("DESCRIPTION: "));
qse_sio_puts (sio, desc);
qse_sio_putms (sio, QSE_MT("\n"));
}
#ifdef HAVE_BACKTRACE
@ -129,30 +138,21 @@ void qse_assert_failed (
btsyms = backtrace_symbols (btarray, btsize);
if (btsyms != QSE_NULL)
{
qse_sio_puts (QSE_SIO_ERR, QSE_T("=[BACKTRACES]===================================================================\n"));
qse_sio_putms (sio, QSE_MT("=[BACKTRACES]===================================================================\n"));
for (i = 0; i < btsize; i++)
{
/* TODO: call qse_sio_putms() instead of using ifdef */
#ifdef QSE_CHAR_IS_MCHAR
qse_sio_puts (QSE_SIO_ERR, btsyms[i]);
#else
qse_wchar_t wcs[256];
qse_size_t wcslen = QSE_COUNTOF(wcs);
qse_size_t mbslen;
qse_mbstowcs (btsyms[i], &mbslen, wcs, &wcslen);
wcs[QSE_COUNTOF(wcs) - 1] = QSE_T('\0');
qse_sio_puts (QSE_SIO_ERR, wcs);
#endif
qse_sio_puts (QSE_SIO_ERR, QSE_T("\n"));
qse_sio_putms (sio, btsyms[i]);
qse_sio_putms (sio, QSE_MT("\n"));
}
free (btsyms);
}
#endif
qse_sio_puts (QSE_SIO_ERR, QSE_T("================================================================================\n"));
qse_sio_flush (QSE_SIO_ERR);
qse_sio_putms (sio, QSE_MT("================================================================================\n"));
qse_sio_flush (sio);
if (sio != QSE_SIO_ERR) qse_sio_fini (sio);
#if defined(_WIN32)
ExitProcess (249);

View File

@ -232,6 +232,7 @@ int qse_sio_init (
if (qse_fio_init (&sio->fio, mmgr, file, flags, mode) <= -1) return -1;
if (flags & QSE_SIO_IGNOREMBWCERR) topt |= QSE_TIO_IGNOREMBWCERR;
if (flags & QSE_SIO_NOAUTOFLUSH) topt |= QSE_TIO_NOAUTOFLUSH;
if (qse_tio_init(&sio->tio, mmgr, topt) <= -1)
{
@ -315,25 +316,33 @@ qse_ssize_t qse_sio_putc (qse_sio_t* sio, qse_char_t c)
return qse_tio_write (&sio->tio, &c, 1);
}
#if 0
qse_ssize_t qse_sio_puts (qse_sio_t* sio, const qse_char_t* str)
{
return qse_tio_write (&sio->tio, str, (qse_size_t)-1);
}
#endif
qse_size_t qse_sio_putms (qse_sio_t* sio, const qse_mchar_t* str)
qse_ssize_t qse_sio_putms (qse_sio_t* sio, const qse_mchar_t* str)
{
return qse_tio_write (&sio->tio, str, qse_mbslen(str));
return qse_tio_writem (&sio->tio, str, qse_mbslen(str));
}
qse_size_t qse_sio_putws (qse_sio_t* sio, const qse_wchar_t* str)
qse_ssize_t qse_sio_putws (qse_sio_t* sio, const qse_wchar_t* str)
{
return qse_tio_write (&sio->tio, str, qse_wcslen(str));
return qse_tio_writew (&sio->tio, str, qse_wcslen(str));
}
qse_ssize_t qse_sio_putsn (
qse_sio_t* sio, const qse_char_t* str, qse_size_t size)
qse_ssize_t qse_sio_putmsn (
qse_sio_t* sio, const qse_mchar_t* str, qse_size_t size)
{
return qse_tio_write (&sio->tio, str, size);
return qse_tio_writem (&sio->tio, str, size);
}
qse_ssize_t qse_sio_putwsn (
qse_sio_t* sio, const qse_wchar_t* str, qse_size_t size)
{
return qse_tio_writew (&sio->tio, str, size);
}
int qse_sio_getpos (qse_sio_t* sio, qse_sio_pos_t* pos)

View File

@ -199,6 +199,8 @@ qse_ssize_t qse_tio_writew (
wcnt = xwlen; mcnt = capa;
n = qse_wcsntombsn (wptr, &wcnt, &tio->outbuf[tio->outbuf_len], &mcnt);
tio->outbuf_len += mcnt;
if (n == -2)
{
/* the buffer is not large enough to
@ -234,10 +236,9 @@ qse_ssize_t qse_tio_writew (
for (i = 0; i < wcnt; i++)
if (wptr[i] == QSE_WT('\n')) nl = 1;
}
}
}
wptr += wcnt; xwlen -= wcnt;
tio->outbuf_len += mcnt;
}
if (nl && qse_tio_flush (tio) == -1) return -1;