renamed QSE_AWK_MAPTOVAR to QSE_AWK_FLEXMAP.
allowes a map variable to be reassigned with another value
This commit is contained in:
@ -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"),
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user