blob: 22ba422c83785b430a73cbc2b414bb61b9781481 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001#include "asn1fix_internal.h"
2
3int
Lev Walkind541c252004-09-05 10:36:22 +00004asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag, int flags) {
Lev Walkinf15320b2004-06-03 03:38:44 +00005 int ret;
6
7 if(expr->tag.tag_class != TC_NOCLASS) {
8 *tag = expr->tag;
9 return 0;
10 }
11
12 if(expr->expr_type == A1TC_EXTENSIBLE) {
13 memset(tag, 0, sizeof(*tag));
14 tag->tag_class = -1;
15 return 0;
16 }
17
18 if(expr->meta_type == AMT_TYPE) {
19 memset(tag, 0, sizeof(*tag));
20 tag->tag_class = TC_UNIVERSAL;
21 tag->tag_value = expr_type2uclass_value[expr->expr_type];
Lev Walkind541c252004-09-05 10:36:22 +000022 if(flags && expr->expr_type == ASN_TYPE_ANY) {
23 assert(tag->tag_value == 0);
24 tag->tag_value = -1;
25 return 0;
26 }
Lev Walkinf15320b2004-06-03 03:38:44 +000027 return (tag->tag_value == 0) ? -1 : 0;
28 }
29
30 if(expr->meta_type == AMT_TYPEREF) {
31 arg_t arg;
32
33 memset(&arg, 0, sizeof(arg));
34 arg.asn = asn;
35 arg.mod = mod;
36 arg.expr = expr;
37
Lev Walkin6fec44d2004-08-22 03:10:23 +000038 expr = asn1f_lookup_symbol(&arg, expr->module, expr->reference);
Lev Walkinf15320b2004-06-03 03:38:44 +000039 if(expr == NULL) return -1;
40
41 if(expr->_mark & TM_RECURSION)
42 return -1;
43
44 expr->_mark |= TM_RECURSION;
Lev Walkind541c252004-09-05 10:36:22 +000045 ret = asn1f_fetch_tag(asn, expr->module, expr, tag,
46 flags);
Lev Walkinf15320b2004-06-03 03:38:44 +000047 expr->_mark &= ~TM_RECURSION;
48 return ret;
49 }
50
51 return -1;
52}
53