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