mirror of https://gerrit.osmocom.org/asn1c
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:
parent
0c6d3810a1
commit
17e65d0c34
|
@ -490,6 +490,9 @@ asn1f_check_duplicate(arg_t *arg) {
|
||||||
assert(tmparg.expr->Identifier);
|
assert(tmparg.expr->Identifier);
|
||||||
assert(arg->expr->Identifier);
|
assert(arg->expr->Identifier);
|
||||||
|
|
||||||
|
if(arg->expr->spec_index != -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
if(tmparg.expr == arg->expr) break;
|
if(tmparg.expr == arg->expr) break;
|
||||||
|
|
||||||
if(strcmp(tmparg.expr->Identifier,
|
if(strcmp(tmparg.expr->Identifier,
|
||||||
|
|
|
@ -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 */
|
resolver_arg_t rarg; /* resolver argument */
|
||||||
asn1p_expr_t *exc; /* expr clone */
|
asn1p_expr_t *exc; /* expr clone */
|
||||||
asn1p_expr_t *rpc; /* rhs_pspecs clone */
|
asn1p_expr_t *rpc; /* rhs_pspecs clone */
|
||||||
asn1p_expr_t *target;
|
|
||||||
void *p;
|
void *p;
|
||||||
struct asn1p_pspec_s *pspec;
|
struct asn1p_pspec_s *pspec;
|
||||||
int npspecs;
|
int npspecs;
|
||||||
int i;
|
|
||||||
|
|
||||||
assert(rhs_pspecs);
|
assert(rhs_pspecs);
|
||||||
assert(expr->lhs_params);
|
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;
|
pspec->my_clone = exc;
|
||||||
exc->spec_index = npspecs;
|
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);
|
DEBUG("Forked new parameterization for %s", expr->Identifier);
|
||||||
|
|
||||||
/* Commit */
|
/* Commit */
|
||||||
|
|
|
@ -75,8 +75,22 @@ asn1p_expr_clone_impl(asn1p_expr_t *expr, int skip_extensions, asn1p_expr_t *(*r
|
||||||
} else {
|
} else {
|
||||||
clone->constraints = tmpct;
|
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;
|
return clone;
|
||||||
} else if(errno != ESRCH) {
|
} else if(errno != ESRCH) {
|
||||||
return NULL; /* Hard error */
|
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);
|
CLVRCLONE(combined_constraints, asn1p_constraint_clone_with_resolver);
|
||||||
CLCLONE(lhs_params, asn1p_paramlist_clone);
|
CLCLONE(lhs_params, asn1p_paramlist_clone);
|
||||||
CLVRCLONE(value, asn1p_value_clone_with_resolver);
|
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);
|
CLCLONE(with_syntax, asn1p_wsyntx_clone);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -62,7 +62,8 @@ asn1p_paramlist_add_param(asn1p_paramlist_t *pl, asn1p_ref_t *gov, char *arg) {
|
||||||
pl->params = p;
|
pl->params = p;
|
||||||
pl->params_size = newsize;
|
pl->params_size = newsize;
|
||||||
memset(&pl->params[pl->params_count], 0,
|
memset(&pl->params[pl->params_count], 0,
|
||||||
sizeof(pl->params[0]));
|
(newsize - pl->params_size)
|
||||||
|
* sizeof(pl->params[0]));
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -104,7 +105,6 @@ asn1p_paramlist_clone(asn1p_paramlist_t *pl) {
|
||||||
newpl = NULL;
|
newpl = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
newpl->params[i].into_expr = pl->params[i].into_expr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,6 @@ typedef struct asn1p_paramlist_s {
|
||||||
/* Translated from */
|
/* Translated from */
|
||||||
asn1p_ref_t *governor;
|
asn1p_ref_t *governor;
|
||||||
char *argument;
|
char *argument;
|
||||||
/* Translated into */
|
|
||||||
struct asn1p_expr_s *into_expr;
|
|
||||||
} *params;
|
} *params;
|
||||||
int params_count;
|
int params_count;
|
||||||
int params_size;
|
int params_size;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -250,10 +250,11 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
|
||||||
%type <a_expr> ObjectClass
|
%type <a_expr> ObjectClass
|
||||||
%type <a_expr> Type
|
%type <a_expr> Type
|
||||||
%type <a_expr> DataTypeReference /* Type1 ::= Type2 */
|
%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> ValueSetDefinition /* Val INTEGER ::= {1|2} */
|
||||||
%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
|
%type <a_expr> ValueDefinition /* val INTEGER ::= 1*/
|
||||||
%type <a_value> Value
|
%type <a_value> Value
|
||||||
|
%type <a_value> SimpleValue
|
||||||
%type <a_value> DefinedValue
|
%type <a_value> DefinedValue
|
||||||
%type <a_value> SignedNumber
|
%type <a_value> SignedNumber
|
||||||
%type <a_expr> optComponentTypeLists
|
%type <a_expr> optComponentTypeLists
|
||||||
|
@ -712,7 +713,7 @@ ExportsElement:
|
||||||
|
|
||||||
|
|
||||||
ValueSetDefinition:
|
ValueSetDefinition:
|
||||||
TypeRefName DefinedTypeRef TOK_PPEQ
|
TypeRefName DefinedType TOK_PPEQ
|
||||||
'{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
|
'{' { asn1p_lexer_hack_push_opaque_state(); } Opaque /* '}' */ {
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
assert($$->Identifier == 0);
|
assert($$->Identifier == 0);
|
||||||
|
@ -722,19 +723,37 @@ ValueSetDefinition:
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
DefinedTypeRef:
|
DefinedType:
|
||||||
ComplexTypeReference {
|
BasicType {
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* A DefinedType reference.
|
||||||
|
* "CLASS1.&id.&id2"
|
||||||
|
* or
|
||||||
|
* "Module.Type"
|
||||||
|
* or
|
||||||
|
* "Module.identifier"
|
||||||
|
* or
|
||||||
|
* "Type"
|
||||||
|
*/
|
||||||
|
| ComplexTypeReference {
|
||||||
$$ = asn1p_expr_new(yylineno);
|
$$ = asn1p_expr_new(yylineno);
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
$$->reference = $1;
|
$$->reference = $1;
|
||||||
$$->expr_type = A1TC_REFERENCE;
|
$$->expr_type = A1TC_REFERENCE;
|
||||||
$$->meta_type = AMT_TYPEREF;
|
$$->meta_type = AMT_TYPEREF;
|
||||||
}
|
}
|
||||||
| BasicTypeId {
|
/*
|
||||||
|
* A parametrized assignment.
|
||||||
|
*/
|
||||||
|
| ComplexTypeReference '{' Specializations '}' {
|
||||||
$$ = asn1p_expr_new(yylineno);
|
$$ = asn1p_expr_new(yylineno);
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
$$->expr_type = $1;
|
$$->reference = $1;
|
||||||
$$->meta_type = AMT_TYPE;
|
$$->rhs_pspecs = $3;
|
||||||
|
$$->expr_type = A1TC_REFERENCE;
|
||||||
|
$$->meta_type = AMT_TYPEREF;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -843,6 +862,14 @@ Specialization:
|
||||||
Type {
|
Type {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
|
| SimpleValue {
|
||||||
|
$$ = asn1p_expr_new(yylineno);
|
||||||
|
checkmem($$);
|
||||||
|
$$->Identifier = "?";
|
||||||
|
$$->expr_type = A1TC_REFERENCE;
|
||||||
|
$$->meta_type = AMT_VALUE;
|
||||||
|
$$->value = $1;
|
||||||
|
}
|
||||||
| Identifier {
|
| Identifier {
|
||||||
asn1p_ref_t *ref;
|
asn1p_ref_t *ref;
|
||||||
$$ = asn1p_expr_new(yylineno);
|
$$ = asn1p_expr_new(yylineno);
|
||||||
|
@ -1168,7 +1195,7 @@ TypeDeclaration:
|
||||||
;
|
;
|
||||||
|
|
||||||
TypeDeclarationSet:
|
TypeDeclarationSet:
|
||||||
BasicType {
|
DefinedType {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
| TOK_CHOICE '{' AlternativeTypeLists '}' {
|
| TOK_CHOICE '{' AlternativeTypeLists '}' {
|
||||||
|
@ -1226,34 +1253,7 @@ TypeDeclarationSet:
|
||||||
$$->expr_type = ASN_TYPE_ANY;
|
$$->expr_type = ASN_TYPE_ANY;
|
||||||
$$->meta_type = AMT_TYPE;
|
$$->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 {
|
| TOK_INSTANCE TOK_OF ComplexTypeReference {
|
||||||
$$ = asn1p_expr_new(yylineno);
|
$$ = asn1p_expr_new(yylineno);
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
|
@ -1407,7 +1407,7 @@ DefinedObjectClass:
|
||||||
* === EOF ===
|
* === EOF ===
|
||||||
*/
|
*/
|
||||||
ValueDefinition:
|
ValueDefinition:
|
||||||
Identifier DefinedTypeRef TOK_PPEQ Value {
|
Identifier DefinedType TOK_PPEQ Value {
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
assert($$->Identifier == NULL);
|
assert($$->Identifier == NULL);
|
||||||
$$->Identifier = $1;
|
$$->Identifier = $1;
|
||||||
|
@ -1417,7 +1417,9 @@ ValueDefinition:
|
||||||
;
|
;
|
||||||
|
|
||||||
Value:
|
Value:
|
||||||
Identifier ':' Value {
|
SimpleValue
|
||||||
|
| DefinedValue
|
||||||
|
| Identifier ':' Value {
|
||||||
$$ = asn1p_value_fromint(0);
|
$$ = asn1p_value_fromint(0);
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
$$->type = ATV_CHOICE_IDENTIFIER;
|
$$->type = ATV_CHOICE_IDENTIFIER;
|
||||||
|
@ -1434,7 +1436,10 @@ Value:
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
$$->type = ATV_NULL;
|
$$->type = ATV_NULL;
|
||||||
}
|
}
|
||||||
| TOK_FALSE {
|
;
|
||||||
|
|
||||||
|
SimpleValue:
|
||||||
|
TOK_FALSE {
|
||||||
$$ = asn1p_value_fromint(0);
|
$$ = asn1p_value_fromint(0);
|
||||||
checkmem($$);
|
checkmem($$);
|
||||||
$$->type = ATV_FALSE;
|
$$->type = ATV_FALSE;
|
||||||
|
@ -1458,9 +1463,6 @@ Value:
|
||||||
| SignedNumber {
|
| SignedNumber {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
| DefinedValue {
|
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
DefinedValue:
|
DefinedValue:
|
||||||
|
|
|
@ -668,6 +668,7 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri
|
||||||
printf("{");
|
printf("{");
|
||||||
TQ_FOR(se, &(tc->rhs_pspecs->members), next) {
|
TQ_FOR(se, &(tc->rhs_pspecs->members), next) {
|
||||||
asn1print_expr(asn, mod, se, flags, level + 1);
|
asn1print_expr(asn, mod, se, flags, level + 1);
|
||||||
|
if(TQ_NEXT(se, next)) printf(", ");
|
||||||
}
|
}
|
||||||
printf("}");
|
printf("}");
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,12 @@ ModuleParametrizationWithConstraints
|
||||||
DEFINITIONS ::=
|
DEFINITIONS ::=
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
Narrow {Type} ::= SEQUENCE {
|
Narrow {Type, INTEGER:value} ::= SEQUENCE {
|
||||||
narrower Type (2..5)
|
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
|
END
|
||||||
|
|
|
@ -6,21 +6,48 @@
|
||||||
|
|
||||||
/*** <<< TYPE-DECLS [Narrow] >>> ***/
|
/*** <<< TYPE-DECLS [Narrow] >>> ***/
|
||||||
|
|
||||||
typedef struct Narrow_16P0 {
|
typedef struct Narrow_15P0 {
|
||||||
long narrower;
|
long *narrow1 /* DEFAULT 3 */;
|
||||||
|
long narrow2;
|
||||||
|
long *narrow3 /* OPTIONAL */;
|
||||||
|
|
||||||
/* Context for parsing across buffer boundaries */
|
/* Context for parsing across buffer boundaries */
|
||||||
asn_struct_ctx_t _asn_ctx;
|
asn_struct_ctx_t _asn_ctx;
|
||||||
} Narrow_16P0_t;
|
} Narrow_15P0_t;
|
||||||
|
|
||||||
/*** <<< FUNC-DECLS [Narrow] >>> ***/
|
/*** <<< FUNC-DECLS [Narrow] >>> ***/
|
||||||
|
|
||||||
extern asn_TYPE_descriptor_t asn_DEF_Narrow_16P0;
|
extern asn_TYPE_descriptor_t asn_DEF_Narrow_15P0;
|
||||||
|
|
||||||
/*** <<< CODE [Narrow] >>> ***/
|
/*** <<< CODE [Narrow] >>> ***/
|
||||||
|
|
||||||
static int
|
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) {
|
asn_app_consume_bytes_f *app_errlog, void *app_key) {
|
||||||
long value;
|
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] >>> ***/
|
/*** <<< STAT-DEFS [Narrow] >>> ***/
|
||||||
|
|
||||||
static asn_TYPE_member_t asn_MBR_Narrow_16P0_1[] = {
|
static int asn_DFL_2_set_3(void **sptr) {
|
||||||
{ ATF_NOFLAGS, 0, offsetof(struct Narrow_16P0, narrower),
|
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 = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
|
||||||
.tag_mode = 0,
|
.tag_mode = 0,
|
||||||
.type = &asn_DEF_NativeInteger,
|
.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 */
|
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
|
||||||
.default_value = 0,
|
.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))
|
(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
|
||||||
};
|
};
|
||||||
static asn_TYPE_tag2member_t asn_MAP_Narrow_16P0_tag2el_1[] = {
|
static asn_TYPE_tag2member_t asn_MAP_Narrow_15P0_tag2el_1[] = {
|
||||||
{ (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* narrower at 18 */
|
{ (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 = {
|
static asn_SEQUENCE_specifics_t asn_SPC_Narrow_15P0_specs_1 = {
|
||||||
sizeof(struct Narrow_16P0),
|
sizeof(struct Narrow_15P0),
|
||||||
offsetof(struct Narrow_16P0, _asn_ctx),
|
offsetof(struct Narrow_15P0, _asn_ctx),
|
||||||
asn_MAP_Narrow_16P0_tag2el_1,
|
asn_MAP_Narrow_15P0_tag2el_1,
|
||||||
1, /* Count of tags in the map */
|
3, /* Count of tags in the map */
|
||||||
0, 0, 0, /* Optional elements (not needed) */
|
0, 0, 0, /* Optional elements (not needed) */
|
||||||
-1, /* Start extensions */
|
-1, /* Start extensions */
|
||||||
-1 /* Stop extensions */
|
-1 /* Stop extensions */
|
||||||
};
|
};
|
||||||
asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
|
asn_TYPE_descriptor_t asn_DEF_Narrow_15P0 = {
|
||||||
"Narrow",
|
"Narrow",
|
||||||
"Narrow",
|
"Narrow",
|
||||||
SEQUENCE_free,
|
SEQUENCE_free,
|
||||||
|
@ -85,16 +169,16 @@ asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
|
||||||
SEQUENCE_encode_xer,
|
SEQUENCE_encode_xer,
|
||||||
0, /* No PER decoder, -gen-PER to enable */
|
0, /* No PER decoder, -gen-PER to enable */
|
||||||
0, /* Use generic outmost tag fetcher */
|
0, /* Use generic outmost tag fetcher */
|
||||||
asn_DEF_Narrow_16P0_tags_1,
|
asn_DEF_Narrow_15P0_tags_1,
|
||||||
sizeof(asn_DEF_Narrow_16P0_tags_1)
|
sizeof(asn_DEF_Narrow_15P0_tags_1)
|
||||||
/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
|
/sizeof(asn_DEF_Narrow_15P0_tags_1[0]), /* 1 */
|
||||||
asn_DEF_Narrow_16P0_tags_1, /* Same as above */
|
asn_DEF_Narrow_15P0_tags_1, /* Same as above */
|
||||||
sizeof(asn_DEF_Narrow_16P0_tags_1)
|
sizeof(asn_DEF_Narrow_15P0_tags_1)
|
||||||
/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
|
/sizeof(asn_DEF_Narrow_15P0_tags_1[0]), /* 1 */
|
||||||
0, /* No PER visible constraints */
|
0, /* No PER visible constraints */
|
||||||
asn_MBR_Narrow_16P0_1,
|
asn_MBR_Narrow_15P0_1,
|
||||||
1, /* Elements count */
|
3, /* Elements count */
|
||||||
&asn_SPC_Narrow_16P0_specs_1 /* Additional specs */
|
&asn_SPC_Narrow_15P0_specs_1 /* Additional specs */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +188,7 @@ asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
|
||||||
|
|
||||||
/*** <<< TYPE-DECLS [NarrowInteger] >>> ***/
|
/*** <<< TYPE-DECLS [NarrowInteger] >>> ***/
|
||||||
|
|
||||||
typedef Narrow_16P0_t NarrowInteger_t;
|
typedef Narrow_15P0_t NarrowInteger_t;
|
||||||
|
|
||||||
/*** <<< FUNC-DECLS [NarrowInteger] >>> ***/
|
/*** <<< FUNC-DECLS [NarrowInteger] >>> ***/
|
||||||
|
|
||||||
|
@ -123,28 +207,28 @@ int
|
||||||
NarrowInteger_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
NarrowInteger_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
|
||||||
asn_app_consume_bytes_f *app_errlog, void *app_key) {
|
asn_app_consume_bytes_f *app_errlog, void *app_key) {
|
||||||
/* Replace with underlying type checker */
|
/* 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);
|
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.
|
* so here we adjust the DEF accordingly.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
NarrowInteger_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
NarrowInteger_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
|
||||||
td->free_struct = asn_DEF_Narrow_16P0.free_struct;
|
td->free_struct = asn_DEF_Narrow_15P0.free_struct;
|
||||||
td->print_struct = asn_DEF_Narrow_16P0.print_struct;
|
td->print_struct = asn_DEF_Narrow_15P0.print_struct;
|
||||||
td->ber_decoder = asn_DEF_Narrow_16P0.ber_decoder;
|
td->ber_decoder = asn_DEF_Narrow_15P0.ber_decoder;
|
||||||
td->der_encoder = asn_DEF_Narrow_16P0.der_encoder;
|
td->der_encoder = asn_DEF_Narrow_15P0.der_encoder;
|
||||||
td->xer_decoder = asn_DEF_Narrow_16P0.xer_decoder;
|
td->xer_decoder = asn_DEF_Narrow_15P0.xer_decoder;
|
||||||
td->xer_encoder = asn_DEF_Narrow_16P0.xer_encoder;
|
td->xer_encoder = asn_DEF_Narrow_15P0.xer_encoder;
|
||||||
td->uper_decoder = asn_DEF_Narrow_16P0.uper_decoder;
|
td->uper_decoder = asn_DEF_Narrow_15P0.uper_decoder;
|
||||||
if(!td->per_constraints)
|
if(!td->per_constraints)
|
||||||
td->per_constraints = asn_DEF_Narrow_16P0.per_constraints;
|
td->per_constraints = asn_DEF_Narrow_15P0.per_constraints;
|
||||||
td->elements = asn_DEF_Narrow_16P0.elements;
|
td->elements = asn_DEF_Narrow_15P0.elements;
|
||||||
td->elements_count = asn_DEF_Narrow_16P0.elements_count;
|
td->elements_count = asn_DEF_Narrow_15P0.elements_count;
|
||||||
td->specifics = asn_DEF_Narrow_16P0.specifics;
|
td->specifics = asn_DEF_Narrow_15P0.specifics;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -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
|
|
@ -8,13 +8,13 @@
|
||||||
/*** <<< TYPE-DECLS [TestType] >>> ***/
|
/*** <<< TYPE-DECLS [TestType] >>> ***/
|
||||||
|
|
||||||
typedef struct TestType_16P0 {
|
typedef struct TestType_16P0 {
|
||||||
long common;
|
long common /* DEFAULT 0 */;
|
||||||
|
|
||||||
/* Context for parsing across buffer boundaries */
|
/* Context for parsing across buffer boundaries */
|
||||||
asn_struct_ctx_t _asn_ctx;
|
asn_struct_ctx_t _asn_ctx;
|
||||||
} TestType_16P0_t;
|
} TestType_16P0_t;
|
||||||
typedef struct TestType_16P1 {
|
typedef struct TestType_16P1 {
|
||||||
BOOLEAN_t common;
|
BOOLEAN_t common /* DEFAULT 0 */;
|
||||||
|
|
||||||
/* Context for parsing across buffer boundaries */
|
/* Context for parsing across buffer boundaries */
|
||||||
asn_struct_ctx_t _asn_ctx;
|
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] >>> ***/
|
/*** <<< 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[] = {
|
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 = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
|
||||||
.tag_mode = 0,
|
.tag_mode = 0,
|
||||||
.type = &asn_DEF_NativeInteger,
|
.type = &asn_DEF_NativeInteger,
|
||||||
.memb_constraints = memb_common_constraint_1,
|
.memb_constraints = memb_common_constraint_1,
|
||||||
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
|
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
|
||||||
.default_value = 0,
|
.default_value = asn_DFL_2_set_0, /* DEFAULT 0 */
|
||||||
.name = "common"
|
.name = "common"
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -105,14 +117,26 @@ asn_TYPE_descriptor_t asn_DEF_TestType_16P0 = {
|
||||||
&asn_SPC_TestType_16P0_specs_1 /* Additional specs */
|
&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[] = {
|
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 = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
|
||||||
.tag_mode = 0,
|
.tag_mode = 0,
|
||||||
.type = &asn_DEF_BOOLEAN,
|
.type = &asn_DEF_BOOLEAN,
|
||||||
.memb_constraints = 0, /* Defer constraints checking to the member type */
|
.memb_constraints = 0, /* Defer constraints checking to the member type */
|
||||||
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
|
.per_constraints = 0, /* PER is not compiled, use -gen-PER */
|
||||||
.default_value = 0,
|
.default_value = asn_DFL_4_set_0, /* DEFAULT 0 */
|
||||||
.name = "common"
|
.name = "common"
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue