blob: 769abed9a28d369258d82dd1805672c9b69cda85 [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
vlmfd245932005-03-10 10:02:50 +000018 DEBUG("(\"%s\":%x ::= \"%s\") for line %d",
19 expr->Identifier, expr->expr_type,
vlmfa67ddc2004-06-03 03:38:44 +000020 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 */
vlm2e0c1942004-08-22 03:10:23 +000029 type_expr = asn1f_find_terminal_type(arg, expr);
vlmfa67ddc2004-06-03 03:38:44 +000030 if(type_expr == NULL) {
vlmd9cd3f92004-06-28 21:21:24 +000031 const char *type_name;
vlmc03306f2006-03-18 05:06:57 +000032 asn1p_expr_t *idexpr;
vlmd9cd3f92004-06-28 21:21:24 +000033
34 if(errno == EEXIST) {
35 /* Ignore missing type
36 * if known to be defined externally:
37 * -fknown-extern-type=<name>
38 */
39 return 0;
40 }
41
42 type_name = asn1f_printable_reference(expr->reference);
vlmc03306f2006-03-18 05:06:57 +000043 /* Avoid NULL in case of unnamed T ::= SEQUENCE OF ... */
44 for(idexpr = expr; !idexpr->Identifier && idexpr->parent_expr;
45 idexpr = idexpr->parent_expr);
vlmfa67ddc2004-06-03 03:38:44 +000046 FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
vlmc03306f2006-03-18 05:06:57 +000047 type_name, idexpr->Identifier, expr->_lineno);
vlmfa67ddc2004-06-03 03:38:44 +000048 return -1;
49 }
50
vlmfa67ddc2004-06-03 03:38:44 +000051 return r_value;
52}
53