Commit 8dd0eedc authored by Lev Walkin's avatar Lev Walkin

better type naming

parent f6ac3c8b
......@@ -13,6 +13,7 @@
* Improved DEFAULT Value parsing and pretty-printing.
* Condition on distinct tags checker was incorrectly dealing with
tagged CHOICE types. Fixed. Modified tests/37-indirect-choice-OK.asn1
* Improved type name generation code ("struct foo" vs "foo_t").
* Fixed constraint checking code incorrectly dealing with imported
types with constraint values defined in other modules.
* Real REAL support! (Haven't tested denormals support yet!)
......
......@@ -452,7 +452,7 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) {
arg->embed--;
assert(arg->target->target == OT_TYPE_DECLS);
} else {
OUT("%s", asn1c_type_name(arg, memb, TNF_RSAFE));
OUT("%s", asn1c_type_name(arg, memb, TNF_CTYPE));
}
OUT(") list;\n");
INDENT(-1);
......@@ -728,8 +728,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) {
if(arg->embed) {
REDIR(OT_TYPE_DECLS);
OUT("%s\t", asn1c_type_name(arg, arg->expr,
expr->marker.flags?TNF_RSAFE:TNF_CTYPE));
OUT("%s\t", asn1c_type_name(arg, arg->expr, TNF_CTYPE));
OUT("%s", expr->marker.flags?"*":" ");
OUT("%s", MKID(expr->Identifier));
if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT)
......
......@@ -112,23 +112,17 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) {
return asn1c_type_name(&tmp, tmp.expr, _format);
}
if(_format == TNF_RSAFE || _format == TNF_CTYPE) {
if(_format == TNF_CTYPE) {
/*
* The recursion-safe format is requested.
* The problem here is that only constructed types
* might be referenced with "struct".
* Change RSAFE to CTYPE if the terminal type
* is primitive.
* If the component references the type itself,
* switch to a recursion safe type representation
* ("struct foo" instead of "foo_t").
*/
asn1p_expr_t *terminal;
terminal = asn1f_find_terminal_type_ex(
arg->asn, arg->mod, arg->expr);
if(terminal) {
if(terminal->expr_type
& (ASN_BASIC_MASK | ASN_STRING_MASK))
_format = TNF_CTYPE;
if(terminal == top_parent)
_format = TNF_RSAFE;
arg->asn, arg->mod, expr);
if(terminal && terminal == top_parent) {
_format = TNF_RSAFE;
}
}
break;
......@@ -179,7 +173,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) {
_format = TNF_CTYPE;
typename = ASN_EXPR_TYPE2STR(expr->expr_type);
} else {
_format = TNF_SAFE;
_format = TNF_RSAFE;
typename = expr->Identifier;
}
}
......@@ -196,7 +190,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) {
return asn1c_make_identifier(0, "struct", " ", typename, 0);
}
assert("!unreachable");
assert(!"unreachable");
return typename;
}
......@@ -200,7 +200,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Name;
typedef struct Name {
A_SEQUENCE_OF(struct RelativeDistinguishedName) list;
A_SEQUENCE_OF(RelativeDistinguishedName_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......
......@@ -13,7 +13,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Forest;
typedef struct Forest {
A_SET_OF(struct Tree) list;
A_SET_OF(Tree_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......@@ -158,7 +158,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_Stuff;
typedef struct Stuff {
struct trees {
A_SET_OF(struct Forest) list;
A_SET_OF(Forest_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......
......@@ -17,7 +17,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_T;
typedef struct T {
INTEGER_t int;
struct collection {
A_SEQUENCE_OF(struct T2) list;
A_SEQUENCE_OF(T2_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......
......@@ -17,7 +17,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_LogLine;
typedef struct LogLine {
IA5String_t line_digest;
struct varsets {
A_SEQUENCE_OF(struct VariablePartSet) list;
A_SEQUENCE_OF(VariablePartSet_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......@@ -171,7 +171,7 @@ extern asn1_TYPE_descriptor_t asn1_DEF_VariablePartSet;
typedef struct VariablePartSet {
struct vparts {
A_SEQUENCE_OF(struct VariablePart) list;
A_SEQUENCE_OF(VariablePart_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
......
-- OK: Everything is fine
-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
-- .spelio.software.asn1c.test (9363.1.5.1)
-- .66
ModuleTestReferenceToSimpleType
{ iso org(3) dod(6) internet(1) private(4) enterprise(1)
spelio(9363) software(1) asn1c(5) test(1) 66 }
DEFINITIONS IMPLICIT TAGS ::=
BEGIN
T ::= SET OF SimpleType
SimpleType ::= ENUMERATED { one, two, three }
END
/*** <<< INCLUDES [T] >>> ***/
#include <SimpleType.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
/*** <<< DEPS [T] >>> ***/
extern asn1_TYPE_descriptor_t asn1_DEF_T;
/*** <<< TYPE-DECLS [T] >>> ***/
typedef struct T {
A_SET_OF(SimpleType_t) list;
/* Context for parsing across buffer boundaries */
ber_dec_ctx_t _ber_dec_ctx;
} T_t;
/*** <<< STAT-DEFS [T] >>> ***/
static asn1_TYPE_member_t asn1_MBR_T[] = {
{ ATF_NOFLAGS, 0, 0,
.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
.tag_mode = 0,
.type = (void *)&asn1_DEF_SimpleType,
.memb_constraints = 0, /* Defer to actual type */
.name = ""
},
};
static ber_tlv_tag_t asn1_DEF_T_tags[] = {
(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_T_specs = {
sizeof(struct T),
offsetof(struct T, _ber_dec_ctx),
};
asn1_TYPE_descriptor_t asn1_DEF_T = {
"T",
SET_OF_constraint,
SET_OF_decode_ber,
SET_OF_encode_der,
SET_OF_print,
SET_OF_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_T_tags,
sizeof(asn1_DEF_T_tags)
/sizeof(asn1_DEF_T_tags[0]), /* 1 */
asn1_DEF_T_tags, /* Same as above */
sizeof(asn1_DEF_T_tags)
/sizeof(asn1_DEF_T_tags[0]), /* 1 */
1, /* Whether CONSTRUCTED */
asn1_MBR_T,
1, /* Single element */
&asn1_DEF_T_specs /* Additional specs */
};
/*** <<< INCLUDES [SimpleType] >>> ***/
#include <ENUMERATED.h>
/*** <<< DEPS [SimpleType] >>> ***/
typedef enum SimpleType {
SimpleType_one = 0,
SimpleType_two = 1,
SimpleType_three = 2,
} SimpleType_e;
/*** <<< TYPE-DECLS [SimpleType] >>> ***/
typedef ENUMERATED_t SimpleType_t;
/*** <<< FUNC-DECLS [SimpleType] >>> ***/
extern asn1_TYPE_descriptor_t asn1_DEF_SimpleType;
asn_constr_check_f SimpleType_constraint;
ber_type_decoder_f SimpleType_decode_ber;
der_type_encoder_f SimpleType_encode_der;
asn_struct_print_f SimpleType_print;
asn_struct_free_f SimpleType_free;
/*** <<< CODE [SimpleType] >>> ***/
int
SimpleType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
/* Make the underlying type checker permanent */
td->check_constraints = asn1_DEF_ENUMERATED.check_constraints;
return td->check_constraints
(td, sptr, app_errlog, app_key);
}
/*
* This type is implemented using ENUMERATED,
* so adjust the DEF appropriately.
*/
static void
SimpleType_inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
td->ber_decoder = asn1_DEF_ENUMERATED.ber_decoder;
td->der_encoder = asn1_DEF_ENUMERATED.der_encoder;
td->free_struct = asn1_DEF_ENUMERATED.free_struct;
td->print_struct = asn1_DEF_ENUMERATED.print_struct;
td->last_tag_form = asn1_DEF_ENUMERATED.last_tag_form;
td->elements = asn1_DEF_ENUMERATED.elements;
td->elements_count = asn1_DEF_ENUMERATED.elements_count;
td->specifics = asn1_DEF_ENUMERATED.specifics;
}
ber_dec_rval_t
SimpleType_decode_ber(asn1_TYPE_descriptor_t *td,
void **structure, void *bufptr, size_t size, int tag_mode) {
SimpleType_inherit_TYPE_descriptor(td);
return td->ber_decoder(td, structure, bufptr, size, tag_mode);
}
der_enc_rval_t
SimpleType_encode_der(asn1_TYPE_descriptor_t *td,
void *structure, int tag_mode, ber_tlv_tag_t tag,
asn_app_consume_bytes_f *cb, void *app_key) {
SimpleType_inherit_TYPE_descriptor(td);
return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}
int
SimpleType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
SimpleType_inherit_TYPE_descriptor(td);
return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}
void
SimpleType_free(asn1_TYPE_descriptor_t *td,
void *struct_ptr, int contents_only) {
SimpleType_inherit_TYPE_descriptor(td);
td->free_struct(td, struct_ptr, contents_only);
}
/*** <<< STAT-DEFS [SimpleType] >>> ***/
static ber_tlv_tag_t asn1_DEF_SimpleType_tags[] = {
(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_SimpleType = {
"SimpleType",
SimpleType_constraint,
SimpleType_decode_ber,
SimpleType_encode_der,
SimpleType_print,
SimpleType_free,
0, /* Use generic outmost tag fetcher */
asn1_DEF_SimpleType_tags,
sizeof(asn1_DEF_SimpleType_tags)
/sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */
asn1_DEF_SimpleType_tags, /* Same as above */
sizeof(asn1_DEF_SimpleType_tags)
/sizeof(asn1_DEF_SimpleType_tags[0]), /* 1 */
-0, /* Unknown yet */
0, 0, /* No members */
0 /* No specifics */
};
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