aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons/constr_CHOICE.c
diff options
context:
space:
mode:
Diffstat (limited to 'skeletons/constr_CHOICE.c')
-rw-r--r--skeletons/constr_CHOICE.c82
1 files changed, 48 insertions, 34 deletions
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index 4aaad239..3fbf194a 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -93,13 +93,13 @@ _search4tag(const void *ap, const void *bp) {
* The decoder of the CHOICE type.
*/
ber_dec_rval_t
-CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
+CHOICE_decode_ber(asn1_TYPE_descriptor_t *td,
void **struct_ptr, void *ptr, size_t size, int tag_mode) {
/*
* Bring closer parts of structure description.
*/
- asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics;
- asn1_CHOICE_element_t *elements = specs->elements;
+ asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics;
+ asn1_TYPE_member_t *elements = td->elements;
/*
* Parts of the structure being constructed.
@@ -114,7 +114,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
- ASN_DEBUG("Decoding %s as CHOICE", sd->name);
+ ASN_DEBUG("Decoding %s as CHOICE", td->name);
/*
* Create the target structure if it is not present already.
@@ -142,12 +142,12 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
* perfectly fits our expectations.
*/
- if(tag_mode || sd->tags_count) {
- rval = ber_check_tags(sd, ctx, ptr, size,
+ if(tag_mode || td->tags_count) {
+ rval = ber_check_tags(td, ctx, ptr, size,
tag_mode, &ctx->left, 0);
if(rval.code != RC_OK) {
ASN_DEBUG("%s tagging check failed: %d",
- sd->name, rval.code);
+ td->name, rval.code);
consumed_myself += rval.consumed;
RETURN(rval.code);
}
@@ -172,7 +172,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
* Fetch the T from TLV.
*/
tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag);
- ASN_DEBUG("In %s CHOICE tag length %d", sd->name, (int)tag_len);
+ ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len);
switch(tag_len) {
case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
/* Fall through */
@@ -197,7 +197,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
} else if(specs->extensible == 0) {
ASN_DEBUG("Unexpected tag %s "
"in non-extensible CHOICE %s",
- ber_tlv_tag_string(tlv_tag), sd->name);
+ ber_tlv_tag_string(tlv_tag), td->name);
RETURN(RC_FAIL);
} else {
/* Skip this tag */
@@ -227,7 +227,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
* Read in the element.
*/
do {
- asn1_CHOICE_element_t *elm; /* CHOICE's element */
+ asn1_TYPE_member_t *elm;/* CHOICE's element */
void *memb_ptr; /* Pointer to the member */
void **memb_ptr2; /* Pointer to that pointer */
@@ -252,6 +252,9 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
/*
* Invoke the member fetch routine according to member's type
*/
+ printf("elm->name = %s\n", elm->name);
+ printf("elm->td = %p\n", elm->type);
+ printf("elm->td->name = %s\n", elm->type->name);
rval = elm->type->ber_decoder(elm->type,
memb_ptr2, ptr, LEFT,
elm->tag_mode);
@@ -278,8 +281,8 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
/* Fall through */
case 3:
ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d",
- sd->name, (long)ctx->left, (long)size,
- tag_mode, sd->tags_count);
+ td->name, (long)ctx->left, (long)size,
+ tag_mode, td->tags_count);
if(ctx->left > 0) {
/*
@@ -290,7 +293,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
}
if(ctx->left == -1
- && !(tag_mode || sd->tags_count)) {
+ && !(tag_mode || td->tags_count)) {
/*
* This is an untagged CHOICE.
* It doesn't contain nothing
@@ -331,7 +334,7 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
}
} else {
ASN_DEBUG("Unexpected continuation in %s",
- sd->name);
+ td->name);
RETURN(RC_FAIL);
}
@@ -349,19 +352,19 @@ CHOICE_decode_ber(asn1_TYPE_descriptor_t *sd,
}
der_enc_rval_t
-CHOICE_encode_der(asn1_TYPE_descriptor_t *sd,
+CHOICE_encode_der(asn1_TYPE_descriptor_t *td,
void *struct_ptr,
int tag_mode, ber_tlv_tag_t tag,
asn_app_consume_bytes_f *cb, void *app_key) {
- asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)sd->specifics;
- asn1_CHOICE_element_t *elm; /* CHOICE element */
+ asn1_CHOICE_specifics_t *specs = (asn1_CHOICE_specifics_t *)td->specifics;
+ asn1_TYPE_member_t *elm; /* CHOICE element */
der_enc_rval_t erval;
void *memb_ptr;
size_t computed_size = 0;
int present;
ASN_DEBUG("%s %s as CHOICE",
- cb?"Encoding":"Estimating", sd->name);
+ cb?"Encoding":"Estimating", td->name);
present = _fetch_present_idx(struct_ptr,
specs->pres_offset, specs->pres_size);
@@ -370,14 +373,14 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd,
* If the structure was not initialized, it cannot be encoded:
* can't deduce what to encode in the choice type.
*/
- if(present <= 0 || present > specs->elements_count) {
- if(present == 0 && specs->elements_count == 0) {
+ if(present <= 0 || present > td->elements_count) {
+ if(present == 0 && td->elements_count == 0) {
/* The CHOICE is empty?! */
erval.encoded = 0;
return erval;
}
erval.encoded = -1;
- erval.failed_type = sd;
+ erval.failed_type = td;
erval.structure_ptr = struct_ptr;
return erval;
}
@@ -385,7 +388,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd,
/*
* Seek over the present member of the structure.
*/
- elm = &specs->elements[present-1];
+ elm = &td->elements[present-1];
if(elm->optional) {
memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset);
if(memb_ptr == 0) {
@@ -401,7 +404,7 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd,
* T ::= [2] EXPLICIT CHOICE { ... }
* Then emit the appropriate tags.
*/
- if(tag_mode == 1 || sd->tags_count) {
+ if(tag_mode == 1 || td->tags_count) {
/*
* For this, we need to pre-compute the member.
*/
@@ -414,11 +417,11 @@ CHOICE_encode_der(asn1_TYPE_descriptor_t *sd,
return erval;
/* Encode CHOICE with parent or my own tag */
- ret = der_write_tags(sd, erval.encoded, tag_mode, tag,
+ ret = der_write_tags(td, erval.encoded, tag_mode, tag,
cb, app_key);
if(ret == -1) {
erval.encoded = -1;
- erval.failed_type = sd;
+ erval.failed_type = td;
erval.structure_ptr = struct_ptr;
return erval;
}
@@ -454,8 +457,8 @@ CHOICE_outmost_tag(asn1_TYPE_descriptor_t *td, const void *ptr, int tag_mode, be
*/
present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size);
- if(present > 0 || present <= specs->elements_count) {
- asn1_CHOICE_element_t *elm = &specs->elements[present-1];
+ if(present > 0 || present <= td->elements_count) {
+ asn1_TYPE_member_t *elm = &td->elements[present-1];
const void *memb_ptr;
if(elm->optional) {
@@ -489,8 +492,8 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
* Figure out which CHOICE element is encoded.
*/
present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size);
- if(present > 0 && present <= specs->elements_count) {
- asn1_CHOICE_element_t *elm = &specs->elements[present-1];
+ if(present > 0 && present <= td->elements_count) {
+ asn1_TYPE_member_t *elm = &td->elements[present-1];
const void *memb_ptr;
if(elm->optional) {
@@ -500,8 +503,19 @@ CHOICE_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
}
- return elm->type->check_constraints(elm->type, memb_ptr,
+ if(elm->memb_constraints) {
+ return elm->memb_constraints(elm->type, memb_ptr,
app_errlog, app_key);
+ } else {
+ int ret = elm->type->check_constraints(elm->type,
+ memb_ptr, app_errlog, app_key);
+ /*
+ * Cannot inherit it eralier:
+ * need to make sure we get the updated version.
+ */
+ elm->memb_constraints = elm->type->check_constraints;
+ return ret;
+ }
} else {
_ASN_ERRLOG(app_errlog, app_key,
"%s: no CHOICE element given", td->name);
@@ -525,8 +539,8 @@ CHOICE_print(asn1_TYPE_descriptor_t *td, const void *sptr, int ilevel,
/*
* Free that element.
*/
- if(present > 0 && present <= specs->elements_count) {
- asn1_CHOICE_element_t *elm = &specs->elements[present-1];
+ if(present > 0 && present <= td->elements_count) {
+ asn1_TYPE_member_t *elm = &td->elements[present-1];
const void *memb_ptr;
if(elm->optional) {
@@ -566,8 +580,8 @@ CHOICE_free(asn1_TYPE_descriptor_t *td, void *ptr, int contents_only) {
/*
* Free that element.
*/
- if(present > 0 && present <= specs->elements_count) {
- asn1_CHOICE_element_t *elm = &specs->elements[present-1];
+ if(present > 0 && present <= td->elements_count) {
+ asn1_TYPE_member_t *elm = &td->elements[present-1];
void *memb_ptr;
if(elm->optional) {