more distinction


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@664 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index 7799145..b136065 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -673,7 +673,8 @@
 				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 @@
 					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 @@
 			}
 			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 d7352c6..1430946 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -623,6 +623,7 @@
 	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 @@
 		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 @@
 				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 @@
 			 * 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 @@
 					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 53a9e61..120acb2 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -714,7 +714,8 @@
 				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 @@
 					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 @@
 			}
 			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 01328b4..eed604e 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -577,7 +577,8 @@
 				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 @@
 				 */
 				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 97e0d39..e81d7de 100644
--- a/skeletons/xer_decoder.c
+++ b/skeletons/xer_decoder.c
@@ -137,12 +137,13 @@
 					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 @@
 			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 1c26ef7..c3df005 100644
--- a/skeletons/xer_decoder.h
+++ b/skeletons/xer_decoder.h
@@ -70,11 +70,14 @@
  * 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 <tag> */
-	XCT_CLOSING,	/* This is the closing </tag> */
-	XCT_BOTH,	/* This is the opening and closing tag <tag/> */
+	XCT_BROKEN	= 0,	/* The tag is broken */
+	XCT_OPENING	= 1,	/* This is the <opening> tag */
+	XCT_CLOSING	= 2,	/* This is the </closing> tag */
+	XCT_BOTH	= 3,	/* This is the <modified/> tag */
+	XCT__UNK__MASK	= 4,	/* Mask of everything unexpected */
+	XCT_UNKNOWN_OP	= 5,	/* Unexpected <opening> tag */
+	XCT_UNKNOWN_CL	= 6,	/* Unexpected </closing> tag */
+	XCT_UNKNOWN_BO	= 7,	/* Unexpected <modified/> tag */
   } xer_check_tag_e;
 xer_check_tag_e xer_check_tag(const void *buf_ptr, int size,
 		const char *need_tag);