From 74ff72564e9049204b6ab80af1a458693da84f53 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 29 Aug 2019 08:42:17 +0000 Subject: [PATCH] added qse_awk_rtx_openstdwithmbs(), qse_awk_rtx_openstdwithwcs(). added QSE_AWK_PARSESTD_MBS, QSE_AWK_PARSESTD_WCS --- qse/include/qse/awk/stdawk.h | 44 ++++- qse/lib/awk/std.c | 371 +++++++++++++++++++++++++++++++++-- qse/samples/awk/awk15.c | 70 +++++-- 3 files changed, 439 insertions(+), 46 deletions(-) diff --git a/qse/include/qse/awk/stdawk.h b/qse/include/qse/awk/stdawk.h index e918260a..4e1fadd2 100644 --- a/qse/include/qse/awk/stdawk.h +++ b/qse/include/qse/awk/stdawk.h @@ -46,7 +46,10 @@ enum qse_awk_parsestd_type_t { QSE_AWK_PARSESTD_NULL = 0, /**< pseudo-value to indicate no script */ 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; @@ -86,6 +89,8 @@ struct qse_awk_parsestd_t * avoid memory leaks. */ qse_cstr_t str; + qse_mcstr_t mbs; + qse_wcstr_t wcs; } 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 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_openstd ( - qse_awk_t* awk, - qse_size_t xtnsize, - const qse_char_t* id, - const qse_char_t* icf[], - const qse_char_t* ocf[], - qse_cmgr_t* cmgr +QSE_EXPORT 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 ); +/** + * 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 * manager associated with a particular I/O target indicated by the name diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 2d7e1154..5e1317d2 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -97,6 +97,16 @@ typedef struct xtn_t const qse_char_t* ptr; const qse_char_t* end; } 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; } in; @@ -113,6 +123,14 @@ typedef struct xtn_t { qse_str_t* buf; } str; + struct + { + qse_mbs_t* buf; + } mbs; + struct + { + qse_wcs_t* buf; + } wcs; } u; } out; } 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; 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: qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL); 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; case QSE_AWK_PARSESTD_STR: + case QSE_AWK_PARSESTD_MBS: + case QSE_AWK_PARSESTD_WCS: /* nothing to close */ 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; case QSE_AWK_PARSESTD_STR: + parsestd_str: n = 0; 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; + 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: /* this should never happen */ 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) { case QSE_AWK_SIO_OPEN: - return sf_in_open (awk, arg, xtn); + return sf_in_open(awk, arg, xtn); case QSE_AWK_SIO_CLOSE: - return sf_in_close (awk, arg, xtn); + return sf_in_close(awk, arg, xtn); case QSE_AWK_SIO_READ: - return sf_in_read (awk, arg, data, size, xtn); + return sf_in_read(awk, arg, data, size, xtn); default: 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; 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) { qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); 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; } @@ -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; 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. * it will be closed at the end of qse_awk_parsestd() */ 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: - { + parsestd_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) + 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); return -1; } 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; @@ -1035,7 +1202,9 @@ int qse_awk_parsestd (qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_ int n; 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 * must be specified */ @@ -1050,7 +1219,9 @@ int qse_awk_parsestd (qse_awk_t* awk, qse_awk_parsestd_t in[], qse_awk_parsestd_ else { 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); 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; } - 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); - qse_str_yield (xtn->s.out.u.str.buf, &out->u.str, 0); + case QSE_AWK_PARSESTD_STR: + 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; @@ -1959,7 +2153,7 @@ static int make_additional_globals ( return 0; } -qse_awk_rtx_t* qse_awk_rtx_openstd ( +static qse_awk_rtx_t* open_rtx_std ( qse_awk_t* awk, qse_size_t xtnsize, const qse_char_t* id, @@ -2022,7 +2216,7 @@ qse_awk_rtx_t* qse_awk_rtx_openstd ( */ 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 */ 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 */ qse_awk_rtx_close (rtx); @@ -2040,12 +2234,147 @@ qse_awk_rtx_t* qse_awk_rtx_openstd ( 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) { - 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("ctimeout")) == 0) return 2; - if (qse_strcasecmp (name, QSE_T("atimeout")) == 0) return 3; + 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("ctimeout")) == 0) return 2; + if (qse_strcasecmp(name, QSE_T("atimeout")) == 0) return 3; return -1; } diff --git a/qse/samples/awk/awk15.c b/qse/samples/awk/awk15.c index a11d215e..0e7f425f 100644 --- a/qse/samples/awk/awk15.c +++ b/qse/samples/awk/awk15.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include 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_rtx_t* rtx = QSE_NULL; @@ -49,11 +51,23 @@ int main () qse_awk_parsestd_t psin[2]; qse_awk_parsestd_t psout; - int ret; + int ret, omode = 0; 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) { 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[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() * returns success */ + } - ret = qse_awk_parsestd (awk, psin, &psout); + ret = qse_awk_parsestd(awk, psin, &psout); if (ret <= -1) { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), - qse_awk_geterrmsg(awk)); + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_geterrmsg(awk)); 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_fflush (QSE_STDOUT); - QSE_MMGR_FREE (qse_awk_getmmgr(awk), psout.u.str.ptr); - rtx = qse_awk_rtx_openstd ( awk, 0, - QSE_T("awk02"), + QSE_T("awk15"), QSE_NULL, /* stdin */ QSE_NULL, /* stdout */ QSE_NULL /* default cmgr */ ); if (rtx == QSE_NULL) { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), - qse_awk_geterrmsg(awk)); + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_geterrmsg(awk)); ret = -1; goto oops; } - retv = qse_awk_rtx_loop (rtx); + retv = qse_awk_rtx_loop(rtx); if (retv == QSE_NULL) { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), - qse_awk_rtx_geterrmsg(rtx)); + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), qse_awk_rtx_geterrmsg(rtx)); ret = -1; goto oops; }