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

references

parent d404427f
No related branches found
No related tags found
No related merge requests found
......@@ -477,7 +477,8 @@ asn1f_check_duplicate(arg_t *arg) {
"ASN.1 expression \"%s\" at line %d of module %s\n"
"clashes with expression \"%s\" at line %d of module %s"
"%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->_lineno,
arg->mod->ModuleName,
......
......@@ -188,7 +188,7 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i
if(isdigit(*p)) {
asn1c_integer_t 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;
}
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
expr->expr_type = ASN_BASIC_INTEGER;
expr->value = asn1p_value_fromint(value);
} 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);
return 1;
}
......
......@@ -29,6 +29,7 @@ asn1f_fix_dereference_types(arg_t *arg) {
type_expr = asn1f_find_terminal_type(arg, expr);
if(type_expr == NULL) {
const char *type_name;
asn1p_expr_t *idexpr;
if(errno == EEXIST) {
/* Ignore missing type
......@@ -39,8 +40,11 @@ asn1f_fix_dereference_types(arg_t *arg) {
}
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",
type_name, expr->Identifier, expr->_lineno);
type_name, idexpr->Identifier, expr->_lineno);
return -1;
}
......
......@@ -58,7 +58,8 @@ asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name) {
arg->expr->_mark |= TM_BROKEN;
FATAL("Cannot find external module \"%s\" "
"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);
}
/* ENOENT/ETOOMANYREFS */
......@@ -144,10 +145,8 @@ asn1f_lookup_module(arg_t *arg, const char *module_name, asn1p_oid_t *oid) {
return NULL;
}
asn1p_expr_t *
asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
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 *ref_tc; /* Referenced tc */
asn1p_module_t *imports_from;
char *modulename;
......@@ -170,6 +169,15 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
mod->ModuleName,
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) {
modulename = NULL;
identifier = ref->components[0].name;
......@@ -247,7 +255,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) {
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)
&& !(imports_from->_tags & MT_STANDARD_MODULE)) {
arg->expr->_mark |= TM_BROKEN;
......@@ -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 *
asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *expr) {
return asn1f_find_terminal_thing(arg, expr, FTT_TYPE);
......
......@@ -3,7 +3,7 @@
* 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.
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
* implementation deals with the standard (machine-specific) representation
......
......@@ -3,7 +3,7 @@
* 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.
* Basically, both are decoders and encoders of ASN.1 INTEGER type, but this
* implementation deals with the standard (machine-specific) representation
......
......@@ -3,7 +3,7 @@
* 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.
* Basically, both are decoders and encoders of ASN.1 REAL type, but this
* 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
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