diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 77991452..b1360653 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -673,7 +673,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; } /* Fall through */ - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: if(ctx->phase != 1) break; /* Really unexpected */ @@ -693,9 +694,9 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step = edx; ctx->phase = 2; break; - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: continue; - case XCT_CLOSING: default: edx = td->elements_count; break; /* Phase out */ @@ -704,6 +705,16 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(edx != td->elements_count) continue; + + /* It is expected extension */ + if(specs->extensible) { + ASN_DEBUG("Got anticipated extension, " + "but NOT IMPLEMENTED YET"); + /* + * TODO: implement skipping of extensions + */ + } + /* Fall through */ default: break; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index d7352c65..14309462 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -623,6 +623,7 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int xer_state; /* XER low level parsing context */ int edx; /* Element index */ + int edx_end; /* * Create the target structure if it is not present already. @@ -649,6 +650,7 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t ch_size; /* Chunk size */ xer_check_tag_e tcv; /* Tag check value */ asn_TYPE_member_t *elm; + int n; /* * Go inside the inner member of a sequence. @@ -740,9 +742,8 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; } /* Fall through */ - case XCT_UNEXPECTED: { - int edx_end; - int n; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d", tcv, ctx->phase); @@ -754,6 +755,8 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Search which member corresponds to this tag. */ edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; for(n = edx; n < edx_end; n++) { elm = &td->elements[n]; tcv = xer_check_tag(buf_ptr,ch_size,elm->name); @@ -766,18 +769,29 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step = edx = n; ctx->phase = 2; break; - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: continue; - case XCT_CLOSING: default: n = edx_end; break; /* Phase out */ } break; } - if(n == edx_end) break; - continue; - } + if(n != edx_end) + continue; + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Got anticipated extension at %d, " + "but NOT IMPLEMENTED YET", edx); + /* + * TODO: implement skipping of extensions + */ + } + + /* Fall through */ default: break; } diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index 53a9e611..120acb21 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -714,7 +714,8 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; } /* Fall through */ - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SET: tcv=%d, ph=%d", tcv, ctx->phase); if(ctx->phase != 1) @@ -735,9 +736,9 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step = edx; ctx->phase = 2; break; - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: continue; - case XCT_CLOSING: default: edx = td->elements_count; break; /* Phase out */ @@ -746,6 +747,16 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(edx != td->elements_count) continue; + + /* It is expected extension */ + if(specs->extensible) { + ASN_DEBUG("Got anticipated extension, " + "but NOT IMPLEMENTED YET"); + /* + * TODO: implement skipping of extensions + */ + } + /* Fall through */ default: break; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 01328b4f..eed604ed 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -577,7 +577,8 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; } /* Fall through */ - case XCT_UNEXPECTED: + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); if(ctx->phase != 1) @@ -595,8 +596,6 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ ctx->phase = 2; continue; - case XCT_UNEXPECTED: - case XCT_CLOSING: default: break; /* Phase out */ } diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index 97e0d394..e81d7de2 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -137,12 +137,13 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { return ct; } } - return XCT_UNEXPECTED; + return (XCT__UNK__MASK | ct); } if(b == 0) return XCT_BROKEN; /* Embedded 0 in buf?! */ } - if(*need_tag) return XCT_UNEXPECTED; + if(*need_tag) + return (XCT__UNK__MASK | ct); return ct; } @@ -272,7 +273,7 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, ADVANCE(ch_size); ctx->phase = 2; /* Phase out */ RETURN(RC_OK); - case XCT_UNEXPECTED: + case XCT_UNKNOWN_BO: if(!ctx->phase) break; /* * Certain tags in the body may be expected. diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index 1c26ef79..c3df005d 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -70,11 +70,14 @@ ssize_t xer_next_token(int *stateContext, void *buffer, size_t size, * This function checks the buffer against the tag name is expected to occur. */ typedef enum xer_check_tag { - XCT_BROKEN, /* The tag is broken */ - XCT_UNEXPECTED, /* The tag is fine, but unexpected */ - XCT_OPENING, /* This is the opening */ - XCT_CLOSING, /* This is the closing */ - XCT_BOTH, /* This is the opening and closing tag */ + XCT_BROKEN = 0, /* The tag is broken */ + XCT_OPENING = 1, /* This is the tag */ + XCT_CLOSING = 2, /* This is the tag */ + XCT_BOTH = 3, /* This is the tag */ + XCT__UNK__MASK = 4, /* Mask of everything unexpected */ + XCT_UNKNOWN_OP = 5, /* Unexpected tag */ + XCT_UNKNOWN_CL = 6, /* Unexpected tag */ + XCT_UNKNOWN_BO = 7, /* Unexpected tag */ } xer_check_tag_e; xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, const char *need_tag);