added qse_awk_rtx_openstdwithmbs(), qse_awk_rtx_openstdwithwcs().
added QSE_AWK_PARSESTD_MBS, QSE_AWK_PARSESTD_WCS
This commit is contained in:
parent
d5320cfd30
commit
74ff72564e
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user