mirror of https://gerrit.osmocom.org/asn1c
context sensitivity
This commit is contained in:
parent
6ab8896515
commit
1e4439612f
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,13 +696,12 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
|
|||
case -1:
|
||||
ctx->phase = 4;
|
||||
RETURN(RC_FAIL);
|
||||
case 1:
|
||||
ctx->phase = 1;
|
||||
/* Fall through */
|
||||
case 0:
|
||||
XER_ADVANCE(ch_size);
|
||||
continue;
|
||||
case 1:
|
||||
XER_ADVANCE(ch_size);
|
||||
ctx->phase = 1;
|
||||
continue;
|
||||
case 2:
|
||||
ctx->phase = 1;
|
||||
break;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue