mirror of https://github.com/arendst/Tasmota.git
Berry int() now accepts hex strings
This commit is contained in:
parent
6ab509576a
commit
7232f5865d
|
@ -168,21 +168,9 @@ static int check_next(blexer *lexer, int c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int char2hex(int c)
|
|
||||||
{
|
|
||||||
if (c >= '0' && c <= '9') {
|
|
||||||
return c - '0';
|
|
||||||
} else if (c >= 'a' && c <= 'f') {
|
|
||||||
return c - 'a' + 0x0A;
|
|
||||||
} else if (c >= 'A' && c <= 'F') {
|
|
||||||
return c - 'A' + 0x0A;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int check2hex(blexer *lexer, int c)
|
static int check2hex(blexer *lexer, int c)
|
||||||
{
|
{
|
||||||
c = char2hex(c);
|
c = be_char2hex(c);
|
||||||
if (c < 0) {
|
if (c < 0) {
|
||||||
be_lexerror(lexer, "invalid hexadecimal number");
|
be_lexerror(lexer, "invalid hexadecimal number");
|
||||||
}
|
}
|
||||||
|
@ -333,7 +321,7 @@ static bint scan_hexadecimal(blexer *lexer)
|
||||||
{
|
{
|
||||||
bint res = 0;
|
bint res = 0;
|
||||||
int dig, num = 0;
|
int dig, num = 0;
|
||||||
while ((dig = char2hex(lgetc(lexer))) >= 0) {
|
while ((dig = be_char2hex(lgetc(lexer))) >= 0) {
|
||||||
res = ((bint)res << 4) + dig;
|
res = ((bint)res << 4) + dig;
|
||||||
next(lexer);
|
next(lexer);
|
||||||
++num;
|
++num;
|
||||||
|
|
|
@ -231,29 +231,54 @@ const char* be_pushvfstr(bvm *vm, const char *format, va_list arg)
|
||||||
return concat2(vm);
|
return concat2(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int be_char2hex(int c)
|
||||||
|
{
|
||||||
|
if (c >= '0' && c <= '9') {
|
||||||
|
return c - '0';
|
||||||
|
} else if (c >= 'a' && c <= 'f') {
|
||||||
|
return c - 'a' + 0x0A;
|
||||||
|
} else if (c >= 'A' && c <= 'F') {
|
||||||
|
return c - 'A' + 0x0A;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* the function be_str2int():
|
* the function be_str2int():
|
||||||
* >>-+------------+--+-----+----digits----><
|
* >>-+------------+--+--+-----+----digits-------+----------------><
|
||||||
* '-whitespace-' +- + -+
|
* '-whitespace-' | +- + -+ |
|
||||||
* '- - -'
|
* | '- - -' |
|
||||||
|
* | |
|
||||||
|
* +- 0x or 0X ---hex_digits--+
|
||||||
|
*
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
BERRY_API bint be_str2int(const char *str, const char **endstr)
|
BERRY_API bint be_str2int(const char *str, const char **endstr)
|
||||||
{
|
{
|
||||||
int c, sign;
|
int c, sign;
|
||||||
bint sum = 0;
|
bint sum = 0;
|
||||||
skip_space(str);
|
skip_space(str);
|
||||||
sign = c = *str++;
|
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
|
||||||
if (c == '+' || c == '-') {
|
/* hex literal */
|
||||||
c = *str++;
|
str += 2; /* skip 0x or 0X */
|
||||||
|
while ((c = be_char2hex(*str++)) >= 0) {
|
||||||
|
sum = sum * 16 + c;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
} else {
|
||||||
|
/* decimal literal */
|
||||||
|
sign = c = *str++;
|
||||||
|
if (c == '+' || c == '-') {
|
||||||
|
c = *str++;
|
||||||
|
}
|
||||||
|
while (is_digit(c)) {
|
||||||
|
sum = sum * 10 + c - '0';
|
||||||
|
c = *str++;
|
||||||
|
}
|
||||||
|
if (endstr) {
|
||||||
|
*endstr = str - 1;
|
||||||
|
}
|
||||||
|
return sign == '-' ? -sum : sum;
|
||||||
}
|
}
|
||||||
while (is_digit(c)) {
|
|
||||||
sum = sum * 10 + c - '0';
|
|
||||||
c = *str++;
|
|
||||||
}
|
|
||||||
if (endstr) {
|
|
||||||
*endstr = str - 1;
|
|
||||||
}
|
|
||||||
return sign == '-' ? -sum : sum;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
|
|
|
@ -19,6 +19,7 @@ bstring* be_strcat(bvm *vm, bstring *s1, bstring *s2);
|
||||||
int be_strcmp(bstring *s1, bstring *s2);
|
int be_strcmp(bstring *s1, bstring *s2);
|
||||||
bstring* be_num2str(bvm *vm, bvalue *v);
|
bstring* be_num2str(bvm *vm, bvalue *v);
|
||||||
void be_val2str(bvm *vm, int index);
|
void be_val2str(bvm *vm, int index);
|
||||||
|
int be_char2hex(int c);
|
||||||
size_t be_strlcpy(char *dst, const char *src, size_t size);
|
size_t be_strlcpy(char *dst, const char *src, size_t size);
|
||||||
const char* be_splitpath(const char *path);
|
const char* be_splitpath(const char *path);
|
||||||
const char* be_splitname(const char *path);
|
const char* be_splitname(const char *path);
|
||||||
|
|
|
@ -6,3 +6,9 @@ class Test_int
|
||||||
end
|
end
|
||||||
t=Test_int()
|
t=Test_int()
|
||||||
assert(int(t) == 42)
|
assert(int(t) == 42)
|
||||||
|
|
||||||
|
#- int can parse hex strings -#
|
||||||
|
assert(int("0x00") == 0)
|
||||||
|
assert(int("0X1") == 1)
|
||||||
|
assert(int("0x000000F") == 15)
|
||||||
|
assert(int("0x1000") == 0x1000)
|
||||||
|
|
Loading…
Reference in New Issue