fixed wrong type casting bugs in StdAwk.

made changes to use qse_sio_openstd() in StdAwk.
fixed a bug of opening an output console file in the wrong mode in StdAwk
made changes to use qse_sio_openstd() in cut/std.c.
removed qse_sio_in/qse_sio_out/qse_sio_err.
This commit is contained in:
hyung-hwan 2011-12-20 16:59:21 +00:00
parent d5db73dfce
commit f4df349fc7
4 changed files with 137 additions and 316 deletions

View File

@ -51,6 +51,46 @@ QSE_BEGIN_NAMESPACE(QSE)
} \ } \
} while (0) } while (0)
static qse_sio_t* open_sio (Awk* awk, StdAwk::Run* run, const qse_char_t* file, int flags)
{
qse_sio_t* sio;
//sio = qse_sio_open ((run? ((Awk::awk_t*)*(Awk*)*run)->mmgr: awk->getMmgr()), 0, file, flags);
sio = qse_sio_open ((run? ((Awk*)*run)->getMmgr(): awk->getMmgr()), 0, file, flags);
if (sio == QSE_NULL)
{
qse_cstr_t ea;
ea.ptr = file;
ea.len = qse_strlen (file);
if (run) run->setError (QSE_AWK_EOPEN, &ea);
else awk->setError (QSE_AWK_EOPEN, &ea);
}
return sio;
}
static qse_sio_t* open_sio_std (Awk* awk, StdAwk::Run* run, qse_sio_std_t std, int flags)
{
qse_sio_t* sio;
static const qse_char_t* std_names[] =
{
QSE_T("stdin"),
QSE_T("stdout"),
QSE_T("stderr"),
};
//sio = qse_sio_openstd ((run? ((Awk::awk_t*)*(Awk*)*run)->mmgr: awk->getMmgr()), 0, std, flags);
sio = qse_sio_openstd ((run? ((Awk*)*run)->getMmgr(): awk->getMmgr()), 0, std, flags);
if (sio == QSE_NULL)
{
qse_cstr_t ea;
ea.ptr = std_names[std];
ea.len = qse_strlen (std_names[std]);
if (run) run->setError (QSE_AWK_EOPEN, &ea);
else awk->setError (QSE_AWK_EOPEN, &ea);
}
return sio;
}
int StdAwk::open () int StdAwk::open ()
{ {
int n = Awk::open (); int n = Awk::open ();
@ -116,17 +156,11 @@ int StdAwk::system (Run& run, Value& ret, const Value* args, size_t nargs,
#else #else
qse_mchar_t* mbs; qse_mchar_t* mbs;
mbs = qse_wcstombsdup (ptr, ((awk_t*)(Awk*)run)->mmgr); mbs = qse_wcstombsdup (ptr, ((Awk*)run)->getMmgr());
if (mbs == QSE_NULL) if (mbs == QSE_NULL) return -1;
{
qse_awk_freemem ((awk_t*)(Awk*)run, mbs);
return -1;
}
int n = ret.setInt ((long_t)::system(mbs)); int n = ret.setInt ((long_t)::system(mbs));
qse_awk_freemem ((awk_t*)(Awk*)run, mbs); QSE_MMGR_FREE (((Awk*)run)->getMmgr(), mbs);
return n; return n;
#endif #endif
} }
@ -263,7 +297,7 @@ int StdAwk::flushFile (File& io)
int StdAwk::addConsoleOutput (const char_t* arg, size_t len) int StdAwk::addConsoleOutput (const char_t* arg, size_t len)
{ {
QSE_ASSERT (awk != QSE_NULL); QSE_ASSERT (awk != QSE_NULL);
int n = ofile.add (awk, arg, len); int n = this->ofile.add (awk, arg, len);
if (n <= -1) setError (QSE_AWK_ENOMEM); if (n <= -1) setError (QSE_AWK_ENOMEM);
return n; return n;
} }
@ -275,21 +309,26 @@ int StdAwk::addConsoleOutput (const char_t* arg)
void StdAwk::clearConsoleOutputs () void StdAwk::clearConsoleOutputs ()
{ {
ofile.clear (awk); this->ofile.clear (awk);
} }
int StdAwk::open_console_in (Console& io) int StdAwk::open_console_in (Console& io)
{ {
qse_awk_rtx_t* rtx = (rtx_t*)io; qse_awk_rtx_t* rtx = (rtx_t*)io;
if (runarg.ptr == QSE_NULL) if (this->runarg.ptr == QSE_NULL)
{ {
QSE_ASSERT (runarg.len == 0 && runarg.capa == 0); QSE_ASSERT (this->runarg.len == 0 && this->runarg.capa == 0);
if (runarg_count == 0) if (this->runarg_count == 0)
{ {
io.setHandle (qse_sio_in); qse_sio_t* sio;
runarg_count++;
sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1;
io.setHandle (sio);
this->runarg_count++;
return 1; return 1;
} }
@ -308,13 +347,13 @@ int StdAwk::open_console_in (Console& io)
qse_awk_rtx_valtostr_out_t out; qse_awk_rtx_valtostr_out_t out;
nextfile: nextfile:
file = runarg.ptr[runarg_index].ptr; file = this->runarg.ptr[this->runarg_index].ptr;
if (file == QSE_NULL) if (file == QSE_NULL)
{ {
/* no more input file */ /* no more input file */
if (runarg_count == 0) if (this->runarg_count == 0)
{ {
/* all ARGVs are empty strings. /* all ARGVs are empty strings.
* so no console files were opened. * so no console files were opened.
@ -323,15 +362,18 @@ int StdAwk::open_console_in (Console& io)
* 'BEGIN { ARGV[1]=""; ARGV[2]=""; } * 'BEGIN { ARGV[1]=""; ARGV[2]=""; }
* { print $0; }' file1 file2 * { print $0; }' file1 file2
*/ */
io.setHandle (qse_sio_in); sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
runarg_count++; if (sio == QSE_NULL) return -1;
io.setHandle (sio);
this->runarg_count++;
return 1; return 1;
} }
return 0; return 0;
} }
if (qse_strlen(file) != runarg.ptr[runarg_index].len) if (qse_strlen(file) != this->runarg.ptr[this->runarg_index].len)
{ {
cstr_t arg; cstr_t arg;
arg.ptr = file; arg.ptr = file;
@ -354,10 +396,10 @@ int StdAwk::open_console_in (Console& io)
map = ((qse_awk_val_map_t*)argv)->map; map = ((qse_awk_val_map_t*)argv)->map;
QSE_ASSERT (map != QSE_NULL); QSE_ASSERT (map != QSE_NULL);
// ok to find ARGV[runarg_index] as ARGV[0] // ok to find ARGV[this->runarg_index] as ARGV[0]
// has been skipped. // has been skipped.
ibuflen = qse_awk_longtostr ( ibuflen = qse_awk_longtostr (
rtx->awk, runarg_index, rtx->awk, this->runarg_index,
10, QSE_NULL, 10, QSE_NULL,
ibuf, QSE_COUNTOF(ibuf) ibuf, QSE_COUNTOF(ibuf)
); );
@ -375,7 +417,7 @@ int StdAwk::open_console_in (Console& io)
{ {
/* the name is empty */ /* the name is empty */
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr); qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
runarg_index++; this->runarg_index++;
goto nextfile; goto nextfile;
} }
@ -393,29 +435,19 @@ int StdAwk::open_console_in (Console& io)
file = out.u.cpldup.ptr; file = out.u.cpldup.ptr;
if (file[0] == QSE_T('-') && file[1] == QSE_T('\0')) if (file[0] == QSE_T('-') && file[1] == QSE_T('\0'))
{ sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
/* special file name '-' */
sio = qse_sio_in;
}
else else
{ sio = open_sio (QSE_NULL, io, file, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
sio = qse_sio_open (
rtx->awk->mmgr, 0, file, QSE_SIO_READ);
if (sio == QSE_NULL) if (sio == QSE_NULL)
{ {
cstr_t arg;
arg.ptr = file;
arg.len = qse_strlen (arg.ptr);
((Run*)io)->setError (QSE_AWK_EOPEN, &arg);
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr); qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
return -1; return -1;
} }
}
if (qse_awk_rtx_setfilename ( if (qse_awk_rtx_setfilename (
rtx, file, qse_strlen(file)) == -1) rtx, file, qse_strlen(file)) == -1)
{ {
if (sio != qse_sio_in) qse_sio_close (sio); qse_sio_close (sio);
qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr); qse_awk_rtx_freemem (rtx, out.u.cpldup.ptr);
return -1; return -1;
} }
@ -424,8 +456,8 @@ int StdAwk::open_console_in (Console& io)
io.setHandle (sio); io.setHandle (sio);
/* increment the counter of files successfully opened */ /* increment the counter of files successfully opened */
runarg_count++; this->runarg_count++;
runarg_index++; this->runarg_index++;
return 1; return 1;
} }
@ -435,14 +467,17 @@ int StdAwk::open_console_out (Console& io)
{ {
qse_awk_rtx_t* rtx = (rtx_t*)io; qse_awk_rtx_t* rtx = (rtx_t*)io;
if (ofile.ptr == QSE_NULL) if (this->ofile.ptr == QSE_NULL)
{ {
QSE_ASSERT (ofile.len == 0 && ofile.capa == 0); QSE_ASSERT (this->ofile.len == 0 && this->ofile.capa == 0);
if (ofile_count == 0) if (this->ofile_count == 0)
{ {
io.setHandle (qse_sio_out); qse_sio_t* sio;
ofile_count++; sio = open_sio_std (QSE_NULL, io, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1;
io.setHandle (sio);
this->ofile_count++;
return 1; return 1;
} }
@ -455,7 +490,7 @@ int StdAwk::open_console_out (Console& io)
qse_sio_t* sio; qse_sio_t* sio;
const qse_char_t* file; const qse_char_t* file;
file = ofile.ptr[ofile_index].ptr; file = this->ofile.ptr[this->ofile_index].ptr;
if (file == QSE_NULL) if (file == QSE_NULL)
{ {
@ -463,7 +498,7 @@ int StdAwk::open_console_out (Console& io)
return 0; return 0;
} }
if (qse_strlen(file) != ofile.ptr[ofile_index].len) if (qse_strlen(file) != this->ofile.ptr[this->ofile_index].len)
{ {
cstr_t arg; cstr_t arg;
arg.ptr = file; arg.ptr = file;
@ -473,23 +508,10 @@ int StdAwk::open_console_out (Console& io)
} }
if (file[0] == QSE_T('-') && file[1] == QSE_T('\0')) 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);
/* special file name '-' */
sio = qse_sio_out;
}
else else
{ sio = open_sio (QSE_NULL, io, file, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR);
sio = qse_sio_open ( if (sio == QSE_NULL) return -1;
rtx->awk->mmgr, 0, file, QSE_SIO_READ);
if (sio == QSE_NULL)
{
cstr_t arg;
arg.ptr = file;
arg.len = qse_strlen (arg.ptr);
((Run*)io)->setError (QSE_AWK_EOPEN, &arg);
return -1;
}
}
if (qse_awk_rtx_setofilename ( if (qse_awk_rtx_setofilename (
rtx, file, qse_strlen(file)) == -1) rtx, file, qse_strlen(file)) == -1)
@ -500,8 +522,8 @@ int StdAwk::open_console_out (Console& io)
io.setHandle (sio); io.setHandle (sio);
ofile_index++; this->ofile_index++;
ofile_count++; this->ofile_count++;
return 1; return 1;
} }
} }
@ -512,12 +534,12 @@ int StdAwk::openConsole (Console& io)
if (mode == Console::READ) if (mode == Console::READ)
{ {
runarg_count = 0; this->runarg_count = 0;
runarg_index = 0; this->runarg_index = 0;
if (runarg.len > 0) if (this->runarg.len > 0)
{ {
// skip ARGV[0] // skip ARGV[0]
runarg_index++; this->runarg_index++;
} }
return open_console_in (io); return open_console_in (io);
} }
@ -525,8 +547,8 @@ int StdAwk::openConsole (Console& io)
{ {
QSE_ASSERT (mode == Console::WRITE); QSE_ASSERT (mode == Console::WRITE);
ofile_count = 0; this->ofile_count = 0;
ofile_index = 0; this->ofile_index = 0;
return open_console_out (io); return open_console_out (io);
} }
} }
@ -756,36 +778,31 @@ int StdAwk::SourceFile::open (Data& io)
{ {
// open the main source file. // open the main source file.
if (name[0] == QSE_T('-') && name[1] == QSE_T('\0')) if (this->name[0] == QSE_T('-') && this->name[1] == QSE_T('\0'))
{ {
sio = (io.getMode() == READ)? qse_sio_in: qse_sio_out; if (io.getMode() == READ)
sio = open_sio_std (io, QSE_NULL, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
else
sio = open_sio_std (io, QSE_NULL, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1;
} }
else else
{ {
const qse_char_t* base; const qse_char_t* base;
sio = qse_sio_open ( sio = open_sio (
((awk_t*)io)->mmgr, io, QSE_NULL, this->name,
0,
name,
(io.getMode() == READ? (io.getMode() == READ?
QSE_SIO_READ: QSE_SIO_READ:
(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE)) (QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE|QSE_SIO_IGNOREMBWCERR))
); );
if (sio == QSE_NULL) if (sio == QSE_NULL) return -1;
{
qse_cstr_t ea;
ea.ptr = name;
ea.len = qse_strlen(name);
((Awk*)io)->setError (QSE_AWK_EOPEN, &ea);
return -1;
}
base = qse_basename (name); base = qse_basename (this->name);
if (base != name) if (base != this->name)
{ {
dir.ptr = name; dir.ptr = this->name;
dir.len = base - name; dir.len = base - this->name;
} }
} }
} }
@ -805,7 +822,7 @@ int StdAwk::SourceFile::open (Data& io)
if (totlen >= QSE_COUNTOF(fbuf)) if (totlen >= QSE_COUNTOF(fbuf))
{ {
dbuf = (qse_char_t*) QSE_MMGR_ALLOC ( dbuf = (qse_char_t*) QSE_MMGR_ALLOC (
((awk_t*)io)->mmgr, ((Awk*)io)->getMmgr(),
QSE_SIZEOF(qse_char_t) * (totlen + 1) QSE_SIZEOF(qse_char_t) * (totlen + 1)
); );
if (dbuf == QSE_NULL) if (dbuf == QSE_NULL)
@ -818,29 +835,18 @@ int StdAwk::SourceFile::open (Data& io)
} }
else file = fbuf; else file = fbuf;
tmplen = qse_strncpy ( tmplen = qse_strncpy ((char_t*)file, dir.ptr, dir.len);
(char_t*)file, dir.ptr, dir.len);
qse_strcpy ((char_t*)file + tmplen, ioname); qse_strcpy ((char_t*)file + tmplen, ioname);
} }
sio = qse_sio_open ( sio = open_sio (
((awk_t*)io)->mmgr, io, QSE_NULL, file,
0,
file,
(io.getMode() == READ? (io.getMode() == READ?
QSE_SIO_READ: QSE_SIO_READ:
(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE)) (QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE|QSE_SIO_IGNOREMBWCERR))
); );
if (dbuf) QSE_MMGR_FREE (((Awk*)io)->getMmgr(), dbuf);
if (dbuf != QSE_NULL) QSE_MMGR_FREE (((awk_t*)io)->mmgr, dbuf); if (sio == QSE_NULL) return -1;
if (sio == QSE_NULL)
{
qse_cstr_t ea;
ea.ptr = file;
ea.len = qse_strlen(file);
((Awk*)io)->setError (QSE_AWK_EOPEN, &ea);
return -1;
}
} }
io.setHandle (sio); io.setHandle (sio);
@ -881,7 +887,7 @@ int StdAwk::SourceString::open (Data& io)
{ {
// open an included file // open an included file
sio = qse_sio_open ( sio = qse_sio_open (
((awk_t*)io)->mmgr, ((Awk*)io)->getMmgr(),
0, 0,
ioname, ioname,
(io.getMode() == READ? (io.getMode() == READ?

View File

@ -94,12 +94,9 @@ void qse_assert_failed (
qse_sio_t* sio, siobuf; qse_sio_t* sio, siobuf;
sio = &siobuf; sio = &siobuf;
if (qse_sio_initstd ( qse_sio_initstd (
sio, QSE_MMGR_GETDFL(), QSE_SIO_STDERR, sio, QSE_MMGR_GETDFL(), QSE_SIO_STDERR,
QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_NOAUTOFLUSH) <= -1) QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR | QSE_SIO_NOAUTOFLUSH);
{
sio = QSE_SIO_ERR;
}
qse_sio_putmbs (sio, QSE_MT("=[ASSERTION FAILURE]============================================================\n")); qse_sio_putmbs (sio, QSE_MT("=[ASSERTION FAILURE]============================================================\n"));
@ -155,7 +152,7 @@ void qse_assert_failed (
qse_sio_putmbs (sio, QSE_MT("================================================================================\n")); qse_sio_putmbs (sio, QSE_MT("================================================================================\n"));
qse_sio_flush (sio); qse_sio_flush (sio);
if (sio != QSE_SIO_ERR) qse_sio_fini (sio); qse_sio_fini (sio);
#if defined(_WIN32) #if defined(_WIN32)
ExitProcess (249); ExitProcess (249);

View File

@ -31,154 +31,6 @@ static qse_ssize_t __sio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_si
# include <os2.h> # include <os2.h>
#endif #endif
static qse_sio_t __sio_in =
{
QSE_NULL, /* mmgr */
/* fio */
{
QSE_NULL, /* mmgr */
#if defined(_WIN32)
/* this is not a handle. it is adjusted to
* an actual handle in __sio_input () */
(HANDLE)STD_INPUT_HANDLE, /* handle */
#elif defined(__OS2__)
(HFILE)0, /* handle */
#elif defined(__DOS__)
0, /* handle */
#else
0, /* handle */
#endif
0, /* flags */
QSE_NULL /* tio */
},
/* tio */
{
QSE_NULL,
QSE_TIO_ENOERR,
QSE_TIO_IGNOREMBWCERR,
__sio_input,
__sio_output,
&__sio_in,
&__sio_in,
0,
0,
0,
0,
0,
0,
{ 0 },
{ 0 },
{ 0 }
}
};
static qse_sio_t __sio_out =
{
QSE_NULL, /* mmgr */
/* fio */
{
QSE_NULL,
#if defined(_WIN32)
/* this is not a handle. it is adjusted to
* an actual handle in __sio_output () */
(HANDLE)STD_OUTPUT_HANDLE,
#elif defined(__OS2__)
(HFILE)1,
#elif defined(__DOS__)
1,
#else
1,
#endif
0,
QSE_NULL
},
/* tio */
{
QSE_NULL,
QSE_TIO_ENOERR,
QSE_TIO_IGNOREMBWCERR,
__sio_input,
__sio_output,
&__sio_out,
&__sio_out,
0,
0,
0,
0,
0,
0,
{ 0 },
{ 0 },
{ 0 }
}
};
static qse_sio_t __sio_err =
{
QSE_NULL, /* mmgr */
/* fio */
{
QSE_NULL,
#if defined(_WIN32)
/* this is not a handle. it is adjusted to
* an actual handle in __sio_output () */
(HANDLE)STD_ERROR_HANDLE,
#elif defined(__OS2__)
(HFILE)2,
#elif defined(__DOS__)
2,
#else
2,
#endif
0,
QSE_NULL
},
/* tio */
{
QSE_NULL,
QSE_TIO_ENOERR,
QSE_TIO_IGNOREMBWCERR,
__sio_input,
__sio_output,
&__sio_err,
&__sio_err,
0,
0,
0,
0,
0,
0,
{ 0 },
{ 0 },
{ 0 }
}
};
qse_sio_t* qse_sio_in = &__sio_in;
qse_sio_t* qse_sio_out = &__sio_out;
qse_sio_t* qse_sio_err = &__sio_err;
qse_sio_t* qse_sio_open ( qse_sio_t* qse_sio_open (
qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* file, int flags) qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* file, int flags)
{ {
@ -272,10 +124,6 @@ void qse_sio_fini (qse_sio_t* sio)
qse_sio_flush (sio); qse_sio_flush (sio);
qse_tio_fini (&sio->tio); qse_tio_fini (&sio->tio);
qse_fio_fini (&sio->fio); qse_fio_fini (&sio->fio);
if (sio == qse_sio_in) qse_sio_in = QSE_NULL;
else if (sio == qse_sio_out) qse_sio_out = QSE_NULL;
else if (sio == qse_sio_err) qse_sio_err = QSE_NULL;
} }
qse_sio_errnum_t qse_sio_geterrnum (qse_sio_t* sio) qse_sio_errnum_t qse_sio_geterrnum (qse_sio_t* sio)
@ -425,21 +273,6 @@ static qse_ssize_t __sio_input (
if (cmd == QSE_TIO_IO_DATA) if (cmd == QSE_TIO_IO_DATA)
{ {
#if defined(_WIN32)
/* TODO: I hate this way of adjusting the handle value
* Is there any good ways to do it statically? */
HANDLE h = sio->fio.handle;
if (h == (HANDLE)STD_INPUT_HANDLE ||
h == (HANDLE)STD_OUTPUT_HANDLE ||
h == (HANDLE)STD_ERROR_HANDLE)
{
h = GetStdHandle((DWORD)h);
if (h != INVALID_HANDLE_VALUE && h != NULL)
{
sio->fio.handle = h;
}
}
#endif
return qse_fio_read (&sio->fio, buf, size); return qse_fio_read (&sio->fio, buf, size);
} }
@ -455,21 +288,6 @@ static qse_ssize_t __sio_output (
if (cmd == QSE_TIO_IO_DATA) if (cmd == QSE_TIO_IO_DATA)
{ {
#if defined(_WIN32)
/* TODO: I hate this way of adjusting the handle value
* Is there any good ways to do it statically? */
HANDLE h = sio->fio.handle;
if (h == (HANDLE)STD_INPUT_HANDLE ||
h == (HANDLE)STD_OUTPUT_HANDLE ||
h == (HANDLE)STD_ERROR_HANDLE)
{
h = GetStdHandle((DWORD)h);
if (h != INVALID_HANDLE_VALUE && h != NULL)
{
sio->fio.handle = h;
}
}
#endif
return qse_fio_write (&sio->fio, buf, size); return qse_fio_write (&sio->fio, buf, size);
} }

View File

@ -79,15 +79,15 @@ static qse_sio_t* open_sio (qse_cut_t* cut, const qse_char_t* file, int flags)
return sio; return sio;
} }
static qse_sio_t* open_sio_std (qse_cut_t* cut, qse_sio_std_t std, int flags)
{
static const qse_char_t* sio_std_names[] = static const qse_char_t* sio_std_names[] =
{ {
QSE_T("stdin"), QSE_T("stdin"),
QSE_T("stdout"), QSE_T("stdout"),
QSE_T("stderr"), QSE_T("stderr"),
}; };
static qse_sio_t* open_sio_std (qse_cut_t* cut, qse_sio_std_t std, int flags)
{
qse_sio_t* sio; qse_sio_t* sio;
sio = qse_sio_openstd (cut->mmgr, 0, std, flags); sio = qse_sio_openstd (cut->mmgr, 0, std, flags);
@ -113,9 +113,9 @@ static qse_ssize_t xin (
case QSE_CUT_IO_OPEN: case QSE_CUT_IO_OPEN:
{ {
/* main data stream */ /* main data stream */
sio = (xtn->infile == QSE_NULL)? sio = xtn->infile?
open_sio_std (cut, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR): open_sio (cut, xtn->infile, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR):
open_sio (cut, xtn->infile, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR); open_sio_std (cut, QSE_SIO_STDIN, QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1; if (sio == QSE_NULL) return -1;
arg->handle = sio; arg->handle = sio;
return 1; return 1;
@ -134,7 +134,7 @@ static qse_ssize_t xin (
if (n == -1) if (n == -1)
{ {
if (xtn->infile != QSE_NULL) if (xtn->infile)
{ {
qse_cstr_t ea; qse_cstr_t ea;
ea.ptr = xtn->infile; ea.ptr = xtn->infile;
@ -162,9 +162,9 @@ static qse_ssize_t xout (
{ {
case QSE_CUT_IO_OPEN: case QSE_CUT_IO_OPEN:
{ {
sio = (xtn->infile == QSE_NULL)? sio = xtn->outfile?
open_sio_std (cut, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR): open_sio (cut, xtn->outfile, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR):
open_sio (cut, xtn->outfile, QSE_SIO_WRITE | QSE_SIO_CREATE | QSE_SIO_TRUNCATE | QSE_SIO_IGNOREMBWCERR); open_sio_std (cut, QSE_SIO_STDOUT, QSE_SIO_WRITE | QSE_SIO_IGNOREMBWCERR);
if (sio == QSE_NULL) return -1; if (sio == QSE_NULL) return -1;
arg->handle = sio; arg->handle = sio;
return 1; return 1;
@ -184,11 +184,11 @@ static qse_ssize_t xout (
if (n == -1) if (n == -1)
{ {
if (xtn->infile != QSE_NULL) if (xtn->outfile)
{ {
qse_cstr_t ea; qse_cstr_t ea;
ea.ptr = xtn->infile; ea.ptr = xtn->outfile;
ea.len = qse_strlen (xtn->infile); ea.len = qse_strlen (xtn->outfile);
qse_cut_seterrnum (cut, QSE_CUT_EIOFIL, &ea); qse_cut_seterrnum (cut, QSE_CUT_EIOFIL, &ea);
} }
} }