aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-02-18 14:23:48 +0000
committerLev Walkin <vlm@lionet.info>2005-02-18 14:23:48 +0000
commit904e65b826a28168fc09454f1c4dba3d935471fc (patch)
tree20e1f8d8a9d58831e2b6e3032ea1c7d18df0ae5b
parent239143eec0b39a49f923eba2f26c78fb0645d467 (diff)
more distinction
-rw-r--r--skeletons/constr_CHOICE.c17
-rw-r--r--skeletons/constr_SEQUENCE.c30
-rw-r--r--skeletons/constr_SET.c17
-rw-r--r--skeletons/constr_SET_OF.c5
-rw-r--r--skeletons/xer_decoder.c7
-rw-r--r--skeletons/xer_decoder.h13
6 files changed, 64 insertions, 25 deletions
diff --git a/skeletons/constr_CHOICE.c b/skeletons/constr_CHOICE.c
index 77991452..b1360653 100644
--- a/skeletons/constr_CHOICE.c
+++ b/skeletons/constr_CHOICE.c
@@ -673,7 +673,8 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
}
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 d7352c65..14309462 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -623,6 +623,7 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
* 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 @@ SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 53a9e611..120acb21 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -714,7 +714,8 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SET_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
}
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 01328b4f..eed604ed 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -577,7 +577,8 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
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 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
*/
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 97e0d394..e81d7de2 100644
--- a/skeletons/xer_decoder.c
+++ b/skeletons/xer_decoder.c
@@ -137,12 +137,13 @@ xer_check_tag(const void *buf_ptr, int size, const char *need_tag) {
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 @@ xer_decode_general(asn_codec_ctx_t *opt_codec_ctx,
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 1c26ef79..c3df005d 100644
--- a/skeletons/xer_decoder.h
+++ b/skeletons/xer_decoder.h
@@ -70,11 +70,14 @@ ssize_t xer_next_token(int *stateContext, void *buffer, size_t size,
* 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);