blob: 3942d16c61d038adec3911ace160e7a62d5971c1 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001#include "asn1fix_internal.h"
2
3/*
4 * Dereference DefinedValues:
5 */
6int
7asn1f_fix_dereference_values(arg_t *arg) {
8 asn1p_expr_t *expr = arg->expr;
9 int r_value = 0;
10
Lev Walkin9fb53592004-09-15 11:46:23 +000011 if(expr->value && expr->meta_type == AMT_VALUE) {
Lev Walkin9288d1c2005-03-10 11:27:13 +000012 if(asn1f_value_resolve(arg, expr, 0)) {
Lev Walkinf15320b2004-06-03 03:38:44 +000013 /* This function will emit messages */
14 r_value = -1;
15 }
Lev Walkin9fb53592004-09-15 11:46:23 +000016 }
Lev Walkinf15320b2004-06-03 03:38:44 +000017
Lev Walkin3645c1c2004-10-31 00:11:50 +000018 return r_value;
19}
20
21
22/*
23 * Dereference DEFAULT values
24 */
25int
26asn1f_fix_dereference_defaults(arg_t *arg) {
27 asn1p_expr_t *expr = arg->expr;
28 int r_value = 0;
29
Lev Walkin9fb53592004-09-15 11:46:23 +000030 if(expr->marker.default_value) {
31 arg_t tmparg = *arg;
32 asn1p_expr_t tmpexpr = *expr;
33
34 switch(expr->marker.default_value->type) {
35 default:
36 return r_value;
37 case ATV_REFERENCED:
38 break;
Lev Walkinf15320b2004-06-03 03:38:44 +000039 }
Lev Walkin9fb53592004-09-15 11:46:23 +000040
Lev Walkindc4376d2006-03-16 11:04:55 +000041
42 if(expr->expr_type == A1TC_CLASSFIELD_FTVFS) {
43 asn1p_expr_t *child = TQ_FIRST(&expr->members);
44 int ret;
45 assert(child);
46 assert(child->marker.default_value == 0);
47 tmparg.expr = child;
48 child->marker.default_value=expr->marker.default_value;
49 ret = asn1f_fix_dereference_defaults(&tmparg);
50 expr->marker.default_value = child->marker.default_value;
Bi-Ruei, Chiu80fd3062017-05-07 21:00:51 +080051 child->marker.default_value = 0; /* ULB: trying to ensure there isn't another pointer to the same value object */
Lev Walkindc4376d2006-03-16 11:04:55 +000052 if(ret == 0) return 0; /* Finished */
53 }
54
Lev Walkin9fb53592004-09-15 11:46:23 +000055 tmparg.expr = &tmpexpr;
56 tmpexpr.meta_type = AMT_VALUE;
57 tmpexpr.marker.default_value = 0;
58 tmpexpr.value = expr->marker.default_value;
Lev Walkin9288d1c2005-03-10 11:27:13 +000059 if(asn1f_value_resolve(&tmparg, &tmpexpr, 0))
Lev Walkin9fb53592004-09-15 11:46:23 +000060 r_value = -1;
61 expr->marker.default_value = tmpexpr.value;
Lev Walkinf15320b2004-06-03 03:38:44 +000062 }
63
64 return r_value;
65}
66