X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse_num.c;h=f6eeb8b44866364e6abc21560e880c6c9ace5829;hb=e5ca055e8b19eaa2335d554357f04e4a6fddb38a;hp=6c1ec7295ef6a2b8dd80af36ccb779ac2af7260f;hpb=36dfbc791ada2e788180a474299d25641f56903f;p=libcmdline.git diff --git a/src/lib/cmdline_parse_num.c b/src/lib/cmdline_parse_num.c index 6c1ec72..f6eeb8b 100644 --- a/src/lib/cmdline_parse_num.c +++ b/src/lib/cmdline_parse_num.c @@ -102,22 +102,22 @@ enum num_parse_state_t { /* Keep it sync with enum in .h */ static const char * num_help[] = { - "UINT8", "UINT16", "UINT32", - "INT8", "INT16", "INT32", -#ifndef CMDLINE_NO_FLOAT + "UINT8", "UINT16", "UINT32", "UINT64", + "INT8", "INT16", "INT32", "INT64", +#ifdef CMDLINE_HAVE_FLOAT "FLOAT", #endif }; static inline int -add_to_res(unsigned int c, uint32_t *res, unsigned int base) +add_to_res(unsigned int c, uint64_t *res, unsigned int base) { /* overflow */ - if ( (UINT32_MAX - c) / base < *res ) { + if ( (UINT64_MAX - c) / base < *res ) { return -1; } - *res = *res * base + c ; + *res = (uint64_t) (*res * base + c); return 0; } @@ -130,9 +130,9 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) enum num_parse_state_t st = START; const char * buf = srcbuf; char c = *buf; - uint32_t res1 = 0; -#ifndef CMDLINE_NO_FLOAT - uint32_t res2 = 0, res3 = 1; + uint64_t res1 = 0; +#ifdef CMDLINE_HAVE_FLOAT + uint64_t res2 = 0, res3 = 1; #endif memcpy(&nd, &((struct cmdline_token_num *)tk)->num_data, sizeof(nd)); @@ -147,7 +147,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) else if (c == '0') { st = ZERO_OK; } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if (c == '.') { st = FLOAT_POS; res1 = 0; @@ -171,7 +171,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) else if (c == 'b') { st = BIN; } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if (c == '.') { st = FLOAT_POS; res1 = 0; @@ -195,7 +195,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) else st = DEC_NEG_OK; } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if (c == '.') { res1 = 0; st = FLOAT_NEG; @@ -211,7 +211,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) if (add_to_res(c - '0', &res1, 10) < 0) st = ERROR; } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if (c == '.') { st = FLOAT_NEG; } @@ -226,7 +226,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) if (add_to_res(c - '0', &res1, 10) < 0) st = ERROR; } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if (c == '.') { st = FLOAT_POS; } @@ -281,7 +281,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) } break; -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT case FLOAT_POS: if (c >= '0' && c <= '9') { if (add_to_res(c - '0', &res2, 10) < 0) @@ -338,11 +338,11 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) } -#ifdef CMDLINE_NO_FLOAT - debug_printf("(%"PRIu32")\n", res1); -#else +#ifdef CMDLINE_HAVE_FLOAT debug_printf("(%"PRIu32") (%"PRIu32") (%"PRIu32")\n", res1, res2, res3); +#else + debug_printf("(%"PRIu32")\n", res1); #endif buf ++; @@ -389,7 +389,12 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) *(uint32_t *)res = (uint32_t) res1; return (buf-srcbuf); } -#ifndef CMDLINE_NO_FLOAT + else if ( nd.type == UINT64 ) { + if (res) + *(uint64_t *)res = res1; + return (buf-srcbuf); + } +#ifdef CMDLINE_HAVE_FLOAT else if ( nd.type == FLOAT ) { if (res) *(float *)res = (float)res1; @@ -417,7 +422,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) *(int32_t *)res = (int32_t) (-res1); return (buf-srcbuf); } -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT else if ( nd.type == FLOAT ) { if (res) *(float *)res = - (float)res1; @@ -429,7 +434,7 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) } break; -#ifndef CMDLINE_NO_FLOAT +#ifdef CMDLINE_HAVE_FLOAT case FLOAT_POS: case FLOAT_POS_OK: if ( nd.type == FLOAT ) {