enhanced line breaking in sio

This commit is contained in:
2013-10-21 14:53:53 +00:00
parent a629a06cdc
commit 636967779d
13 changed files with 294 additions and 254 deletions

View File

@ -998,7 +998,7 @@ int StdAwk::open_console_out (Console& io)
qse_sio_t* sio;
sio = open_sio_std (
QSE_NULL, io, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR);
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK);
if (sio == QSE_NULL) return -1;
if (this->console_cmgr)
@ -1036,7 +1036,7 @@ int StdAwk::open_console_out (Console& io)
}
if (file[0] == QSE_T('-') && file[1] == QSE_T('\0'))
sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR);
sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK);
else
sio = open_sio (QSE_NULL, io, file, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1;
@ -1515,7 +1515,7 @@ int StdAwk::SourceFile::open (Data& io)
sio = open_sio_std (
io, QSE_NULL, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_CREATE |
QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR);
QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK);
if (sio == QSE_NULL) return -1;
}
else

View File

@ -954,7 +954,7 @@ static qse_ssize_t sf_out (
/* no path name or - -> stdout */
xtn->s.out.u.file.sio = open_sio_std (
awk, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK
);
if (xtn->s.out.u.file.sio == QSE_NULL) return -1;
}
@ -1623,7 +1623,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
{
sio = open_sio_std_rtx (
rtx, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK
);
if (sio == QSE_NULL) return -1;
@ -1654,7 +1654,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
sio = (file[0] == QSE_T('-') && file[1] == QSE_T('\0'))?
open_sio_std_rtx (
rtx, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR):
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK):
open_sio_rtx (
rtx, file,
QSE_SIO_WRITE | QSE_SIO_CREATE |

View File

@ -36,7 +36,7 @@
enum
{
STATUS_UTF8_CONSOLE = (1 << 0),
STATUS_LINE_BREAK = (1 << 1)
STATUS_LINE_BREAK = (1 << 1)
};
static qse_ssize_t file_input (
@ -427,10 +427,18 @@ qse_ssize_t qse_sio_putmb (qse_sio_t* sio, qse_mchar_t c)
qse_ssize_t n;
sio->errnum = QSE_SIO_ENOERR;
#if defined(__OS2__)
if (c == QSE_MT('\n') && (sio->status & STATUS_LINE_BREAK))
n = qse_tio_writembs (&sio->tio.io, QSE_MT("\r\n"), 2);
else
n = qse_tio_writembs (&sio->tio.io, &c, 1);
#else
n = qse_tio_writembs (&sio->tio.io, &c, 1);
#endif
if (n <= -1 && sio->errnum == QSE_SIO_ENOERR)
sio->errnum = tio_errnum_to_sio_errnum (&sio->tio.io);
return n;
}
@ -439,7 +447,14 @@ qse_ssize_t qse_sio_putwc (qse_sio_t* sio, qse_wchar_t c)
qse_ssize_t n;
sio->errnum = QSE_SIO_ENOERR;
#if defined(__OS2__)
if (c == QSE_WT('\n') && (sio->status & STATUS_LINE_BREAK))
n = qse_tio_writewcs (&sio->tio.io, QSE_WT("\r\n"), 2);
else
n = qse_tio_writewcs (&sio->tio.io, &c, 1);
#else
n = qse_tio_writewcs (&sio->tio.io, &c, 1);
#endif
if (n <= -1 && sio->errnum == QSE_SIO_ENOERR)
sio->errnum = tio_errnum_to_sio_errnum (&sio->tio.io);
@ -453,6 +468,15 @@ qse_ssize_t qse_sio_putmbs (qse_sio_t* sio, const qse_mchar_t* str)
#if defined(_WIN32)
/* Using WriteConsoleA() didn't help at all.
* so I don't implement any hacks here */
#elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK)
{
for (n = 0; n < QSE_TYPE_MAX(qse_ssize_t) && str[n] != QSE_MT('\0'); n++)
{
if ((n = qse_sio_putmb (sio, str[n])) <= -1) return n;
}
return n;
}
#endif
sio->errnum = QSE_SIO_ENOERR;
@ -471,6 +495,16 @@ qse_ssize_t qse_sio_putmbsn (
#if defined(_WIN32)
/* Using WriteConsoleA() didn't help at all.
* so I don't implement any hacks here */
#elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK)
{
if (size > QSE_TYPE_MAX(qse_ssize_t)) size = QSE_TYPE_MAX(qse_ssize_t);
for (n = 0; n < size; n++)
{
if (qse_sio_putmb (sio, str[n]) <= -1) return -1;
}
return n;
}
#endif
sio->errnum = QSE_SIO_ENOERR;
@ -513,6 +547,15 @@ qse_ssize_t qse_sio_putwcs (qse_sio_t* sio, const qse_wchar_t* str)
}
return cur - str;
}
#elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK)
{
for (n = 0; n < QSE_TYPE_MAX(qse_ssize_t) && str[n] != QSE_WT('\0'); n++)
{
if (qse_sio_putwc (sio, str[n]) <= -1) return -1;
}
return n;
}
#endif
sio->errnum = QSE_SIO_ENOERR;
@ -574,7 +617,16 @@ qse_ssize_t qse_sio_putwcsn (
}
return cur - str;
}
#elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK)
{
if (size > QSE_TYPE_MAX(qse_ssize_t)) size = QSE_TYPE_MAX(qse_ssize_t);
for (n = 0; n < size; n++)
{
if (qse_sio_putwc (sio, str[n]) <= -1) return -1;
}
return n;
}
#endif
sio->errnum = QSE_SIO_ENOERR;
@ -586,26 +638,12 @@ qse_ssize_t qse_sio_putwcsn (
static int put_wchar (qse_wchar_t c, void *arg)
{
#if defined(__OS2__)
if (c == QSE_WT('\n') && (((qse_sio_t*)arg)->status & STATUS_LINE_BREAK))
return qse_sio_putwcs ((qse_sio_t*)arg, QSE_WT("\r\n"));
else
return qse_sio_putwc ((qse_sio_t*)arg, c);
#else
return qse_sio_putwc ((qse_sio_t*)arg, c);
#endif
}
static int put_mchar (qse_mchar_t c, void *arg)
{
#if defined(__OS2__)
if (c == QSE_MT('\n') && (((qse_sio_t*)arg)->status & STATUS_LINE_BREAK))
return qse_sio_putmbs ((qse_sio_t*)arg, QSE_MT("\r\n"));
else
return qse_sio_putmb ((qse_sio_t*)arg, c);
#else
return qse_sio_putmb ((qse_sio_t*)arg, c);
#endif
}
qse_ssize_t qse_sio_putmbsf (qse_sio_t* sio, const qse_mchar_t* fmt, ...)
@ -718,7 +756,6 @@ int qse_sio_seek (qse_sio_t* sio, qse_sio_seek_t pos)
static qse_ssize_t file_input (
qse_tio_t* tio, qse_tio_cmd_t cmd, void* buf, qse_size_t size)
{
if (cmd == QSE_TIO_DATA)
{
qse_ssize_t n;

View File

@ -576,7 +576,7 @@ qse_ssize_t qse_tio_writembs (
if (tio->flags & QSE_TIO_NOAUTOFLUSH)
{
while (mptr[pos])
while (mptr[pos] != QSE_MT('\0'))
{
tio->out.buf.ptr[tio->outbuf_len++] = mptr[pos++];
if (tio->outbuf_len >= tio->out.buf.capa &&
@ -587,7 +587,7 @@ qse_ssize_t qse_tio_writembs (
else
{
int nl = 0;
while (mptr[pos])
while (mptr[pos] != QSE_MT('\0'))
{
tio->out.buf.ptr[tio->outbuf_len++] = mptr[pos];
if (tio->outbuf_len >= tio->out.buf.capa)
@ -690,7 +690,7 @@ qse_ssize_t qse_tio_writewcs (
/* the buffer is not large enough to
* convert more. so flush now and continue.
* note that the buffer may not be full though
* it not large enough in this case */
* it is not large enough in this case */
if (qse_tio_flush (tio) <= -1) return -1;
nl = 0;
}

View File

@ -73,7 +73,7 @@ int StdSed::FileStream::open (Data& io)
if (io.getMode() == READ)
oflags = QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR;
else
oflags = QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR;
oflags = QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK;
if (ioname == QSE_NULL)
{

View File

@ -306,7 +306,8 @@ static int open_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_io
QSE_SIO_WRITE |
QSE_SIO_CREATE |
QSE_SIO_TRUNCATE |
QSE_SIO_IGNOREMBWCERR
QSE_SIO_IGNOREMBWCERR |
QSE_SIO_LINEBREAK
);
}
else
@ -635,7 +636,8 @@ static qse_ssize_t x_out (
QSE_SIO_WRITE |
QSE_SIO_CREATE |
QSE_SIO_TRUNCATE |
QSE_SIO_IGNOREMBWCERR
QSE_SIO_IGNOREMBWCERR |
QSE_SIO_LINEBREAK
);
if (sio == QSE_NULL) return -1;
arg->handle = sio;

View File

@ -154,7 +154,7 @@ static qse_ssize_t sf_in_open (qse_xli_t* xli, qse_xli_io_arg_t* arg, xtn_t* xtn
psin->u.file.path[1] == QSE_T('\0')))
{
/* no path name or - -> stdin */
arg->handle = open_sio_std (xli, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
arg->handle = open_sio_std (xli, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK);
}
else
{
@ -360,124 +360,6 @@ static qse_ssize_t sf_in (
}
}
#if 0
static qse_ssize_t sf_out (
qse_xli_t* xli, qse_xli_io_cmd_t cmd,
qse_xli_io_arg_t* arg, qse_char_t* data, qse_size_t size)
{
xtn_t* xtn = QSE_XTN (xli);
switch (cmd)
{
case QSE_XLI_IO_OPEN:
{
switch (xtn->s.out.x->type)
{
case QSE_XLI_IOSTD_FILE:
if (xtn->s.out.x->u.file.path == QSE_NULL ||
(xtn->s.out.x->u.file.path[0] == QSE_T('-') &&
xtn->s.out.x->u.file.path[1] == QSE_T('\0')))
{
/* no path name or - -> stdout */
xtn->s.out.u.file.sio = open_sio_std (
xli, QSE_SIO_STDOUT,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR
);
if (xtn->s.out.u.file.sio == QSE_NULL) return -1;
}
else
{
xtn->s.out.u.file.sio = open_sio (
xli, xtn->s.out.x->u.file.path,
QSE_SIO_WRITE | QSE_SIO_CREATE |
QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR
);
if (xtn->s.out.u.file.sio == QSE_NULL) return -1;
}
if (xtn->s.out.x->u.file.cmgr)
qse_sio_setcmgr (xtn->s.out.u.file.sio, xtn->s.out.x->u.file.cmgr);
return 1;
case QSE_XLI_IOSTD_STR:
xtn->s.out.u.str.buf = qse_str_open (xli->mmgr, 0, 512);
if (xtn->s.out.u.str.buf == QSE_NULL)
{
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
return -1;
}
return 1;
}
break;
}
case QSE_XLI_IO_CLOSE:
{
switch (xtn->s.out.x->type)
{
case QSE_XLI_IOSTD_FILE:
qse_sio_close (xtn->s.out.u.file.sio);
return 0;
case QSE_XLI_IOSTD_STR:
/* i don't close xtn->s.out.u.str.buf intentionally here.
* it will be closed at the end of qse_xli_readstd() */
return 0;
}
break;
}
case QSE_XLI_IO_WRITE:
{
switch (xtn->s.out.x->type)
{
case QSE_XLI_IOSTD_FILE:
{
qse_ssize_t n;
QSE_ASSERT (xtn->s.out.u.file.sio != QSE_NULL);
n = qse_sio_putstrn (xtn->s.out.u.file.sio, data, size);
if (n <= -1)
{
qse_cstr_t ea;
ea.ptr = xtn->s.out.x->u.file.path;
if (ea.ptr == QSE_NULL) ea.ptr = sio_std_names[QSE_SIO_STDOUT].ptr;
ea.len = qse_strlen(ea.ptr);
qse_xli_seterrnum (xli, QSE_XLI_EIOFIL, &ea);
}
return n;
}
case QSE_XLI_IOSTD_STR:
{
if (size > QSE_TYPE_MAX(qse_ssize_t)) size = QSE_TYPE_MAX(qse_ssize_t);
if (qse_str_ncat (xtn->s.out.u.str.buf, data, size) == (qse_size_t)-1)
{
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
return -1;
}
return size;
}
}
break;
}
default:
/* other code must not trigger this function */
break;
}
qse_xli_seterrnum (xli, QSE_XLI_EINTERN, QSE_NULL);
return -1;
}
#endif
static qse_ssize_t sf_out_open (qse_xli_t* xli, qse_xli_io_arg_t* arg, xtn_t* xtn)
{
if (arg->prev == QSE_NULL)
@ -495,7 +377,7 @@ static qse_ssize_t sf_out_open (qse_xli_t* xli, qse_xli_io_arg_t* arg, xtn_t* xt
psout->u.file.path[1] == QSE_T('\0')))
{
/* no path name or - -> stdout */
arg->handle = open_sio_std (xli, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR);
arg->handle = open_sio_std (xli, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_LINEBREAK);
}
else
{