diff options
author | Lev Walkin <vlm@lionet.info> | 2012-09-03 00:48:45 -0700 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2012-09-03 00:48:52 -0700 |
commit | f59271171fa344a8619aac80db64ae90ed0b2ac0 (patch) | |
tree | 3c273474964a162e7ba263ca4574dc307f429821 | |
parent | e09f9f1b4b5023b8d3e80e6c5d564cf73c82d6d2 (diff) |
remove volatile qualifier from OID code
-rw-r--r-- | skeletons/OBJECT_IDENTIFIER.c | 88 | ||||
-rw-r--r-- | skeletons/tests/check-OIDs.c | 22 |
2 files changed, 76 insertions, 34 deletions
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c index ed083f8a..c1f58843 100644 --- a/skeletons/OBJECT_IDENTIFIER.c +++ b/skeletons/OBJECT_IDENTIFIER.c @@ -3,6 +3,7 @@ * Redistribution and modifications are permitted subject to BSD license. */ #include <asn_internal.h> +#include <INTEGER.h> #include <OBJECT_IDENTIFIER.h> #include <OCTET_STRING.h> #include <limits.h> /* for CHAR_BIT */ @@ -649,12 +650,13 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, long *arcs, unsigned int arcs_slots, const char **opt_oid_text_end) { unsigned int arcs_count = 0; const char *oid_end; - long value = 0; + const char *value_start; enum { - ST_SKIPSPACE, + ST_LEADSPACE, + ST_TAILSPACE, ST_WAITDIGITS, /* Next character is expected to be a digit */ - ST_DIGITS - } state = ST_SKIPSPACE; + ST_DIGITS /* INVARIANT: value_start != 0 in this state */ + } state = ST_LEADSPACE; if(!oid_text || oid_txt_length < -1 || (arcs_slots && !arcs)) { if(opt_oid_text_end) *opt_oid_text_end = oid_text; @@ -665,42 +667,70 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, if(oid_txt_length == -1) oid_txt_length = strlen(oid_text); +#define _OID_CAPTURE_ARC(value_start, oid_text) do { \ + long value; \ + switch(asn_strtol(value_start, oid_text, &value)) { \ + case ASN_STRTOL_OK: \ + if(arcs_count < arcs_slots) \ + arcs[arcs_count] = value; \ + arcs_count++; \ + break; \ + case ASN_STRTOL_ERROR_RANGE: \ + if(opt_oid_text_end) \ + *opt_oid_text_end = oid_text; \ + errno = ERANGE; \ + return -1; \ + case ASN_STRTOL_ERROR_INVAL: \ + if(opt_oid_text_end) \ + *opt_oid_text_end = oid_text; \ + errno = EINVAL; \ + return -1; \ + } \ + } while(0) + for(oid_end = oid_text + oid_txt_length; oid_text<oid_end; oid_text++) { switch(*oid_text) { case 0x09: case 0x0a: case 0x0d: case 0x20: /* whitespace */ - if(state == ST_SKIPSPACE) { + switch(state) { + case ST_LEADSPACE: + case ST_TAILSPACE: continue; - } else { - break; /* Finish */ + case ST_DIGITS: + _OID_CAPTURE_ARC(value_start, oid_text); + state = ST_TAILSPACE; + continue; + case ST_WAITDIGITS: + break; } case 0x2e: /* '.' */ - if(state != ST_DIGITS - || (oid_text + 1) == oid_end) { + switch(state) { + case ST_LEADSPACE: + case ST_WAITDIGITS: + break; + case ST_TAILSPACE: state = ST_WAITDIGITS; break; + case ST_DIGITS: + _OID_CAPTURE_ARC(value_start, oid_text); + state = ST_WAITDIGITS; + continue; } - if(arcs_count < arcs_slots) - arcs[arcs_count] = value; - arcs_count++; - state = ST_WAITDIGITS; - continue; + break; case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: - if(state != ST_DIGITS) { + switch(state) { + case ST_TAILSPACE: + state = ST_WAITDIGITS; + break; + case ST_LEADSPACE: + case ST_WAITDIGITS: state = ST_DIGITS; - value = 0; - } - if(1) { - long volatile new_value = value * 10; - /* GCC 4.x is being too smart without volatile */ - if(new_value / 10 != value - || (value = new_value + (*oid_text - 0x30)) < 0) { - /* Overflow */ - state = ST_WAITDIGITS; - break; - } + value_start = oid_text; + continue; + case ST_DIGITS: continue; } + break; default: /* Unexpected symbols */ state = ST_WAITDIGITS; @@ -714,14 +744,14 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length, /* Finalize last arc */ switch(state) { + case ST_LEADSPACE: case ST_WAITDIGITS: errno = EINVAL; return -1; case ST_DIGITS: - if(arcs_count < arcs_slots) - arcs[arcs_count] = value; - arcs_count++; + _OID_CAPTURE_ARC(value_start, oid_text); /* Fall through */ + case ST_TAILSPACE: default: return arcs_count; } diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c index 0805baac..ce62bdae 100644 --- a/skeletons/tests/check-OIDs.c +++ b/skeletons/tests/check-OIDs.c @@ -249,8 +249,10 @@ static void check_xer(int expect_arcs, char *xer) { &asn_DEF_RELATIVE_OID, (void **)stp, "t", xer, strlen(xer)); if(expect_arcs == -1) { - if(rc.code != RC_OK) + if(rc.code != RC_OK) { + printf("-1\n"); return; + } } assert(rc.code == RC_OK); @@ -381,17 +383,27 @@ main() { 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); check_parse(".", -1); check_parse(" .", -1); + check_parse(".1", -1); + check_parse("1.", -1); + check_parse("1. ", -1); + check_parse(".1. ", -1); + check_parse(" .1. ", -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("1.2 ", 2); + check_parse("1.2 ", 2); + check_parse(" 1.2 ", 2); + check_parse("1. 2", -1); + check_parse("1 .2", -1); check_parse("10.30.234.234", 4); check_parse("10.30.234.234 ", 4); check_parse("10.30.234. 234 ", -1); @@ -414,7 +426,7 @@ main() { check_parse("1.900a0000000.3", -1); check_parse("1.900a.3", -1); - check_xer(0, "<t></t>"); + check_xer(-1, "<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>"); |