blob: ed8c19f28f6cc1c1b99dc48db749cc6541b70dae [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001#include "asn1fix_internal.h"
2
3int
4asn1f_fetch_tag(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag) {
5 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];
22 return (tag->tag_value == 0) ? -1 : 0;
23 }
24
25 if(expr->meta_type == AMT_TYPEREF) {
26 arg_t arg;
27
28 memset(&arg, 0, sizeof(arg));
29 arg.asn = asn;
30 arg.mod = mod;
31 arg.expr = expr;
32
33 expr = asn1f_lookup_symbol(&arg, expr->reference, &mod);
34 if(expr == NULL) return -1;
35
36 if(expr->_mark & TM_RECURSION)
37 return -1;
38
39 expr->_mark |= TM_RECURSION;
40 ret = asn1f_fetch_tag(asn, mod, expr, tag);
41 expr->_mark &= ~TM_RECURSION;
42 return ret;
43 }
44
45 return -1;
46}
47