// ---------------------------------------------------------------- static void handle_oosvar_assignment_from_xval( mlr_dsl_cst_statement_t* pstatement, variables_t* pvars, cst_outputs_t* pcst_outputs) { oosvar_assignment_state_t* pstate = pstatement->pvstate; int lhs_all_non_null_or_error = TRUE; sllmv_t* plhskeys = evaluate_list(pstate->plhs_keylist_evaluators, pvars, &lhs_all_non_null_or_error); if (lhs_all_non_null_or_error) { rxval_evaluator_t* prhs_xevaluator = pstate->prhs_xevaluator; boxed_xval_t boxed_xval = prhs_xevaluator->pprocess_func(prhs_xevaluator->pvstate, pvars); if (!boxed_xval.xval.is_terminal || mv_is_present(&boxed_xval.xval.terminal_mlrval)) { if (boxed_xval.is_ephemeral) { mlhmmv_level_put_xvalue(pvars->poosvars->root_xvalue.pnext_level, plhskeys->phead, &boxed_xval.xval); } else { mlhmmv_xvalue_t copy_xval = mlhmmv_xvalue_copy(&boxed_xval.xval); mlhmmv_level_put_xvalue(pvars->poosvars->root_xvalue.pnext_level, plhskeys->phead, ©_xval); } } } sllmv_free(plhskeys); }
// ---------------------------------------------------------------- static void handle_indexed_local_variable_assignment_from_xval( mlr_dsl_cst_statement_t* pstatement, variables_t* pvars, cst_outputs_t* pcst_outputs) { indexed_local_variable_assignment_state_t* pstate = pstatement->pvstate; int lhs_keys_all_non_null_or_error; sllmv_t* pmvkeys = evaluate_list(pstate->plhs_keylist_evaluators, pvars, &lhs_keys_all_non_null_or_error); if (lhs_keys_all_non_null_or_error) { rxval_evaluator_t* prhs_xevaluator = pstate->prhs_xevaluator; boxed_xval_t boxed_xval = prhs_xevaluator->pprocess_func(prhs_xevaluator->pvstate, pvars); if (!boxed_xval.xval.is_terminal || mv_is_present(&boxed_xval.xval.terminal_mlrval)) { local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack); if (boxed_xval.is_ephemeral) { local_stack_frame_assign_extended_indexed(pframe, pstate->lhs_frame_relative_index, pmvkeys, boxed_xval.xval); } else { local_stack_frame_assign_extended_indexed(pframe, pstate->lhs_frame_relative_index, pmvkeys, mlhmmv_xvalue_copy(&boxed_xval.xval)); } } } sllmv_free(pmvkeys); }
static void handle_unset_all( mlr_dsl_cst_statement_t* pstatement, variables_t* pvars, cst_outputs_t* pcst_outputs) { sllmv_t* pempty = sllmv_alloc(); mlhmmv_root_remove(pvars->poosvars, pempty); sllmv_free(pempty); }
static void handle_unset_oosvar( unset_item_t* punset_item, variables_t* pvars, cst_outputs_t* pcst_outputs) { int all_non_null_or_error = TRUE; sllmv_t* pmvkeys = evaluate_list(punset_item->pkeylist_evaluators, pvars, &all_non_null_or_error); if (all_non_null_or_error) mlhmmv_root_remove(pvars->poosvars, pmvkeys); sllmv_free(pmvkeys); }
// ---------------------------------------------------------------- static char* test_no_overlap() { mlhmmv_t* pmap = mlhmmv_alloc(); int error = 0; printf("----------------------------------------------------------------\n"); printf("empty map:\n"); mlhmmv_print(pmap); sllmv_t* pmvkeys1 = sllmv_single(imv(3)); mv_t value1 = mv_from_int(4LL); printf("\n"); printf("keys1: "); sllmv_print(pmvkeys1); printf("value1: %s\n", mv_alloc_format_val(&value1)); mlhmmv_put(pmap, pmvkeys1, &value1); printf("map:\n"); mlhmmv_print(pmap); mu_assert_lf(mv_equals_si(mlhmmv_get(pmap, pmvkeys1, &error), &value1)); sllmv_t* pmvkeys2 = sllmv_double(smv("abcde"), imv(-6)); mv_t value2 = mv_from_int(7); printf("\n"); printf("keys2: "); sllmv_print(pmvkeys2); printf("value2: %s\n", mv_alloc_format_val(&value2)); mlhmmv_put(pmap, pmvkeys2, &value2); printf("map:\n"); mlhmmv_print(pmap); mu_assert_lf(mv_equals_si(mlhmmv_get(pmap, pmvkeys2, &error), &value2)); sllmv_t* pmvkeys3 = sllmv_triple(imv(0), smv("fghij"), imv(0)); mv_t value3 = mv_from_int(0LL); printf("\n"); printf("keys3: "); sllmv_print(pmvkeys3); printf("value3: %s\n", mv_alloc_format_val(&value3)); mlhmmv_put(pmap, pmvkeys3, &value3); printf("map:\n"); mlhmmv_print(pmap); mu_assert_lf(mv_equals_si(mlhmmv_get(pmap, pmvkeys3, &error), &value3)); sllmv_free(pmvkeys1); mlhmmv_free(pmap); return NULL; }
// As with oosvars, unset removes the key. E.g. if 'v = { 1:2, 3:4 }' then // 'unset v[1]' results in 'v = { 3:4 }'. static void handle_unset_indexed_local_variable( unset_item_t* punset_item, variables_t* pvars, cst_outputs_t* pcst_outputs) { int all_non_null_or_error = TRUE; sllmv_t* pmvkeys = evaluate_list(punset_item->pkeylist_evaluators, pvars, &all_non_null_or_error); if (all_non_null_or_error) { local_stack_frame_t* pframe = local_stack_get_top_frame(pvars->plocal_stack); // 'unset nonesuch[someindex]' requires the existence check first: else we'd be poking data // into the absent-value stack-frame-index-0 slot. mlhmmv_xvalue_t* pxval = local_stack_frame_ref_extended_from_indexed(pframe, punset_item->local_variable_frame_relative_index, NULL); if (pxval != NULL) { mlhmmv_level_remove(pxval->pnext_level, pmvkeys->phead); } } sllmv_free(pmvkeys); }