blob: 8f570f6445ca2bd0930f2476919ae28012c0bb8b [file] [log] [blame]
Lev Walkinf15320b2004-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
Lev Walkinf15320b2004-06-03 03:38:44 +00009 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
Lev Walkin03850182005-03-10 10:02:50 +000015 DEBUG("(\"%s\":%x ::= \"%s\") for line %d",
16 expr->Identifier, expr->expr_type,
Lev Walkinf15320b2004-06-03 03:38:44 +000017 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 */
Lev Walkin6fec44d2004-08-22 03:10:23 +000026 type_expr = asn1f_find_terminal_type(arg, expr);
Lev Walkinf15320b2004-06-03 03:38:44 +000027 if(type_expr == NULL) {
Lev Walkin97bdee22004-06-28 21:21:24 +000028 const char *type_name;
Lev Walkin41635d32006-03-18 05:06:57 +000029 asn1p_expr_t *idexpr;
Lev Walkin97bdee22004-06-28 21:21:24 +000030
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);
Lev Walkin41635d32006-03-18 05:06:57 +000040 /* Avoid NULL in case of unnamed T ::= SEQUENCE OF ... */
41 for(idexpr = expr; !idexpr->Identifier && idexpr->parent_expr;
42 idexpr = idexpr->parent_expr);
Lev Walkinf15320b2004-06-03 03:38:44 +000043 FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
Lev Walkin41635d32006-03-18 05:06:57 +000044 type_name, idexpr->Identifier, expr->_lineno);
Lev Walkinf15320b2004-06-03 03:38:44 +000045 return -1;
46 }
47
Lev Walkinf15320b2004-06-03 03:38:44 +000048 return r_value;
49}
50