git.droids-corp.org
/
libcmdline.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cmdline: support parsing of 64-bit values
[libcmdline.git]
/
src
/
lib
/
cmdline_parse_num.c
diff --git
a/src/lib/cmdline_parse_num.c
b/src/lib/cmdline_parse_num.c
index
6c1ec72
..
f6eeb8b
100644
(file)
--- 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[] = {
/* Keep it sync with enum in .h */
static const char * num_help[] = {
- "UINT8", "UINT16", "UINT32",
- "INT8", "INT16", "INT32",
-#if
ndef CMDLINE_NO
_FLOAT
+ "UINT8", "UINT16", "UINT32",
"UINT64",
+ "INT8", "INT16", "INT32",
"INT64",
+#if
def CMDLINE_HAVE
_FLOAT
"FLOAT",
#endif
};
static inline int
"FLOAT",
#endif
};
static inline int
-add_to_res(unsigned int c, uint
32
_t *res, unsigned int base)
+add_to_res(unsigned int c, uint
64
_t *res, unsigned int base)
{
/* overflow */
{
/* overflow */
- if ( (UINT
32
_MAX - c) / base < *res ) {
+ if ( (UINT
64
_MAX - c) / base < *res ) {
return -1;
}
return -1;
}
- *res =
*res * base + c
;
+ *res =
(uint64_t) (*res * base + c)
;
return 0;
}
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;
enum num_parse_state_t st = START;
const char * buf = srcbuf;
char c = *buf;
- uint
32
_t res1 = 0;
-#if
ndef CMDLINE_NO
_FLOAT
- uint
32
_t res2 = 0, res3 = 1;
+ uint
64
_t res1 = 0;
+#if
def CMDLINE_HAVE
_FLOAT
+ uint
64
_t res2 = 0, res3 = 1;
#endif
memcpy(&nd, &((struct cmdline_token_num *)tk)->num_data, sizeof(nd));
#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;
}
else if (c == '0') {
st = ZERO_OK;
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if (c == '.') {
st = FLOAT_POS;
res1 = 0;
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;
}
else if (c == 'b') {
st = BIN;
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if (c == '.') {
st = FLOAT_POS;
res1 = 0;
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;
}
else
st = DEC_NEG_OK;
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if (c == '.') {
res1 = 0;
st = FLOAT_NEG;
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;
}
if (add_to_res(c - '0', &res1, 10) < 0)
st = ERROR;
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if (c == '.') {
st = FLOAT_NEG;
}
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;
}
if (add_to_res(c - '0', &res1, 10) < 0)
st = ERROR;
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if (c == '.') {
st = FLOAT_POS;
}
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;
}
break;
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
case FLOAT_POS:
if (c >= '0' && c <= '9') {
if (add_to_res(c - '0', &res2, 10) < 0)
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);
debug_printf("(%"PRIu32") (%"PRIu32") (%"PRIu32")\n",
res1, res2, res3);
+#else
+ debug_printf("(%"PRIu32")\n", res1);
#endif
buf ++;
#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);
}
*(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;
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);
}
*(int32_t *)res = (int32_t) (-res1);
return (buf-srcbuf);
}
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
else if ( nd.type == FLOAT ) {
if (res)
*(float *)res = - (float)res1;
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;
}
break;
-#if
ndef CMDLINE_NO
_FLOAT
+#if
def CMDLINE_HAVE
_FLOAT
case FLOAT_POS:
case FLOAT_POS_OK:
if ( nd.type == FLOAT ) {
case FLOAT_POS:
case FLOAT_POS_OK:
if ( nd.type == FLOAT ) {