parameterization: direct assignment

git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1103 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
vlm 2006-03-21 04:48:15 +00:00
parent 0c6d3810a1
commit 17e65d0c34
12 changed files with 1205 additions and 1088 deletions

View File

@ -490,6 +490,9 @@ asn1f_check_duplicate(arg_t *arg) {
assert(tmparg.expr->Identifier);
assert(arg->expr->Identifier);
if(arg->expr->spec_index != -1)
continue;
if(tmparg.expr == arg->expr) break;
if(strcmp(tmparg.expr->Identifier,

View File

@ -18,11 +18,9 @@ asn1f_parameterization_fork(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *rhs_ps
resolver_arg_t rarg; /* resolver argument */
asn1p_expr_t *exc; /* expr clone */
asn1p_expr_t *rpc; /* rhs_pspecs clone */
asn1p_expr_t *target;
void *p;
struct asn1p_pspec_s *pspec;
int npspecs;
int i;
assert(rhs_pspecs);
assert(expr->lhs_params);
@ -70,24 +68,6 @@ asn1f_parameterization_fork(arg_t *arg, asn1p_expr_t *expr, asn1p_expr_t *rhs_ps
pspec->my_clone = exc;
exc->spec_index = npspecs;
/* Update LHS->RHS specialization in target */
target = TQ_FIRST(&rpc->members);
for(i = 0; i < exc->lhs_params->params_count;
i++, target = TQ_NEXT(target, next)) {
if(!target) { target = (void *)0xdeadbeef; break; }
assert(exc->lhs_params->params[i].into_expr == 0);
exc->lhs_params->params[i].into_expr = target;
}
if(target) {
asn1p_expr_free(exc);
asn1p_expr_free(rpc);
FATAL("Parameterization of %s failed: "
"parameters number mismatch", expr->Identifier);
errno = EPERM;
return NULL;
}
DEBUG("Forked new parameterization for %s", expr->Identifier);
/* Commit */

View File

@ -75,8 +75,22 @@ asn1p_expr_clone_impl(asn1p_expr_t *expr, int skip_extensions, asn1p_expr_t *(*r
} else {
clone->constraints = tmpct;
}
assert(expr->combined_constraints == 0);
}
/* Merge defaults */
CLCOPY(marker.flags);
CLVRCLONE(marker.default_value,
asn1p_value_clone_with_resolver);
if(clone->tag.tag_class == TC_NOCLASS) {
CLCOPY(tag);
} else if(expr->tag.tag_class != TC_NOCLASS) {
fprintf(stderr, "asn1c does not support "
"nested tagging in parameterization, "
"necessary at line %d\n",
expr->_lineno);
asn1p_expr_free(clone);
return NULL;
}
assert(expr->combined_constraints == 0);
return clone;
} else if(errno != ESRCH) {
return NULL; /* Hard error */
@ -107,7 +121,7 @@ asn1p_expr_clone_impl(asn1p_expr_t *expr, int skip_extensions, asn1p_expr_t *(*r
CLVRCLONE(combined_constraints, asn1p_constraint_clone_with_resolver);
CLCLONE(lhs_params, asn1p_paramlist_clone);
CLVRCLONE(value, asn1p_value_clone_with_resolver);
CLCLONE(marker.default_value, asn1p_value_clone);
CLVRCLONE(marker.default_value, asn1p_value_clone_with_resolver);
CLCLONE(with_syntax, asn1p_wsyntx_clone);
/*

View File

@ -62,7 +62,8 @@ asn1p_paramlist_add_param(asn1p_paramlist_t *pl, asn1p_ref_t *gov, char *arg) {
pl->params = p;
pl->params_size = newsize;
memset(&pl->params[pl->params_count], 0,
sizeof(pl->params[0]));
(newsize - pl->params_size)
* sizeof(pl->params[0]));
} else {
return -1;
}
@ -104,7 +105,6 @@ asn1p_paramlist_clone(asn1p_paramlist_t *pl) {
newpl = NULL;
break;
}
newpl->params[i].into_expr = pl->params[i].into_expr;
}
}

View File

@ -11,8 +11,6 @@ typedef struct asn1p_paramlist_s {
/* Translated from */
asn1p_ref_t *governor;
char *argument;
/* Translated into */
struct asn1p_expr_s *into_expr;
} *params;
int params_count;
int params_size;

File diff suppressed because it is too large Load Diff

View File

@ -250,10 +250,11 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
%type <a_expr> ObjectClass
%type <a_expr> Type
%type <a_expr> DataTypeReference /* Type1 ::= Type2 */
%type <a_expr> DefinedTypeRef
%type <a_expr> DefinedType
%type <a_expr> ValueSetDefinition /* Val INTEGER ::= {1|2} */
%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
%type <a_value> Value
%type <a_value> SimpleValue
%type <a_value> DefinedValue
%type <a_value> SignedNumber
%type <a_expr> optComponentTypeLists
@ -712,7 +713,7 @@ ExportsElement:
ValueSetDefinition:
TypeRefName DefinedTypeRef TOK_PPEQ
TypeRefName DefinedType TOK_PPEQ
'{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
$$ = $2;
assert($$->Identifier == 0);
@ -722,19 +723,37 @@ ValueSetDefinition:
}
;
DefinedTypeRef:
ComplexTypeReference {
DefinedType:
BasicType {
$$ = $1;
}
/*
* A DefinedType reference.
* "CLASS1.&id.&id2"
* or
* "Module.Type"
* or
* "Module.identifier"
* or
* "Type"
*/
| ComplexTypeReference {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->reference = $1;
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_TYPEREF;
}
| BasicTypeId {
/*
* A parametrized assignment.
*/
| ComplexTypeReference '{' Specializations '}' {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->expr_type = $1;
$$->meta_type = AMT_TYPE;
$$->reference = $1;
$$->rhs_pspecs = $3;
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_TYPEREF;
}
;
@ -843,6 +862,14 @@ Specialization:
Type {
$$ = $1;
}
| SimpleValue {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->Identifier = "?";
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_VALUE;
$$->value = $1;
}
| Identifier {
asn1p_ref_t *ref;
$$ = asn1p_expr_new(yylineno);
@ -1168,7 +1195,7 @@ TypeDeclaration:
;
TypeDeclarationSet:
BasicType {
DefinedType {
$$ = $1;
}
| TOK_CHOICE '{' AlternativeTypeLists '}' {
@ -1226,34 +1253,7 @@ TypeDeclarationSet:
$$->expr_type = ASN_TYPE_ANY;
$$->meta_type = AMT_TYPE;
}
/*
* A DefinedType reference.
* "CLASS1.&id.&id2"
* or
* "Module.Type"
* or
* "Module.identifier"
* or
* "Type"
*/
| ComplexTypeReference {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->reference = $1;
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_TYPEREF;
}
/*
* A parametrized assignment.
*/
| ComplexTypeReference '{' Specializations '}' {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
$$->reference = $1;
$$->rhs_pspecs = $3;
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_TYPEREF;
}
| TOK_INSTANCE TOK_OF ComplexTypeReference {
$$ = asn1p_expr_new(yylineno);
checkmem($$);
@ -1407,7 +1407,7 @@ DefinedObjectClass:
* === EOF ===
*/
ValueDefinition:
Identifier DefinedTypeRef TOK_PPEQ Value {
Identifier DefinedType TOK_PPEQ Value {
$$ = $2;
assert($$->Identifier == NULL);
$$->Identifier = $1;
@ -1417,7 +1417,9 @@ ValueDefinition:
;
Value:
Identifier ':' Value {
SimpleValue
| DefinedValue
| Identifier ':' Value {
$$ = asn1p_value_fromint(0);
checkmem($$);
$$->type = ATV_CHOICE_IDENTIFIER;
@ -1434,7 +1436,10 @@ Value:
checkmem($$);
$$->type = ATV_NULL;
}
| TOK_FALSE {
;
SimpleValue:
TOK_FALSE {
$$ = asn1p_value_fromint(0);
checkmem($$);
$$->type = ATV_FALSE;
@ -1458,9 +1463,6 @@ Value:
| SignedNumber {
$$ = $1;
}
| DefinedValue {
$$ = $1;
}
;
DefinedValue:

View File

@ -668,6 +668,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri
printf("{");
TQ_FOR(se, &(tc->rhs_pspecs->members), next) {
asn1print_expr(asn, mod, se, flags, level + 1);
if(TQ_NEXT(se, next)) printf(", ");
}
printf("}");
}

View File

@ -11,10 +11,12 @@ ModuleParametrizationWithConstraints
DEFINITIONS ::=
BEGIN
Narrow {Type} ::= SEQUENCE {
narrower Type (2..5)
Narrow {Type, INTEGER:value} ::= SEQUENCE {
narrow1 Type (1..5) DEFAULT value,
narrow2 [0] Type (2..5),
narrow3 [1] Type (3..5) OPTIONAL
}
NarrowInteger ::= Narrow {INTEGER (0..10)}
NarrowInteger ::= Narrow {INTEGER (0..10), 3}
END

View File

@ -6,21 +6,48 @@
/*** <<< TYPE-DECLS [Narrow] >>> ***/
typedef struct Narrow_16P0 {
long narrower;
typedef struct Narrow_15P0 {
long *narrow1 /* DEFAULT 3 */;
long narrow2;
long *narrow3 /* OPTIONAL */;
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} Narrow_16P0_t;
} Narrow_15P0_t;
/*** <<< FUNC-DECLS [Narrow] >>> ***/
extern asn_TYPE_descriptor_t asn_DEF_Narrow_16P0;
extern asn_TYPE_descriptor_t asn_DEF_Narrow_15P0;
/*** <<< CODE [Narrow] >>> ***/
static int
memb_narrower_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
memb_narrow1_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
long value;
if(!sptr) {
_ASN_ERRLOG(app_errlog, app_key,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
value = *(const long *)sptr;
if((value >= 1 && value <= 5)) {
/* Constraint check succeeded */
return 0;
} else {
_ASN_ERRLOG(app_errlog, app_key,
"%s: constraint failed (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
}
static int
memb_narrow2_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
long value;
@ -44,36 +71,93 @@ memb_narrower_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
}
}
static int
memb_narrow3_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
long value;
if(!sptr) {
_ASN_ERRLOG(app_errlog, app_key,
"%s: value not given (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
value = *(const long *)sptr;
if((value >= 3 && value <= 5)) {
/* Constraint check succeeded */
return 0;
} else {
_ASN_ERRLOG(app_errlog, app_key,
"%s: constraint failed (%s:%d)",
td->name, __FILE__, __LINE__);
return -1;
}
}
/*** <<< STAT-DEFS [Narrow] >>> ***/
static asn_TYPE_member_t asn_MBR_Narrow_16P0_1[] = {
{ ATF_NOFLAGS, 0, offsetof(struct Narrow_16P0, narrower),
static int asn_DFL_2_set_3(void **sptr) {
long *st = *sptr;
if(!st) {
st = (*sptr = CALLOC(1, sizeof(*st)));
if(!st) return -1;
}
/* Install default value 3 */
*st = 3;
return 0;
}
static asn_TYPE_member_t asn_MBR_Narrow_15P0_1[] = {
{ ATF_POINTER, 1, offsetof(struct Narrow_15P0, narrow1),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
.tag_mode = 0,
.type = &asn_DEF_NativeInteger,
.memb_constraints = memb_narrower_constraint_1,
.memb_constraints = memb_narrow1_constraint_1,
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
.default_value = asn_DFL_2_set_3, /* DEFAULT 3 */
.name = "narrow1"
},
{ ATF_NOFLAGS, 0, offsetof(struct Narrow_15P0, narrow2),
.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
.tag_mode = +1, /* EXPLICIT tag at current level */
.type = &asn_DEF_NativeInteger,
.memb_constraints = memb_narrow2_constraint_1,
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
.default_value = 0,
.name = "narrower"
.name = "narrow2"
},
{ ATF_POINTER, 1, offsetof(struct Narrow_15P0, narrow3),
.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
.tag_mode = +1, /* EXPLICIT tag at current level */
.type = &asn_DEF_NativeInteger,
.memb_constraints = memb_narrow3_constraint_1,
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
.default_value = 0,
.name = "narrow3"
},
};
static ber_tlv_tag_t asn_DEF_Narrow_16P0_tags_1[] = {
static ber_tlv_tag_t asn_DEF_Narrow_15P0_tags_1[] = {
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Narrow_16P0_tag2el_1[] = {
{ (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* narrower at 18 */
static asn_TYPE_tag2member_t asn_MAP_Narrow_15P0_tag2el_1[] = {
{ (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* narrow1 at 20 */
{ (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* narrow2 at 20 */
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 } /* narrow3 at 20 */
};
static asn_SEQUENCE_specifics_t asn_SPC_Narrow_16P0_specs_1 = {
sizeof(struct Narrow_16P0),
offsetof(struct Narrow_16P0, _asn_ctx),
asn_MAP_Narrow_16P0_tag2el_1,
1, /* Count of tags in the map */
static asn_SEQUENCE_specifics_t asn_SPC_Narrow_15P0_specs_1 = {
sizeof(struct Narrow_15P0),
offsetof(struct Narrow_15P0, _asn_ctx),
asn_MAP_Narrow_15P0_tag2el_1,
3, /* Count of tags in the map */
0, 0, 0, /* Optional elements (not needed) */
-1, /* Start extensions */
-1 /* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
asn_TYPE_descriptor_t asn_DEF_Narrow_15P0 = {
"Narrow",
"Narrow",
SEQUENCE_free,
@ -85,16 +169,16 @@ asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
SEQUENCE_encode_xer,
0, /* No PER decoder, -gen-PER to enable */
0, /* Use generic outmost tag fetcher */
asn_DEF_Narrow_16P0_tags_1,
sizeof(asn_DEF_Narrow_16P0_tags_1)
/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
asn_DEF_Narrow_16P0_tags_1, /* Same as above */
sizeof(asn_DEF_Narrow_16P0_tags_1)
/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
asn_DEF_Narrow_15P0_tags_1,
sizeof(asn_DEF_Narrow_15P0_tags_1)
/sizeof(asn_DEF_Narrow_15P0_tags_1[0]), /* 1 */
asn_DEF_Narrow_15P0_tags_1, /* Same as above */
sizeof(asn_DEF_Narrow_15P0_tags_1)
/sizeof(asn_DEF_Narrow_15P0_tags_1[0]), /* 1 */
0, /* No PER visible constraints */
asn_MBR_Narrow_16P0_1,
1, /* Elements count */
&asn_SPC_Narrow_16P0_specs_1 /* Additional specs */
asn_MBR_Narrow_15P0_1,
3, /* Elements count */
&asn_SPC_Narrow_15P0_specs_1 /* Additional specs */
};
@ -104,7 +188,7 @@ asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
/*** <<< TYPE-DECLS [NarrowInteger] >>> ***/
typedef Narrow_16P0_t NarrowInteger_t;
typedef Narrow_15P0_t NarrowInteger_t;
/*** <<< FUNC-DECLS [NarrowInteger] >>> ***/
@ -123,28 +207,28 @@ int
NarrowInteger_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
/* Replace with underlying type checker */
td->check_constraints = asn_DEF_Narrow_16P0.check_constraints;
td->check_constraints = asn_DEF_Narrow_15P0.check_constraints;
return td->check_constraints(td, sptr, app_errlog, app_key);
}
/*
* This type is implemented using Narrow_16P0,
* This type is implemented using Narrow_15P0,
* so here we adjust the DEF accordingly.
*/
static void
NarrowInteger_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
td->free_struct = asn_DEF_Narrow_16P0.free_struct;
td->print_struct = asn_DEF_Narrow_16P0.print_struct;
td->ber_decoder = asn_DEF_Narrow_16P0.ber_decoder;
td->der_encoder = asn_DEF_Narrow_16P0.der_encoder;
td->xer_decoder = asn_DEF_Narrow_16P0.xer_decoder;
td->xer_encoder = asn_DEF_Narrow_16P0.xer_encoder;
td->uper_decoder = asn_DEF_Narrow_16P0.uper_decoder;
td->free_struct = asn_DEF_Narrow_15P0.free_struct;
td->print_struct = asn_DEF_Narrow_15P0.print_struct;
td->ber_decoder = asn_DEF_Narrow_15P0.ber_decoder;
td->der_encoder = asn_DEF_Narrow_15P0.der_encoder;
td->xer_decoder = asn_DEF_Narrow_15P0.xer_decoder;
td->xer_encoder = asn_DEF_Narrow_15P0.xer_encoder;
td->uper_decoder = asn_DEF_Narrow_15P0.uper_decoder;
if(!td->per_constraints)
td->per_constraints = asn_DEF_Narrow_16P0.per_constraints;
td->elements = asn_DEF_Narrow_16P0.elements;
td->elements_count = asn_DEF_Narrow_16P0.elements_count;
td->specifics = asn_DEF_Narrow_16P0.specifics;
td->per_constraints = asn_DEF_Narrow_15P0.per_constraints;
td->elements = asn_DEF_Narrow_15P0.elements;
td->elements_count = asn_DEF_Narrow_15P0.elements_count;
td->specifics = asn_DEF_Narrow_15P0.specifics;
}
void

View File

@ -0,0 +1,18 @@
-- OK: Everything is fine
-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
-- .spelio.software.asn1c.test (9363.1.5.1)
-- .107
ModuleParametrizationWithConstraints2
{ iso org(3) dod(6) internet (1) private(4) enterprise(1)
spelio(9363) software(1) asn1c(5) test(1) 107 }
DEFINITIONS ::=
BEGIN
Narrow {Type} ::= Type (2..5)
NarrowInteger ::= Narrow {INTEGER}
END

View File

@ -8,13 +8,13 @@
/*** <<< TYPE-DECLS [TestType] >>> ***/
typedef struct TestType_16P0 {
long common;
long common /* DEFAULT 0 */;
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} TestType_16P0_t;
typedef struct TestType_16P1 {
BOOLEAN_t common;
BOOLEAN_t common /* DEFAULT 0 */;
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
@ -55,14 +55,26 @@ memb_common_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
/*** <<< STAT-DEFS [TestType] >>> ***/
static int asn_DFL_2_set_0(void **sptr) {
long *st = *sptr;
if(!st) {
st = (*sptr = CALLOC(1, sizeof(*st)));
if(!st) return -1;
}
/* Install default value 0 */
*st = 0;
return 0;
}
static asn_TYPE_member_t asn_MBR_TestType_16P0_1[] = {
{ ATF_NOFLAGS, 0, offsetof(struct TestType_16P0, common),
{ ATF_NOFLAGS, 1, offsetof(struct TestType_16P0, common),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
.tag_mode = 0,
.type = &asn_DEF_NativeInteger,
.memb_constraints = memb_common_constraint_1,
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
.default_value = 0,
.default_value = asn_DFL_2_set_0, /* DEFAULT 0 */
.name = "common"
},
};
@ -105,14 +117,26 @@ asn_TYPE_descriptor_t asn_DEF_TestType_16P0 = {
&asn_SPC_TestType_16P0_specs_1 /* Additional specs */
};
static int asn_DFL_4_set_0(void **sptr) {
BOOLEAN_t *st = *sptr;
if(!st) {
st = (*sptr = CALLOC(1, sizeof(*st)));
if(!st) return -1;
}
/* Install default value 0 */
*st = 0;
return 0;
}
static asn_TYPE_member_t asn_MBR_TestType_16P1_3[] = {
{ ATF_NOFLAGS, 0, offsetof(struct TestType_16P1, common),
{ ATF_NOFLAGS, 1, offsetof(struct TestType_16P1, common),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
.tag_mode = 0,
.type = &asn_DEF_BOOLEAN,
.memb_constraints = 0, /* Defer constraints checking to the member type */
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
.default_value = 0,
.default_value = asn_DFL_4_set_0, /* DEFAULT 0 */
.name = "common"
},
};