Skip to content
Snippets Groups Projects
Commit 33f63f83 authored by Lev Walkin's avatar Lev Walkin
Browse files

calling conventions refactored

parent d897416e
No related branches found
No related tags found
No related merge requests found
#include "asn1fix_internal.h" #include "asn1fix_internal.h"
static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value); enum ftt_what {
FTT_TYPE, /* Find the type of the given expression */
FTT_VALUE, /* Find the value of the given expression */
};
static asn1p_expr_t *asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what);
static int asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name); static int asn1f_compatible_with_exports(arg_t *arg, asn1p_module_t *mod, const char *name);
...@@ -290,37 +295,38 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { ...@@ -290,37 +295,38 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
asn1p_expr_t * asn1p_expr_t *
asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) { asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) {
return asn1f_find_terminal_thing(arg, expr, 0); return asn1f_find_terminal_thing(arg, expr, FTT_TYPE);
} }
asn1p_expr_t * asn1p_expr_t *
asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) { asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *expr) {
return asn1f_find_terminal_thing(arg, expr, 1); return asn1f_find_terminal_thing(arg, expr, FTT_VALUE);
} }
static asn1p_expr_t * static asn1p_expr_t *
asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, enum ftt_what what) {
asn1p_ref_t *ref; asn1p_ref_t *ref;
asn1p_expr_t *tc; asn1p_expr_t *tc;
if(type_or_value) { switch(what) {
/* VALUE */ case FTT_TYPE:
/* Expression may be a terminal type itself */
if(expr->expr_type != A1TC_REFERENCE)
return expr;
ref = expr->reference;
break;
case FTT_VALUE:
assert(expr->meta_type == AMT_VALUE); assert(expr->meta_type == AMT_VALUE);
assert(expr->value); assert(expr->value);
/* Expression may be a terminal type itself */ /* Expression may be a terminal type itself */
if(expr->value->type != ATV_REFERENCED) if(expr->value->type != ATV_REFERENCED)
return expr; return expr;
ref = expr->value->value.reference; ref = expr->value->value.reference;
} else { break;
/* TYPE */
/* Expression may be a terminal type itself */
if(expr->expr_type != A1TC_REFERENCE)
return expr;
ref = expr->reference;
} }
DEBUG("%s(%s->%s) for line %d", DEBUG("%s(%s->%s) for line %d",
type_or_value?"VALUE":"TYPE", (what == FTT_VALUE)?"VALUE":"TYPE",
expr->Identifier, asn1f_printable_reference(ref), expr->Identifier, asn1f_printable_reference(ref),
expr->_lineno); expr->_lineno);
...@@ -329,7 +335,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { ...@@ -329,7 +335,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) {
/* /*
* Lookup inside the type itself (ENUMERATED, INTEGER, etc). * Lookup inside the type itself (ENUMERATED, INTEGER, etc).
*/ */
if(type_or_value) { if(what == FTT_VALUE) {
asn1p_expr_t *val_type_tc; asn1p_expr_t *val_type_tc;
val_type_tc = asn1f_find_terminal_type(arg, expr); val_type_tc = asn1f_find_terminal_type(arg, expr);
if(val_type_tc if(val_type_tc
...@@ -365,7 +371,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) { ...@@ -365,7 +371,7 @@ asn1f_find_terminal_thing(arg_t *arg, asn1p_expr_t *expr, int type_or_value) {
tc->_mark |= TM_RECURSION; tc->_mark |= TM_RECURSION;
WITH_MODULE(tc->module, WITH_MODULE(tc->module,
expr = asn1f_find_terminal_thing(arg, tc, type_or_value)); expr = asn1f_find_terminal_thing(arg, tc, what));
tc->_mark &= ~TM_RECURSION; tc->_mark &= ~TM_RECURSION;
return expr; return expr;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment