Commit 41635d33 authored by Lev Walkin's avatar Lev Walkin

references

parent d404427f
...@@ -477,7 +477,8 @@ asn1f_check_duplicate(arg_t *arg) { ...@@ -477,7 +477,8 @@ asn1f_check_duplicate(arg_t *arg) {
"ASN.1 expression \"%s\" at line %d of module %s\n" "ASN.1 expression \"%s\" at line %d of module %s\n"
"clashes with expression \"%s\" at line %d of module %s" "clashes with expression \"%s\" at line %d of module %s"
"%s%s%s.\n" "%s%s%s.\n"
"Please rename either instance to resolve the conflict", "Rename or remove either instance "
"to resolve the conflict",
arg->expr->Identifier, arg->expr->Identifier,
arg->expr->_lineno, arg->expr->_lineno,
arg->mod->ModuleName, arg->mod->ModuleName,
......
...@@ -188,7 +188,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i ...@@ -188,7 +188,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i
if(isdigit(*p)) { if(isdigit(*p)) {
asn1c_integer_t value; asn1c_integer_t value;
if(asn1p_atoi(p, &value)) { if(asn1p_atoi(p, &value)) {
FATAL("Value %s at line %d is too large for this compiler! Please contact the asn1c author.\n", p, arg->expr->_lineno); FATAL("Value %s at line %d is too large for this compiler! Contact the asn1c author.\n", p, arg->expr->_lineno);
return -1; return -1;
} }
expr = asn1p_expr_new(arg->expr->_lineno); expr = asn1p_expr_new(arg->expr->_lineno);
...@@ -197,7 +197,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i ...@@ -197,7 +197,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i
expr->expr_type = ASN_BASIC_INTEGER; expr->expr_type = ASN_BASIC_INTEGER;
expr->value = asn1p_value_fromint(value); expr->value = asn1p_value_fromint(value);
} else { } else {
WARNING("asn1c is not yet able to parse arbitrary direct values; please convert %s at line %d to a reference.", p, arg->expr->_lineno); WARNING("asn1c is not yet able to parse arbitrary direct values; try converting %s at line %d to a reference.", p, arg->expr->_lineno);
free(p); free(p);
return 1; return 1;
} }
......
...@@ -29,6 +29,7 @@ asn1f_fix_dereference_types(arg_t *arg) { ...@@ -29,6 +29,7 @@ asn1f_fix_dereference_types(arg_t *arg) {
type_expr = asn1f_find_terminal_type(arg, expr); type_expr = asn1f_find_terminal_type(arg, expr);
if(type_expr == NULL) { if(type_expr == NULL) {
const char *type_name; const char *type_name;
asn1p_expr_t *idexpr;
if(errno == EEXIST) { if(errno == EEXIST) {
/* Ignore missing type /* Ignore missing type
...@@ -39,8 +40,11 @@ asn1f_fix_dereference_types(arg_t *arg) { ...@@ -39,8 +40,11 @@ asn1f_fix_dereference_types(arg_t *arg) {
} }
type_name = asn1f_printable_reference(expr->reference); type_name = asn1f_printable_reference(expr->reference);
/* Avoid NULL in case of unnamed T ::= SEQUENCE OF ... */
for(idexpr = expr; !idexpr->Identifier && idexpr->parent_expr;
idexpr = idexpr->parent_expr);
FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d", FATAL("Unknown type \"%s\" referenced by \"%s\" at line %d",
type_name, expr->Identifier, expr->_lineno); type_name, idexpr->Identifier, expr->_lineno);
return -1; return -1;
} }
......
...@@ -58,7 +58,8 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) { ...@@ -58,7 +58,8 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) {
arg->expr->_mark |= TM_BROKEN; arg->expr->_mark |= TM_BROKEN;
FATAL("Cannot find external module \"%s\" " FATAL("Cannot find external module \"%s\" "
"mentioned for " "mentioned for "
"\"%s\" at line %d", "\"%s\" at line %d. "
"Obtain this module and instruct compiler to process it too.",
xp->fromModuleName, name, arg->expr->_lineno); xp->fromModuleName, name, arg->expr->_lineno);
} }
/* ENOENT/ETOOMANYREFS */ /* ENOENT/ETOOMANYREFS */
...@@ -144,10 +145,8 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) { ...@@ -144,10 +145,8 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) {
return NULL; return NULL;
} }
static asn1p_expr_t *
asn1f_lookup_symbol_impl(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref, int recursion_depth) {
asn1p_expr_t *
asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
asn1p_expr_t *ref_tc; /* Referenced tc */ asn1p_expr_t *ref_tc; /* Referenced tc */
asn1p_module_t *imports_from; asn1p_module_t *imports_from;
char *modulename; char *modulename;
...@@ -170,6 +169,15 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { ...@@ -170,6 +169,15 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
mod->ModuleName, mod->ModuleName,
ref->_lineno); ref->_lineno);
if(recursion_depth++ > 30 /* Arbitrary constant */) {
FATAL("Excessive circular referencing detected in module %s for %s at line %d",
mod->ModuleName,
asn1f_printable_reference(ref),
ref->_lineno);
errno = ETOOMANYREFS;
return NULL;
}
if(ref->comp_count == 1) { if(ref->comp_count == 1) {
modulename = NULL; modulename = NULL;
identifier = ref->components[0].name; identifier = ref->components[0].name;
...@@ -247,7 +255,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { ...@@ -247,7 +255,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
assert(tmpref.comp_count > 0); assert(tmpref.comp_count > 0);
} }
expr = asn1f_lookup_symbol(arg, imports_from, &tmpref); expr = asn1f_lookup_symbol_impl(arg, imports_from, &tmpref, recursion_depth);
if(!expr && !(arg->expr->_mark & TM_BROKEN) if(!expr && !(arg->expr->_mark & TM_BROKEN)
&& !(imports_from->_tags & MT_STANDARD_MODULE)) { && !(imports_from->_tags & MT_STANDARD_MODULE)) {
arg->expr->_mark |= TM_BROKEN; arg->expr->_mark |= TM_BROKEN;
...@@ -326,6 +334,11 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { ...@@ -326,6 +334,11 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
} }
asn1p_expr_t *
asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
return asn1f_lookup_symbol_impl(arg, mod, ref, 0);
}
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, FTT_TYPE); return asn1f_find_terminal_thing(arg, expr, FTT_TYPE);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Redistribution and modifications are permitted subject to BSD license. * Redistribution and modifications are permitted subject to BSD license.
*/ */
/* /*
* Please read the NativeInteger.h for the explanation wrt. differences between * Read the NativeInteger.h for the explanation wrt. differences between
* INTEGER and NativeInteger. * INTEGER and NativeInteger.
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
* implementation deals with the standard (machine-specific) representation * implementation deals with the standard (machine-specific) representation
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Redistribution and modifications are permitted subject to BSD license. * Redistribution and modifications are permitted subject to BSD license.
*/ */
/* /*
* Please read the NativeInteger.h for the explanation wrt. differences between * Read the NativeInteger.h for the explanation wrt. differences between
* INTEGER and NativeInteger. * INTEGER and NativeInteger.
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
* implementation deals with the standard (machine-specific) representation * implementation deals with the standard (machine-specific) representation
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Redistribution and modifications are permitted subject to BSD license. * Redistribution and modifications are permitted subject to BSD license.
*/ */
/* /*
* Please read the NativeReal.h for the explanation wrt. differences between * Read the NativeReal.h for the explanation wrt. differences between
* REAL and NativeReal. * REAL and NativeReal.
* Basically, both are decoders and encoders of ASN.1 REAL type, but this * Basically, both are decoders and encoders of ASN.1 REAL type, but this
* implementation deals with the standard (machine-specific) representation * implementation deals with the standard (machine-specific) representation
......
-- SE: Semantic error
-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
-- .spelio.software.asn1c.test (9363.1.5.1)
-- .102
ModuleReference
{ iso org(3) dod(6) internet (1) private(4) enterprise(1)
spelio(9363) software(1) asn1c(5) test(1) 102 }
DEFINITIONS ::=
BEGIN
IMPORTS Type FROM ModuleReference;
T ::= SEQUENCE OF Type
END
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment