15 #define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) 28 #define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) 35 #define ADVANCE(num_bytes) do { \ 36 size_t num = num_bytes; \ 37 ptr = ((const char *)ptr) + num;\ 41 consumed_myself += num; \ 48 #define NEXT_PHASE(ctx) do { \ 57 #define RETURN(_code) do { \ 59 rval.consumed = consumed_myself;\ 80 if(a_class == b_class) {
84 if(a_value == b_value)
86 else if(a_value < b_value)
90 }
else if(a_class < b_class) {
102 void **struct_ptr,
const void *ptr,
size_t size,
int tag_mode) {
112 void *st = *struct_ptr;
119 ssize_t consumed_myself = 0;
151 tag_mode, -1, &ctx->left, 0);
152 if(rval.code !=
RC_OK) {
154 td->
name, rval.code);
160 ctx->left += rval.consumed;
169 ASN_DEBUG(
"Structure consumes %ld bytes, buffer %ld",
170 (
long)ctx->left, (
long)size);
178 ASN_DEBUG(
"In %s CHOICE tag length %d", td->
name, (
int)tag_len);
198 ctx->step = t2m->
el_no;
202 "in non-extensible CHOICE %s",
214 (
const char *)ptr + tag_len,
238 elm = &elements[ctx->step];
247 memb_ptr2 = (
void **)((
char *)st + elm->
memb_offset);
254 memb_ptr2 = &memb_ptr;
284 ASN_DEBUG(
"CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d",
285 td->
name, (
long)ctx->left, (
long)size,
311 while(ctx->left < 0) {
324 if(((
const uint8_t *)ptr)[0] == 0) {
330 }
else if(((
const uint8_t *)ptr)[1] == 0) {
339 ASN_DEBUG(
"Unexpected continuation in %s",
364 size_t computed_size = 0;
370 cb?
"Encoding":
"Estimating", td->
name);
393 memb_ptr = *(
void **)((
char *)sptr + elm->memb_offset);
403 memb_ptr = (
void *)((
char *)sptr + elm->memb_offset);
418 erval = elm->type->der_encoder(elm->type, memb_ptr,
419 elm->tag_mode, elm->tag, 0, 0);
420 if(erval.encoded == -1)
428 computed_size += ret;
434 erval = elm->type->der_encoder(elm->type, memb_ptr,
435 elm->tag_mode, elm->tag, cb, app_key);
436 if(erval.encoded == -1)
439 ASN_DEBUG(
"Encoded CHOICE member in %ld bytes (+%ld)",
440 (
long)erval.encoded, (
long)computed_size);
442 erval.encoded += computed_size;
452 assert(tag_mode == 0); (void)tag_mode;
453 assert(tag == 0); (void)tag;
460 if(present > 0 || present <= td->elements_count) {
462 const void *memb_ptr;
465 memb_ptr = *(
const void *
const *)
468 memb_ptr = (
const void *)
487 "%s: value not given (%s:%d)",
488 td->
name, __FILE__, __LINE__);
496 if(present > 0 && present <= td->elements_count) {
498 const void *memb_ptr;
501 memb_ptr = *(
const void *
const *)((
const char *)sptr + elm->
memb_offset);
506 "%s: mandatory CHOICE element %s absent (%s:%d)",
507 td->
name, elm->
name, __FILE__, __LINE__);
511 memb_ptr = (
const void *)((
const char *)sptr + elm->
memb_offset);
519 memb_ptr, ctfailcb, app_key);
529 "%s: no CHOICE element given (%s:%d)",
530 td->
name, __FILE__, __LINE__);
536 #define XER_ADVANCE(num_bytes) do { \ 537 size_t num = num_bytes; \ 538 buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ 540 consumed_myself += num; \ 548 void **struct_ptr,
const char *opt_mname,
549 const void *buf_ptr,
size_t size) {
554 const char *xml_tag = opt_mname ? opt_mname : td->
xml_tag;
559 void *st = *struct_ptr;
563 ssize_t consumed_myself = 0;
578 if(ctx->phase == 0 && !*xml_tag)
590 for(edx = ctx->step; ctx->phase <= 4;) {
599 if(ctx->phase == 2) {
608 memb_ptr2 = (
void **)((
char *)st
612 memb_ptr2 = &memb_ptr;
620 ASN_DEBUG(
"XER/CHOICE: itdf: [%s] code=%d",
634 if(ctx->phase == 3 && !*xml_tag) {
658 ASN_DEBUG(
"XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d",
659 ch_size>0?((
const uint8_t *)buf_ptr)[0]:
'?',
660 ch_size>1?((
const uint8_t *)buf_ptr)[1]:
'?',
661 ch_size>2?((
const uint8_t *)buf_ptr)[2]:
'?',
662 ch_size>3?((
const uint8_t *)buf_ptr)[3]:
'?',
666 if(ctx->phase == 4) {
668 tcv, (
long)ctx->left);
696 if(ctx->phase == 0) {
759 ASN_DEBUG(
"Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" 761 ch_size>0?((
const uint8_t *)buf_ptr)[0]:
'?',
762 ch_size>1?((
const uint8_t *)buf_ptr)[1]:
'?',
763 ch_size>2?((
const uint8_t *)buf_ptr)[2]:
'?',
764 ch_size>3?((
const uint8_t *)buf_ptr)[3]:
'?',
765 td->
name, ctx->phase, xml_tag);
796 const char *mname = elm->
name;
797 unsigned int mlen = strlen(mname);
800 memb_ptr = *(
void **)((
char *)sptr + elm->
memb_offset);
803 memb_ptr = (
void *)((
char *)sptr + elm->
memb_offset);
812 ilevel + 1, flags, cb, app_key);
813 if(tmper.
encoded == -1)
return tmper;
817 er.encoded += 5 + (2 * mlen) + tmper.
encoded;
850 if(constraints) ct = &constraints->
value;
854 if(ct && ct->flags & APC_EXTENSIBLE) {
860 if(ct && ct->range_bits >= 0) {
863 ASN_DEBUG(
"CHOICE %s got index %d in range %d",
864 td->
name, value, ct->range_bits);
865 if(value > ct->upper_bound)
887 memb_ptr2 = (
void **)((
char *)st + elm->memb_offset);
890 memb_ptr2 = &memb_ptr;
892 ASN_DEBUG(
"Discovered CHOICE %s encodes %s", td->
name, elm->name);
894 if(ct && ct->range_bits >= 0) {
895 rv = elm->type->uper_decoder(opt_codec_ctx, elm->type,
896 elm->per_constraints, memb_ptr2, pd);
899 elm->per_constraints, memb_ptr2, pd);
903 ASN_DEBUG(
"Failed to decode %s in %s (CHOICE) %d",
904 elm->name, td->
name, rv.code);
922 if(constraints) ct = &constraints->
value;
938 ASN_DEBUG(
"Encoding %s CHOICE element %d", td->
name, present);
944 present_enc = present;
946 if(ct && ct->range_bits >= 0) {
947 if(present_enc < ct->lower_bound
948 || present_enc > ct->upper_bound) {
949 if(ct->flags & APC_EXTENSIBLE) {
958 if(ct && ct->flags & APC_EXTENSIBLE)
965 memb_ptr = *(
void **)((
char *)sptr + elm->memb_offset);
968 memb_ptr = (
char *)sptr + elm->memb_offset;
971 if(ct && ct->range_bits >= 0) {
975 return elm->type->uper_encoder(elm->type, elm->per_constraints,
998 if(!sptr)
return (cb(
"<absent>", 8, app_key) < 0) ? -1 : 0;
1008 if(present > 0 && present <= td->elements_count) {
1010 const void *memb_ptr;
1013 memb_ptr = *(
const void *
const *)((
const char *)sptr + elm->
memb_offset);
1014 if(!memb_ptr)
return (cb(
"<absent>", 8, app_key) < 0) ? -1 : 0;
1016 memb_ptr = (
const void *)((
const char *)sptr + elm->
memb_offset);
1021 if(cb(elm->
name, strlen(elm->
name), app_key) < 0
1022 || cb(
": ", 2, app_key) < 0)
1029 return (cb(
"<absent>", 8, app_key) < 0) ? -1 : 0;
1051 if(present > 0 && present <= td->elements_count) {
1056 memb_ptr = *(
void **)((
char *)ptr + elm->
memb_offset);
1060 memb_ptr = (
void *)((
char *)ptr + elm->
memb_offset);
1065 if(!contents_only) {
1082 const void *present_ptr;
1085 present_ptr = ((
const char *)struct_ptr) + pres_offset;
1088 case sizeof(int): present = *(
const int *)present_ptr;
break;
1089 case sizeof(short): present = *(
const short *)present_ptr;
break;
1090 case sizeof(char): present = *(
const char *)present_ptr;
break;
1093 assert(pres_size !=
sizeof(
int));
1103 present_ptr = ((
char *)struct_ptr) + pres_offset;
1106 case sizeof(int): *(
int *)present_ptr = present;
break;
1107 case sizeof(short): *(
short *)present_ptr = present;
break;
1108 case sizeof(char): *(
char *)present_ptr = present;
break;
1111 assert(pres_size !=
sizeof(
int));
asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po)
#define _i_ASN_TEXT_INDENT(nl, level)
ssize_t der_write_tags(struct asn_TYPE_descriptor_s *type_descriptor, size_t struct_length, int tag_mode, int last_tag_form, ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, void *app_key)
asn_outmost_tag_f asn_TYPE_outmost_tag
int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, asn_app_consume_bytes_f *cb, void *app_key)
ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r)
#define BER_TLV_CONSTRUCTED(tagptr)
asn_enc_rval_t CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, int ilevel, enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, void *app_key)
enum asn_TYPE_flags_e flags
#define _ASN_DECODE_STARVED
int CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, asn_app_constraint_failed_f *ctfailcb, void *app_key)
int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits)
char * ber_tlv_tag_string(ber_tlv_tag_t tag)
asn_dec_rval_t CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const void *ptr, size_t size, int tag_mode)
static int _search4tag(const void *ap, const void *bp)
ssize_t ber_skip_length(struct asn_codec_ctx_s *opt_codec_ctx, int _is_constructed, const void *bufptr, size_t size)
asn_constr_check_f * memb_constraints
int uper_put_nsnnwn(asn_per_outp_t *po, int n)
#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr)
asn_per_constraint_t value
asn_dec_rval_t CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **struct_ptr, const char *opt_mname, const void *buf_ptr, size_t size)
#define CALLOC(nmemb, size)
#define BER_TAG_VALUE(tag)
static void _set_present_idx(void *sptr, int offset, int size, int pres)
static int _ASN_STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx)
#define _ASN_ENCODED_OK(rval)
asn_constr_check_f * check_constraints
asn_dec_rval_t ber_check_tags(struct asn_codec_ctx_s *opt_codec_ctx, struct asn_TYPE_descriptor_s *type_descriptor, asn_struct_ctx_t *opt_ctx, const void *ptr, size_t size, int tag_mode, int last_tag_form, ber_tlv_len_t *last_length, int *opt_tlv_form)
#define ASN_STRUCT_FREE(asn_DEF, ptr)
#define _ASN_ENCODE_FAILED
ssize_t xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *_ch_type)
asn_struct_print_f * print_struct
enum xer_check_tag xer_check_tag_e
struct asn_TYPE_member_s * elements
int() asn_app_consume_bytes_f(const void *buffer, size_t size, void *application_specific_key)
xer_type_decoder_f * xer_decoder
#define BER_TAG_CLASS(tag)
#define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3)
int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits)
int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po)
void() asn_app_constraint_failed_f(void *application_specific_key, struct asn_TYPE_descriptor_s *type_descriptor_which_failed, const void *structure_which_failed_ptr, const char *error_message_format,...) GCC_PRINTFLIKE(4
static int _fetch_present_idx(const void *struct_ptr, int off, int size)
enum asn_dec_rval_code_e code
asn_TYPE_descriptor_t * type
#define ADVANCE(num_bytes)
#define XER_ADVANCE(num_bytes)
static void ASN_DEBUG(const char *fmt,...)
asn_enc_rval_t 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)
ber_tlv_tag_t CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag)
ssize_t uper_get_nsnnwn(asn_per_data_t *pd)
asn_per_constraints_t * per_constraints
int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth)
asn_dec_rval_t CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd)
ber_type_decoder_f * ber_decoder
asn_TYPE_tag2member_t * tag2el
enum pxer_chunk_type pxer_chunk_type_e
#define _ASN_DECODE_FAILED
xer_type_encoder_f * xer_encoder
void CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only)
asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd)