From 1e4439612faf6c5da0f91c4d16e59a28e0ee1cbf Mon Sep 17 00:00:00 2001
From: Lev Walkin <vlm@lionet.info>
Date: Fri, 18 Feb 2005 18:06:36 +0000
Subject: [PATCH] context sensitivity

---
 skeletons/BOOLEAN.c         |  2 +-
 skeletons/constr_CHOICE.c   |  3 ++-
 skeletons/constr_SEQUENCE.c |  3 ++-
 skeletons/constr_SET.c      | 10 +++++-----
 skeletons/constr_SET_OF.c   |  3 ++-
 skeletons/constr_TYPE.h     |  7 ++++---
 skeletons/tests/check-XER.c |  3 ++-
 skeletons/xer_decoder.c     | 18 ++++++++++--------
 skeletons/xer_decoder.h     |  3 ++-
 9 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c
index 7473b626..6a4cdc7e 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 49bd06cc..4e90bbd6 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 31f0c422..459de4c2 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 c5bb201d..2ee3b81a 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 7df1e5cf..37268dc0 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 79bd0a26..e36f2932 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 5c7e69c1..9254dbc1 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 ed1fff46..91276790 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 c0e23b9e..fa8c3c69 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.
-- 
GitLab