refactoring

diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c
index b7bc83b..db27a49 100644
--- a/skeletons/xer_decoder.c
+++ b/skeletons/xer_decoder.c
@@ -189,7 +189,6 @@
 
 	asn_dec_rval_t rval;
 	ssize_t consumed_myself = 0;
-	pxer_chunk_type_e ch_type;	/* XER chunk type */
 	int xer_state;			/* XER low level parsing context */
 
 	(void)opt_codec_ctx;
@@ -201,8 +200,9 @@
 	 */
 	if(ctx->phase > 1) RETURN(RC_FAIL);
 	for(xer_state = ctx->step;;) {
-		ssize_t ch_size;	/* Chunk size */
-		xer_check_tag_e tcv;	/* Tag check value */
+		pxer_chunk_type_e ch_type;	/* XER chunk type */
+		ssize_t ch_size;		/* Chunk size */
+		xer_check_tag_e tcv;		/* Tag check value */
 
 		/*
 		 * Get the next part of the XML stream.
@@ -239,51 +239,49 @@
 		assert(ch_type == PXER_TAG && size);
 
 		tcv = xer_check_tag(buf_ptr, ch_size, xml_tag);
-		if(ctx->phase == 0) {
+		/*
+		 * Phase 0:
+		 * 	Expecting the opening tag
+		 * 	for the type being processed.
+		 * Phase 1:
+		 * 	Waiting for the closing XML tag.
+		 */
+		switch(tcv) {
+		case XCT_BOTH:
+			if(ctx->phase) break;
+			/* Finished decoding of an empty element */
+			XER_GOT_EMPTY();
+			ADVANCE(ch_size);
+			ctx->phase = 2;	/* Phase out */
+			RETURN(RC_OK);
+		case XCT_OPENING:
+			if(ctx->phase) break;
+			ADVANCE(ch_size);
+			ctx->phase = 1;	/* Processing body phase */
+			continue;
+		case XCT_CLOSING:
+			if(!ctx->phase) break;
+			ADVANCE(ch_size);
+			ctx->phase = 2;	/* Phase out */
+			RETURN(RC_OK);
+		case XCT_UNEXPECTED:
+			if(!ctx->phase) break;
 			/*
-			 * Expecting the opening tag
-			 * for the type being processed.
+			 * Certain tags in the body may be expected.
 			 */
-			switch(tcv) {
-			case XCT_BOTH:
-				/* Finished decoding of an empty element */
-				XER_GOT_EMPTY();
+			if(opt_unexpected_tag_decoder
+			&& opt_unexpected_tag_decoder(struct_key,
+					buf_ptr, ch_size) == 0) {
+				/* Tag's processed fine */
 				ADVANCE(ch_size);
-				ctx->phase = 2;	/* Phase out */
-				RETURN(RC_OK);
-			case XCT_OPENING:
-				ADVANCE(ch_size);
-				ctx->phase = 1;	/* Processing body phase */
 				continue;
-			default:
-				break;		/* Unexpected tag */
 			}
-		} else {
-			/*
-			 * Waiting for the closing XML tag.
-			 */
-			switch(tcv) {
-			case XCT_CLOSING:
-				ADVANCE(ch_size);
-				ctx->phase = 2;	/* Phase out */
-				RETURN(RC_OK);
-			case XCT_UNEXPECTED:
-				/*
-				 * Certain tags in the body may be expected.
-				 */
-				if(opt_unexpected_tag_decoder
-				&& opt_unexpected_tag_decoder(struct_key,
-						buf_ptr, ch_size) == 0) {
-					/* Tag's processed fine */
-					ADVANCE(ch_size);
-					continue;
-				}
-				/* Fall through */
-			default:
-				break;
-			}
-			ASN_DEBUG("Unexpected XML tag");
+			/* Fall through */
+		default:
+			break;		/* Unexpected tag */
 		}
+
+		ASN_DEBUG("Unexpected XML tag");
 		break;	/* Dark and mysterious things have just happened */
 	}