renamed QSE_AWK_MAPTOVAR to QSE_AWK_FLEXMAP.

allowes a map variable to be reassigned with another value
This commit is contained in:
2012-11-28 05:34:19 +00:00
parent f1f3080ab3
commit a332c5b55e
8 changed files with 149 additions and 123 deletions

View File

@ -116,10 +116,11 @@ const qse_char_t* qse_awk_dflerrstr (const qse_awk_t* awk, qse_awk_errnum_t errn
QSE_T("right-hand side of the 'in' operator not a map"),
QSE_T("right-hand side of the 'in' operator not a map nor nil"),
QSE_T("value not referenceable"),
QSE_T("value not assignable"),
QSE_T("indexed value cannot be assigned a map"),
QSE_T("positional value cannot be assigned a map"),
QSE_T("map '${0}' not assignable"),
QSE_T("indexed value cannot be a map"),
QSE_T("positional value cannot be a map"),
QSE_T("map cannot be assigned to variable"),
QSE_T("map '${0}' cannot be reassigned"),
QSE_T("map cannot be returned"),
QSE_T("map prohibited"),
QSE_T("cannot change a scalar value to a map"),
QSE_T("invalid value type"),

View File

@ -620,14 +620,14 @@ static int fnc_split (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
((qse_awk_val_ref_t*)a1)->id <= QSE_AWK_VAL_REF_ARGIDX)
{
/* an indexed value should not be assigned another map */
qse_awk_rtx_seterrnum (run, QSE_AWK_EIDXVALASSMAP, QSE_NULL);
qse_awk_rtx_seterrnum (run, QSE_AWK_EIDXVALMAP, QSE_NULL);
return -1;
}
if (((qse_awk_val_ref_t*)a1)->id == QSE_AWK_VAL_REF_POS)
{
/* a positional should not be assigned a map */
qse_awk_rtx_seterrnum (run, QSE_AWK_EPOSVALASSMAP, QSE_NULL);
qse_awk_rtx_seterrnum (run, QSE_AWK_EPOSVALMAP, QSE_NULL);
return -1;
}
@ -635,7 +635,7 @@ static int fnc_split (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
if ((*a1_ref)->type != QSE_AWK_VAL_NIL &&
(*a1_ref)->type != QSE_AWK_VAL_MAP)
{
if (!(run->awk->opt.trait & QSE_AWK_MAPTOVAR))
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP))
{
/* cannot change a scalar value to a map */
qse_awk_rtx_seterrnum (run, QSE_AWK_ESCALARTOMAP, QSE_NULL);
@ -961,7 +961,12 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
if ((*a2_ref)->type == QSE_AWK_VAL_MAP)
{
/* a map is not allowed as the third parameter */
/* a map is not allowed as the third parameter.
* this is a prohibited condition regardless of QSE_AWK_FLEXMAP.
* i don't accept this.
*
* TODO: can i extend to replace something in a map???
*/
qse_awk_rtx_seterrnum (run, QSE_AWK_EMAPPH, QSE_NULL);
goto oops;
}

View File

@ -314,17 +314,17 @@ static int set_global (
qse_awk_val_t* old;
old = STACK_GBL (rtx, idx);
if (old->type == QSE_AWK_VAL_MAP)
if (!(rtx->awk->opt.trait & QSE_AWK_FLEXMAP) && old->type == QSE_AWK_VAL_MAP)
{
/* once a variable becomes a map,
* it cannot be changed to a scalar variable */
* it cannot be assigned with another value.
* you can only add a member using indexing. */
if (var)
{
/* global variable */
SETERR_ARGX_LOC (
rtx,
QSE_AWK_EMAPNA,
QSE_AWK_EMAPNRA,
xstr_to_cstr(&var->id.name),
&var->loc
);
@ -334,7 +334,7 @@ static int set_global (
/* qse_awk_rtx_setgbl has been called */
qse_cstr_t ea;
ea.ptr = qse_awk_getgblname (rtx->awk, idx, &ea.len);
SETERR_ARGX (rtx, QSE_AWK_EMAPNA, &ea);
SETERR_ARGX (rtx, QSE_AWK_EMAPNRA, &ea);
}
return -1;
@ -2318,14 +2318,14 @@ static int run_return (qse_awk_rtx_t* run, qse_awk_nde_return_t* nde)
val = eval_expression (run, nde->val);
if (val == QSE_NULL) return -1;
if ((run->awk->opt.trait & QSE_AWK_MAPTOVAR) == 0)
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP))
{
if (val->type == QSE_AWK_VAL_MAP)
{
/* cannot return a map */
qse_awk_rtx_refupval (run, val);
qse_awk_rtx_refdownval (run, val);
SETERR_LOC (run, QSE_AWK_EMAPPH, &nde->loc);
SETERR_LOC (run, QSE_AWK_EMAPUR, &nde->loc);
return -1;
}
}
@ -3389,11 +3389,12 @@ static qse_awk_val_t* do_assignment (
var->type == QSE_AWK_NDE_LCL ||
var->type == QSE_AWK_NDE_ARG)
{
if ((run->awk->opt.trait & QSE_AWK_MAPTOVAR) == 0)
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP))
{
/* a map value cannot be assigned to another variable */
if (val->type == QSE_AWK_VAL_MAP)
{
errnum = QSE_AWK_ENOTASS;
errnum = QSE_AWK_EMAPNA;
goto exit_on_error;
}
}
@ -3407,7 +3408,7 @@ static qse_awk_val_t* do_assignment (
{
if (val->type == QSE_AWK_VAL_MAP)
{
errnum = QSE_AWK_ENOTASS;
errnum = QSE_AWK_EMAPNA;
goto exit_on_error;
}
@ -3417,7 +3418,7 @@ static qse_awk_val_t* do_assignment (
{
if (val->type == QSE_AWK_VAL_MAP)
{
errnum = QSE_AWK_ENOTASS;
errnum = QSE_AWK_EMAPNA;
goto exit_on_error;
}
@ -3450,7 +3451,7 @@ static qse_awk_val_t* do_assignment_scalar (
QSE_ASSERT (var->idx == QSE_NULL);
QSE_ASSERT (
(run->awk->opt.trait & QSE_AWK_MAPTOVAR) ||
(run->awk->opt.trait & QSE_AWK_FLEXMAP) ||
val->type != QSE_AWK_VAL_MAP);
switch (var->type)
@ -3461,12 +3462,13 @@ static qse_awk_val_t* do_assignment_scalar (
pair = qse_htb_search (
run->named, var->id.name.ptr, var->id.name.len);
if (pair && ((qse_awk_val_t*)QSE_HTB_VPTR(pair))->type == QSE_AWK_VAL_MAP)
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP) &&
pair && ((qse_awk_val_t*)QSE_HTB_VPTR(pair))->type == QSE_AWK_VAL_MAP)
{
/* once a variable becomes a map,
* it cannot be changed to a scalar variable */
SETERR_ARGX_LOC (
run, QSE_AWK_EMAPNA,
run, QSE_AWK_EMAPNRA,
xstr_to_cstr(&var->id.name), &var->loc);
return QSE_NULL;
}
@ -3495,12 +3497,12 @@ static qse_awk_val_t* do_assignment_scalar (
case QSE_AWK_NDE_LCL:
{
qse_awk_val_t* old = STACK_LCL(run,var->id.idxa);
if (old->type == QSE_AWK_VAL_MAP)
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP) && old->type == QSE_AWK_VAL_MAP)
{
/* once the variable becomes a map,
* it cannot be changed to a scalar variable */
SETERR_ARGX_LOC (
run, QSE_AWK_EMAPNA,
run, QSE_AWK_EMAPNRA,
xstr_to_cstr(&var->id.name), &var->loc);
return QSE_NULL;
}
@ -3514,12 +3516,12 @@ static qse_awk_val_t* do_assignment_scalar (
case QSE_AWK_NDE_ARG:
{
qse_awk_val_t* old = STACK_ARG(run,var->id.idxa);
if (old->type == QSE_AWK_VAL_MAP)
if (!(run->awk->opt.trait & QSE_AWK_FLEXMAP) && old->type == QSE_AWK_VAL_MAP)
{
/* once the variable becomes a map,
* it cannot be changed to a scalar variable */
SETERR_ARGX_LOC (
run, QSE_AWK_EMAPNA,
run, QSE_AWK_EMAPNRA,
xstr_to_cstr(&var->id.name), &var->loc);
return QSE_NULL;
}

View File

@ -1273,6 +1273,13 @@ int qse_awk_rtx_valtostr (
qse_awk_val_str_t* vs = (qse_awk_val_str_t*)v;
return str_to_str (rtx, vs->val.ptr, vs->val.len, out);
}
case QSE_AWK_VAL_MAP:
{
if (rtx->awk->opt.trait & QSE_AWK_FLEXMAP)
return str_to_str (rtx, QSE_T("#MAP"), 4, out);
break;
}
}
#ifdef DEBUG_VAL