added getioattr and setioattr to StdAwk. still pending nwio
This commit is contained in:
parent
1c1cb83bb1
commit
998799bd4a
@ -136,6 +136,7 @@ protected:
|
|||||||
const char_t* name, size_t len);
|
const char_t* name, size_t len);
|
||||||
|
|
||||||
qse_cmgr_t* getcmgr (const char_t* ioname);
|
qse_cmgr_t* getcmgr (const char_t* ioname);
|
||||||
|
|
||||||
int setioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
int setioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||||
const char_t* name, size_t len);
|
const char_t* name, size_t len);
|
||||||
int getioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
int getioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
||||||
@ -204,6 +205,27 @@ protected:
|
|||||||
size_t ofile_index;
|
size_t ofile_index;
|
||||||
size_t ofile_count;
|
size_t ofile_count;
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct ioattr_t
|
||||||
|
{
|
||||||
|
qse_cmgr_t* cmgr;
|
||||||
|
char_t cmgr_name[64]; /* i assume that the cmgr name never exceeds this length */
|
||||||
|
int tmout[4];
|
||||||
|
|
||||||
|
ioattr_t (): cmgr (QSE_NULL)
|
||||||
|
{
|
||||||
|
this->cmgr_name[0] = QSE_T('\0');
|
||||||
|
for (size_t i = 0; i < QSE_COUNTOF(this->tmout); i++)
|
||||||
|
this->tmout[i] = -999;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static ioattr_t default_ioattr;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ioattr_t* get_ioattr (const char_t* ptr, size_t len);
|
||||||
|
ioattr_t* find_or_make_ioattr (const char_t* ptr, size_t len);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int open_console_in (Console& io);
|
int open_console_in (Console& io);
|
||||||
int open_console_out (Console& io);
|
int open_console_out (Console& io);
|
||||||
|
@ -74,6 +74,9 @@ QSE_BEGIN_NAMESPACE(QSE)
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
StdAwk::ioattr_t StdAwk::default_ioattr;
|
||||||
|
|
||||||
static qse_sio_t* open_sio (Awk* awk, StdAwk::Run* run, const qse_char_t* file, int flags)
|
static qse_sio_t* open_sio (Awk* awk, StdAwk::Run* run, const qse_char_t* file, int flags)
|
||||||
{
|
{
|
||||||
qse_sio_t* sio;
|
qse_sio_t* sio;
|
||||||
@ -462,7 +465,106 @@ qse_cmgr_t* StdAwk::getcmgr (const char_t* ioname)
|
|||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int StdAwk::setioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
StdAwk::ioattr_t* StdAwk::get_ioattr (const char_t* ptr, size_t len)
|
||||||
|
{
|
||||||
|
qse_htb_pair_t* pair;
|
||||||
|
|
||||||
|
pair = qse_htb_search (&this->cmgrtab, ptr, len);
|
||||||
|
if (pair == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
|
return (ioattr_t*)QSE_HTB_VPTR(pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
StdAwk::ioattr_t* StdAwk::find_or_make_ioattr (const char_t* ptr, size_t len)
|
||||||
|
{
|
||||||
|
qse_htb_pair_t* pair;
|
||||||
|
|
||||||
|
pair = qse_htb_search (&this->cmgrtab, ptr, len);
|
||||||
|
if (pair == QSE_NULL)
|
||||||
|
{
|
||||||
|
ioattr_t ioattr;
|
||||||
|
pair = qse_htb_insert (
|
||||||
|
&this->cmgrtab, (void*)ptr, len,
|
||||||
|
(void*)&ioattr, QSE_SIZEOF(ioattr));
|
||||||
|
if (pair == QSE_NULL) setError (QSE_AWK_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ioattr_t*)QSE_HTB_VPTR(pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int timeout_code (const qse_char_t* name)
|
||||||
|
{
|
||||||
|
if (qse_strcmp (name, QSE_T("rtimeout")) == 0) return 0;
|
||||||
|
if (qse_strcmp (name, QSE_T("wtimeout")) == 0) return 1;
|
||||||
|
if (qse_strcmp (name, QSE_T("ctimeout")) == 0) return 2;
|
||||||
|
if (qse_strcmp (name, QSE_T("atimeout")) == 0) return 3;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int StdAwk::setioattr (
|
||||||
|
Run& run, Value& ret, const Value* args, size_t nargs,
|
||||||
|
const char_t* name, size_t len)
|
||||||
|
{
|
||||||
|
QSE_ASSERT (this->cmgrtab_inited == true);
|
||||||
|
size_t l[3];
|
||||||
|
const char_t* ptr[3];
|
||||||
|
|
||||||
|
ptr[0] = args[0].toStr(&l[0]);
|
||||||
|
ptr[1] = args[1].toStr(&l[1]);
|
||||||
|
ptr[2] = args[2].toStr(&l[2]);
|
||||||
|
|
||||||
|
if (qse_strxchr (ptr[0], l[0], QSE_T('\0')) ||
|
||||||
|
qse_strxchr (ptr[1], l[1], QSE_T('\0')) ||
|
||||||
|
qse_strxchr (ptr[2], l[2], QSE_T('\0')))
|
||||||
|
{
|
||||||
|
return ret.setInt ((long_t)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tmout;
|
||||||
|
if ((tmout = timeout_code (ptr[1])) >= 0)
|
||||||
|
{
|
||||||
|
long_t tmout_val = args[2].toInt();
|
||||||
|
|
||||||
|
if (tmout_val < QSE_TYPE_MIN(int) ||
|
||||||
|
tmout_val > QSE_TYPE_MAX(int))
|
||||||
|
return ret.setInt ((long_t)-1);
|
||||||
|
|
||||||
|
ioattr_t* ioattr = find_or_make_ioattr (ptr[0], l[0]);
|
||||||
|
if (ioattr == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
ioattr->tmout[tmout] = tmout_val;
|
||||||
|
return ret.setInt ((long_t)0);
|
||||||
|
}
|
||||||
|
#if defined(QSE_CHAR_IS_WCHAR)
|
||||||
|
else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0)
|
||||||
|
{
|
||||||
|
ioattr_t* ioattr;
|
||||||
|
qse_cmgr_t* cmgr;
|
||||||
|
|
||||||
|
if (ptr[2][0] == QSE_T('\0')) cmgr = QSE_NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmgr = qse_findcmgr (ptr[1]);
|
||||||
|
if (cmgr == QSE_NULL) return ret.setInt ((long_t)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ioattr = find_or_make_ioattr (ptr[0], l[0]);
|
||||||
|
if (ioattr == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
ioattr->cmgr = cmgr;
|
||||||
|
qse_strxcpy (ioattr->cmgr_name, QSE_COUNTOF(ioattr->cmgr_name), ptr[2]);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unknown attribute name
|
||||||
|
return ret.setInt ((long_t)-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int StdAwk::getioattr (
|
||||||
|
Run& run, Value& ret, const Value* args, size_t nargs,
|
||||||
const char_t* name, size_t len)
|
const char_t* name, size_t len)
|
||||||
{
|
{
|
||||||
QSE_ASSERT (this->cmgrtab_inited == true);
|
QSE_ASSERT (this->cmgrtab_inited == true);
|
||||||
@ -477,25 +579,26 @@ int StdAwk::setioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
|||||||
{
|
{
|
||||||
return ret.setInt ((long_t)-1);
|
return ret.setInt ((long_t)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_cmgr_t* cmgr = qse_findcmgr (ptr[1]);
|
ioattr_t* ioattr = get_ioattr (ptr[0], l[0]);
|
||||||
if (cmgr == QSE_NULL)
|
if (ioattr == QSE_NULL) ioattr = &StdAwk::default_ioattr;
|
||||||
|
|
||||||
|
int tmout;
|
||||||
|
if ((tmout = timeout_code(ptr[1])) >= 0)
|
||||||
{
|
{
|
||||||
|
return ret.setInt ((long_t)ioattr->tmout[tmout]);
|
||||||
|
}
|
||||||
|
#if defined(QSE_CHAR_IS_WCHAR)
|
||||||
|
else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0)
|
||||||
|
{
|
||||||
|
return ret.setStr (ioattr->cmgr_name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unknown attribute name
|
||||||
return ret.setInt ((long_t)-1);
|
return ret.setInt ((long_t)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_htb_pair_t* pair = qse_htb_upsert (&this->cmgrtab, (char_t*)ptr[0], l[0], cmgr, 0);
|
|
||||||
return ret.setInt ((long_t)(pair? 0: -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
int StdAwk::getioattr (Run& run, Value& ret, const Value* args, size_t nargs,
|
|
||||||
const char_t* name, size_t len)
|
|
||||||
{
|
|
||||||
QSE_ASSERT (this->cmgrtab_inited == true);
|
|
||||||
|
|
||||||
size_t l;
|
|
||||||
const char_t* ptr = args[0].toStr(&l);
|
|
||||||
return ret.setInt ((long_t)qse_htb_delete (&this->cmgrtab, ptr, l));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int StdAwk::openPipe (Pipe& io)
|
int StdAwk::openPipe (Pipe& io)
|
||||||
@ -511,9 +614,11 @@ int StdAwk::openPipe (Pipe& io)
|
|||||||
flags |= QSE_PIO_READOUT |
|
flags |= QSE_PIO_READOUT |
|
||||||
QSE_PIO_ERRTOOUT;
|
QSE_PIO_ERRTOOUT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Awk::Pipe::WRITE:
|
case Awk::Pipe::WRITE:
|
||||||
flags |= QSE_PIO_WRITEIN;
|
flags |= QSE_PIO_WRITEIN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Awk::Pipe::RW:
|
case Awk::Pipe::RW:
|
||||||
flags |= QSE_PIO_READOUT |
|
flags |= QSE_PIO_READOUT |
|
||||||
QSE_PIO_ERRTOOUT |
|
QSE_PIO_ERRTOOUT |
|
||||||
|
@ -138,9 +138,9 @@ typedef struct rxtn_t
|
|||||||
|
|
||||||
typedef struct ioattr_t
|
typedef struct ioattr_t
|
||||||
{
|
{
|
||||||
qse_cmgr_t* cmgr;
|
qse_cmgr_t* cmgr;
|
||||||
qse_char_t cmgr_name[64]; /* i assume that the cmgr name never exceeds this length */
|
qse_char_t cmgr_name[64]; /* i assume that the cmgr name never exceeds this length */
|
||||||
int tmout[4];
|
int tmout[4];
|
||||||
} ioattr_t;
|
} ioattr_t;
|
||||||
|
|
||||||
static ioattr_t* get_ioattr (qse_htb_t* tab, const qse_char_t* ptr, qse_size_t len);
|
static ioattr_t* get_ioattr (qse_htb_t* tab, const qse_char_t* ptr, qse_size_t len);
|
||||||
@ -1907,7 +1907,7 @@ qse_awk_rtx_t* qse_awk_rtx_openstd (
|
|||||||
{
|
{
|
||||||
if (qse_htb_init (
|
if (qse_htb_init (
|
||||||
&rxtn->cmgrtab, awk->mmgr, 256, 70,
|
&rxtn->cmgrtab, awk->mmgr, 256, 70,
|
||||||
QSE_SIZEOF(qse_char_t), 0) <= -1)
|
QSE_SIZEOF(qse_char_t), 1) <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_close (rtx);
|
qse_awk_rtx_close (rtx);
|
||||||
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
|
||||||
@ -2133,7 +2133,7 @@ static ioattr_t* get_ioattr (
|
|||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qse_htb_pair_t* find_or_make_ioattr (
|
static ioattr_t* find_or_make_ioattr (
|
||||||
qse_awk_rtx_t* rtx, qse_htb_t* tab, const qse_char_t* ptr, qse_size_t len)
|
qse_awk_rtx_t* rtx, qse_htb_t* tab, const qse_char_t* ptr, qse_size_t len)
|
||||||
{
|
{
|
||||||
qse_htb_pair_t* pair;
|
qse_htb_pair_t* pair;
|
||||||
@ -2152,7 +2152,7 @@ static qse_htb_pair_t* find_or_make_ioattr (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pair;
|
return (ioattr_t*)QSE_HTB_VPTR(pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
@ -2163,7 +2163,6 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
qse_char_t* ptr[3];
|
qse_char_t* ptr[3];
|
||||||
qse_size_t len[3];
|
qse_size_t len[3];
|
||||||
int i, ret = 0, fret = 0;
|
int i, ret = 0, fret = 0;
|
||||||
qse_cmgr_t* cmgr;
|
|
||||||
int tmout;
|
int tmout;
|
||||||
|
|
||||||
rxtn = (rxtn_t*) QSE_XTN (rtx);
|
rxtn = (rxtn_t*) QSE_XTN (rtx);
|
||||||
@ -2199,7 +2198,6 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
|
|
||||||
if ((tmout = timeout_code (ptr[1])) >= 0)
|
if ((tmout = timeout_code (ptr[1])) >= 0)
|
||||||
{
|
{
|
||||||
qse_htb_pair_t* pair;
|
|
||||||
ioattr_t* ioattr;
|
ioattr_t* ioattr;
|
||||||
|
|
||||||
qse_long_t l;
|
qse_long_t l;
|
||||||
@ -2217,21 +2215,20 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
pair = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]);
|
ioattr = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]);
|
||||||
if (pair == QSE_NULL)
|
if (ioattr == QSE_NULL)
|
||||||
{
|
{
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
ioattr = QSE_HTB_VPTR(pair);
|
|
||||||
ioattr->tmout[tmout] = l;
|
ioattr->tmout[tmout] = l;
|
||||||
}
|
}
|
||||||
#if defined(QSE_CHAR_IS_WCHAR)
|
#if defined(QSE_CHAR_IS_WCHAR)
|
||||||
else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0)
|
else if (qse_strcmp (ptr[1], QSE_T("codepage")) == 0)
|
||||||
{
|
{
|
||||||
qse_htb_pair_t* pair;
|
|
||||||
ioattr_t* ioattr;
|
ioattr_t* ioattr;
|
||||||
|
qse_cmgr_t* cmgr;
|
||||||
|
|
||||||
if (ptr[2][0] == QSE_T('\0'))
|
if (ptr[2][0] == QSE_T('\0'))
|
||||||
{
|
{
|
||||||
@ -2247,14 +2244,13 @@ static int fnc_setioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pair = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]);
|
ioattr = find_or_make_ioattr (rtx, &rxtn->cmgrtab, ptr[0], len[0]);
|
||||||
if (pair == QSE_NULL)
|
if (ioattr == QSE_NULL)
|
||||||
{
|
{
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
ioattr = QSE_HTB_VPTR(pair);
|
|
||||||
ioattr->cmgr = cmgr;
|
ioattr->cmgr = cmgr;
|
||||||
qse_strxcpy (ioattr->cmgr_name, QSE_COUNTOF(ioattr->cmgr_name), ptr[2]);
|
qse_strxcpy (ioattr->cmgr_name, QSE_COUNTOF(ioattr->cmgr_name), ptr[2]);
|
||||||
}
|
}
|
||||||
@ -2295,7 +2291,6 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
int tmout;
|
int tmout;
|
||||||
qse_awk_val_t* rv = QSE_NULL;
|
qse_awk_val_t* rv = QSE_NULL;
|
||||||
|
|
||||||
qse_htb_pair_t* pair;
|
|
||||||
ioattr_t* ioattr;
|
ioattr_t* ioattr;
|
||||||
ioattr_t ioattr_buf;
|
ioattr_t ioattr_buf;
|
||||||
|
|
||||||
@ -2326,16 +2321,12 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
if (qse_strxchr (ptr[i], len[i], QSE_T('\0'))) goto done;
|
if (qse_strxchr (ptr[i], len[i], QSE_T('\0'))) goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
pair = qse_htb_search (&rxtn->cmgrtab, ptr[0], len[0]);
|
ioattr = get_ioattr (&rxtn->cmgrtab, ptr[0], len[0]);
|
||||||
if (pair == QSE_NULL)
|
if (ioattr == QSE_NULL)
|
||||||
{
|
{
|
||||||
init_ioattr (&ioattr_buf);
|
init_ioattr (&ioattr_buf);
|
||||||
ioattr = &ioattr_buf;
|
ioattr = &ioattr_buf;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
ioattr = QSE_HTB_VPTR(pair);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((tmout = timeout_code (ptr[1])) >= 0)
|
if ((tmout = timeout_code (ptr[1])) >= 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user