X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse_num.c;h=f6eeb8b44866364e6abc21560e880c6c9ace5829;hb=ebb34ff512a9ab83c22fad013196d8c1667afd4d;hp=90c9402422cdcc117ee379ca6d1f2634c2216f9d;hpb=e963f1233ab27f2568fa34714b834deb836f724a;p=libcmdline.git diff --git a/src/lib/cmdline_parse_num.c b/src/lib/cmdline_parse_num.c index 90c9402..f6eeb8b 100644 --- a/src/lib/cmdline_parse_num.c +++ b/src/lib/cmdline_parse_num.c @@ -1,3 +1,37 @@ +/*- + * Copyright (c) <2010>, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * - Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + /* * Copyright (c) 2009, Olivier MATZ * All rights reserved. @@ -26,6 +60,7 @@ */ #include +#include #include #include #include @@ -36,21 +71,6 @@ //#define debug_printf(args...) printf(args) #define debug_printf(args...) do {} while(0) -/* XXX to remove ? there should be something better */ -#define U08_MIN 0x00 -#define U08_MAX 0xFF -#define U16_MIN 0x0000 -#define U16_MAX 0xFFFF -#define U32_MIN 0x00000000 -#define U32_MAX 0xFFFFFFFF -#define S08_MIN 0x80 -#define S08_MAX 0x7F -#define S16_MIN 0x8000 -#define S16_MAX 0x7FFF -#define S32_MIN 0x80000000 -#define S32_MAX 0x7FFFFFFF - - struct cmdline_token_ops cmdline_token_num_ops = { .parse = cmdline_parse_num, .complete_get_nb = NULL, @@ -77,27 +97,27 @@ enum num_parse_state_t { DEC_NEG_OK, DEC_POS_OK, FLOAT_POS_OK, - FLOAT_NEG_OK, + FLOAT_NEG_OK }; /* 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, unsigned int *res, unsigned int base) +add_to_res(unsigned int c, uint64_t *res, unsigned int base) { /* overflow */ - if ( (U32_MAX - c) / base < *res ) { + if ( (UINT64_MAX - c) / base < *res ) { return -1; } - *res = *res * base + c ; + *res = (uint64_t) (*res * base + c); return 0; } @@ -110,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)); @@ -127,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; @@ -151,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; @@ -175,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; @@ -191,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; } @@ -206,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; } @@ -261,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) @@ -318,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 ++; @@ -339,27 +359,27 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) case HEX_OK: case OCTAL_OK: case BIN_OK: - if ( nd.type == INT8 && res1 <= S08_MAX ) { + if ( nd.type == INT8 && res1 <= INT8_MAX ) { if (res) *(int8_t *)res = (int8_t) res1; return (buf-srcbuf); } - else if ( nd.type == INT16 && res1 <= S16_MAX ) { + else if ( nd.type == INT16 && res1 <= INT16_MAX ) { if (res) *(int16_t *)res = (int16_t) res1; return (buf-srcbuf); } - else if ( nd.type == INT32 && res1 <= S32_MAX ) { + else if ( nd.type == INT32 && res1 <= INT32_MAX ) { if (res) *(int32_t *)res = (int32_t) res1; return (buf-srcbuf); } - else if ( nd.type == UINT8 && res1 <= U08_MAX ) { + else if ( nd.type == UINT8 && res1 <= UINT8_MAX ) { if (res) *(uint8_t *)res = (uint8_t) res1; return (buf-srcbuf); } - else if (nd.type == UINT16 && res1 <= U16_MAX ) { + else if (nd.type == UINT16 && res1 <= UINT16_MAX ) { if (res) *(uint16_t *)res = (uint16_t) res1; return (buf-srcbuf); @@ -369,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; @@ -382,22 +407,22 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) break; case DEC_NEG_OK: - if ( nd.type == INT8 && res1 <= S08_MAX + 1 ) { + if ( nd.type == INT8 && res1 <= INT8_MAX + 1 ) { if (res) - *(int8_t *)res = - (int8_t) res1; + *(int8_t *)res = (int8_t) (-res1); return (buf-srcbuf); } - else if ( nd.type == INT16 && res1 <= (uint16_t)S16_MAX + 1 ) { + else if ( nd.type == INT16 && res1 <= (uint16_t)INT16_MAX + 1 ) { if (res) - *(int16_t *)res = - (int16_t) res1; + *(int16_t *)res = (int16_t) (-res1); return (buf-srcbuf); } - else if ( nd.type == INT32 && res1 <= (uint32_t)S32_MAX + 1 ) { + else if ( nd.type == INT32 && res1 <= (uint32_t)INT32_MAX + 1 ) { if (res) - *(int32_t *)res = - (int32_t) res1; + *(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; @@ -409,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 ) { @@ -440,7 +465,6 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) debug_printf("error\n"); return -1; } - return -1; }