added qse_awk_rtx_openstdwithmbs(), qse_awk_rtx_openstdwithwcs().

added QSE_AWK_PARSESTD_MBS, QSE_AWK_PARSESTD_WCS
This commit is contained in:
hyung-hwan 2019-08-29 08:42:17 +00:00
parent d5320cfd30
commit 74ff72564e
3 changed files with 439 additions and 46 deletions

View File

@ -46,7 +46,10 @@ enum qse_awk_parsestd_type_t
{ {
QSE_AWK_PARSESTD_NULL = 0, /**< pseudo-value to indicate no script */ QSE_AWK_PARSESTD_NULL = 0, /**< pseudo-value to indicate no script */
QSE_AWK_PARSESTD_FILE = 1, /**< file */ QSE_AWK_PARSESTD_FILE = 1, /**< file */
QSE_AWK_PARSESTD_STR = 2 /**< length-bounded string */ QSE_AWK_PARSESTD_STR = 2, /**< length-bounded string */
QSE_AWK_PARSESTD_MBS = 3,
QSE_AWK_PARSESTD_WCS = 4
}; };
typedef enum qse_awk_parsestd_type_t qse_awk_parsestd_type_t; typedef enum qse_awk_parsestd_type_t qse_awk_parsestd_type_t;
@ -86,6 +89,8 @@ struct qse_awk_parsestd_t
* avoid memory leaks. * avoid memory leaks.
*/ */
qse_cstr_t str; qse_cstr_t str;
qse_mcstr_t mbs;
qse_wcstr_t wcs;
} u; } u;
}; };
@ -146,20 +151,41 @@ QSE_EXPORT int qse_awk_parsestd (
); );
/** /**
* The qse_awk_rtx_openstd() function creates a standard runtime context. * The qse_awk_rtx_openstdwithmbs() function creates a standard runtime context.
* The caller should keep the contents of \a icf and \a ocf valid throughout * The caller should keep the contents of \a icf and \a ocf valid throughout
* the lifetime of the runtime context created. The \a cmgr is set to the * the lifetime of the runtime context created. The \a cmgr is set to the
* streams created with \a icf and \a ocf if it is not #QSE_NULL. * streams created with \a icf and \a ocf if it is not #QSE_NULL.
*/ */
QSE_EXPORT qse_awk_rtx_t* qse_awk_rtx_openstd ( QSE_EXPORT qse_awk_rtx_t* qse_awk_rtx_openstdwithmbs (
qse_awk_t* awk, qse_awk_t* awk,
qse_size_t xtnsize, qse_size_t xtnsize,
const qse_char_t* id, const qse_mchar_t* id,
const qse_char_t* icf[], const qse_mchar_t* icf[],
const qse_char_t* ocf[], const qse_mchar_t* ocf[],
qse_cmgr_t* cmgr qse_cmgr_t* cmgr
); );
/**
* The qse_awk_rtx_openstdwithwcs() function creates a standard runtime context.
* The caller should keep the contents of \a icf and \a ocf valid throughout
* the lifetime of the runtime context created. The \a cmgr is set to the
* streams created with \a icf and \a ocf if it is not #QSE_NULL.
*/
QSE_EXPORT qse_awk_rtx_t* qse_awk_rtx_openstdwithwcs (
qse_awk_t* awk,
qse_size_t xtnsize,
const qse_wchar_t* id,
const qse_wchar_t* icf[],
const qse_wchar_t* ocf[],
qse_cmgr_t* cmgr
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_awk_rtx_openstd qse_awk_rtx_openstdwithmbs
#else
# define qse_awk_rtx_openstd qse_awk_rtx_openstdwithwcs
#endif
/** /**
* The qse_awk_rtx_getiocmgrstd() function gets the current character * The qse_awk_rtx_getiocmgrstd() function gets the current character
* manager associated with a particular I/O target indicated by the name * manager associated with a particular I/O target indicated by the name

View File

@ -97,6 +97,16 @@ typedef struct xtn_t
const qse_char_t* ptr; const qse_char_t* ptr;
const qse_char_t* end; const qse_char_t* end;
} str; } str;
struct
{
const qse_mchar_t* ptr;
const qse_mchar_t* end;
} mbs;
struct
{
const qse_wchar_t* ptr;
const qse_wchar_t* end;
} wcs;
} u; } u;
} in; } in;
@ -113,6 +123,14 @@ typedef struct xtn_t
{ {
qse_str_t* buf; qse_str_t* buf;
} str; } str;
struct
{
qse_mbs_t* buf;
} mbs;
struct
{
qse_wcs_t* buf;
} wcs;
} u; } u;
} out; } out;
} s; /* script/source handling */ } s; /* script/source handling */
@ -671,6 +689,22 @@ static int open_parsestd (qse_awk_t* awk, qse_awk_sio_arg_t* arg, xtn_t* xtn, qs
xtn->s.in.u.str.end = psin->u.str.ptr + psin->u.str.len; xtn->s.in.u.str.end = psin->u.str.ptr + psin->u.str.len;
return 0; return 0;
case QSE_AWK_PARSESTD_MBS:
if (index >= 1 && xtn->s.in.x[index-1].type == QSE_AWK_PARSESTD_FILE)
qse_sio_close (arg->handle);
xtn->s.in.u.mbs.ptr = psin->u.mbs.ptr;
xtn->s.in.u.mbs.end = psin->u.mbs.ptr + psin->u.mbs.len;
return 0;
case QSE_AWK_PARSESTD_WCS:
if (index >= 1 && xtn->s.in.x[index-1].type == QSE_AWK_PARSESTD_FILE)
qse_sio_close (arg->handle);
xtn->s.in.u.wcs.ptr = psin->u.wcs.ptr;
xtn->s.in.u.wcs.end = psin->u.wcs.ptr + psin->u.wcs.len;
return 0;
default: default:
qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL);
return -1; return -1;
@ -788,6 +822,8 @@ static qse_ssize_t sf_in_close (qse_awk_t* awk, qse_awk_sio_arg_t* arg, xtn_t* x
break; break;
case QSE_AWK_PARSESTD_STR: case QSE_AWK_PARSESTD_STR:
case QSE_AWK_PARSESTD_MBS:
case QSE_AWK_PARSESTD_WCS:
/* nothing to close */ /* nothing to close */
break; break;
@ -831,6 +867,7 @@ static qse_ssize_t sf_in_read (qse_awk_t* awk, qse_awk_sio_arg_t* arg, qse_char_
break; break;
case QSE_AWK_PARSESTD_STR: case QSE_AWK_PARSESTD_STR:
parsestd_str:
n = 0; n = 0;
while (n < size && xtn->s.in.u.str.ptr < xtn->s.in.u.str.end) while (n < size && xtn->s.in.u.str.ptr < xtn->s.in.u.str.end)
{ {
@ -838,6 +875,54 @@ static qse_ssize_t sf_in_read (qse_awk_t* awk, qse_awk_sio_arg_t* arg, qse_char_
} }
break; break;
case QSE_AWK_PARSESTD_MBS:
#if defined(QSE_CHAR_IS_MCHAR)
goto parsestd_str;
#else
{
int m;
qse_size_t mbslen, wcslen;
mbslen = xtn->s.in.u.mbs.end - xtn->s.in.u.mbs.ptr;
wcslen = size;
if ((m = qse_mbsntowcsnwithcmgr(xtn->s.in.u.mbs.ptr, &mbslen, data, &wcslen, qse_awk_getcmgr(awk))) <= -1 && m != -2)
{
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
n = -1;
}
else
{
xtn->s.in.u.mbs.ptr += mbslen;
n = wcslen;
}
break;
}
#endif
case QSE_AWK_PARSESTD_WCS:
#if defined(QSE_CHAR_IS_MCHAR)
{
int m;
qse_size_t mbslen, wcslen;
wcslen = xtn->s.in.u.wcs.end - xtn->s.in.u.wcs.ptr;
mbslen = size;
if ((m = qse_wcsntombsnwithcmgr(xtn->s.in.u.wcs.ptr, &wcslen, data, &mbslen, qse_awk_getcmgr(awk))) <= -1 && m != -2)
{
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
n = -1;
}
else
{
xtn->s.in.u.wcs.ptr += wcslen;
n = mbslen;
}
break;
}
#else
goto parsestd_str;
#endif
default: default:
/* this should never happen */ /* this should never happen */
qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL);
@ -902,13 +987,13 @@ static qse_ssize_t sf_in (qse_awk_t* awk, qse_awk_sio_cmd_t cmd, qse_awk_sio_arg
switch (cmd) switch (cmd)
{ {
case QSE_AWK_SIO_OPEN: case QSE_AWK_SIO_OPEN:
return sf_in_open (awk, arg, xtn); return sf_in_open(awk, arg, xtn);
case QSE_AWK_SIO_CLOSE: case QSE_AWK_SIO_CLOSE:
return sf_in_close (awk, arg, xtn); return sf_in_close(awk, arg, xtn);
case QSE_AWK_SIO_READ: case QSE_AWK_SIO_READ:
return sf_in_read (awk, arg, data, size, xtn); return sf_in_read(awk, arg, data, size, xtn);
default: default:
qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL);
@ -953,13 +1038,30 @@ static qse_ssize_t sf_out (qse_awk_t* awk, qse_awk_sio_cmd_t cmd, qse_awk_sio_ar
return 1; return 1;
case QSE_AWK_PARSESTD_STR: case QSE_AWK_PARSESTD_STR:
xtn->s.out.u.str.buf = qse_str_open (qse_awk_getmmgr(awk), 0, 512); xtn->s.out.u.str.buf = qse_str_open(qse_awk_getmmgr(awk), 0, 512);
if (xtn->s.out.u.str.buf == QSE_NULL) if (xtn->s.out.u.str.buf == QSE_NULL)
{ {
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1; return -1;
} }
return 1;
case QSE_AWK_PARSESTD_MBS:
xtn->s.out.u.mbs.buf = qse_mbs_open(qse_awk_getmmgr(awk), 0, 512);
if (xtn->s.out.u.mbs.buf == QSE_NULL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
return 1;
case QSE_AWK_PARSESTD_WCS:
xtn->s.out.u.wcs.buf = qse_wcs_open(qse_awk_getmmgr(awk), 0, 512);
if (xtn->s.out.u.wcs.buf == QSE_NULL)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
return 1; return 1;
} }
@ -976,6 +1078,8 @@ static qse_ssize_t sf_out (qse_awk_t* awk, qse_awk_sio_cmd_t cmd, qse_awk_sio_ar
return 0; return 0;
case QSE_AWK_PARSESTD_STR: case QSE_AWK_PARSESTD_STR:
case QSE_AWK_PARSESTD_MBS:
case QSE_AWK_PARSESTD_WCS:
/* i don't close xtn->s.out.u.str.buf intentionally here. /* i don't close xtn->s.out.u.str.buf intentionally here.
* it will be closed at the end of qse_awk_parsestd() */ * it will be closed at the end of qse_awk_parsestd() */
return 0; return 0;
@ -1005,15 +1109,78 @@ static qse_ssize_t sf_out (qse_awk_t* awk, qse_awk_sio_cmd_t cmd, qse_awk_sio_ar
} }
case QSE_AWK_PARSESTD_STR: case QSE_AWK_PARSESTD_STR:
{ parsestd_str:
if (size > QSE_TYPE_MAX(qse_ssize_t)) size = QSE_TYPE_MAX(qse_ssize_t); 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) if (qse_str_ncat(xtn->s.out.u.str.buf, data, size) == (qse_size_t)-1)
{ {
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1; return -1;
} }
return size; return size;
case QSE_AWK_PARSESTD_MBS:
#if defined(QSE_CHAR_IS_MCHAR)
goto parsestd_str;
#else
{
qse_size_t mbslen, wcslen;
qse_size_t orglen;
wcslen = size;
if (qse_wcsntombsnwithcmgr(data, &wcslen, QSE_NULL, &mbslen, qse_awk_getcmgr(awk)) <= -1)
{
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
return -1;
}
if (mbslen > QSE_TYPE_MAX(qse_ssize_t)) mbslen = QSE_TYPE_MAX(qse_ssize_t);
orglen = qse_mbs_getlen(xtn->s.out.u.mbs.buf);
if (qse_mbs_setlen(xtn->s.out.u.mbs.buf, orglen + mbslen) == (qse_size_t)-1)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
wcslen = size;
qse_wcsntombsnwithcmgr(data, &wcslen, QSE_MBS_CPTR(xtn->s.out.u.mbs.buf, orglen), &mbslen, qse_awk_getcmgr(awk));
size = wcslen;
return size;
} }
#endif
case QSE_AWK_PARSESTD_WCS:
#if defined(QSE_CHAR_IS_MCHAR)
{
qse_size_t mbslen, wcslen;
qse_size_t orglen;
mbslen = size;
if (qse_mbsntowcsnwithcmgr(data, &mbslen, QSE_NULL, &wcslen, qse_awk_getcmgr(awk)) <= -1)
{
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
return -1;
}
if (wcslen > QSE_TYPE_MAX(qse_ssize_t)) wcslen = QSE_TYPE_MAX(qse_ssize_t);
orglen = qse_mbs_getlen(xtn->s.out.u.wcs.buf);
if (qse_wcs_setlen(xtn->s.out.u.wcs.buf, orglen + wcslen) == (qse_size_t)-1)
{
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
mbslen = size;
qse_mbsntowcsnwithcmgr(data, &mbslen, QSE_MBS_CPTR(xtn->s.out.u.wcs.buf, orglen), &wcslen, qse_awk_getcmgr(awk));
size = mbslen;
return size;
}
#else
goto parsestd_str;
#endif
} }
break; break;
@ -1035,7 +1202,9 @@ int qse_awk_parsestd (qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_
int n; int n;
if (in == QSE_NULL || (in[0].type != QSE_AWK_PARSESTD_FILE && if (in == QSE_NULL || (in[0].type != QSE_AWK_PARSESTD_FILE &&
in[0].type != QSE_AWK_PARSESTD_STR)) in[0].type != QSE_AWK_PARSESTD_STR &&
in[0].type != QSE_AWK_PARSESTD_MBS &&
in[0].type != QSE_AWK_PARSESTD_WCS))
{ {
/* the input is a must. at least 1 file or 1 string /* the input is a must. at least 1 file or 1 string
* must be specified */ * must be specified */
@ -1050,7 +1219,9 @@ int qse_awk_parsestd (qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_
else else
{ {
if (out->type != QSE_AWK_PARSESTD_FILE && if (out->type != QSE_AWK_PARSESTD_FILE &&
out->type != QSE_AWK_PARSESTD_STR) out->type != QSE_AWK_PARSESTD_STR &&
out->type != QSE_AWK_PARSESTD_MBS &&
out->type != QSE_AWK_PARSESTD_WCS)
{ {
qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_EINVAL, QSE_NULL);
return -1; return -1;
@ -1059,16 +1230,39 @@ int qse_awk_parsestd (qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_
xtn->s.out.x = out; xtn->s.out.x = out;
} }
n = qse_awk_parse (awk, &sio); n = qse_awk_parse(awk, &sio);
if (out && out->type == QSE_AWK_PARSESTD_STR) if (out)
{ {
if (n >= 0) switch (out->type)
{ {
QSE_ASSERT (xtn->s.out.u.str.buf != QSE_NULL); case QSE_AWK_PARSESTD_STR:
qse_str_yield (xtn->s.out.u.str.buf, &out->u.str, 0); if (n >= 0)
{
QSE_ASSERT (xtn->s.out.u.str.buf != QSE_NULL);
qse_str_yield (xtn->s.out.u.str.buf, &out->u.str, 0);
}
if (xtn->s.out.u.str.buf) qse_str_close (xtn->s.out.u.str.buf);
break;
case QSE_AWK_PARSESTD_MBS:
if (n >= 0)
{
QSE_ASSERT (xtn->s.out.u.mbs.buf != QSE_NULL);
qse_mbs_yield (xtn->s.out.u.mbs.buf, &out->u.mbs, 0);
}
if (xtn->s.out.u.mbs.buf) qse_mbs_close (xtn->s.out.u.mbs.buf);
break;
case QSE_AWK_PARSESTD_WCS:
if (n >= 0)
{
QSE_ASSERT (xtn->s.out.u.wcs.buf != QSE_NULL);
qse_wcs_yield (xtn->s.out.u.wcs.buf, &out->u.wcs, 0);
}
if (xtn->s.out.u.wcs.buf) qse_wcs_close (xtn->s.out.u.wcs.buf);
break;
} }
if (xtn->s.out.u.str.buf) qse_str_close (xtn->s.out.u.str.buf);
} }
return n; return n;
@ -1959,7 +2153,7 @@ static int make_additional_globals (
return 0; return 0;
} }
qse_awk_rtx_t* qse_awk_rtx_openstd ( static qse_awk_rtx_t* open_rtx_std (
qse_awk_t* awk, qse_awk_t* awk,
qse_size_t xtnsize, qse_size_t xtnsize,
const qse_char_t* id, const qse_char_t* id,
@ -2022,7 +2216,7 @@ qse_awk_rtx_t* qse_awk_rtx_openstd (
*/ */
if (ocf && ocf[0]) if (ocf && ocf[0])
{ {
if (qse_awk_rtx_setofilename (rtx, ocf[0], qse_strlen(ocf[0])) <= -1) if (qse_awk_rtx_setofilename(rtx, ocf[0], qse_strlen(ocf[0])) <= -1)
{ {
awk->errinf = rtx->errinf; /* transfer error info */ awk->errinf = rtx->errinf; /* transfer error info */
qse_awk_rtx_close (rtx); qse_awk_rtx_close (rtx);
@ -2030,7 +2224,7 @@ qse_awk_rtx_t* qse_awk_rtx_openstd (
} }
} }
if (make_additional_globals (rtx, xtn, id, icf) <= -1) if (make_additional_globals(rtx, xtn, id, icf) <= -1)
{ {
awk->errinf = rtx->errinf; /* transfer error info */ awk->errinf = rtx->errinf; /* transfer error info */
qse_awk_rtx_close (rtx); qse_awk_rtx_close (rtx);
@ -2040,12 +2234,147 @@ qse_awk_rtx_t* qse_awk_rtx_openstd (
return rtx; return rtx;
} }
qse_awk_rtx_t* qse_awk_rtx_openstdwithmbs (
qse_awk_t* awk,
qse_size_t xtnsize,
const qse_mchar_t* id,
const qse_mchar_t* icf[],
const qse_mchar_t* ocf[],
qse_cmgr_t* cmgr)
{
#if defined(QSE_CHAR_IS_MCHAR)
return open_rtx_std(awk, xtnsize, id, icf, ocf, cmgr);
#else
qse_awk_rtx_t* rtx = QSE_NULL;
qse_size_t wcslen, i;
qse_wchar_t* wid = QSE_NULL, ** wicf = QSE_NULL, ** wocf = QSE_NULL;
wid = qse_awk_mbstowcsdup(awk, id, &wcslen);
if (!wid) return QSE_NULL;
if (icf)
{
for (i = 0; icf[i]; i++) ;
wicf = (qse_wchar_t**)qse_awk_callocmem(awk, QSE_SIZEOF(*wicf) * (i + 1));
if (!wicf) goto done;
for (i = 0; icf[i]; i++)
{
wicf[i] = qse_awk_mbstowcsdup(awk, icf[i], &wcslen);
if (!wicf[i]) goto done;
}
wicf[i] = QSE_NULL;
}
if (ocf)
{
for (i = 0; ocf[i]; i++) ;
wocf = (qse_wchar_t**)qse_awk_callocmem(awk, QSE_SIZEOF(*wocf) * (i + 1));
if (!wocf) goto done;
for (i = 0; ocf[i]; i++)
{
wocf[i] = qse_awk_mbstowcsdup(awk, ocf[i], &wcslen);
if (!wocf[i]) goto done;
}
wocf[i] = QSE_NULL;
}
rtx = open_rtx_std(awk, xtnsize, wid, (const qse_wchar_t**)wicf, (const qse_wchar_t**)wocf, cmgr);
done:
if (wocf)
{
for (i = 0; wocf[i]; i++) qse_awk_freemem (awk, wocf[i]);
qse_awk_freemem (awk, wocf);
}
if (wicf)
{
for (i = 0; wicf[i]; i++) qse_awk_freemem (awk, wicf[i]);
qse_awk_freemem (awk, wicf);
}
if (wid) qse_awk_freemem (awk, wid);
return rtx;
#endif
}
qse_awk_rtx_t* qse_awk_rtx_openstdwithwcs (
qse_awk_t* awk,
qse_size_t xtnsize,
const qse_wchar_t* id,
const qse_wchar_t* icf[],
const qse_wchar_t* ocf[],
qse_cmgr_t* cmgr)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_rtx_t* rtx = QSE_NULL;
qse_size_t mbslen, i;
qse_mchar_t* mid = QSE_NULL, ** micf = QSE_NULL, ** mocf = QSE_NULL;
mid = qse_awk_wcstombsdup(awk, id, &mbslen);
if (!mid) return QSE_NULL;
if (icf)
{
for (i = 0; icf[i]; i++) ;
micf = (qse_mchar_t**)qse_awk_callocmem(awk, QSE_SIZEOF(*micf) * (i + 1));
if (!micf) goto done;
for (i = 0; icf[i]; i++)
{
micf[i] = qse_awk_wcstombsdup(awk, icf[i], &mbslen);
if (!micf[i]) goto done;
}
micf[i] = QSE_NULL;
}
if (ocf)
{
for (i = 0; ocf[i]; i++) ;
mocf = (qse_wchar_t**)qse_awk_callocmem(awk, QSE_SIZEOF(*mocf) * (i + 1));
if (!mocf) goto done;
for (i = 0; ocf[i]; i++)
{
mocf[i] = qse_awk_wcstombsdup(awk, ocf[i], &mbslen);
if (!mocf[i]) goto done;
}
mocf[i] = QSE_NULL;
}
rtx = open_rtx_std(awk, xtnsize, mid, (const qse_mchar_t**)micf, (const qse_mchar_t**)mocf, cmgr);
done:
if (mocf)
{
for (i = 0; mocf[i]; i++) qse_awk_freemem (awk, mocf[i]);
qse_awk_freemem (awk, mocf);
}
if (micf)
{
for (i = 0; micf[i]; i++) qse_awk_freemem (awk, micf[i]);
qse_awk_freemem (awk, micf);
}
if (mid) qse_awk_freemem (awk, mid);
return rtx;
#else
return open_rtx_std(awk, xtnsize, id, icf, ocf, cmgr);
#endif
}
static int timeout_code (const qse_char_t* name) static int timeout_code (const qse_char_t* name)
{ {
if (qse_strcasecmp (name, QSE_T("rtimeout")) == 0) return 0; if (qse_strcasecmp(name, QSE_T("rtimeout")) == 0) return 0;
if (qse_strcasecmp (name, QSE_T("wtimeout")) == 0) return 1; if (qse_strcasecmp(name, QSE_T("wtimeout")) == 0) return 1;
if (qse_strcasecmp (name, QSE_T("ctimeout")) == 0) return 2; if (qse_strcasecmp(name, QSE_T("ctimeout")) == 0) return 2;
if (qse_strcasecmp (name, QSE_T("atimeout")) == 0) return 3; if (qse_strcasecmp(name, QSE_T("atimeout")) == 0) return 3;
return -1; return -1;
} }

View File

@ -27,6 +27,8 @@
#include <qse/awk/awk.h> #include <qse/awk/awk.h>
#include <qse/awk/stdawk.h> #include <qse/awk/stdawk.h>
#include <qse/cmn/mem.h> #include <qse/cmn/mem.h>
#include <qse/cmn/path.h>
#include <qse/cmn/str.h>
#include <qse/si/sio.h> #include <qse/si/sio.h>
static const qse_char_t* src = QSE_T( static const qse_char_t* src = QSE_T(
@ -40,7 +42,7 @@ static const qse_char_t* src = QSE_T(
"}" "}"
); );
int main () int main (int argc, char* argv[])
{ {
qse_awk_t* awk = QSE_NULL; qse_awk_t* awk = QSE_NULL;
qse_awk_rtx_t* rtx = QSE_NULL; qse_awk_rtx_t* rtx = QSE_NULL;
@ -49,11 +51,23 @@ int main ()
qse_awk_parsestd_t psin[2]; qse_awk_parsestd_t psin[2];
qse_awk_parsestd_t psout; qse_awk_parsestd_t psout;
int ret; int ret, omode = 0;
qse_open_stdsios (); qse_open_stdsios ();
awk = qse_awk_openstd (0, QSE_NULL); if (argc >= 2)
{
if (argc == 2 && qse_mbscmp(argv[1], "-m") == 0) omode = 1;
else if (argc == 2 && qse_mbscmp(argv[1], "-w") == 0) omode = 2;
else
{
qse_fprintf (QSE_STDERR, QSE_T("USAGE: %hs [-m | -w]\n"), qse_basenameasmbs(argv[0]));
ret = -1; goto oops;
}
}
awk = qse_awk_openstd(0, QSE_NULL);
if (awk == QSE_NULL) if (awk == QSE_NULL)
{ {
qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n")); qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n"));
@ -65,44 +79,68 @@ int main ()
psin[0].u.str.len = qse_strlen(src); psin[0].u.str.len = qse_strlen(src);
psin[1].type = QSE_AWK_PARSESTD_NULL; psin[1].type = QSE_AWK_PARSESTD_NULL;
psout.type = QSE_AWK_PARSESTD_STR; switch (omode)
{
case 1:
psout.type = QSE_AWK_PARSESTD_MBS;
break;
case 2:
psout.type = QSE_AWK_PARSESTD_WCS;
break;
default:
psout.type = QSE_AWK_PARSESTD_STR;
break;
/* ps.out.u.str.ptr and ps.out.u.str.len are set when qse_awk_parsestd() /* ps.out.u.str.ptr and ps.out.u.str.len are set when qse_awk_parsestd()
* returns success */ * returns success */
}
ret = qse_awk_parsestd (awk, psin, &psout); ret = qse_awk_parsestd(awk, psin, &psout);
if (ret <= -1) if (ret <= -1)
{ {
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_geterrmsg(awk));
qse_awk_geterrmsg(awk));
ret = -1; goto oops; ret = -1; goto oops;
} }
qse_printf (QSE_T("DEPARSED SOURCE:\n%s\n"), psout.u.str.ptr); qse_printf (QSE_T("DEPARSED SOURCE:\n"));
switch (omode)
{
case 1:
qse_printf (QSE_T("%hs\n"), psout.u.mbs.ptr);
qse_awk_freemem (awk, psout.u.mbs.ptr);
break;
case 2:
qse_printf (QSE_T("%ls\n"), psout.u.wcs.ptr);
qse_awk_freemem (awk, psout.u.wcs.ptr);
break;
default:
qse_printf (QSE_T("%js\n"), psout.u.str.ptr);
qse_awk_freemem (awk, psout.u.str.ptr);
break;
}
qse_printf (QSE_T("=================================\n")); qse_printf (QSE_T("=================================\n"));
qse_fflush (QSE_STDOUT); qse_fflush (QSE_STDOUT);
QSE_MMGR_FREE (qse_awk_getmmgr(awk), psout.u.str.ptr);
rtx = qse_awk_rtx_openstd ( rtx = qse_awk_rtx_openstd (
awk, awk,
0, 0,
QSE_T("awk02"), QSE_T("awk15"),
QSE_NULL, /* stdin */ QSE_NULL, /* stdin */
QSE_NULL, /* stdout */ QSE_NULL, /* stdout */
QSE_NULL /* default cmgr */ QSE_NULL /* default cmgr */
); );
if (rtx == QSE_NULL) if (rtx == QSE_NULL)
{ {
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_geterrmsg(awk));
qse_awk_geterrmsg(awk));
ret = -1; goto oops; ret = -1; goto oops;
} }
retv = qse_awk_rtx_loop (rtx); retv = qse_awk_rtx_loop(rtx);
if (retv == QSE_NULL) if (retv == QSE_NULL)
{ {
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_rtx_geterrmsg(rtx));
qse_awk_rtx_geterrmsg(rtx));
ret = -1; goto oops; ret = -1; goto oops;
} }