added qse_awk_rtx_setprm().

changed some module functions to use referenced argument
This commit is contained in:
hyung-hwan 2013-01-05 14:38:30 +00:00
parent db32de0ceb
commit d9f961c6c3
6 changed files with 124 additions and 79 deletions

View File

@ -1454,10 +1454,22 @@ QSE_EXPORT void* qse_awk_getxtn (
);
/**
* The qse_awk_getprm() function gets primitive functions
* The qse_awk_getprm() function retrieves primitive functions
* associated. Actual function pointers are copied into a
* structure specified by @a prm.
*/
QSE_EXPORT qse_awk_prm_t* qse_awk_getprm (
qse_awk_t* awk
QSE_EXPORT void qse_awk_getprm (
qse_awk_t* awk,
qse_awk_prm_t* prm
);
/**
* The qse_awk_setprm() function changes existing primitive
* functions.
*/
QSE_EXPORT void qse_awk_setprm (
qse_awk_t* awk,
const qse_awk_prm_t* prm
);
/**

View File

@ -424,9 +424,14 @@ void* qse_awk_getxtn (qse_awk_t* awk)
return QSE_XTN (awk);
}
qse_awk_prm_t* qse_awk_getprm (qse_awk_t* awk)
void qse_awk_getprm (qse_awk_t* awk, qse_awk_prm_t* prm)
{
return &awk->prm;
*prm = awk->prm;
}
void qse_awk_setprm (qse_awk_t* awk, const qse_awk_prm_t* prm)
{
awk->prm = *prm;
}
int qse_awk_setopt (qse_awk_t* awk, qse_awk_opt_t id, const void* value)

View File

@ -755,9 +755,6 @@ qse_awk_rtx_t* qse_awk_rtx_open (
qse_awk_rtx_t* rtx;
struct module_init_ctx_t mic;
QSE_ASSERTX (awk->prm.math.pow != QSE_NULL, "Call qse_awk_setprm() first");
QSE_ASSERTX (awk->prm.sprintf != QSE_NULL, "Call qse_awk_setprm() first");
/* clear the awk error code */
qse_awk_seterrnum (awk, QSE_AWK_ENOERR, QSE_NULL);
@ -4732,9 +4729,6 @@ static qse_awk_val_t* eval_binop_exp (
qse_flt_t r1, r2;
qse_awk_val_t* res;
QSE_ASSERTX (rtx->awk->prm.math.pow != QSE_NULL,
"the pow function must be provided when the awk object is created to make exponentiation work properly.");
n1 = qse_awk_rtx_valtonum (rtx, left, &l1, &r1);
n2 = qse_awk_rtx_valtonum (rtx, right, &l2, &r2);

View File

@ -281,11 +281,11 @@ static int read_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_long_t id, qse_a
if (!tmp || qse_awk_rtx_setrefval (rtx, ref, tmp) <= -1)
{
list->errnum = awk_err_to_errnum (qse_awk_rtx_geterrnum (rtx));
if (tmp) qse_awk_rtx_freemem (rtx, tmp);
if (tmp) qse_awk_rtx_freeval (rtx, tmp);
return -1;
}
return 1;
return 0;
}
else
{
@ -356,9 +356,10 @@ static int fnc_dir_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
dir_list_t* list;
dir_node_t* node;
dir_node_t* node = QSE_NULL;
qse_long_t ret;
qse_char_t* path;
qse_awk_val_t* retv;
list = rtx_to_list (rtx, fi);
@ -376,7 +377,16 @@ static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
ret = -1;
}
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval (rtx, ret));
/* ret may not be a statically managed number.
* error checking is required */
retv = qse_awk_rtx_makeintval (rtx, ret);
if (retv == QSE_NULL)
{
if (node) free_dir_node (rtx, list, node);
return -1;
}
qse_awk_rtx_setretval (rtx, retv);
return 0;
}

View File

@ -498,6 +498,7 @@ static int fnc_getnwifcfg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
qse_nwifcfg_t cfg;
qse_awk_rtx_valtostr_out_t out;
int ret = -1;
out.type = QSE_AWK_RTX_VALTOSTR_CPLCPY;
out.u.cplcpy.ptr = cfg.name;
@ -520,7 +521,7 @@ static int fnc_getnwifcfg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
qse_char_t mask[128];
qse_char_t ethw[32];
qse_awk_val_map_data_t md[7];
qse_awk_val_t* retv;
qse_awk_val_t* tmp;
QSE_MEMSET (md, 0, QSE_SIZEOF(md));
@ -563,14 +564,19 @@ static int fnc_getnwifcfg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
md[5].vptr = (cfg.flags & QSE_NWIFCFG_LINKUP)? QSE_T("up"): QSE_T("down");
}
retv = qse_awk_rtx_makemapvalwithdata (rtx, md);
if (retv == QSE_NULL) return -1;
qse_awk_rtx_setretval (rtx, retv);
tmp = qse_awk_rtx_makemapvalwithdata (rtx, md);
if (tmp)
{
if (qse_awk_rtx_setrefval (rtx, qse_awk_rtx_getarg (rtx, 2), tmp) <= -1)
qse_awk_rtx_freeval (rtx, tmp);
else ret = 0;
}
}
}
}
/* no error check for qse_awk_rtx_makeintval() since ret is 0 or -1 */
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval (rtx, ret));
return 0;
}
@ -597,7 +603,7 @@ static fnctab_t fnctab[] =
{ QSE_T("getenv"), { { 1, 1, QSE_NULL }, fnc_getenv, 0 } },
{ QSE_T("geteuid"), { { 0, 0, QSE_NULL }, fnc_geteuid, 0 } },
{ QSE_T("getgid"), { { 0, 0, QSE_NULL }, fnc_getgid, 0 } },
{ QSE_T("getnwifcfg"), { { 2, 2, QSE_NULL }, fnc_getnwifcfg, 0 } },
{ QSE_T("getnwifcfg"), { { 3, 3, QSE_T("vvr") }, fnc_getnwifcfg, 0 } },
{ QSE_T("getpgrp"), { { 0, 0, QSE_NULL }, fnc_getpgrp, 0 } },
{ QSE_T("getpid"), { { 0, 0, QSE_NULL }, fnc_getpid, 0 } },
{ QSE_T("getppid"), { { 0, 0, QSE_NULL }, fnc_getppid, 0 } },

View File

@ -426,7 +426,7 @@ static int adddeltapath_byid (
static int getsection_byid (
qse_awk_rtx_t* rtx, uctx_list_t* list, qse_long_t id,
qse_mchar_t* tuple, qse_awk_val_t** retv)
qse_mchar_t* tuple, qse_awk_val_ref_t* ref)
{
int x = UCI_ERR_INVAL;
@ -469,7 +469,14 @@ static int getsection_byid (
md[2].vptr = &lv;
tmp = qse_awk_rtx_makemapvalwithdata (rtx, md);
if (tmp) *retv = tmp;
if (tmp)
{
if (qse_awk_rtx_setrefval (rtx, ref, tmp) <= -1)
{
qse_awk_rtx_freeval (rtx, tmp);
x = UCI_ERR_MEM;
}
}
else x = UCI_ERR_MEM;
}
else x = UCI_ERR_NOTFOUND;
@ -484,7 +491,7 @@ static int getsection_byid (
static int getoption_byid (
qse_awk_rtx_t* rtx, uctx_list_t* list, qse_long_t id,
qse_mchar_t* tuple, qse_awk_val_t** retv)
qse_mchar_t* tuple, qse_awk_val_ref_t* ref)
{
int x = UCI_ERR_INVAL;
@ -524,7 +531,15 @@ static int getoption_byid (
md[1].vptr = uo->v.string;
map = qse_awk_rtx_makemapvalwithdata (rtx, md);
if (map) *retv = map;
if (map)
{
if (qse_awk_rtx_setrefval (rtx, ref, map) <= -1)
{
qse_awk_rtx_freeval (rtx, map);
map = QSE_NULL;
x = UCI_ERR_MEM;
}
}
else x = UCI_ERR_MEM;
}
else if (uo->type == UCI_TYPE_LIST)
@ -564,8 +579,7 @@ static int getoption_byid (
fld = qse_awk_rtx_makestrvalwithmbs (rtx, tmp->name);
if (!fld)
{
qse_awk_rtx_refupval (rtx, map);
qse_awk_rtx_refdownval (rtx, map);
qse_awk_rtx_freeval (rtx, map);
map = QSE_NULL;
x = UCI_ERR_MEM;
break;
@ -586,10 +600,8 @@ static int getoption_byid (
if (kp == QSE_NULL || qse_awk_rtx_setmapvalfld (rtx, map, kp, kl, fld) == QSE_NULL)
{
if (kp) QSE_MMGR_FREE (qse_awk_rtx_getmmgr(rtx), kp);
qse_awk_rtx_refupval (rtx, fld);
qse_awk_rtx_refdownval (rtx, fld);
qse_awk_rtx_refupval (rtx, map);
qse_awk_rtx_refdownval (rtx, map);
qse_awk_rtx_freeval (rtx, fld);
qse_awk_rtx_freeval (rtx, map);
map = QSE_NULL;
x = UCI_ERR_MEM;
break;
@ -599,7 +611,15 @@ static int getoption_byid (
count++;
}
if (map) *retv = map;
if (map)
{
if (qse_awk_rtx_setrefval (rtx, ref, map) <= -1)
{
qse_awk_rtx_freeval (rtx, map);
map = QSE_NULL;
x = UCI_ERR_MEM;
}
}
}
else x = UCI_ERR_MEM;
}
@ -1199,7 +1219,6 @@ static int fnc_uci_adddeltapath (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t*
static int fnc_uci_getoption (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
uctx_list_t* list;
qse_awk_val_t* retv;
qse_long_t id;
int ret;
@ -1214,7 +1233,7 @@ static int fnc_uci_getoption (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
item = qse_awk_rtx_valtombsdup (rtx, qse_awk_rtx_getarg(rtx, 1), QSE_NULL);
if (item)
{
ret = getoption_byid (rtx, list, id, item, &retv);
ret = getoption_byid (rtx, list, id, item, qse_awk_rtx_getarg (rtx, 2));
qse_awk_rtx_freemem (rtx, item);
}
else ret = -UCI_ERR_MEM;
@ -1223,18 +1242,17 @@ static int fnc_uci_getoption (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
if (ret <= -1)
{
list->errnum = -ret;
ret = -1;
}
else
{
qse_awk_rtx_setretval (rtx, retv);
}
else ret = 0;
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval (rtx, ret));
return 0;
}
static int fnc_uci_getsection (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
{
uctx_list_t* list;
qse_awk_val_t* retv;
qse_long_t id;
int ret;
@ -1249,7 +1267,7 @@ static int fnc_uci_getsection (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
item = qse_awk_rtx_valtombsdup (rtx, qse_awk_rtx_getarg (rtx, 1), QSE_NULL);
if (item)
{
ret = getsection_byid (rtx, list, id, item, &retv);
ret = getsection_byid (rtx, list, id, item, qse_awk_rtx_getarg (rtx, 2));
qse_awk_rtx_freemem (rtx, item);
}
else ret = -UCI_ERR_MEM;
@ -1258,11 +1276,11 @@ static int fnc_uci_getsection (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
if (ret <= -1)
{
list->errnum = -ret;
ret = -1;
}
else
{
qse_awk_rtx_setretval (rtx, retv);
}
else ret = 0;
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval (rtx, ret));
return 0;
}
@ -1285,8 +1303,8 @@ static fnctab_t fnctab[] =
{ QSE_T("delete"), { { 2, 2, QSE_NULL }, fnc_uci_delete, 0 } },
{ QSE_T("errno"), { { 0, 0, QSE_NULL }, fnc_uci_errno, 0 } },
{ QSE_T("errstr"), { { 0, 1, QSE_NULL }, fnc_uci_errstr, 0 } },
{ QSE_T("getoption"), { { 2, 2, QSE_NULL }, fnc_uci_getoption, 0 } },
{ QSE_T("getsection"), { { 2, 2, QSE_NULL }, fnc_uci_getsection, 0 } },
{ QSE_T("getoption"), { { 3, 3, QSE_T("vvr")}, fnc_uci_getoption, 0 } },
{ QSE_T("getsection"), { { 3, 3, QSE_T("vvr")}, fnc_uci_getsection, 0 } },
{ QSE_T("load"), { { 2, 2, QSE_NULL }, fnc_uci_load, 0 } },
{ QSE_T("open"), { { 0, 0, QSE_NULL }, fnc_uci_open, 0 } },
{ QSE_T("rename"), { { 2, 2, QSE_NULL }, fnc_uci_rename, 0 } },