bc: fixes to bugs found while testing 64-bit build
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
f4f10720fe
commit
0f31a5c79e
@ -2690,12 +2690,11 @@ static void bc_lex_whitespace(BcLex *l)
|
|||||||
static BC_STATUS zbc_lex_number(BcLex *l, char start)
|
static BC_STATUS zbc_lex_number(BcLex *l, char start)
|
||||||
{
|
{
|
||||||
const char *buf = l->buf + l->i;
|
const char *buf = l->buf + l->i;
|
||||||
size_t len, bslashes, i, ccnt;
|
size_t len, i, ccnt;
|
||||||
bool pt;
|
bool pt;
|
||||||
|
|
||||||
pt = (start == '.');
|
pt = (start == '.');
|
||||||
l->t.t = BC_LEX_NUMBER;
|
l->t.t = BC_LEX_NUMBER;
|
||||||
bslashes = 0;
|
|
||||||
ccnt = i = 0;
|
ccnt = i = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char c = buf[i];
|
char c = buf[i];
|
||||||
@ -2703,26 +2702,31 @@ static BC_STATUS zbc_lex_number(BcLex *l, char start)
|
|||||||
break;
|
break;
|
||||||
if (c == '\\' && buf[i + 1] == '\n') {
|
if (c == '\\' && buf[i + 1] == '\n') {
|
||||||
i += 2;
|
i += 2;
|
||||||
bslashes++;
|
//number_of_backslashes++ - see comment below
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!isdigit(c) && (c < 'A' || c > 'F')) {
|
if (!isdigit(c) && (c < 'A' || c > 'F')) {
|
||||||
if (c != '.') break;
|
if (c != '.') break;
|
||||||
// if '.' was already seen, stop on second one:
|
// if '.' was already seen, stop on second one:
|
||||||
if (pt) break;
|
if (pt) break;
|
||||||
pt = 1;
|
pt = true;
|
||||||
}
|
}
|
||||||
// buf[i] is one of "0-9A-F."
|
// buf[i] is one of "0-9A-F."
|
||||||
i++;
|
i++;
|
||||||
if (c != '.')
|
if (c != '.')
|
||||||
ccnt = i;
|
ccnt = i;
|
||||||
}
|
}
|
||||||
//i is buf[i] index of the first not-yet-parsed char
|
//ccnt is the number of chars in the number string, excluding possible
|
||||||
|
//trailing "[\<newline>].[\<newline>]" (with any number of \<NL> repetitions).
|
||||||
|
//i is buf[i] index of the first not-yet-parsed char after that.
|
||||||
l->i += i;
|
l->i += i;
|
||||||
|
|
||||||
//ccnt is the number of chars in the number string, excluding possible
|
// This might overestimate the size, if there are "\<NL>"'s
|
||||||
//trailing "." and possible following trailing "\<newline>"(s).
|
// in the number. Subtracting number_of_backslashes*2 correctly
|
||||||
len = ccnt - bslashes * 2 + 1; // +1 byte for NUL termination
|
// is not that easy: consider that in the case of "NNN.\<NL>"
|
||||||
|
// loop above will count "\<NL>" before it realizes it is not
|
||||||
|
// in fact *inside* the number:
|
||||||
|
len = ccnt + 1; // +1 byte for NUL termination
|
||||||
|
|
||||||
// This check makes sense only if size_t is (much) larger than BC_MAX_NUM.
|
// This check makes sense only if size_t is (much) larger than BC_MAX_NUM.
|
||||||
if (SIZE_MAX > (BC_MAX_NUM | 0xff)) {
|
if (SIZE_MAX > (BC_MAX_NUM | 0xff)) {
|
||||||
@ -2979,6 +2983,7 @@ static BC_STATUS zbc_lex_identifier(BcLex *l)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bc_lex_name(l);
|
bc_lex_name(l);
|
||||||
|
s = BC_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (l->t.v.len > 2) {
|
if (l->t.v.len > 2) {
|
||||||
// Prevent this:
|
// Prevent this:
|
||||||
|
Loading…
Reference in New Issue
Block a user