*** doc/scan.n.orig Tue Dec  5 14:36:52 2000
--- doc/scan.n Tue Dec  5 14:36:06 2000
***************
*** 82,91 ****
--- 82,102 ----
  \fBo\fR
  The input field must be an octal integer. It is read in and the 
  value is stored in the variable as a decimal string.
+ .VS 8.4
+ If the
+ value exceeds MAX_INT (017777777777 on platforms using 32-bit
+ integers), it will be truncated to a signed integer.  Hence,
+ 037777777777 will appear as -1 on a 32-bit machine.
+ .VE 8.4
  .TP 10
  \fBx\fR
  The input field must be a hexadecimal integer. It is read in 
  and the value is stored in the variable as a decimal string.
+ .VS 8.4
+ If the value exceeds MAX_INT (0x7FFFFFFF on platforms
+ using 32-bit integers), it will be truncated to a signed integer.
+ Hence, 0xFFFFFFFF will appear as -1 on a 32-bit machine.
+ .VE 8.4
  .VS 8.1
  .TP 10
  \fBu\fR
*** generic/tclScan.c.orig Tue Dec  5 11:53:48 2000
--- generic/tclScan.c Tue Dec  5 14:19:56 2000
***************
*** 694,705 ****
  	    case 'o':
  		op = 'i';
  		base = 8;
! 		fn = (long (*)())strtol;
  		break;
  	    case 'x':
  		op = 'i';
  		base = 16;
! 		fn = (long (*)())strtol;
  		break;
  	    case 'u':
  		op = 'i';
--- 694,705 ----
  	    case 'o':
  		op = 'i';
  		base = 8;
! 		fn = (long (*)())strtoul;
  		break;
  	    case 'x':
  		op = 'i';
  		base = 16;
! 		fn = (long (*)())strtoul;
  		break;
  	    case 'u':
  		op = 'i';
*** tests/scan.test.orig Tue Dec  5 11:58:36 2000
--- tests/scan.test Wed Dec  6 13:57:20 2000
***************
*** 324,329 ****
--- 324,358 ----
      set result
  } {1 {couldn't set variable "z"couldn't set variable "y"} abc}
  
+ # procedure that returns the range of integers
+ 
+ proc int_range {} {
+     for { set MIN_INT 1 } { $MIN_INT > 0 } {} {
+ 	set MIN_INT [expr { $MIN_INT << 1 }]
+     }
+     set MAX_INT [expr { ~ $MIN_INT }]
+     return [list $MIN_INT $MAX_INT]
+ }
+ 
+ test scan-4.62 {scanning of large and negative octal integers} {
+     foreach { MIN_INT MAX_INT } [int_range] {}
+     set scanstring [format {%o %o %o} -1 $MIN_INT $MAX_INT]
+     list [scan $scanstring {%o %o %o} a b c] \
+ 	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
+ } {3 1 1 1}
+ test scan-4.63 {scanning of large and negative hex integers} {
+     foreach { MIN_INT MAX_INT } [int_range] {}
+     set scanstring [format {%x %x %x} -1 $MIN_INT $MAX_INT]
+     list [scan $scanstring {%x %x %x} a b c] \
+ 	[expr { $a == -1 }] [expr { $b == $MIN_INT }] [expr { $c == $MAX_INT }]
+ } {3 1 1 1}
+ 
+ # clean up from last two tests
+ 
+ catch {
+     rename int_range {}
+ }
+ 
  test scan-5.1 {integer scanning} {
      set a {}; set b {}; set c {}; set d {}
      list [scan "-20 1476 \n33 0" "%d %d %d %d" a b c d] $a $b $c $d
***************
*** 630,646 ****
  # cleanup
  ::tcltest::cleanupTests
  return
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
--- 659,661 ----
