mirror of https://gerrit.osmocom.org/asn1c
decode SET OF in OER
This commit is contained in:
parent
84382cc1f5
commit
96f9921b09
|
@ -287,6 +287,7 @@ ASN_MODULE_SOURCES+=NativeInteger_oer.c
|
||||||
ASN_MODULE_SOURCES+=NativeEnumerated_oer.c
|
ASN_MODULE_SOURCES+=NativeEnumerated_oer.c
|
||||||
ASN_MODULE_SOURCES+=constr_SEQUENCE_oer.c
|
ASN_MODULE_SOURCES+=constr_SEQUENCE_oer.c
|
||||||
ASN_MODULE_SOURCES+=constr_CHOICE_oer.c
|
ASN_MODULE_SOURCES+=constr_CHOICE_oer.c
|
||||||
|
ASN_MODULE_SOURCES+=constr_SET_OF_oer.c
|
||||||
ASN_CONVERTER_SOURCES+=pdu_collection.c
|
ASN_CONVERTER_SOURCES+=pdu_collection.c
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,7 @@ libasn1cskeletons_la_SOURCES = \
|
||||||
constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \
|
constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \
|
||||||
constr_SET.c constr_SET.h \
|
constr_SET.c constr_SET.h \
|
||||||
constr_SET_OF.c constr_SET_OF.h \
|
constr_SET_OF.c constr_SET_OF.h \
|
||||||
|
constr_SET_OF_oer.c \
|
||||||
constr_TYPE.c constr_TYPE.h \
|
constr_TYPE.c constr_TYPE.h \
|
||||||
constraints.c constraints.h \
|
constraints.c constraints.h \
|
||||||
der_encoder.c der_encoder.h \
|
der_encoder.c der_encoder.h \
|
||||||
|
|
|
@ -41,23 +41,23 @@ NativeInteger_decode_oer(asn_codec_ctx_t *opt_codec_ctx,
|
||||||
|
|
||||||
if(specs && specs->field_unsigned) {
|
if(specs && specs->field_unsigned) {
|
||||||
unsigned long ul;
|
unsigned long ul;
|
||||||
if(asn_INTEGER2ulong(&tmpint, &ul) != 0) {
|
int ok = asn_INTEGER2ulong(&tmpint, &ul) == 0;
|
||||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
||||||
rval.code = RC_FAIL;
|
if(ok) {
|
||||||
rval.consumed = 0;
|
|
||||||
return rval;
|
|
||||||
} else {
|
|
||||||
*native = ul;
|
*native = ul;
|
||||||
|
} else {
|
||||||
|
rval.code = RC_FAIL;
|
||||||
|
return rval;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
long l;
|
long l;
|
||||||
if(asn_INTEGER2long(&tmpint, &l) != 0) {
|
int ok = asn_INTEGER2long(&tmpint, &l) == 0;
|
||||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint);
|
||||||
rval.code = RC_FAIL;
|
if(ok) {
|
||||||
rval.consumed = 0;
|
|
||||||
return rval;
|
|
||||||
} else {
|
|
||||||
*native = l;
|
*native = l;
|
||||||
|
} else {
|
||||||
|
rval.code = RC_FAIL;
|
||||||
|
return rval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#undef RETURN
|
#undef RETURN
|
||||||
#define RETURN(_code) \
|
#define RETURN(_code) \
|
||||||
do { \
|
do { \
|
||||||
|
asn_dec_rval_t rval; \
|
||||||
rval.code = _code; \
|
rval.code = _code; \
|
||||||
rval.consumed = consumed_myself; \
|
rval.consumed = consumed_myself; \
|
||||||
return rval; \
|
return rval; \
|
||||||
|
@ -38,7 +39,12 @@
|
||||||
ctx->phase++; \
|
ctx->phase++; \
|
||||||
ctx->step = 0; \
|
ctx->step = 0; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#undef SET_PHASE
|
||||||
|
#define SET_PHASE(ctx, value) \
|
||||||
|
do { \
|
||||||
|
ctx->phase = value; \
|
||||||
|
ctx->step = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tags are canonically sorted in the tag to member table.
|
* Tags are canonically sorted in the tag to member table.
|
||||||
|
@ -136,8 +142,6 @@ CHOICE_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||||
void *st = *struct_ptr; /* Target structure. */
|
void *st = *struct_ptr; /* Target structure. */
|
||||||
asn_struct_ctx_t *ctx; /* Decoder context */
|
asn_struct_ctx_t *ctx; /* Decoder context */
|
||||||
|
|
||||||
asn_dec_rval_t rval; /* Return code from subparsers */
|
|
||||||
|
|
||||||
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
|
ssize_t consumed_myself = 0; /* Consumed bytes from ptr */
|
||||||
|
|
||||||
(void)constraints;
|
(void)constraints;
|
||||||
|
@ -196,7 +200,9 @@ CHOICE_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||||
RETURN(RC_FAIL);
|
RETURN(RC_FAIL);
|
||||||
} else {
|
} else {
|
||||||
/* Skip open type extension */
|
/* Skip open type extension */
|
||||||
ASN_DEBUG("Not implemented skipping open type extension");
|
ASN_DEBUG(
|
||||||
|
"Not implemented skipping open type extension for tag %s",
|
||||||
|
ber_tlv_tag_string(tlv_tag));
|
||||||
RETURN(RC_FAIL);
|
RETURN(RC_FAIL);
|
||||||
}
|
}
|
||||||
} while(0);
|
} while(0);
|
||||||
|
@ -204,10 +210,12 @@ CHOICE_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||||
|
|
||||||
ADVANCE(tag_len);
|
ADVANCE(tag_len);
|
||||||
}
|
}
|
||||||
|
/* Fall through */
|
||||||
case 1: {
|
case 1: {
|
||||||
asn_TYPE_member_t *elm = &elements[ctx->step]; /* CHOICE's element */
|
asn_TYPE_member_t *elm = &elements[ctx->step]; /* CHOICE's element */
|
||||||
void *memb_ptr; /* Pointer to the member */
|
void *memb_ptr; /* Pointer to the member */
|
||||||
void **memb_ptr2; /* Pointer to that pointer */
|
void **memb_ptr2; /* Pointer to that pointer */
|
||||||
|
asn_dec_rval_t rval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute the position of the member inside a structure,
|
* Compute the position of the member inside a structure,
|
||||||
|
@ -240,8 +248,22 @@ CHOICE_decode_oer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
||||||
elm->oer_constraints, memb_ptr2, ptr,
|
elm->oer_constraints, memb_ptr2, ptr,
|
||||||
size);
|
size);
|
||||||
rval.consumed += consumed_myself;
|
rval.consumed += consumed_myself;
|
||||||
|
switch(rval.code) {
|
||||||
|
case RC_OK:
|
||||||
|
NEXT_PHASE(ctx);
|
||||||
|
case RC_WMORE:
|
||||||
|
break;
|
||||||
|
case RC_FAIL:
|
||||||
|
SET_PHASE(ctx, 3); /* => 3 */
|
||||||
|
}
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
case 2:
|
||||||
|
/* Already decoded everything */
|
||||||
|
RETURN(RC_OK);
|
||||||
|
case 3:
|
||||||
|
/* Failed to decode, after all */
|
||||||
|
RETURN(RC_FAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN(RC_FAIL);
|
RETURN(RC_FAIL);
|
||||||
|
|
|
@ -220,8 +220,8 @@ asn_TYPE_operation_t asn_OP_SEQUENCE_OF = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
#else
|
#else
|
||||||
0,
|
SEQUENCE_OF_decode_oer,
|
||||||
0,
|
SEQUENCE_OF_encode_oer,
|
||||||
#endif /* ASN_DISABLE_OER_SUPPORT */
|
#endif /* ASN_DISABLE_OER_SUPPORT */
|
||||||
#ifdef ASN_DISABLE_PER_SUPPORT
|
#ifdef ASN_DISABLE_PER_SUPPORT
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -23,6 +23,8 @@ extern "C" {
|
||||||
#define SEQUENCE_OF_decode_ber SET_OF_decode_ber
|
#define SEQUENCE_OF_decode_ber SET_OF_decode_ber
|
||||||
#define SEQUENCE_OF_decode_xer SET_OF_decode_xer
|
#define SEQUENCE_OF_decode_xer SET_OF_decode_xer
|
||||||
#define SEQUENCE_OF_decode_uper SET_OF_decode_uper
|
#define SEQUENCE_OF_decode_uper SET_OF_decode_uper
|
||||||
|
#define SEQUENCE_OF_decode_oer SET_OF_decode_oer
|
||||||
|
#define SEQUENCE_OF_encode_oer SET_OF_encode_oer
|
||||||
der_type_encoder_f SEQUENCE_OF_encode_der;
|
der_type_encoder_f SEQUENCE_OF_encode_der;
|
||||||
xer_type_encoder_f SEQUENCE_OF_encode_xer;
|
xer_type_encoder_f SEQUENCE_OF_encode_xer;
|
||||||
per_type_encoder_f SEQUENCE_OF_encode_uper;
|
per_type_encoder_f SEQUENCE_OF_encode_uper;
|
||||||
|
|
|
@ -981,8 +981,13 @@ asn_TYPE_operation_t asn_OP_SET_OF = {
|
||||||
SET_OF_encode_der,
|
SET_OF_encode_der,
|
||||||
SET_OF_decode_xer,
|
SET_OF_decode_xer,
|
||||||
SET_OF_encode_xer,
|
SET_OF_encode_xer,
|
||||||
|
#ifdef ASN_DISABLE_OER_SUPPORT
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
#else
|
||||||
|
SET_OF_decode_oer,
|
||||||
|
SET_OF_decode_oer,
|
||||||
|
#endif
|
||||||
#ifdef ASN_DISABLE_PER_SUPPORT
|
#ifdef ASN_DISABLE_PER_SUPPORT
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
* Copyright (c) 2003 Lev Walkin <vlm@lionet.info>. All rights reserved.
|
||||||
* Redistribution and modifications are permitted subject to BSD license.
|
* Redistribution and modifications are permitted subject to BSD license.
|
||||||
*/
|
*/
|
||||||
#ifndef _CONSTR_SET_OF_H_
|
#ifndef CONSTR_SET_OF_H
|
||||||
#define _CONSTR_SET_OF_H_
|
#define CONSTR_SET_OF_H
|
||||||
|
|
||||||
#include <asn_application.h>
|
#include <asn_application.h>
|
||||||
|
|
||||||
|
@ -12,14 +12,14 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef const struct asn_SET_OF_specifics_s {
|
typedef const struct asn_SET_OF_specifics_s {
|
||||||
/*
|
/*
|
||||||
* Target structure description.
|
* Target structure description.
|
||||||
*/
|
*/
|
||||||
int struct_size; /* Size of the target structure. */
|
unsigned struct_size; /* Size of the target structure. */
|
||||||
int ctx_offset; /* Offset of the asn_struct_ctx_t member */
|
unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */
|
||||||
|
|
||||||
/* XER-specific stuff */
|
/* XER-specific stuff */
|
||||||
int as_XMLValueList; /* The member type must be encoded like this */
|
int as_XMLValueList; /* The member type must be encoded like this */
|
||||||
} asn_SET_OF_specifics_t;
|
} asn_SET_OF_specifics_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -33,6 +33,8 @@ ber_type_decoder_f SET_OF_decode_ber;
|
||||||
der_type_encoder_f SET_OF_encode_der;
|
der_type_encoder_f SET_OF_encode_der;
|
||||||
xer_type_decoder_f SET_OF_decode_xer;
|
xer_type_decoder_f SET_OF_decode_xer;
|
||||||
xer_type_encoder_f SET_OF_encode_xer;
|
xer_type_encoder_f SET_OF_encode_xer;
|
||||||
|
oer_type_decoder_f SET_OF_decode_oer;
|
||||||
|
oer_type_encoder_f SET_OF_encode_oer;
|
||||||
per_type_decoder_f SET_OF_decode_uper;
|
per_type_decoder_f SET_OF_decode_uper;
|
||||||
per_type_encoder_f SET_OF_encode_uper;
|
per_type_encoder_f SET_OF_encode_uper;
|
||||||
extern asn_TYPE_operation_t asn_OP_SET_OF;
|
extern asn_TYPE_operation_t asn_OP_SET_OF;
|
||||||
|
@ -41,4 +43,4 @@ extern asn_TYPE_operation_t asn_OP_SET_OF;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _CONSTR_SET_OF_H_ */
|
#endif /* CONSTR_SET_OF_H */
|
||||||
|
|
|
@ -78,5 +78,6 @@ NativeInteger_oer.c
|
||||||
NativeEnumerated_oer.c
|
NativeEnumerated_oer.c
|
||||||
constr_SEQUENCE_oer.c
|
constr_SEQUENCE_oer.c
|
||||||
constr_CHOICE_oer.c
|
constr_CHOICE_oer.c
|
||||||
|
constr_SET_OF_oer.c
|
||||||
|
|
||||||
CODEC-PER: # THIS IS A SPECIAL SECTION
|
CODEC-PER: # THIS IS A SPECIAL SECTION
|
||||||
|
|
Loading…
Reference in New Issue