コード例 #1
0
// ----------------------------------------------------------------
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, &copy_xval);
			}
		}
	}

	sllmv_free(plhskeys);
}
コード例 #2
0
// ----------------------------------------------------------------
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);

}
コード例 #3
0
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);
}
コード例 #4
0
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);
}
コード例 #5
0
ファイル: test_mlhmmv.c プロジェクト: shekkbuilder/miller
// ----------------------------------------------------------------
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;
}
コード例 #6
0
// 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);
}