added primitive qse_tio_writem() and qse_tio_writew()
This commit is contained in:
parent
566e13d874
commit
0b4c66cbf5
@ -70,7 +70,8 @@ typedef enum qse_tio_cmd_t qse_tio_cmd_t;
|
|||||||
|
|
||||||
enum qse_tio_flag_t
|
enum qse_tio_flag_t
|
||||||
{
|
{
|
||||||
QSE_TIO_IGNOREMBWCERR = (1 << 0)
|
QSE_TIO_IGNOREMBWCERR = (1 << 0),
|
||||||
|
QSE_TIO_NOAUTOFLUSH = (1 << 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
#define QSE_TIO_ERRNUM(tio) ((const qse_tio_errnum_t)(tio)->errnum)
|
#define QSE_TIO_ERRNUM(tio) ((const qse_tio_errnum_t)(tio)->errnum)
|
||||||
@ -247,6 +248,18 @@ qse_ssize_t qse_tio_write (
|
|||||||
qse_size_t size
|
qse_size_t size
|
||||||
);
|
);
|
||||||
|
|
||||||
|
qse_ssize_t qse_tio_writem (
|
||||||
|
qse_tio_t* tio,
|
||||||
|
const qse_mchar_t* data,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
|
qse_ssize_t qse_tio_writew (
|
||||||
|
qse_tio_t* tio,
|
||||||
|
const qse_wchar_t* data,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -320,6 +320,16 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qse_size_t qse_sio_putms (qse_sio_t* sio, const qse_mchar_t* str)
|
||||||
|
{
|
||||||
|
return qse_tio_write (&sio->tio, str, qse_mbslen(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_size_t qse_sio_putws (qse_sio_t* sio, const qse_wchar_t* str)
|
||||||
|
{
|
||||||
|
return qse_tio_write (&sio->tio, str, qse_wcslen(str));
|
||||||
|
}
|
||||||
|
|
||||||
qse_ssize_t qse_sio_putsn (
|
qse_ssize_t qse_sio_putsn (
|
||||||
qse_sio_t* sio, const qse_char_t* str, qse_size_t size)
|
qse_sio_t* sio, const qse_char_t* str, qse_size_t size)
|
||||||
{
|
{
|
||||||
|
@ -129,7 +129,7 @@ qse_ssize_t qse_tio_write (qse_tio_t* tio, const qse_char_t* str, qse_size_t siz
|
|||||||
return p - str;
|
return p - str;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_ssize_t qse_tio_writemstr (
|
qse_ssize_t qse_tio_writem (
|
||||||
qse_tio_t* tio, const qse_mchar_t* mptr, qse_size_t mlen)
|
qse_tio_t* tio, const qse_mchar_t* mptr, qse_size_t mlen)
|
||||||
{
|
{
|
||||||
const qse_mchar_t* xptr, * xend;
|
const qse_mchar_t* xptr, * xend;
|
||||||
@ -148,6 +148,7 @@ qse_ssize_t qse_tio_writemstr (
|
|||||||
/* adjust mlen for the type difference between the parameter
|
/* adjust mlen for the type difference between the parameter
|
||||||
* and the return value */
|
* and the return value */
|
||||||
if (mlen > QSE_TYPE_MAX(qse_ssize_t)) mlen = QSE_TYPE_MAX(qse_ssize_t);
|
if (mlen > QSE_TYPE_MAX(qse_ssize_t)) mlen = QSE_TYPE_MAX(qse_ssize_t);
|
||||||
|
xptr = mptr;
|
||||||
|
|
||||||
/* handle the parts that can't fit into the internal buffer */
|
/* handle the parts that can't fit into the internal buffer */
|
||||||
while (mlen >= (capa = QSE_COUNTOF(tio->outbuf) - tio->outbuf_len))
|
while (mlen >= (capa = QSE_COUNTOF(tio->outbuf) - tio->outbuf_len))
|
||||||
@ -158,6 +159,14 @@ qse_ssize_t qse_tio_writemstr (
|
|||||||
mlen -= capa;
|
mlen -= capa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tio->flags & QSE_TIO_NOAUTOFLUSH)
|
||||||
|
{
|
||||||
|
/* handle the last part that can fit into the internal buffer */
|
||||||
|
for (xend = xptr + mlen; xptr < xend; xptr++)
|
||||||
|
tio->outbuf[tio->outbuf_len++] = *xptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* handle the last part that can fit into the internal buffer */
|
/* handle the last part that can fit into the internal buffer */
|
||||||
for (xend = xptr + mlen; xptr < xend; xptr++)
|
for (xend = xptr + mlen; xptr < xend; xptr++)
|
||||||
{
|
{
|
||||||
@ -165,6 +174,7 @@ qse_ssize_t qse_tio_writemstr (
|
|||||||
if (*xptr == QSE_MT('\n')) nl = 1;
|
if (*xptr == QSE_MT('\n')) nl = 1;
|
||||||
tio->outbuf[tio->outbuf_len++] = *xptr;
|
tio->outbuf[tio->outbuf_len++] = *xptr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* if the last part contains a new line, flush the internal
|
/* if the last part contains a new line, flush the internal
|
||||||
* buffer. note that this flushes characters after nl also.*/
|
* buffer. note that this flushes characters after nl also.*/
|
||||||
@ -174,39 +184,62 @@ qse_ssize_t qse_tio_writemstr (
|
|||||||
return xptr - mptr;
|
return xptr - mptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
qse_ssize_t qse_tio_writew (
|
||||||
qse_ssize_t qse_tio_writewstr (
|
|
||||||
qse_tio_t* tio, const qse_wchar_t* wptr, qse_size_t wlen)
|
qse_tio_t* tio, const qse_wchar_t* wptr, qse_size_t wlen)
|
||||||
{
|
{
|
||||||
|
qse_size_t capa, wcnt, mcnt, xwlen;
|
||||||
|
int n, nl = 0;
|
||||||
|
|
||||||
if (wlen > QSE_TYPE_MAX(qse_ssize_t)) wlen = QSE_TYPE_MAX(qse_ssize_t);
|
if (wlen > QSE_TYPE_MAX(qse_ssize_t)) wlen = QSE_TYPE_MAX(qse_ssize_t);
|
||||||
|
|
||||||
while (1)
|
xwlen = wlen;
|
||||||
|
while (xwlen > 0)
|
||||||
{
|
{
|
||||||
qse_size_t capa, mcnt, wcnt;
|
|
||||||
|
|
||||||
capa = QSE_COUNTOF(tio->outbuf) - tio->outbuf_len;
|
capa = QSE_COUNTOF(tio->outbuf) - tio->outbuf_len;
|
||||||
mcnt = capa;
|
wcnt = xwlen; mcnt = capa;
|
||||||
wcnt = qse_wcsntombsn (wptr, wlen, &tio->outbuf[tio->outbuf_len], &mcnt);
|
|
||||||
|
|
||||||
if (wcnt == wlen)
|
n = qse_wcsntombsn (wptr, &wcnt, &tio->outbuf[tio->outbuf_len], &mcnt);
|
||||||
|
if (n == -2)
|
||||||
{
|
{
|
||||||
/* process the all*/
|
/* the buffer is not large enough to
|
||||||
}
|
* convert more. so flush now and continue */
|
||||||
|
|
||||||
if (mcnt >= capa)
|
|
||||||
{
|
|
||||||
/* wcsntombsn doesn't null-terminate the result. * /
|
|
||||||
/* buffer is not large enough. flush first before continuing */
|
|
||||||
if (qse_tio_flush (tio) == -1) return -1;
|
if (qse_tio_flush (tio) == -1) return -1;
|
||||||
continue;
|
nl = 0;
|
||||||
}
|
}
|
||||||
else if (wcnt != wlen)
|
else if (n <= -1)
|
||||||
{
|
{
|
||||||
/* invalid wide-character is included. */
|
/* invalid wide-character is encountered. */
|
||||||
if (tio->flags & QSE_TIO_IGNOREMBWCERR)
|
if (tio->flags & QSE_TIO_IGNOREMBWCERR)
|
||||||
{
|
{
|
||||||
|
/* though an error occurred, wcnt and mcnt
|
||||||
|
* are valid for the bytes and characters
|
||||||
|
* processed so far. so i can insert a question
|
||||||
|
* mark using mcnt as an index */
|
||||||
|
tio->outbuf[tio->outbuf_len + mcnt] = QSE_MT('?');
|
||||||
|
mcnt++; wcnt++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tio->errnum = QSE_TIO_EILCHR;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(tio->flags & QSE_TIO_NOAUTOFLUSH))
|
||||||
|
{
|
||||||
|
qse_size_t i;
|
||||||
|
/* checking for a newline this way looks damn ugly.
|
||||||
|
* TODO: how can i do this more elegantly? */
|
||||||
|
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;
|
||||||
|
return wlen;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
@ -56,9 +56,9 @@ static int test1 (void)
|
|||||||
(int)wlen, (int)mlen, (int)wlen1, (int)mlen1, buf2);
|
(int)wlen, (int)mlen, (int)wlen1, (int)mlen1, buf2);
|
||||||
qse_fflush (QSE_STDOUT);
|
qse_fflush (QSE_STDOUT);
|
||||||
|
|
||||||
qse_sio_puts (QSE_SIO_OUT, QSE_T("<<"));
|
qse_sio_putws (QSE_SIO_OUT, QSE_T("<<"));
|
||||||
qse_sio_puts (QSE_SIO_OUT, buf2);
|
qse_sio_putws (QSE_SIO_OUT, buf2);
|
||||||
qse_sio_puts (QSE_SIO_OUT, QSE_T(">>\n"));
|
qse_sio_putws (QSE_SIO_OUT, QSE_T(">>\n"));
|
||||||
qse_sio_flush (QSE_SIO_OUT);
|
qse_sio_flush (QSE_SIO_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,9 +78,9 @@ static int test1 (void)
|
|||||||
(int)wlen, (int)mlen, (int)wlen, (int)wlen1, (int)mlen1, buf2);
|
(int)wlen, (int)mlen, (int)wlen, (int)wlen1, (int)mlen1, buf2);
|
||||||
|
|
||||||
qse_fflush (QSE_STDOUT);
|
qse_fflush (QSE_STDOUT);
|
||||||
qse_sio_puts (QSE_SIO_OUT, QSE_T("<<"));
|
qse_sio_putws (QSE_SIO_OUT, QSE_T("<<"));
|
||||||
qse_sio_puts (QSE_SIO_OUT, buf2);
|
qse_sio_putws (QSE_SIO_OUT, buf2);
|
||||||
qse_sio_puts (QSE_SIO_OUT, QSE_T(">>\n"));
|
qse_sio_putws (QSE_SIO_OUT, QSE_T(">>\n"));
|
||||||
qse_sio_flush (QSE_SIO_OUT);
|
qse_sio_flush (QSE_SIO_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user