added QSE_SIO_NOAUTOFLUSH.
fixed a bug in qse_tio_writew() changed how assert() prints messages.
This commit is contained in:
parent
0b4c66cbf5
commit
57683c9396
@ -60,13 +60,18 @@ enum qse_fio_open_flag_t
|
|||||||
QSE_FIO_NOFOLLOW = (1 << 15),
|
QSE_FIO_NOFOLLOW = (1 << 15),
|
||||||
|
|
||||||
/* for WIN32 only. harmless(no effect) when used on other platforms */
|
/* for WIN32 only. harmless(no effect) when used on other platforms */
|
||||||
QSE_FIO_NOSHRD = (1 << 24),
|
QSE_FIO_NOSHRD = (1 << 20),
|
||||||
QSE_FIO_NOSHWR = (1 << 25),
|
QSE_FIO_NOSHWR = (1 << 21),
|
||||||
QSE_FIO_NOSHDL = (1 << 26),
|
QSE_FIO_NOSHDL = (1 << 22),
|
||||||
|
|
||||||
/* hints to OS. harmless(no effect) when used on unsupported platforms */
|
/* hints to OS. harmless(no effect) when used on unsupported platforms */
|
||||||
QSE_FIO_RANDOM = (1 << 27), /* hint that access be random */
|
QSE_FIO_RANDOM = (1 << 23), /* hint that access be random */
|
||||||
QSE_FIO_SEQUENTIAL = (1 << 28) /* hint that access is sequential */
|
QSE_FIO_SEQUENTIAL = (1 << 24) /* hint that access is sequential */
|
||||||
|
|
||||||
|
/* NOTE:
|
||||||
|
* NEVER (1 << 31) since QSE_SIO_NOAUTOFLUSH is defined to
|
||||||
|
* that value in sio.h FIO doesn't have any bufferring.
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
enum qse_fio_std_t
|
enum qse_fio_std_t
|
||||||
|
@ -53,7 +53,11 @@ enum qse_sio_open_flag_t
|
|||||||
QSE_SIO_NOSHDL = QSE_FIO_NOSHDL,
|
QSE_SIO_NOSHDL = QSE_FIO_NOSHDL,
|
||||||
|
|
||||||
QSE_SIO_RANDOM = QSE_FIO_RANDOM,
|
QSE_SIO_RANDOM = QSE_FIO_RANDOM,
|
||||||
QSE_SIO_SEQUENTIAL = QSE_FIO_SEQUENTIAL
|
QSE_SIO_SEQUENTIAL = QSE_FIO_SEQUENTIAL,
|
||||||
|
|
||||||
|
/* Beware that this should not overlap with any QSE_FIO_XXXX.
|
||||||
|
* See NOTE in fio.h */
|
||||||
|
QSE_SIO_NOAUTOFLUSH = (1 << 31)
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef qse_fio_off_t qse_sio_pos_t;
|
typedef qse_fio_off_t qse_sio_pos_t;
|
||||||
@ -62,7 +66,7 @@ typedef qse_fio_std_t qse_sio_std_t;
|
|||||||
|
|
||||||
#define QSE_SIO_STDIN QSE_FIO_STDIN
|
#define QSE_SIO_STDIN QSE_FIO_STDIN
|
||||||
#define QSE_SIO_STDOUT QSE_FIO_STDOUT
|
#define QSE_SIO_STDOUT QSE_FIO_STDOUT
|
||||||
#define QSE_SIO_STDER QSE_FIO_STDERR
|
#define QSE_SIO_STDERR QSE_FIO_STDERR
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_sio_t type defines a simple text stream over a file. It also
|
* The qse_sio_t type defines a simple text stream over a file. It also
|
||||||
@ -165,17 +169,37 @@ qse_ssize_t qse_sio_putc (
|
|||||||
qse_char_t c
|
qse_char_t c
|
||||||
);
|
);
|
||||||
|
|
||||||
qse_ssize_t qse_sio_puts (
|
qse_ssize_t qse_sio_putms (
|
||||||
qse_sio_t* sio,
|
qse_sio_t* sio,
|
||||||
const qse_char_t* str
|
const qse_mchar_t* str
|
||||||
);
|
);
|
||||||
|
|
||||||
qse_ssize_t qse_sio_putsn (
|
qse_ssize_t qse_sio_putws (
|
||||||
qse_sio_t* sio,
|
qse_sio_t* sio,
|
||||||
const qse_char_t* str,
|
const qse_wchar_t* str
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
qse_ssize_t qse_sio_putmsn (
|
||||||
|
qse_sio_t* sio,
|
||||||
|
const qse_mchar_t* str,
|
||||||
qse_size_t size
|
qse_size_t size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
qse_ssize_t qse_sio_putwsn (
|
||||||
|
qse_sio_t* sio,
|
||||||
|
const qse_wchar_t* str,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
# define qse_sio_puts(sio,str) qse_sio_putms(sio,str)
|
||||||
|
# define qse_sio_putsn(sio,str,size) qse_sio_putmsn(sio,str,size)
|
||||||
|
#else
|
||||||
|
# define qse_sio_puts(sio,str) qse_sio_putws(sio,str)
|
||||||
|
# define qse_sio_putsn(sio,str,size) qse_sio_putwsn(sio,str,size)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_sio_getpos() gets the current position in a stream.
|
* The qse_sio_getpos() gets the current position in a stream.
|
||||||
* Note that it may not return the desired postion due to buffering.
|
* Note that it may not return the desired postion due to buffering.
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <qse/cmn/sio.h>
|
#include <qse/cmn/sio.h>
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
#ifdef HAVE_EXECINFO_H
|
#ifdef HAVE_EXECINFO_H
|
||||||
# include <execinfo.h>
|
# include <execinfo.h>
|
||||||
@ -43,14 +45,14 @@
|
|||||||
# include "syscall.h"
|
# include "syscall.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NTOC(n) (QSE_T("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n])
|
#define NTOC(n) (QSE_MT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")[n])
|
||||||
#define WRITE_CHAR(c) \
|
#define WRITE_CHAR(sio,c) \
|
||||||
do { \
|
do { \
|
||||||
qse_char_t __xxx_c = c; \
|
qse_mchar_t __xxx_c = c; \
|
||||||
if (qse_sio_putsn (QSE_SIO_ERR, &__xxx_c, 1) != 1) return -1; \
|
if (qse_sio_putmsn (sio, &__xxx_c, 1) != 1) return -1; \
|
||||||
} while (0)
|
} 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 last = x % base;
|
||||||
qse_size_t y = 0;
|
qse_size_t y = 0;
|
||||||
@ -67,7 +69,7 @@ static int write_num (qse_size_t x, int base)
|
|||||||
|
|
||||||
while (y > 0)
|
while (y > 0)
|
||||||
{
|
{
|
||||||
WRITE_CHAR (NTOC(y % base));
|
WRITE_CHAR (sio, NTOC(y % base));
|
||||||
y = y / base;
|
y = y / base;
|
||||||
dig--;
|
dig--;
|
||||||
}
|
}
|
||||||
@ -75,9 +77,9 @@ static int write_num (qse_size_t x, int base)
|
|||||||
while (dig > 0)
|
while (dig > 0)
|
||||||
{
|
{
|
||||||
dig--;
|
dig--;
|
||||||
WRITE_CHAR (QSE_T('0'));
|
WRITE_CHAR (sio, QSE_T('0'));
|
||||||
}
|
}
|
||||||
WRITE_CHAR (NTOC(last));
|
WRITE_CHAR (sio, NTOC(last));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,38 +92,45 @@ void qse_assert_failed (
|
|||||||
qse_size_t btsize, i;
|
qse_size_t btsize, i;
|
||||||
char **btsyms;
|
char **btsyms;
|
||||||
#endif
|
#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
|
#if 1
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n"));
|
qse_sio_putms (sio, QSE_MT(" __ \n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____| |\n"));
|
qse_sio_putms (sio, QSE_MT(" _____ _____ _____ _____| |\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| |\n"));
|
qse_sio_putms (sio, QSE_MT("| | | _ | __| |\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ |__|\n"));
|
qse_sio_putms (sio, QSE_MT("| | | | | __|__ |__|\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____|__|\n"));
|
qse_sio_putms (sio, QSE_MT("|_____|_____|__| |_____|__|\n"));
|
||||||
|
qse_sio_putms (sio, QSE_MT(" \n"));
|
||||||
#else
|
#else
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T(" __ \n"));
|
qse_sio_putms (sio, QSE_MT(" __ \n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T(" _____ _____ _____ _____ | |\n"));
|
qse_sio_putms (sio, QSE_MT(" _____ _____ _____ _____ | |\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | _ | __| | |\n"));
|
qse_sio_putms (sio, QSE_MT("| | | _ | __| | |\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("| | | | | __|__ | |__|\n"));
|
qse_sio_putms (sio, QSE_MT("| | | | | __|__ | |__|\n"));
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("|_____|_____|__| |_____| |__|\n"));
|
qse_sio_putms (sio, QSE_MT("|_____|_____|__| |_____| |__|\n"));
|
||||||
|
qse_sio_putms (sio, QSE_MT(" __ \n"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("FILE "));
|
qse_sio_putms (sio, QSE_MT("FILE: "));
|
||||||
qse_sio_puts (QSE_SIO_ERR, file);
|
qse_sio_puts (sio, file);
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T(" LINE "));
|
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_putms (sio, QSE_MT("\nEXPRESSION: "));
|
||||||
qse_sio_puts (QSE_SIO_ERR, expr);
|
qse_sio_puts (sio, expr);
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("\n"));
|
qse_sio_putms (sio, QSE_MT("\n"));
|
||||||
|
|
||||||
if (desc != QSE_NULL)
|
if (desc != QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("DESCRIPTION: "));
|
qse_sio_putms (sio, QSE_MT("DESCRIPTION: "));
|
||||||
qse_sio_puts (QSE_SIO_ERR, desc);
|
qse_sio_puts (sio, desc);
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("\n"));
|
qse_sio_putms (sio, QSE_MT("\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_BACKTRACE
|
#ifdef HAVE_BACKTRACE
|
||||||
@ -129,30 +138,21 @@ void qse_assert_failed (
|
|||||||
btsyms = backtrace_symbols (btarray, btsize);
|
btsyms = backtrace_symbols (btarray, btsize);
|
||||||
if (btsyms != QSE_NULL)
|
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++)
|
for (i = 0; i < btsize; i++)
|
||||||
{
|
{
|
||||||
/* TODO: call qse_sio_putms() instead of using ifdef */
|
qse_sio_putms (sio, btsyms[i]);
|
||||||
#ifdef QSE_CHAR_IS_MCHAR
|
qse_sio_putms (sio, QSE_MT("\n"));
|
||||||
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"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free (btsyms);
|
free (btsyms);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qse_sio_puts (QSE_SIO_ERR, QSE_T("================================================================================\n"));
|
qse_sio_putms (sio, QSE_MT("================================================================================\n"));
|
||||||
qse_sio_flush (QSE_SIO_ERR);
|
qse_sio_flush (sio);
|
||||||
|
if (sio != QSE_SIO_ERR) qse_sio_fini (sio);
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
ExitProcess (249);
|
ExitProcess (249);
|
||||||
|
@ -232,6 +232,7 @@ int qse_sio_init (
|
|||||||
if (qse_fio_init (&sio->fio, mmgr, file, flags, mode) <= -1) return -1;
|
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_IGNOREMBWCERR) topt |= QSE_TIO_IGNOREMBWCERR;
|
||||||
|
if (flags & QSE_SIO_NOAUTOFLUSH) topt |= QSE_TIO_NOAUTOFLUSH;
|
||||||
|
|
||||||
if (qse_tio_init(&sio->tio, mmgr, topt) <= -1)
|
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);
|
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)
|
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);
|
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_ssize_t qse_sio_putmsn (
|
||||||
qse_sio_t* sio, const qse_char_t* str, qse_size_t size)
|
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)
|
int qse_sio_getpos (qse_sio_t* sio, qse_sio_pos_t* pos)
|
||||||
|
@ -199,6 +199,8 @@ qse_ssize_t qse_tio_writew (
|
|||||||
wcnt = xwlen; mcnt = capa;
|
wcnt = xwlen; mcnt = capa;
|
||||||
|
|
||||||
n = qse_wcsntombsn (wptr, &wcnt, &tio->outbuf[tio->outbuf_len], &mcnt);
|
n = qse_wcsntombsn (wptr, &wcnt, &tio->outbuf[tio->outbuf_len], &mcnt);
|
||||||
|
tio->outbuf_len += mcnt;
|
||||||
|
|
||||||
if (n == -2)
|
if (n == -2)
|
||||||
{
|
{
|
||||||
/* the buffer is not large enough to
|
/* the buffer is not large enough to
|
||||||
@ -234,10 +236,9 @@ qse_ssize_t qse_tio_writew (
|
|||||||
for (i = 0; i < wcnt; i++)
|
for (i = 0; i < wcnt; i++)
|
||||||
if (wptr[i] == QSE_WT('\n')) nl = 1;
|
if (wptr[i] == QSE_WT('\n')) nl = 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
wptr += wcnt; xwlen -= wcnt;
|
wptr += wcnt; xwlen -= wcnt;
|
||||||
tio->outbuf_len += mcnt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nl && qse_tio_flush (tio) == -1) return -1;
|
if (nl && qse_tio_flush (tio) == -1) return -1;
|
||||||
|
@ -67,7 +67,7 @@ static int test1 (void)
|
|||||||
qse_mbsset (buf, QSE_MT('A'), QSE_COUNTOF(buf));
|
qse_mbsset (buf, QSE_MT('A'), QSE_COUNTOF(buf));
|
||||||
n = qse_wcstombs (x[i], &wlen, buf, &mlen);
|
n = qse_wcstombs (x[i], &wlen, buf, &mlen);
|
||||||
|
|
||||||
QSE_ASSERT (buf[QSE_COUNTOF(buf)-1] == QSE_MT('A'));
|
QSE_ASSERT (buf[QSE_COUNTOF(buf)-1] != QSE_MT('A'));
|
||||||
buf[QSE_COUNTOF(buf)-1] = QSE_MT('\0');
|
buf[QSE_COUNTOF(buf)-1] = QSE_MT('\0');
|
||||||
|
|
||||||
qse_printf (QSE_T("%s chars=%d bytes=%d [%hs]\n"),
|
qse_printf (QSE_T("%s chars=%d bytes=%d [%hs]\n"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user