aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
diff options
context:
space:
mode:
authorBi-Ruei, Chiu <biruei.chiu@gmail.com>2016-05-16 13:50:09 +0800
committerLev Walkin <vlm@lionet.info>2017-08-02 14:06:07 -0700
commit1fa31c9e3e4182251439e8d5795fe4abf73f3152 (patch)
treeda5b80c8044d08a21443409a83f2f593b94539fb /libasn1fix
parent6bc7a11d9e76d2b6116b5e23a21800d028c98d08 (diff)
Simplify the logic of accessing codec function for specific TYPE
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix_export.c15
-rw-r--r--libasn1fix/asn1fix_export.h6
-rw-r--r--libasn1fix/asn1fix_retrieve.c12
-rw-r--r--libasn1fix/asn1fix_retrieve.h7
4 files changed, 40 insertions, 0 deletions
diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c
index 6eb8cdad..bb598bf4 100644
--- a/libasn1fix/asn1fix_export.c
+++ b/libasn1fix/asn1fix_export.c
@@ -57,6 +57,21 @@ asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_expr_t *expr) {
return asn1f_find_terminal_type(&arg, expr);
}
+asn1p_expr_t *
+asn1f_find_ancestor_type_with_PER_constraint_ex(asn1p_t *asn, asn1p_expr_t *expr) {
+ arg_t arg;
+
+ memset(&arg, 0, sizeof(arg));
+
+ arg.asn = asn;
+ arg.mod = expr->module;
+ arg.expr = expr;
+ arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
+ arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
+
+ return asn1f_find_ancestor_type_with_PER_constraint(&arg, expr);
+}
+
int
asn1f_fix_dereference_values_ex(asn1p_t *asn, asn1p_module_t *mod,
asn1p_expr_t *expr) {
diff --git a/libasn1fix/asn1fix_export.h b/libasn1fix/asn1fix_export.h
index be066234..0411843b 100644
--- a/libasn1fix/asn1fix_export.h
+++ b/libasn1fix/asn1fix_export.h
@@ -38,4 +38,10 @@ asn1p_expr_t *asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_expr_t *tc);
int asn1f_fix_dereference_values_ex(asn1p_t *asn, asn1p_module_t *mod,
asn1p_expr_t *expr);
+/*
+ * Exportable version of asn1f_find_ancestor_type_with_PER_constraint().
+ */
+asn1p_expr_t *asn1f_find_ancestor_type_with_PER_constraint_ex(asn1p_t *asn,
+ asn1p_expr_t *expr);
+
#endif /* ASN1FIX_EXPORT_H */
diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c
index 86540b94..1700914f 100644
--- a/libasn1fix/asn1fix_retrieve.c
+++ b/libasn1fix/asn1fix_retrieve.c
@@ -3,6 +3,7 @@
enum ftt_what {
FTT_TYPE, /* Find the type of the given expression */
FTT_VALUE, /* Find the value of the given expression */
+ FTT_CONSTR_TYPE /* Find the type of the given expression having constraint */
};
static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what);
@@ -382,6 +383,11 @@ asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) {
return asn1f_find_terminal_thing(arg, expr, FTT_VALUE);
}
+asn1p_expr_t *
+asn1f_find_ancestor_type_with_PER_constraint(arg_t *arg, asn1p_expr_t *expr) {
+ return asn1f_find_terminal_thing(arg, expr, FTT_CONSTR_TYPE);
+}
+
static asn1p_expr_t *
asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) {
asn1p_ref_t *ref = 0;
@@ -389,6 +395,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) {
switch(what) {
case FTT_TYPE:
+ case FTT_CONSTR_TYPE:
/* Expression may be a terminal type itself */
if(expr->expr_type != A1TC_REFERENCE)
return expr;
@@ -455,6 +462,10 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) {
}
tc->_type_referenced = 1;
+
+ if((what == FTT_CONSTR_TYPE) && (tc->constraints))
+ return tc;
+
tc->_mark |= TM_RECURSION;
WITH_MODULE(tc->module,
expr = asn1f_find_terminal_thing(arg, tc, what));
@@ -463,6 +474,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) {
return expr;
}
+
/*
* Make sure that the specified name is present or otherwise does
* not contradict with the EXPORTS clause of the specified module.
diff --git a/libasn1fix/asn1fix_retrieve.h b/libasn1fix/asn1fix_retrieve.h
index 53239046..2d529ef9 100644
--- a/libasn1fix/asn1fix_retrieve.h
+++ b/libasn1fix/asn1fix_retrieve.h
@@ -68,4 +68,11 @@ asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc);
*/
asn1p_expr_t *asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *tc);
+/*
+ * Recursively find the original type with constraint for the given
+ * expression.
+ */
+asn1p_expr_t *asn1f_find_ancestor_type_with_PER_constraint(arg_t *arg, asn1p_expr_t *tc);
+
+
#endif /* ASN1FIX_RETRIEVE_H */