OBJECT IDENTIFIER and RELATIVE-OID XER decoding
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@537 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c
index 8033d7c..816eb55 100644
--- a/skeletons/tests/check-OIDs.c
+++ b/skeletons/tests/check-OIDs.c
@@ -223,6 +223,50 @@
return 0;
}
+static void check_parse(const char *oid_txt, int retval) {
+ int ret;
+ long l[2];
+ char *p;
+
+ ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, l, 2, &p);
+ printf("[%s] => %d == %d\n", oid_txt, ret, retval);
+ assert(ret == retval);
+ assert(p >= oid_txt);
+}
+
+static void check_xer(int expect_arcs, char *xer) {
+ asn_dec_rval_t rc;
+ RELATIVE_OID_t *st = 0;
+ long arcs[10];
+ int ret;
+ int i;
+
+ printf("[%s] => ", xer); fflush(stdout);
+ rc = asn_DEF_RELATIVE_OID.xer_decoder(0,
+ &asn_DEF_RELATIVE_OID, (void **)&st, "t",
+ xer, strlen(xer));
+ if(expect_arcs == -1) {
+ if(rc.code != RC_OK)
+ return;
+ }
+ assert(rc.code == RC_OK);
+
+ ret = RELATIVE_OID_get_arcs(st, arcs, sizeof(arcs[0]),
+ sizeof(arcs)/sizeof(arcs[0]));
+ assert(ret < 10);
+ if(expect_arcs == -1) {
+ assert(ret == -1);
+ return;
+ }
+ for(i = 0; i < ret; i++) {
+ if(i) printf(".");
+ printf("%ld", arcs[i]);
+ assert(arcs[i] == i + 1);
+ }
+ printf(": %d == %d\n", ret, expect_arcs);
+ assert(ret == expect_arcs);
+}
+
#define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \
buf ## n ## _check, \
sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
@@ -334,6 +378,42 @@
CHECK_REGEN_OID(19);
CHECK_REGEN_OID(20);
+ check_parse("", 0);
+ check_parse(" ", 0);
+ check_parse(" ", 0);
+ check_parse(".", -1);
+ check_parse(" .", -1);
+ check_parse(" 1", 1);
+ check_parse(" 1.2", 2);
+ check_parse(" 1.", -1);
+ check_parse(" 1. ", -1);
+ check_parse("1. ", -1);
+ check_parse("1.2", 2);
+ check_parse("10.30.234.234", 4);
+ check_parse("10.30.234.234 ", 4);
+ check_parse("10.30.234. 234 ", -1);
+ check_parse("10.30.234.234.", -1);
+ check_parse("1.2000000000.3", 3);
+ check_parse("1.2147483647.3", 3);
+ if(sizeof(long) == 4) {
+ check_parse("1.2147483648.3", -1); /* overflow on ILP32 */
+ check_parse("1.3000000000.3", -1);
+ check_parse("1.4000000000.3", -1);
+ check_parse("1.5000000000.3", -1);
+ check_parse("1.6000000000.3", -1);
+ check_parse("1.9000000000.3", -1);
+ } else {
+ check_parse("1.2147483648.3", 3);
+ }
+ check_parse("1.900a0000000.3", -1);
+ check_parse("1.900a.3", -1);
+
+ check_xer(0, "<t></t>");
+ check_xer(2, "<t>1.2</t>");
+ check_xer(3, "<t>1.2.3</t>");
+ check_xer(3, "<t> 1.2.3 </t>");
+ check_xer(-1, "<t>1.2.3 1</t>");
+
for(i = 0; i < 100000; i++) {
int bufA_check[3] = { 2, i, rand() };
int bufB_check[2] = { rand(), i * 121 };