avoid generating references to empty maps
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index c51f998..e3669fd 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -410,6 +410,20 @@
return asn1c_lang_C_type_SEQUENCE_def(arg, ioc_tao.ioct ? &ioc_tao : 0);
}
+static void
+emit_tag2member_reference(arg_t *arg, asn1p_expr_t *expr,
+ unsigned tag2el_count) {
+ if(tag2el_count) {
+ if(C99_MODE) OUT(".tag2el = ");
+ OUT("asn_MAP_%s_tag2el_%d,\n", MKID(expr), expr->_type_unique_index);
+ if(C99_MODE) OUT(".tag2el_count = ");
+ OUT("%d,\t/* Count of tags in the map */\n", tag2el_count);
+ } else {
+ OUT("0,\t/* No top level tags */\n");
+ OUT("0,\t/* No tags in the map */\n");
+ }
+}
+
static int
asn1c_lang_C_type_SEQUENCE_def(arg_t *arg, asn1c_ioc_table_and_objset_t *opt_ioc) {
asn1p_expr_t *expr = arg->expr;
@@ -540,16 +554,7 @@
out_name_chain(arg, ONC_avoid_keywords); OUT("),\n");
OUT("offsetof(struct ");
out_name_chain(arg, ONC_avoid_keywords); OUT(", _asn_ctx),\n");
-
- if(tag2el_count) {
- OUT("asn_MAP_%s_tag2el_%d,\n",
- MKID(expr),
- expr->_type_unique_index);
- OUT("%d,\t/* Count of tags in the map */\n", tag2el_count);
- } else {
- OUT("0,\t/* No top level tags */\n");
- OUT("0,\t/* No tags in the map */\n");
- }
+ emit_tag2member_reference(arg, expr, tag2el_count);
if(roms_count + aoms_count) {
OUT("asn_MAP_%s_oms_%d,\t/* Optional members */\n",
MKID(expr), expr->_type_unique_index);
@@ -784,9 +789,8 @@
OUT("offsetof(struct ");
out_name_chain(arg, ONC_avoid_keywords);
OUT(", _presence_map),\n");
+ emit_tag2member_reference(arg, expr, tag2el_count);
p = MKID(expr);
- OUT("asn_MAP_%s_tag2el_%d,\n", p, expr->_type_unique_index);
- OUT("%d,\t/* Count of tags in the map */\n", tag2el_count);
if(tag2el_cxer)
OUT("asn_MAP_%s_tag2el_cxer_%d,\n",
p, expr->_type_unique_index);
@@ -1227,9 +1231,7 @@
OUT("sizeof(((struct ");
out_name_chain(arg, ONC_avoid_keywords);
OUT(" *)0)->present),\n");
- OUT("asn_MAP_%s_tag2el_%d,\n",
- MKID(expr), expr->_type_unique_index);
- OUT("%d,\t/* Count of tags in the map */\n", tag2el_count);
+ emit_tag2member_reference(arg, expr, tag2el_count);
if(C99_MODE) OUT(".canonical_order = ");
if(cmap) OUT("asn_MAP_%s_cmap_%d,\t/* Canonically sorted */\n",
MKID(expr), expr->_type_unique_index);
@@ -2715,13 +2717,35 @@
const asn1p_ref_t *objset_ref =
asn1c_get_information_object_set_reference_from_constraint(arg, crc);
- if(!objset_ref || objset_ref->comp_count != 1) {
- FATAL("Reference %s does not look like an object set type %s",
- asn1p_constraint_string(crc), asn1p_ref_string(objset_ref));
+ if(!objset_ref) {
+ FATAL("Constraint %s does not look like it referst to a set type %s",
+ asn1p_constraint_string(crc),
+ opt_ioc->objset->Identifier);
return -1;
}
- const char *objset_name = objset_ref->components[0].name;
+ const char *objset_name;
+ if(objset_ref->comp_count == 1) {
+ objset_name = objset_ref->components[0].name;
+ } else if(objset_ref->comp_count == 2) {
+ if(strcmp(objset_ref->components[0].name,
+ opt_ioc->objset->module->ModuleName)
+ != 0) {
+ FATAL(
+ "Composite reference %s (from %s) does not look like it refers "
+ "to the same module as %s from an object set type %s",
+ asn1p_ref_string(objset_ref), asn1p_constraint_string(crc),
+ opt_ioc->objset->module->ModuleName,
+ opt_ioc->objset->Identifier);
+ return -1;
+ }
+ objset_name = objset_ref->components[1].name;
+ } else {
+ FATAL("Reference %s (from %s) does not look like an object set type %s",
+ asn1p_ref_string(objset_ref), asn1p_constraint_string(crc),
+ opt_ioc->objset->Identifier);
+ return -1;
+ }
if(strcmp(objset_name, opt_ioc->objset->Identifier) != 0) {
FATAL("Object Set references do not match: %s != %s", objset_name,
opt_ioc->objset->Identifier);
diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c
index 8965b96..1106e55 100644
--- a/libasn1fix/asn1fix_cws.c
+++ b/libasn1fix/asn1fix_cws.c
@@ -1,8 +1,6 @@
#include "asn1fix_internal.h"
#include "asn1fix_cws.h"
-const char *asn1p_constraint_string(const asn1p_constraint_t *);
-
static int _asn1f_parse_class_object_data(arg_t *, asn1p_expr_t *eclass,
struct asn1p_ioc_row_s *row, asn1p_wsyntx_t *syntax,
const uint8_t *buf, const uint8_t *bend,
@@ -181,25 +179,28 @@
_asn1f_foreach_unparsed(arg_t *arg, const asn1p_constraint_t *ct,
int (*process)(const uint8_t *buf, size_t size,
void *key),
- void *key) {
+ void *keyp) {
+ struct parse_object_key *key = keyp;
if(!ct) return -1;
switch(ct->type) {
default:
- DEBUG("Constraint %s is of unknown type for CWS",
- asn1p_constraint_string(ct));
+ DEBUG("Constraint is of unknown type %d for CWS", ct->type);
return -1;
case ACT_EL_EXT: /* ... */
+ if(key) {
+ key->expr->ioc_table->extensible = 1;
+ }
return 0;
case ACT_CA_UNI: /* | */
- return _asn1f_foreach_unparsed_union(ct, process, key);
+ return _asn1f_foreach_unparsed_union(ct, process, keyp);
case ACT_CA_CSV: /* , */
break;
}
for(size_t i = 0; i < ct->el_count; i++) {
const asn1p_constraint_t *ct1 = ct->elements[i];
- if(_asn1f_foreach_unparsed(arg, ct1, process, key) != 0) {
+ if(_asn1f_foreach_unparsed(arg, ct1, process, keyp) != 0) {
return -1;
}
}