#include "asn1fix_internal.h"

/*
 * Dereference DefinedValues:
 */
int
asn1f_fix_dereference_values(arg_t *arg) {
	asn1p_expr_t *expr = arg->expr;
	int r_value = 0;

	if(expr->value && expr->meta_type == AMT_VALUE) {
		if(asn1f_value_resolve(arg, expr, 0)) {
			/* This function will emit messages */
			r_value = -1;
		}
	}

	return r_value;
}


/*
 * Dereference DEFAULT values
 */
int
asn1f_fix_dereference_defaults(arg_t *arg) {
	asn1p_expr_t *expr = arg->expr;
	int r_value = 0;

	if(expr->marker.default_value) {
		arg_t tmparg = *arg;
		asn1p_expr_t tmpexpr = *expr;

		switch(expr->marker.default_value->type) {
		default:
			return r_value;
		case ATV_REFERENCED:
			break;
		}


		if(expr->expr_type == A1TC_CLASSFIELD_FTVFS) {
			asn1p_expr_t *child = TQ_FIRST(&expr->members);
			int ret;
			assert(child);
			assert(child->marker.default_value == 0);
			tmparg.expr = child;
			child->marker.default_value=expr->marker.default_value;
			ret = asn1f_fix_dereference_defaults(&tmparg);
			expr->marker.default_value = child->marker.default_value;
			if(ret == 0) return 0;	/* Finished */
		}

		tmparg.expr = &tmpexpr;
		tmpexpr.meta_type = AMT_VALUE;
		tmpexpr.marker.default_value = 0;
		tmpexpr.value = expr->marker.default_value;
		if(asn1f_value_resolve(&tmparg, &tmpexpr, 0))
			r_value = -1;
		expr->marker.default_value = tmpexpr.value;
	}

	return r_value;
}

