8f570f6445ca2bd0930f2476919ae28012c0bb8b
[com/asn1c.git] / libasn1fix / asn1fix_dereft.c
1 #include "asn1fix_internal.h"
2
3 int
4 asn1f_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_REFERENCE
10         || expr->meta_type != AMT_TYPEREF) {
11                 //assert(expr->reference == 0);
12                 return 0;       /* Just ignore it */
13         }
14
15         DEBUG("(\"%s\":%x ::= \"%s\") for line %d",
16                 expr->Identifier, expr->expr_type,
17                 asn1f_printable_value(expr->value),
18                 expr->_lineno);
19
20         assert(TQ_FIRST(&(expr->members)) == 0);
21         assert(expr->reference);
22
23         /*
24          * Follow the reference.
25          */
26         type_expr = asn1f_find_terminal_type(arg, expr);
27         if(type_expr == NULL) {
28                 const char *type_name;
29                 asn1p_expr_t *idexpr;
30
31                 if(errno == EEXIST) {
32                         /* Ignore missing type
33                          * if known to be defined externally:
34                          * -fknown-extern-type=<name>
35                          */
36                         return 0;
37                 }
38
39                 type_name = asn1f_printable_reference(expr->reference);
40                 /* Avoid NULL in case of unnamed T ::= SEQUENCE OF ... */
41                 for(idexpr = expr; !idexpr->Identifier && idexpr->parent_expr;
42                         idexpr = idexpr->parent_expr);
43                 FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
44                         type_name, idexpr->Identifier, expr->_lineno);
45                 return -1;
46         }
47
48         return r_value;
49 }
50