diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c index 7473b62671a9adf8a106d23f8581d198446531f4..6a4cdc7e5819771966391f615f6c53d1c96730cd 100644 --- a/skeletons/BOOLEAN.c +++ b/skeletons/BOOLEAN.c @@ -146,7 +146,7 @@ BOOLEAN__xer_body_decode(void *sptr, void *chunk_buf, size_t chunk_size) { /* "<false/>" */ *st = 0; break; - case XCT_UNEXPECTED: + case XCT_UNKNOWN_BO: if(xer_check_tag(chunk_buf, chunk_size, "true") != XCT_BOTH) return -1; diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c index 49bd06cc4b7915268e564977f5117523bb5a0c3e..4e90bbd6fb31997d7fa135aa62c78287180554be 100644 --- a/skeletons/constr_CHOICE.c +++ b/skeletons/constr_CHOICE.c @@ -639,7 +639,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Get the next part of the XML stream. */ - ch_size = xer_next_token(buf_ptr, size, &ch_type); + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -667,6 +667,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; case 1: ctx->phase = 3; + /* Fall through */ case 0: XER_ADVANCE(ch_size); continue; diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c index 31f0c42236b0a702561ab5aaab1f737f99a9074a..459de4c2443c7b7bb3cb3e5b5b91bca7062d2902 100644 --- a/skeletons/constr_SEQUENCE.c +++ b/skeletons/constr_SEQUENCE.c @@ -689,7 +689,8 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Get the next part of the XML stream. */ - ch_size = xer_next_token(buf_ptr, size, &ch_type); + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c index c5bb201dd5acc582748900f9d39d362e4853f1c3..2ee3b81a7444570ac19a8aa83fb55859b91869ac 100644 --- a/skeletons/constr_SET.c +++ b/skeletons/constr_SET.c @@ -671,7 +671,8 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Get the next part of the XML stream. */ - ch_size = xer_next_token(buf_ptr, size, &ch_type); + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -695,12 +696,11 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case -1: ctx->phase = 4; RETURN(RC_FAIL); - case 0: - XER_ADVANCE(ch_size); - continue; case 1: - XER_ADVANCE(ch_size); ctx->phase = 1; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); continue; case 2: ctx->phase = 1; diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c index 7df1e5cfa33baddebb6e665934edd1e7fe37d1ba..37268dc0401643492377a246ac22f0184ec1345d 100644 --- a/skeletons/constr_SET_OF.c +++ b/skeletons/constr_SET_OF.c @@ -536,7 +536,8 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * Get the next part of the XML stream. */ - ch_size = xer_next_token(buf_ptr, size, &ch_type); + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h index 79bd0a26815b08a93f00d6d9c1ee16b50be38740..e36f2932dbdd16edbf650b973ce2fed76ad7b730 100644 --- a/skeletons/constr_TYPE.h +++ b/skeletons/constr_TYPE.h @@ -23,10 +23,11 @@ struct asn_TYPE_member_s; /* Forward declaration */ * included into certain target language's structures, such as compound types. */ typedef struct asn_struct_ctx_s { - int phase; /* Decoding phase */ - int step; /* Elementary step of a phase */ - ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ } asn_struct_ctx_t; #include <ber_decoder.h> /* Basic Encoding Rules decoder */ diff --git a/skeletons/tests/check-XER.c b/skeletons/tests/check-XER.c index 5c7e69c19c7fd6279b5aa16a85421bbd52c87212..9254dbc1bc8d486fbbb50b017d7cd75b0bb8039d 100644 --- a/skeletons/tests/check-XER.c +++ b/skeletons/tests/check-XER.c @@ -17,10 +17,11 @@ check_next(char *xerbuf, int expected_chunk_size, pxer_chunk_type_e expected_chu int xerbuf_len = strlen(xerbuf); pxer_chunk_type_e ch_type; ssize_t ch_size; + int state = 0; if(expected_chunk_size == -1) expected_chunk_size = xerbuf_len; - ch_size = xer_next_token(xerbuf, xerbuf_len, &ch_type); + ch_size = xer_next_token(&state, xerbuf, xerbuf_len, &ch_type); printf("[%s]:%d\n", xerbuf, xerbuf_len); printf("chunk sizes: %d vs %d, chunk types: %d vs %d\n", diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c index ed1fff46baa4069f5853838e2c548855e22988aa..912767902a8cce732aef429b9a181bc9f7e326f6 100644 --- a/skeletons/xer_decoder.c +++ b/skeletons/xer_decoder.c @@ -51,13 +51,13 @@ xer__token_cb(pxml_chunk_type_e type, void *_chunk_data, size_t _chunk_size, voi * Fetch the next token from the XER/XML stream. */ ssize_t -xer_next_token(void *buffer, size_t size, pxer_chunk_type_e *ch_type) { +xer_next_token(int *stateContext, void *buffer, size_t size, pxer_chunk_type_e *ch_type) { struct xer__cb_arg arg; - int stateContext = 0; + int new_stateContext = *stateContext; ssize_t ret; arg.callback_not_invoked = 1; - ret = pxml_parse(&stateContext, buffer, size, xer__token_cb, &arg); + ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); if(ret < 0) return -1; if(arg.callback_not_invoked) { assert(ret == 0); /* No data was consumed */ @@ -65,7 +65,6 @@ xer_next_token(void *buffer, size_t size, pxer_chunk_type_e *ch_type) { } else { assert(arg.chunk_size); assert(arg.chunk_buf == buffer); - assert(stateContext == 0); } /* @@ -85,6 +84,7 @@ xer_next_token(void *buffer, size_t size, pxer_chunk_type_e *ch_type) { break; } + *stateContext = new_stateContext; return arg.chunk_size; } @@ -136,13 +136,13 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { return ct; } } - return (XCT__UNK__MASK | ct); + return (xer_check_tag_e)(XCT__UNK__MASK | ct); } if(b == 0) return XCT_BROKEN; /* Embedded 0 in buf?! */ } if(*need_tag) - return (XCT__UNK__MASK | ct); + return (xer_check_tag_e)(XCT__UNK__MASK | ct); return ct; } @@ -168,7 +168,8 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { (struct_key, chunk_buf, chunk_size, \ (size_t)chunk_size < size); \ if(converted_size == -1) RETURN(RC_FAIL); \ - if(converted_size == 0 && size == chunk_size) \ + if(converted_size == 0 \ + && size == (size_t)chunk_size) \ RETURN(RC_WMORE); \ chunk_size = converted_size; \ } while(0) @@ -212,7 +213,8 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, /* * Get the next part of the XML stream. */ - ch_size = xer_next_token(buf_ptr, size, &ch_type); + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); switch(ch_size) { case -1: RETURN(RC_FAIL); case 0: diff --git a/skeletons/xer_decoder.h b/skeletons/xer_decoder.h index c0e23b9e7036d7fa0a35ae30d5b3b1ea995458ba..fa8c3c69bb11e22e399ac4676ae88202cb85c26a 100644 --- a/skeletons/xer_decoder.h +++ b/skeletons/xer_decoder.h @@ -63,7 +63,8 @@ asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, PXER_TEXT, /* Plain text between XER tags */ PXER_COMMENT, /* A comment, may be part of */ } pxer_chunk_type_e; -ssize_t xer_next_token(void *buffer, size_t size, pxer_chunk_type_e *_ch_type); +ssize_t xer_next_token(int *stateContext, + void *buffer, size_t size, pxer_chunk_type_e *_ch_type); /* * This function checks the buffer against the tag name is expected to occur.