Merge [2063] and [2064] from trunk.
svn path=/branches/yasm-0.7.x/; revision=2065
diff --git a/libyasm/bitvect.c b/libyasm/bitvect.c
index 49f19b2..57ad613 100644
--- a/libyasm/bitvect.c
+++ b/libyasm/bitvect.c
@@ -1511,7 +1511,9 @@
digit = (int) *(--string); length--;
/* separate because toupper() is likely a macro! */
digit = toupper(digit);
- if ((ok = (isxdigit(digit) != 0)))
+ if (digit == '_')
+ count -= 4;
+ else if ((ok = (isxdigit(digit) != 0)))
{
if (digit >= (int) 'A') digit -= (int) 'A' - 10;
else digit -= (int) '0';
@@ -1548,7 +1550,9 @@
for ( count = count_fill; (ok and (length > 0) and (count < BITS)); count += 3 )
{
digit = (int) *(--string); length--;
- if ((ok = (isdigit(digit) && digit != '8' && digit != '9')) != 0)
+ if (digit == '_')
+ count -= 3;
+ else if ((ok = (isdigit(digit) && digit != '8' && digit != '9')) != 0)
{
digit -= (int) '0';
value |= (((N_word) digit) << count);
@@ -1628,6 +1632,9 @@
case (int) '1':
value |= BITMASKTAB[count];
break;
+ case (int) '_':
+ count--;
+ break;
default:
ok = FALSE;
break;
diff --git a/libyasm/value.c b/libyasm/value.c
index a34be63..180bf6a 100644
--- a/libyasm/value.c
+++ b/libyasm/value.c
@@ -276,8 +276,8 @@
&& sect2 == yasm_bc_get_section(expr_precbc)))) {
for (j=0; j<e->numterms; j++) {
if (e->terms[j].type == YASM_EXPR_SYM
- && yasm_symrec_get_label(e->terms[j].data.sym,
- &precbc2)
+ && !yasm_symrec_get_equ(e->terms[j].data.sym)
+ && !yasm_symrec_is_special(e->terms[j].data.sym)
&& (used & (1<<j)) == 0) {
/* Mark as used */
used |= 1<<j;
diff --git a/modules/parsers/nasm/nasm-token.re b/modules/parsers/nasm/nasm-token.re
index a106945..931dbdc 100644
--- a/modules/parsers/nasm/nasm-token.re
+++ b/modules/parsers/nasm/nasm-token.re
@@ -63,9 +63,9 @@
any = [\001-\377];
digit = [0-9];
iletter = [a-zA-Z];
- bindigit = [01];
- octdigit = [0-7];
- hexdigit = [0-9a-fA-F];
+ bindigit = [01_];
+ octdigit = [0-7_];
+ hexdigit = [0-9a-fA-F_];
ws = [ \t\r];
quot = ["'];
*/
@@ -151,14 +151,14 @@
}
/* 10010011b - binary number */
- bindigit+ 'b' {
+ [01] bindigit* 'b' {
s->tok[TOKLEN-1] = '\0'; /* strip off 'b' */
lvalp->intn = yasm_intnum_create_bin(TOK);
RETURN(INTNUM);
}
/* 777q or 777o - octal number */
- octdigit+ [qQoO] {
+ [0-7] octdigit* [qQoO] {
s->tok[TOKLEN-1] = '\0'; /* strip off 'q' or 'o' */
lvalp->intn = yasm_intnum_create_oct(TOK);
RETURN(INTNUM);
@@ -541,14 +541,14 @@
}
/* 10010011b - binary number */
- bindigit+ 'b' {
+ [01] bindigit* 'b' {
s->tok[TOKLEN-1] = '\0'; /* strip off 'b' */
lvalp->intn = yasm_intnum_create_bin(TOK);
RETURN(INTNUM);
}
/* 777q or 777o - octal number */
- octdigit+ [qQoO] {
+ [0-7] octdigit* [qQoO] {
s->tok[TOKLEN-1] = '\0'; /* strip off 'q' or 'o' */
lvalp->intn = yasm_intnum_create_oct(TOK);
RETURN(INTNUM);
@@ -562,10 +562,10 @@
}
/* $0AA and 0xAA forms of hexidecimal number */
- (("$" digit) | "0x") hexdigit+ {
+ (("$" digit) | '0x') hexdigit+ {
savech = s->tok[TOKLEN];
s->tok[TOKLEN] = '\0';
- if (s->tok[1] == 'x')
+ if (s->tok[1] == 'x' || s->tok[1] == 'X')
/* skip 0 and x */
lvalp->intn = yasm_intnum_create_hex(TOK+2);
else
diff --git a/modules/parsers/nasm/tests/Makefile.inc b/modules/parsers/nasm/tests/Makefile.inc
index c9115e9..f4589c3 100644
--- a/modules/parsers/nasm/tests/Makefile.inc
+++ b/modules/parsers/nasm/tests/Makefile.inc
@@ -38,6 +38,8 @@
EXTRA_DIST += modules/parsers/nasm/tests/struczero.hex
EXTRA_DIST += modules/parsers/nasm/tests/syntax-err.asm
EXTRA_DIST += modules/parsers/nasm/tests/syntax-err.errwarn
+EXTRA_DIST += modules/parsers/nasm/tests/uscore.asm
+EXTRA_DIST += modules/parsers/nasm/tests/uscore.hex
EXTRA_DIST += modules/parsers/nasm/tests/worphan/Makefile.inc
diff --git a/modules/parsers/nasm/tests/uscore.asm b/modules/parsers/nasm/tests/uscore.asm
new file mode 100644
index 0000000..0630597
--- /dev/null
+++ b/modules/parsers/nasm/tests/uscore.asm
@@ -0,0 +1,10 @@
+dq 0000_1111_2222_3333h
+dq 0000111122223333h
+dd 0x01_23_45_67
+dd 0x01234567
+dw 1_2_3_4q
+dw 1234q
+db 00_11_00_11b
+db 00110011b
+_0:
+dw _0
diff --git a/modules/parsers/nasm/tests/uscore.hex b/modules/parsers/nasm/tests/uscore.hex
new file mode 100644
index 0000000..4793d1d
--- /dev/null
+++ b/modules/parsers/nasm/tests/uscore.hex
@@ -0,0 +1,32 @@
+33
+33
+22
+22
+11
+11
+00
+00
+33
+33
+22
+22
+11
+11
+00
+00
+67
+45
+23
+01
+67
+45
+23
+01
+9c
+02
+9c
+02
+33
+33
+1e
+00