fix parsing for OID and RELATIVE-OID
diff --git a/asn1c/tests/data-70/data-70-55.in b/asn1c/tests/data-70/data-70-55.in
new file mode 100644
index 0000000..7be4ca5
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-55.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112</roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-56.in b/asn1c/tests/data-70/data-70-56.in
new file mode 100644
index 0000000..7a7ba07
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-56.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid> 123.456.789.101112 </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-57-D.in b/asn1c/tests/data-70/data-70-57-D.in
new file mode 100644
index 0000000..74da9b9
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-57-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid> <!--/--> 123.456.789.101112</roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-58-D.in b/asn1c/tests/data-70/data-70-58-D.in
new file mode 100644
index 0000000..252345d
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-58-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112<!--/--></roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-59-D.in b/asn1c/tests/data-70/data-70-59-D.in
new file mode 100644
index 0000000..2d989d2
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-59-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112<!--/--> </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-60-D.in b/asn1c/tests/data-70/data-70-60-D.in
new file mode 100644
index 0000000..11be5d7
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-60-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112 <!--/--></roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-61-D.in b/asn1c/tests/data-70/data-70-61-D.in
new file mode 100644
index 0000000..5c47c9f
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-61-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112 <!--/--> </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-62-D.in b/asn1c/tests/data-70/data-70-62-D.in
new file mode 100644
index 0000000..cb790d2
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-62-D.in
@@ -0,0 +1,9 @@
+<PDU>
+	<set>
+		<roid>
+			<!-- This is a special comment -->
+			123.456.789.101112
+			<!-- This is a special comment too -->
+		</roid>
+	</set>
+</PDU>
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index c1f5884..2939f25 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -282,15 +282,13 @@
 	arcs_count = OBJECT_IDENTIFIER_parse_arcs(
 		(const char *)chunk_buf, chunk_size, arcs,
 			sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr);
-	if(arcs_count <= 0) {
+	if(arcs_count < 0) {
 		/* Expecting more than zero arcs */
 		return XPBD_BROKEN_ENCODING;
+	} else if(arcs_count == 0) {
+		return XPBD_NOT_BODY_IGNORE;
 	}
-	if(endptr < chunk_end) {
-		/* We have a tail of unrecognized data. Check its safety. */
-		if(!xer_is_whitespace(endptr, chunk_end - endptr))
-			return XPBD_BROKEN_ENCODING;
-	}
+	assert(endptr == chunk_end);
 
 	if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
 		arcs = (long *)MALLOC(arcs_count * sizeof(long));
@@ -745,16 +743,19 @@
 	/* Finalize last arc */
 	switch(state) {
 	case ST_LEADSPACE:
-	case ST_WAITDIGITS:
-		errno = EINVAL;
-		return -1;
+		return 0; /* No OID found in input data */
 	case ST_DIGITS:
 		_OID_CAPTURE_ARC(value_start, oid_text);
-		/* Fall through */
+		return arcs_count;
+	case ST_WAITDIGITS:
+		errno = EINVAL;	/* Broken OID */
+		return -1;
 	case ST_TAILSPACE:
-	default:
 		return arcs_count;
 	}
+
+	errno = EINVAL;	/* Broken OID */
+	return -1;
 }
 
 
diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c
index 983fc09..4275c0a 100644
--- a/skeletons/RELATIVE-OID.c
+++ b/skeletons/RELATIVE-OID.c
@@ -106,14 +106,12 @@
 		(const char *)chunk_buf, chunk_size,
 		arcs, sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr);
 	if(arcs_count < 0) {
-		/* Expecting at least zero arcs */
+		/* Expecting at least one arc arcs */
 		return XPBD_BROKEN_ENCODING;
+	} else if(arcs_count == 0) {
+		return XPBD_NOT_BODY_IGNORE;
 	}
-	if(endptr < chunk_end) {
-		/* We have a tail of unrecognized data. Check its safety. */
-		if(!xer_is_whitespace(endptr, chunk_end - endptr))
-			return XPBD_BROKEN_ENCODING;
-	}
+	assert(endptr == chunk_end);
 
 	if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
 		arcs = (long *)MALLOC(arcs_count * sizeof(long));