diff options
Diffstat (limited to 'skeletons')
-rw-r--r-- | skeletons/constr_CHOICE.c | 31 | ||||
-rw-r--r-- | skeletons/constr_SEQUENCE.c | 53 | ||||
-rw-r--r-- | skeletons/constr_SET.c | 19 |
3 files changed, 59 insertions, 44 deletions
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index e49bc1af..b3af333a 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -353,8 +353,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } asn_enc_rval_t -CHOICE_encode_der(asn_TYPE_descriptor_t *td, - void *struct_ptr, +CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; @@ -367,7 +366,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, ASN_DEBUG("%s %s as CHOICE", cb?"Encoding":"Estimating", td->name); - present = _fetch_present_idx(struct_ptr, + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); /* @@ -380,10 +379,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, erval.encoded = 0; return erval; } - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = struct_ptr; - return erval; + _ASN_ENCODE_FAILED; } /* @@ -391,20 +387,17 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, */ elm = &td->elements[present-1]; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)struct_ptr + elm->memb_offset); + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(memb_ptr == 0) { if(elm->optional) { erval.encoded = 0; - } else { - /* Mandatory element absent */ - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = struct_ptr; + return erval; } - return erval; + /* Mandatory element absent */ + _ASN_ENCODE_FAILED; } } else { - memb_ptr = (void *)((char *)struct_ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } /* @@ -427,12 +420,8 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, /* Encode CHOICE with parent or my own tag */ ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, cb, app_key); - if(ret == -1) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = struct_ptr; - return erval; - } + if(ret == -1) + _ASN_ENCODE_FAILED; computed_size += ret; } diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index aefd94b5..7dcb5da1 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -506,7 +506,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ asn_enc_rval_t SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, - void *ptr, int tag_mode, ber_tlv_tag_t tag, + void *sptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { size_t computed_size = 0; asn_enc_rval_t erval; @@ -523,10 +523,14 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, asn_TYPE_member_t *elm = &td->elements[edx]; void *memb_ptr; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); - if(!memb_ptr) continue; + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Mandatory element is missing */ + _ASN_ENCODE_FAILED; + } } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } erval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, @@ -543,12 +547,8 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, */ ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); - if(ret == -1) { - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - return erval; - } + if(ret == -1) + _ASN_ENCODE_FAILED; erval.encoded = computed_size + ret; if(!cb) return erval; @@ -562,10 +562,10 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, void *memb_ptr; if(elm->flags & ATF_POINTER) { - memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) continue; } else { - memb_ptr = (void *)((char *)ptr + elm->memb_offset); + memb_ptr = (void *)((char *)sptr + elm->memb_offset); } tmperval = elm->type->der_encoder(elm->type, memb_ptr, elm->tag_mode, elm->tag, @@ -577,14 +577,11 @@ SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, edx, elm->name, td->name, (long)tmperval.encoded); } - if(computed_size != 0) { + if(computed_size != 0) /* * Encoded size is not equal to the computed size. */ - erval.encoded = -1; - erval.failed_type = td; - erval.structure_ptr = ptr; - } + _ASN_ENCODE_FAILED; return erval; } @@ -862,7 +859,12 @@ SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; /* OPTIONAL element? */ + if(!memb_ptr) { + if(elm->optional) + continue; + /* Mandatory element is missing */ + _ASN_ENCODE_FAILED; + } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } @@ -905,7 +907,11 @@ SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; + if(!memb_ptr) { + if(elm->optional) continue; + /* Print <absent> line */ + /* Fall through */ + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } @@ -978,7 +984,14 @@ SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; + if(!memb_ptr) { + if(elm->optional) + continue; + _ASN_ERRLOG(app_errlog, app_key, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index a45d7f9f..f99d66f4 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -1,5 +1,6 @@ /*- - * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved. + * Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>. + * All rights reserved. * Redistribution and modifications are permitted subject to BSD license. */ #include <asn_internal.h> @@ -477,6 +478,9 @@ SET_encode_der(asn_TYPE_descriptor_t *td, if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); if(!memb_ptr) { + if(!elm->optional) + /* Mandatory elements missing */ + _ASN_ENCODE_FAILED; if(t2m_build_own) { t2m[t2m_count].el_no = edx; t2m[t2m_count].el_tag = 0; @@ -827,7 +831,12 @@ SET_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, if(elm->flags & ATF_POINTER) { memb_ptr = *(void **)((char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; /* OPTIONAL element? */ + if(!memb_ptr) { + if(elm->optional) + continue; + /* Mandatory element missing */ + _ASN_ENCODE_FAILED; + } } else { memb_ptr = (void *)((char *)sptr + elm->memb_offset); } @@ -872,7 +881,11 @@ SET_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, if(elm->flags & ATF_POINTER) { memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); - if(!memb_ptr) continue; + if(!memb_ptr) { + if(elm->optional) continue; + /* Print <absent> line */ + /* Fall through */ + } } else { memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); } |