blob: f0ec9a6ce5102d043499b89eb8b602f6f87f21ab [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001#include "asn1fix_internal.h"
2
3int
4asn1f_fix_dereference_types(arg_t *arg) {
5 asn1p_expr_t *expr = arg->expr;
6 asn1p_expr_t *type_expr;
7 int r_value = 0;
8
9 if(expr->expr_type == A1TC_PARAMETRIZED)
10 return asn1f_fix_parametrized_assignment(arg);
11
12 if(expr->expr_type != A1TC_REFERENCE
13 || expr->meta_type != AMT_TYPEREF) {
14 //assert(expr->reference == 0);
15 return 0; /* Just ignore it */
16 }
17
18 DEBUG("%s(\"%s\":%x ::= \"%s\") for line %d",
19 __func__, expr->Identifier, expr->expr_type,
20 asn1f_printable_value(expr->value),
21 expr->_lineno);
22
23 assert(TQ_FIRST(&(expr->members)) == 0);
24 assert(expr->reference);
25
26 /*
27 * Follow the reference.
28 */
29 type_expr = asn1f_find_terminal_type(arg, expr, 0);
30 if(type_expr == NULL) {
31 FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
32 asn1f_printable_reference(expr->reference),
33 expr->Identifier, expr->_lineno);
34 return -1;
35 }
36
37 /*
38 * Copying members of the source expression
39 * into the current expression.
40 */
41 if(0) {
42 asn1p_expr_t *tmp_clone;
43
44 tmp_clone = asn1p_expr_clone(type_expr);
45 if(tmp_clone == NULL) {
46 FATAL("Could not clone \"%s\" at line %d",
47 type_expr->Identifier, type_expr->_lineno);
48 return -1;
49 }
50
51 /*
52 * Replace the referenced type with its definition.
53 */
54 DEBUG("\tChanging type of \"%s\":%x to %x for line %d",
55 expr->Identifier,
56 expr->expr_type,
57 type_expr->expr_type,
58 expr->_lineno
59 );
60 expr->expr_type = type_expr->expr_type;
61 expr->members = tmp_clone->members;
62 memset(&tmp_clone->members, 0, sizeof(tmp_clone->members));
63 asn1p_expr_free(tmp_clone);
64 }
65
66 return r_value;
67}
68