Index: generic/tclScan.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclScan.c,v
retrieving revision 1.8
diff -b -u -r1.8 tclScan.c
--- generic/tclScan.c	2001/09/20 01:03:08	1.8
+++ generic/tclScan.c	2002/02/07 01:42:14
@@ -855,10 +855,17 @@
 			 * a number.  If we are unsure of the base, it
 			 * indicates that we are in base 8 or base 16 (if it is
 			 * followed by an 'x').
+			 *
+			 * 8.1 - 8.3.4 incorrectly handled 0x... base-16
+			 * cases for %x by not reading the 0x as the
+			 * auto-prelude for base-16. [Bug #495213]
 			 */
 			case '0':
 			    if (base == 0) {
 				base = 8;
+				flags |= SCAN_XOK;
+			    }
+			    if (base == 16) {
 				flags |= SCAN_XOK;
 			    }
 			    if (flags & SCAN_NOZERO) {
Index: tests/scan.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/scan.test,v
retrieving revision 1.11
diff -b -u -r1.11 scan.test
--- tests/scan.test	2000/12/10 03:27:04	1.11
+++ tests/scan.test	2002/02/07 01:42:14
@@ -231,9 +231,20 @@
     list [scan {+1238 -123a 0123} {%x%x%x} x y z] $x $y $z
 } {3 4664 -4666 291}
 test scan-4.40 {Tcl_ScanObjCmd, base-16 integer scanning} {
+    # The behavior changed in 8.4a4/8.3.4cvs (6 Feb) to correctly
+    # return '1' for 0x1 scanned via %x, to comply with 8.0 and C scanf.
+    # Bug #495213
     set x {}
     list [scan {aBcDeF AbCdEf 0x1} {%x%x%x} x y z] $x $y $z
-} {3 11259375 11259375 0}
+} {3 11259375 11259375 1}
+test scan-4.40.1 {Tcl_ScanObjCmd, base-16 integer scanning} {
+    set x {}
+    list [scan {0xF 0x00A0B 0X0XF} {%x %x %x} x y z] $x $y $z
+} {3 15 2571 0}
+test scan-4.40.2 {Tcl_ScanObjCmd, base-16 integer scanning} {
+    catch {unset x}
+    list [scan {xF} {%x} x] [info exists x]
+} {0 0}
 test scan-4.41 {Tcl_ScanObjCmd, base-unknown integer scanning} {
     set x {}
     list [scan {10 010 0x10} {%i%i%i} x y z] $x $y $z
