added qse_awk_rtx_makemapvalwithdata().

enhancced qse_awk_rtx_makestrval() and related functions.
enhanced the uci module
This commit is contained in:
2012-10-29 14:41:39 +00:00
parent 18ab6aaf8d
commit 3db3ab2249
15 changed files with 1029 additions and 191 deletions

View File

@ -593,7 +593,7 @@ int Awk::Value::setStr (const char_t* str)
int Awk::Value::setStr (Run* r, const char_t* str)
{
val_t* tmp;
tmp = qse_awk_rtx_makestrval0 (r->rtx, str);
tmp = qse_awk_rtx_makestrvalwithstr (r->rtx, str);
if (tmp == QSE_NULL)
{
r->awk->retrieveError (r);
@ -751,7 +751,7 @@ int Awk::Value::setIndexedStr (const Index& idx, const char_t* str)
int Awk::Value::setIndexedStr (Run* r, const Index& idx, const char_t* str)
{
val_t* tmp;
tmp = qse_awk_rtx_makestrval0 (r->rtx, str);
tmp = qse_awk_rtx_makestrvalwithstr (r->rtx, str);
if (tmp == QSE_NULL)
{
r->awk->retrieveError (r);

View File

@ -244,8 +244,8 @@ struct qse_awk_rtx_t
qse_size_t stack_limit;
int exit_level;
qse_awk_val_ref_t* fcache[128];
qse_size_t fcache_count;
qse_awk_val_ref_t* rcache[128];
qse_size_t rcache_count;
#ifdef ENABLE_FEATURE_SCACHE
qse_awk_val_str_t* scache

View File

@ -774,7 +774,7 @@ static int fnc_split (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
QSE_ASSERT ((tok.ptr != QSE_NULL && tok.len > 0) || tok.len == 0);
/* create the field string */
t2 = qse_awk_rtx_makestrval (run, tok.ptr, tok.len);
t2 = qse_awk_rtx_makestrvalwithcstr (run, &tok);
if (t2 == QSE_NULL) goto oops;
/* put it into the map */
@ -815,9 +815,9 @@ oops:
static int fnc_tolower (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
qse_char_t* str;
qse_size_t len, i;
qse_size_t i;
qse_awk_val_t* a0, * r;
qse_xstr_t str;
nargs = qse_awk_rtx_getnargs (run);
QSE_ASSERT (nargs == 1);
@ -826,25 +826,25 @@ static int fnc_tolower (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
if (a0->type == QSE_AWK_VAL_STR)
{
str = ((qse_awk_val_str_t*)a0)->val.ptr;
len = ((qse_awk_val_str_t*)a0)->val.len;
str.ptr = ((qse_awk_val_str_t*)a0)->val.ptr;
str.len = ((qse_awk_val_str_t*)a0)->val.len;
}
else
{
str = qse_awk_rtx_valtocpldup (run, a0, &len);
if (str == QSE_NULL) return -1;
str.ptr = qse_awk_rtx_valtocpldup (run, a0, &str.len);
if (str.ptr == QSE_NULL) return -1;
}
for (i = 0; i < len; i++) str[i] = QSE_AWK_TOLOWER (run->awk, str[i]);
for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOLOWER (run->awk, str.ptr[i]);
r = qse_awk_rtx_makestrval (run, str, len);
r = qse_awk_rtx_makestrvalwithcstr (run, &str);
if (r == QSE_NULL)
{
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
return -1;
}
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
qse_awk_rtx_setretval (run, r);
return 0;
}
@ -852,9 +852,9 @@ static int fnc_tolower (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
static int fnc_toupper (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
{
qse_size_t nargs;
qse_char_t* str;
qse_size_t len, i;
qse_size_t i;
qse_awk_val_t* a0, * r;
qse_xstr_t str;
nargs = qse_awk_rtx_getnargs (run);
QSE_ASSERT (nargs == 1);
@ -863,25 +863,25 @@ static int fnc_toupper (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
if (a0->type == QSE_AWK_VAL_STR)
{
str = ((qse_awk_val_str_t*)a0)->val.ptr;
len = ((qse_awk_val_str_t*)a0)->val.len;
str.ptr = ((qse_awk_val_str_t*)a0)->val.ptr;
str.len = ((qse_awk_val_str_t*)a0)->val.len;
}
else
{
str = qse_awk_rtx_valtocpldup (run, a0, &len);
if (str == QSE_NULL) return -1;
str.ptr = qse_awk_rtx_valtocpldup (run, a0, &str.len);
if (str.ptr == QSE_NULL) return -1;
}
for (i = 0; i < len; i++) str[i] = QSE_AWK_TOUPPER (run->awk, str[i]);
for (i = 0; i < str.len; i++) str.ptr[i] = QSE_AWK_TOUPPER (run->awk, str.ptr[i]);
r = qse_awk_rtx_makestrval (run, str, len);
r = qse_awk_rtx_makestrvalwithcstr (run, &str);
if (r == QSE_NULL)
{
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
return -1;
}
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
qse_awk_rtx_setretval (run, r);
return 0;
}
@ -1136,8 +1136,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
if (a2 == QSE_NULL)
{
int n;
n = qse_awk_rtx_setrec (run, 0,
QSE_STR_PTR(&new), QSE_STR_LEN(&new));
n = qse_awk_rtx_setrec (run, 0, QSE_STR_CSTR(&new));
if (n <= -1) goto oops;
}
else if (((qse_awk_val_ref_t*)a2)->id == QSE_AWK_VAL_REF_POS)
@ -1146,14 +1145,13 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
n = qse_awk_rtx_setrec (
run, (qse_size_t)((qse_awk_val_ref_t*)a2)->adr,
QSE_STR_PTR(&new), QSE_STR_LEN(&new));
QSE_STR_CSTR(&new));
if (n <= -1) goto oops;
}
else
{
v = qse_awk_rtx_makestrval (run,
QSE_STR_PTR(&new), QSE_STR_LEN(&new));
v = qse_awk_rtx_makestrvalwithcstr (run, QSE_STR_CSTR(&new));
if (v == QSE_NULL) goto oops;
qse_awk_rtx_refdownval (run, *a2_ref);
@ -1390,12 +1388,10 @@ static int fnc_sprintf (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, cs0.ptr);
if (x.ptr == QSE_NULL) goto oops;
/*a0 = qse_awk_rtx_makestrval_nodup (run, x.ptr, x.len);*/
a0 = qse_awk_rtx_makestrval (run, x.ptr, x.len);
a0 = qse_awk_rtx_makestrvalwithcstr (run, &x);
if (a0 == QSE_NULL) goto oops;
qse_str_fini (&fbu);
/*qse_str_yield (&out, QSE_NULL, 0);*/
qse_str_fini (&out);
qse_awk_rtx_setretval (run, a0);
return 0;

View File

@ -137,35 +137,17 @@ qse_awk_rtx_t* qse_awk_rtx_openmpi (
case 0: /* MPI_HOST */
{
char buf[MPI_MAX_PROCESSOR_NAME];
int len;
#if defined(QSE_CHAR_IS_MCHAR)
/* nothing */
#else
qse_mmgr_t* mmgr;
qse_char_t* tmp;
#endif
if (MPI_Get_processor_name(buf, &len) != MPI_SUCCESS)
qse_mcstr_t mcstr;
if (MPI_Get_processor_name(buf, &mcstr.len) != MPI_SUCCESS)
{
qse_awk_rtx_close (rtx);
qse_awk_seterrnum (awk, QSE_AWK_ESYSERR, QSE_NULL);
return QSE_NULL;
}
#if defined(QSE_CHAR_IS_MCHAR)
v_tmp = qse_awk_rtx_makestrval (rtx, buf, len);
#else
mmgr = qse_awk_getmmgr(awk);
tmp = qse_mbstowcsdup (buf, QSE_NULL, mmgr);
if (tmp == QSE_NULL)
{
qse_awk_rtx_close (rtx);
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v_tmp = qse_awk_rtx_makestrval0 (rtx, tmp);
QSE_MMGR_FREE (mmgr, tmp);
#endif
mcstr.ptr = buf;
v_tmp = qse_awk_rtx_makestrvalwithmcstr (rtx, &mcstr);
break;
}

View File

@ -22,19 +22,17 @@
static int split_record (qse_awk_rtx_t* run);
static int recomp_record_fields (
qse_awk_rtx_t* run, qse_size_t lv,
const qse_char_t* str, qse_size_t len);
qse_awk_rtx_t* run, qse_size_t lv, const qse_cstr_t* str);
int qse_awk_rtx_setrec (
qse_awk_rtx_t* run, qse_size_t idx,
const qse_char_t* str, qse_size_t len)
qse_awk_rtx_t* run, qse_size_t idx, const qse_cstr_t* str)
{
qse_awk_val_t* v;
if (idx == 0)
{
if (str == QSE_STR_PTR(&run->inrec.line) &&
len == QSE_STR_LEN(&run->inrec.line))
if (str->ptr == QSE_STR_PTR(&run->inrec.line) &&
str->len == QSE_STR_LEN(&run->inrec.line))
{
if (qse_awk_rtx_clrrec (run, 1) == -1) return -1;
}
@ -42,7 +40,7 @@ int qse_awk_rtx_setrec (
{
if (qse_awk_rtx_clrrec (run, 0) == -1) return -1;
if (qse_str_ncpy (&run->inrec.line, str, len) == (qse_size_t)-1)
if (qse_str_ncpy (&run->inrec.line, str->ptr, str->len) == (qse_size_t)-1)
{
qse_awk_rtx_clrrec (run, 0);
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
@ -50,7 +48,7 @@ int qse_awk_rtx_setrec (
}
}
v = qse_awk_rtx_makenstrval (run, str, len);
v = qse_awk_rtx_makenstrvalwithcstr (run, str);
if (v == QSE_NULL)
{
@ -72,16 +70,14 @@ int qse_awk_rtx_setrec (
}
else
{
if (recomp_record_fields (run, idx, str, len) == -1)
if (recomp_record_fields (run, idx, str) <= -1)
{
qse_awk_rtx_clrrec (run, 0);
return -1;
}
/* recompose $0 */
v = qse_awk_rtx_makestrval (run,
QSE_STR_PTR(&run->inrec.line),
QSE_STR_LEN(&run->inrec.line));
v = qse_awk_rtx_makestrvalwithcstr (run, QSE_STR_CSTR(&run->inrec.line));
if (v == QSE_NULL)
{
qse_awk_rtx_clrrec (run, 0);
@ -328,14 +324,11 @@ static int split_record (qse_awk_rtx_t* rtx)
rtx->inrec.flds[rtx->inrec.nflds].ptr = tok.ptr;
rtx->inrec.flds[rtx->inrec.nflds].len = tok.len;
rtx->inrec.flds[rtx->inrec.nflds].val =
qse_awk_rtx_makenstrval (rtx, tok.ptr, tok.len);
rtx->inrec.flds[rtx->inrec.nflds].val = qse_awk_rtx_makenstrvalwithcstr (rtx, &tok);
if (rtx->inrec.flds[rtx->inrec.nflds].val == QSE_NULL)
{
if (fs_free != QSE_NULL)
QSE_AWK_FREE (rtx->awk, fs_free);
if (fs_free) QSE_AWK_FREE (rtx->awk, fs_free);
return -1;
}
@ -402,8 +395,7 @@ int qse_awk_rtx_clrrec (qse_awk_rtx_t* run, int skip_inrec_line)
}
static int recomp_record_fields (
qse_awk_rtx_t* run, qse_size_t lv,
const qse_char_t* str, qse_size_t len)
qse_awk_rtx_t* run, qse_size_t lv, const qse_cstr_t* str)
{
qse_awk_val_t* v;
qse_size_t max, i, nflds;
@ -444,10 +436,7 @@ static int recomp_record_fields (
{
if (i > 0)
{
if (qse_str_ncat (
&run->inrec.line,
run->gbl.ofs.ptr,
run->gbl.ofs.len) == (qse_size_t)-1)
if (qse_str_ncat (&run->inrec.line, run->gbl.ofs.ptr, run->gbl.ofs.len) == (qse_size_t)-1)
{
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
@ -461,16 +450,15 @@ static int recomp_record_fields (
run->inrec.flds[i].ptr =
QSE_STR_PTR(&run->inrec.line) +
QSE_STR_LEN(&run->inrec.line);
run->inrec.flds[i].len = len;
run->inrec.flds[i].len = str->len;
if (qse_str_ncat (
&run->inrec.line, str, len) == (qse_size_t)-1)
if (qse_str_ncat (&run->inrec.line, str->ptr, str->len) == (qse_size_t)-1)
{
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
return -1;
}
tmp = qse_awk_rtx_makestrval (run, str,len);
tmp = qse_awk_rtx_makestrvalwithcstr (run, str);
if (tmp == QSE_NULL) return -1;
if (i < nflds)
@ -487,8 +475,7 @@ static int recomp_record_fields (
QSE_STR_LEN(&run->inrec.line);
run->inrec.flds[i].len = 0;
if (qse_str_cat (
&run->inrec.line, QSE_T("")) == (qse_size_t)-1)
if (qse_str_cat (&run->inrec.line, QSE_T("")) == (qse_size_t)-1)
{
qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL);
return -1;

View File

@ -1093,9 +1093,9 @@ static void fini_rtx (qse_awk_rtx_t* rtx, int fini_globals)
qse_htb_close (rtx->named);
/* destroy values in free list */
while (rtx->fcache_count > 0)
while (rtx->rcache_count > 0)
{
qse_awk_val_ref_t* tmp = rtx->fcache[--rtx->fcache_count];
qse_awk_val_ref_t* tmp = rtx->rcache[--rtx->rcache_count];
qse_awk_rtx_freeval (rtx, (qse_awk_val_t*)tmp, 0);
}
@ -1240,7 +1240,7 @@ static int defaultify_globals (qse_awk_rtx_t* rtx)
}
else
{
tmp = qse_awk_rtx_makestrval0 (rtx, gtab[i].str);
tmp = qse_awk_rtx_makestrvalwithstr (rtx, gtab[i].str);
if (tmp == QSE_NULL) return -1;
}
@ -1600,7 +1600,7 @@ qse_awk_val_t* qse_awk_rtx_callwithstrs (
for (i = 0; i < nargs; i++)
{
v[i] = qse_awk_rtx_makestrval0 (rtx, args[i]);
v[i] = qse_awk_rtx_makestrvalwithstr (rtx, args[i]);
if (v[i] == QSE_NULL)
{
ret = QSE_NULL;
@ -3695,7 +3695,7 @@ static qse_awk_val_t* do_assignment_pos (
str = out.u.cpldup;
}
n = qse_awk_rtx_setrec (run, (qse_size_t)lv, str.ptr, str.len);
n = qse_awk_rtx_setrec (run, (qse_size_t)lv, &str);
if (val->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str.ptr);
@ -6456,14 +6456,14 @@ read_console_again:
if (p->var == QSE_NULL)
{
/* set $0 with the input value */
x = qse_awk_rtx_setrec (rtx, 0, QSE_STR_PTR(buf), QSE_STR_LEN(buf));
x = qse_awk_rtx_setrec (rtx, 0, QSE_STR_CSTR(buf));
if (x <= -1) return QSE_NULL;
}
else
{
qse_awk_val_t* v;
v = qse_awk_rtx_makestrval (rtx, QSE_STR_PTR(buf), QSE_STR_LEN(buf));
v = qse_awk_rtx_makestrvalwithcstr (rtx, QSE_STR_CSTR(buf));
if (v == QSE_NULL)
{
ADJERR_LOC (rtx, &nde->loc);
@ -6562,7 +6562,7 @@ read_again:
}
}
if (qse_awk_rtx_setrec (rtx, 0, QSE_STR_PTR(buf), QSE_STR_LEN(buf)) <= -1 ||
if (qse_awk_rtx_setrec (rtx, 0, QSE_STR_CSTR(buf)) <= -1 ||
update_fnr (rtx, rtx->gbl.fnr + 1, rtx->gbl.nr + 1) <= -1) return -1;
return 1;
@ -6644,8 +6644,7 @@ static int shorten_record (qse_awk_rtx_t* run, qse_size_t nflds)
if (ofs_free != QSE_NULL) QSE_AWK_FREE (run->awk, ofs_free);
if (nflds > 1) qse_awk_rtx_refdownval (run, v);
v = (qse_awk_val_t*) qse_awk_rtx_makestrval (
run, QSE_STR_PTR(&tmp), QSE_STR_LEN(&tmp));
v = (qse_awk_val_t*) qse_awk_rtx_makestrvalwithcstr (run, QSE_STR_CSTR(&tmp));
if (v == QSE_NULL)
{
qse_str_fini (&tmp);

View File

@ -1620,7 +1620,7 @@ static int build_argcv (
qse_awk_rtx_refupval (rtx, v_argv);
/* make ARGV[0] */
v_tmp = qse_awk_rtx_makestrval0 (rtx, id);
v_tmp = qse_awk_rtx_makestrvalwithstr (rtx, id);
if (v_tmp == QSE_NULL)
{
qse_awk_rtx_refdownval (rtx, v_argv);
@ -1652,7 +1652,7 @@ static int build_argcv (
{
for (argc = 1, p = icf; *p; p++, argc++)
{
v_tmp = qse_awk_rtx_makestrval0 (rtx, *p);
v_tmp = qse_awk_rtx_makestrvalwithstr (rtx, *p);
if (v_tmp == QSE_NULL)
{
qse_awk_rtx_refdownval (rtx, v_argv);
@ -1779,7 +1779,7 @@ static int __build_environ (
*eq = QSE_WT('=');
#endif
v_tmp = qse_awk_rtx_makestrval0 (rtx, vptr);
v_tmp = qse_awk_rtx_makestrvalwithstr (rtx, vptr);
if (v_tmp == QSE_NULL)
{
#if ((defined(QSE_ENV_CHAR_IS_MCHAR) && defined(QSE_CHAR_IS_MCHAR)) || \
@ -2461,7 +2461,7 @@ static int fnc_getioattr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
#if defined(QSE_CHAR_IS_WCHAR)
else if (qse_strcasecmp (ptr[1], QSE_T("codepage")) == 0)
{
rv = qse_awk_rtx_makestrval0 (rtx, ioattr->cmgr_name);
rv = qse_awk_rtx_makestrvalwithstr (rtx, ioattr->cmgr_name);
if (rv == QSE_NULL)
{
ret = -1;

View File

@ -19,6 +19,7 @@
*/
#include "awk.h"
#include <qse/cmn/mbwc.h>
#ifdef DEBUG_VAL
#include <qse/cmn/stdio.h>
@ -64,7 +65,7 @@ qse_awk_val_t* qse_awk_val_one = (qse_awk_val_t*)&awk_int[2];
qse_awk_val_t* qse_awk_rtx_makenilval (qse_awk_rtx_t* rtx)
{
return &awk_nil;
return (qse_awk_val_t*)&awk_nil;
}
qse_awk_val_t* qse_awk_rtx_makeintval (qse_awk_rtx_t* rtx, qse_long_t v)
@ -187,17 +188,109 @@ qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_flt_t v)
return (qse_awk_val_t*)val;
}
qse_awk_val_t* qse_awk_rtx_makestrval0 (
qse_awk_val_t* qse_awk_rtx_makestrvalwithmbs (
qse_awk_rtx_t* rtx, const qse_mchar_t* mbs)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrval (rtx, mbs, qse_mbslen(mbs));
#else
qse_awk_val_t* v;
qse_wxstr_t tmp;
tmp.ptr = qse_mbstowcsdup (mbs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcs (
qse_awk_rtx_t* rtx, const qse_wchar_t* wcs)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mxstr_t tmp;
tmp.ptr = qse_wcstombsdup (wcs, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrval (rtx, wcs, qse_wcslen(wcs));
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithstr (
qse_awk_rtx_t* rtx, const qse_char_t* str)
{
return qse_awk_rtx_makestrval (rtx, str, qse_strlen(str));
}
qse_awk_val_t* qse_awk_rtx_makestrval (
qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t len)
qse_awk_val_t* qse_awk_rtx_makestrvalwithmcstr (
qse_awk_rtx_t* rtx, const qse_mcstr_t* mcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_awk_rtx_makestrvalwithcstr (rtx, mcstr);
#else
qse_awk_val_t* v;
qse_wcstr_t tmp;
qse_size_t mbslen;
mbslen = mcstr->len;
tmp.ptr = qse_mbsntowcsdup (mcstr->ptr, &mbslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithwcstr (
qse_awk_rtx_t* rtx, const qse_wcstr_t* wcstr)
{
#if defined(QSE_CHAR_IS_MCHAR)
qse_awk_val_t* v;
qse_mcstr_t tmp;
qse_size_t wcslen;
wcslen = wcstr->len;
tmp.ptr = qse_wcsntombsdup (wcstr->ptr, &wcslen, &tmp.len, rtx->awk->mmgr);
if (tmp.ptr == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
v = qse_awk_rtx_makestrvalwithcstr (rtx, &tmp);
QSE_AWK_FREE (rtx->awk, tmp.ptr);
return v;
#else
return qse_awk_rtx_makestrvalwithcstr (rtx, wcstr);
#endif
}
qse_awk_val_t* qse_awk_rtx_makestrvalwithcstr (
qse_awk_rtx_t* rtx, const qse_cstr_t* str)
{
qse_awk_val_str_t* val = QSE_NULL;
qse_size_t rlen = len;
qse_size_t rlen = str->len;
#ifdef ENABLE_FEATURE_SCACHE
qse_size_t i;
@ -217,7 +310,7 @@ qse_awk_val_t* qse_awk_rtx_makestrval (
val = (qse_awk_val_str_t*) QSE_AWK_ALLOC (
rtx->awk,
QSE_SIZEOF(qse_awk_val_str_t) +
(rlen+1)*QSE_SIZEOF(qse_char_t));
(rlen + 1) * QSE_SIZEOF(qse_char_t));
if (val == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
@ -230,9 +323,9 @@ init:
val->type = QSE_AWK_VAL_STR;
val->ref = 0;
val->nstr = 0;
val->val.len = len;
val->val.len = str->len;
val->val.ptr = (qse_char_t*)(val + 1);
qse_strncpy (val->val.ptr, str, len);
qse_strncpy (val->val.ptr, str->ptr, str->len);
#ifdef DEBUG_VAL
qse_dprintf (QSE_T("makestrval => %p\n"), val);
@ -240,25 +333,13 @@ init:
return (qse_awk_val_t*)val;
}
qse_awk_val_t* qse_awk_rtx_makestrval_nodup (
qse_awk_rtx_t* rtx, qse_char_t* str, qse_size_t len)
qse_awk_val_t* qse_awk_rtx_makestrval (
qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t len)
{
qse_awk_val_str_t* val;
val = (qse_awk_val_str_t*) QSE_AWK_ALLOC (
rtx->awk, QSE_SIZEOF(qse_awk_val_str_t));
if (val == QSE_NULL)
{
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL;
}
val->type = QSE_AWK_VAL_STR;
val->ref = 0;
val->nstr = 0;
val->val.len = len;
val->val.ptr = str;
return (qse_awk_val_t*)val;
qse_cstr_t cstr;
cstr.ptr = str;
cstr.len = len;
return qse_awk_rtx_makestrvalwithcstr (rtx, &cstr);
}
qse_awk_val_t* qse_awk_rtx_makestrval2 (
@ -311,16 +392,15 @@ init:
return (qse_awk_val_t*)val;
}
qse_awk_val_t* qse_awk_rtx_makenstrval (
qse_awk_rtx_t* rtx, const qse_char_t* str, qse_size_t len)
qse_awk_val_t* qse_awk_rtx_makenstrvalwithcstr (qse_awk_rtx_t* rtx, const qse_cstr_t* str)
{
int x;
qse_awk_val_t* v;
qse_long_t l;
qse_flt_t r;
x = qse_awk_rtx_strtonum (rtx, 1, str, len, &l, &r);
v = qse_awk_rtx_makestrval (rtx, str, len);
x = qse_awk_rtx_strtonum (rtx, 1, str->ptr, str->len, &l, &r);
v = qse_awk_rtx_makestrvalwithcstr (rtx, str);
if (v == QSE_NULL) return QSE_NULL;
@ -468,6 +548,70 @@ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx)
return (qse_awk_val_t*)val;
}
qse_awk_val_t* qse_awk_rtx_makemapvalwithdata (qse_awk_rtx_t* rtx, qse_awk_val_map_data_t data[])
{
qse_awk_val_t* map, * tmp;
qse_awk_val_map_data_t* p;
map = qse_awk_rtx_makemapval (rtx);
if (map == QSE_NULL) return QSE_NULL;
for (p = data; p->key.ptr; p++)
{
switch (p->type)
{
case QSE_AWK_VAL_MAP_DATA_INT:
tmp = qse_awk_rtx_makeintval (rtx, *(qse_long_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_FLT:
tmp = qse_awk_rtx_makefltval (rtx, *(qse_flt_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_STR:
tmp = qse_awk_rtx_makestrvalwithstr (rtx, (qse_char_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_MBS:
tmp = qse_awk_rtx_makestrvalwithmbs (rtx, (qse_mchar_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_WCS:
tmp = qse_awk_rtx_makestrvalwithwcs (rtx, (qse_wchar_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_XSTR:
case QSE_AWK_VAL_MAP_DATA_CSTR:
tmp = qse_awk_rtx_makestrvalwithcstr (rtx, (qse_cstr_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_MXSTR:
case QSE_AWK_VAL_MAP_DATA_MCSTR:
tmp = qse_awk_rtx_makestrvalwithmcstr (rtx, (qse_mcstr_t*)p->vptr);
break;
case QSE_AWK_VAL_MAP_DATA_WXSTR:
case QSE_AWK_VAL_MAP_DATA_WCSTR:
tmp = qse_awk_rtx_makestrvalwithwcstr (rtx, (qse_wcstr_t*)p->vptr);
break;
default:
tmp = QSE_NULL;
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINVAL, QSE_NULL);
break;
}
if (tmp == QSE_NULL || qse_awk_rtx_setmapvalfld (rtx, map, p->key.ptr, p->key.len, tmp) == QSE_NULL)
{
if (tmp) qse_awk_rtx_freeval (rtx, tmp, 1);
qse_awk_rtx_freeval (rtx, map, 1);
return QSE_NULL;
}
}
return map;
}
qse_awk_val_t* qse_awk_rtx_setmapvalfld (
qse_awk_rtx_t* rtx, qse_awk_val_t* map,
const qse_char_t* kptr, qse_size_t klen, qse_awk_val_t* v)
@ -554,9 +698,9 @@ qse_awk_val_t* qse_awk_rtx_makerefval (
{
qse_awk_val_ref_t* val;
if (rtx->fcache_count > 0)
if (rtx->rcache_count > 0)
{
val = rtx->fcache[--rtx->fcache_count];
val = rtx->rcache[--rtx->rcache_count];
}
else
{
@ -675,9 +819,9 @@ void qse_awk_rtx_freeval (
case QSE_AWK_VAL_REF:
{
if (cache && rtx->fcache_count < QSE_COUNTOF(rtx->fcache))
if (cache && rtx->rcache_count < QSE_COUNTOF(rtx->rcache))
{
rtx->fcache[rtx->fcache_count++] = (qse_awk_val_ref_t*)val;
rtx->rcache[rtx->rcache_count++] = (qse_awk_val_ref_t*)val;
}
else QSE_AWK_FREE (rtx->awk, val);
break;

View File

@ -245,6 +245,40 @@ int qse_mbsntowcsnuptowithcmgr (
return ret;
}
static qse_wchar_t* mbsn_to_wcs_dup_with_cmgr (
const qse_mchar_t* mbs, qse_size_t* mbslen, qse_size_t* wcslen,
qse_mmgr_t* mmgr, qse_cmgr_t* cmgr, int all)
{
qse_size_t ml, wl;
qse_wchar_t* wcs;
ml = *mbslen;
if (mbsn_to_wcsn_with_cmgr (
mbs, &ml, QSE_NULL, &wl, cmgr, all) <= -1) return QSE_NULL;
wl++; /* for terminating null */
wcs = QSE_MMGR_ALLOC (mmgr, wl * QSE_SIZEOF(*wcs));
if (wcs == QSE_NULL) return QSE_NULL;
mbsn_to_wcsn_with_cmgr (mbs, mbslen, wcs, &wl, cmgr, all);
wcs[wl] = QSE_WT('\0');
if (wcslen) *wcslen = wl;
return wcs;
}
qse_wchar_t* qse_mbsntowcsdupwithcmgr (
const qse_mchar_t* mbs, qse_size_t* mbslen, qse_size_t* wcslen, qse_mmgr_t* mmgr, qse_cmgr_t* cmgr)
{
return mbsn_to_wcs_dup_with_cmgr (mbs, mbslen, wcslen, mmgr, cmgr, 0);
}
qse_wchar_t* qse_mbsntowcsalldupwithcmgr (
const qse_mchar_t* mbs, qse_size_t* mbslen, qse_size_t* wcslen, qse_mmgr_t* mmgr, qse_cmgr_t* cmgr)
{
return mbsn_to_wcs_dup_with_cmgr (mbs, mbslen, wcslen, mmgr, cmgr, 1);
}
static qse_wchar_t* mbs_to_wcs_dup_with_cmgr (
const qse_mchar_t* mbs, qse_size_t* wcslen, qse_mmgr_t* mmgr, qse_cmgr_t* cmgr, int all)
{

View File

@ -183,6 +183,18 @@ qse_wchar_t* qse_mbstowcsalldup (
return qse_mbstowcsalldupwithcmgr (mbs, wcslen, mmgr, dfl_cmgr);
}
qse_wchar_t* qse_mbsntowcsdup (
const qse_mchar_t* mbs, qse_size_t* mbslen, qse_size_t* wcslen, qse_mmgr_t* mmgr)
{
return qse_mbsntowcsdupwithcmgr (mbs, mbslen, wcslen, mmgr, dfl_cmgr);
}
qse_wchar_t* qse_mbsntowcsalldup (
const qse_mchar_t* mbs, qse_size_t* mbslen, qse_size_t* wcslen, qse_mmgr_t* mmgr)
{
return qse_mbsntowcsalldupwithcmgr (mbs, mbslen, wcslen, mmgr, dfl_cmgr);
}
qse_wchar_t* qse_mbsatowcsdup (
const qse_mchar_t* mbs[], qse_size_t* wcslen, qse_mmgr_t* mmgr)
{