From d9f961c6c306dfe3eb5b3ee11dbd683a1e8e3c70 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 5 Jan 2013 14:38:30 +0000 Subject: [PATCH] added qse_awk_rtx_setprm(). changed some module functions to use referenced argument --- qse/include/qse/awk/awk.h | 18 +++++-- qse/lib/awk/awk.c | 9 +++- qse/lib/awk/run.c | 6 --- qse/mod/awk/dir.c | 18 +++++-- qse/mod/awk/sys.c | 48 ++++++++++-------- qse/mod/awk/uci.c | 104 ++++++++++++++++++++++---------------- 6 files changed, 124 insertions(+), 79 deletions(-) diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 6da8498c..93027f05 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -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 ); /** diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index e2252c78..f65de4d3 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -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) diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 89dc088f..ddd1136c 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -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); diff --git a/qse/mod/awk/dir.c b/qse/mod/awk/dir.c index 5ed80553..9fb16f65 100644 --- a/qse/mod/awk/dir.c +++ b/qse/mod/awk/dir.c @@ -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; } diff --git a/qse/mod/awk/sys.c b/qse/mod/awk/sys.c index a0459867..fabd4d2c 100644 --- a/qse/mod/awk/sys.c +++ b/qse/mod/awk/sys.c @@ -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; } @@ -592,22 +598,22 @@ static fnctab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ - { QSE_T("fork"), { { 0, 0, QSE_NULL }, fnc_fork, 0 } }, - { QSE_T("getegid"), { { 0, 0, QSE_NULL }, fnc_getegid, 0 } }, - { 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("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 } }, - { QSE_T("gettid"), { { 0, 0, QSE_NULL }, fnc_gettid, 0 } }, - { QSE_T("gettime"), { { 0, 0, QSE_NULL }, fnc_gettime, 0 } }, - { QSE_T("getuid"), { { 0, 0, QSE_NULL }, fnc_getuid, 0 } }, - { QSE_T("kill"), { { 2, 2, QSE_NULL }, fnc_kill, 0 } }, - { QSE_T("settime"), { { 1, 1, QSE_NULL }, fnc_settime, 0 } }, - { QSE_T("sleep"), { { 1, 1, QSE_NULL }, fnc_sleep, 0 } }, - { QSE_T("wait"), { { 1, 1, QSE_NULL }, fnc_wait, 0 } } + { QSE_T("fork"), { { 0, 0, QSE_NULL }, fnc_fork, 0 } }, + { QSE_T("getegid"), { { 0, 0, QSE_NULL }, fnc_getegid, 0 } }, + { 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"), { { 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 } }, + { QSE_T("gettid"), { { 0, 0, QSE_NULL }, fnc_gettid, 0 } }, + { QSE_T("gettime"), { { 0, 0, QSE_NULL }, fnc_gettime, 0 } }, + { QSE_T("getuid"), { { 0, 0, QSE_NULL }, fnc_getuid, 0 } }, + { QSE_T("kill"), { { 2, 2, QSE_NULL }, fnc_kill, 0 } }, + { QSE_T("settime"), { { 1, 1, QSE_NULL }, fnc_settime, 0 } }, + { QSE_T("sleep"), { { 1, 1, QSE_NULL }, fnc_sleep, 0 } }, + { QSE_T("wait"), { { 1, 1, QSE_NULL }, fnc_wait, 0 } } }; #if !defined(SIGHUP) diff --git a/qse/mod/awk/uci.c b/qse/mod/awk/uci.c index 3ad2af33..f00017e6 100644 --- a/qse/mod/awk/uci.c +++ b/qse/mod/awk/uci.c @@ -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; @@ -1246,10 +1264,10 @@ static int fnc_uci_getsection (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) { qse_mchar_t* item; - item = qse_awk_rtx_valtombsdup (rtx, qse_awk_rtx_getarg(rtx, 1), QSE_NULL); + 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; } @@ -1277,25 +1295,25 @@ struct fnctab_t static fnctab_t fnctab[] = { - { QSE_T("adddeltapath"), { { 2, 2, QSE_NULL }, fnc_uci_adddeltapath, 0 } }, - { QSE_T("addlist"), { { 2, 2, QSE_NULL }, fnc_uci_addlist, 0 } }, - { QSE_T("addsection"), { { 3, 3, QSE_NULL }, fnc_uci_addsection, 0 } }, - { QSE_T("close"), { { 1, 1, QSE_NULL }, fnc_uci_close, 0 } }, - { QSE_T("commit"), { { 2, 2, QSE_NULL }, fnc_uci_commit, 0 } }, - { 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("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 } }, - { QSE_T("revert"), { { 2, 2, QSE_NULL }, fnc_uci_revert, 0 } }, - { QSE_T("save"), { { 2, 2, QSE_NULL }, fnc_uci_save, 0 } }, - { QSE_T("set"), { { 2, 2, QSE_NULL }, fnc_uci_set, 0 } }, - { QSE_T("setconfdir"), { { 2, 2, QSE_NULL }, fnc_uci_setconfdir, 0 } }, - { QSE_T("setsavedir"), { { 2, 2, QSE_NULL }, fnc_uci_setsavedir, 0 } }, - { QSE_T("unload"), { { 1, 1, QSE_NULL }, fnc_uci_unload, 0 } } + { QSE_T("adddeltapath"), { { 2, 2, QSE_NULL }, fnc_uci_adddeltapath, 0 } }, + { QSE_T("addlist"), { { 2, 2, QSE_NULL }, fnc_uci_addlist, 0 } }, + { QSE_T("addsection"), { { 3, 3, QSE_NULL }, fnc_uci_addsection, 0 } }, + { QSE_T("close"), { { 1, 1, QSE_NULL }, fnc_uci_close, 0 } }, + { QSE_T("commit"), { { 2, 2, QSE_NULL }, fnc_uci_commit, 0 } }, + { 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"), { { 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 } }, + { QSE_T("revert"), { { 2, 2, QSE_NULL }, fnc_uci_revert, 0 } }, + { QSE_T("save"), { { 2, 2, QSE_NULL }, fnc_uci_save, 0 } }, + { QSE_T("set"), { { 2, 2, QSE_NULL }, fnc_uci_set, 0 } }, + { QSE_T("setconfdir"), { { 2, 2, QSE_NULL }, fnc_uci_setconfdir, 0 } }, + { QSE_T("setsavedir"), { { 2, 2, QSE_NULL }, fnc_uci_setsavedir, 0 } }, + { QSE_T("unload"), { { 1, 1, QSE_NULL }, fnc_uci_unload, 0 } } }; /* ------------------------------------------------------------------------ */