asn1c/libasn1fix/asn1fix_dereft.c

69 lines
1.6 KiB
C

#include "asn1fix_internal.h"
int
asn1f_fix_dereference_types(arg_t *arg) {
asn1p_expr_t *expr = arg->expr;
asn1p_expr_t *type_expr;
int r_value = 0;
if(expr->expr_type == A1TC_PARAMETRIZED)
return asn1f_fix_parametrized_assignment(arg);
if(expr->expr_type != A1TC_REFERENCE
|| expr->meta_type != AMT_TYPEREF) {
//assert(expr->reference == 0);
return 0; /* Just ignore it */
}
DEBUG("%s(\"%s\":%x ::= \"%s\") for line %d",
__func__, expr->Identifier, expr->expr_type,
asn1f_printable_value(expr->value),
expr->_lineno);
assert(TQ_FIRST(&(expr->members)) == 0);
assert(expr->reference);
/*
* Follow the reference.
*/
type_expr = asn1f_find_terminal_type(arg, expr, 0);
if(type_expr == NULL) {
FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
asn1f_printable_reference(expr->reference),
expr->Identifier, expr->_lineno);
return -1;
}
/*
* Copying members of the source expression
* into the current expression.
*/
if(0) {
asn1p_expr_t *tmp_clone;
tmp_clone = asn1p_expr_clone(type_expr);
if(tmp_clone == NULL) {
FATAL("Could not clone \"%s\" at line %d",
type_expr->Identifier, type_expr->_lineno);
return -1;
}
/*
* Replace the referenced type with its definition.
*/
DEBUG("\tChanging type of \"%s\":%x to %x for line %d",
expr->Identifier,
expr->expr_type,
type_expr->expr_type,
expr->_lineno
);
expr->expr_type = type_expr->expr_type;
expr->members = tmp_clone->members;
memset(&tmp_clone->members, 0, sizeof(tmp_clone->members));
asn1p_expr_free(tmp_clone);
}
return r_value;
}