diff -prbBTC 5 coreutils-5.0-old/src/ls.c coreutils-5.0/src/ls.c
*** coreutils-5.0-old/src/ls.c	Wed Mar 19 16:01:51 2003
--- coreutils-5.0/src/ls.c	Tue Dec  2 16:16:03 2003
*************** static int current_time_ns = -1;
*** 359,368 ****
--- 359,369 ----
 	
 	/* The number of digits to use for block sizes.
 	   4, or more if needed for bigger numbers.  */
 	
 	static int block_size_size;
+	static int file_block_size_size;
 	
 	/* Option flags */
 	
 	/* long_format for lots of info, one per line.
 	   one_per_line for just names, one per line.
*************** clear_files (void)
*** 2302,2312 ****
 	      if (files[i].linkname)
 		free (files[i].linkname);
 	    }
 	
 	  files_index = 0;
!	  block_size_size = 4;
 	}
 	
 	/* Add a file to the current table of files.
 	   Verify that the file exists, and print an error message if it does not.
 	   Return the number of blocks that the file occupies.  */
--- 2303,2314 ----
 	      if (files[i].linkname)
 		free (files[i].linkname);
 	    }
 	
 	  files_index = 0;
!	  block_size_size = 0;
!	  file_block_size_size = 8;
 	}
 	
 	/* Add a file to the current table of files.
 	   Verify that the file exists, and print an error message if it does not.
 	   Return the number of blocks that the file occupies.  */
*************** gobble_file (const char *name, enum file
*** 2459,2469 ****
 	      {
 		char buf[LONGEST_HUMAN_READABLE + 1];
 		int len = strlen (human_readable (blocks, buf, human_output_opts,
 						  ST_NBLOCKSIZE, output_block_size));
 		if (block_size_size < len)
!		  block_size_size = len < 7 ? len : 7;
 	      }
 	    }
 	  else
 	    {
 	      files[files_index].filetype = type;
--- 2461,2482 ----
 	      {
 		char buf[LONGEST_HUMAN_READABLE + 1];
 		int len = strlen (human_readable (blocks, buf, human_output_opts,
 						  ST_NBLOCKSIZE, output_block_size));
 		if (block_size_size < len)
!		  block_size_size = len;
!			}
!	
!			{
!				uintmax_t size = files[files_index].stat.st_size +
!					(files[files_index].stat.st_size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
!	
!				char buf[LONGEST_HUMAN_READABLE + 1];
!				int len = strlen (human_readable (size, buf, human_output_opts,
!															 1, file_output_block_size));
!				if (file_block_size_size < len)
!					file_block_size_size = len;
 			}
 	    }
 	  else
 	    {
 	      files[files_index].filetype = type;
*************** print_long_format (const struct fileinfo
*** 2999,3022 ****
 	
 	  if (print_author)
 	    p += format_user (p, f->stat.st_author);
 	
 	  if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
!	    sprintf (p, "%3lu, %3lu ",
!		     (unsigned long) major (f->stat.st_rdev),
!		     (unsigned long) minor (f->stat.st_rdev));
 	  else
 	    {
 	      char hbuf[LONGEST_HUMAN_READABLE + 1];
 	      uintmax_t size = f->stat.st_size;
 	
 	      /* POSIX requires that the size be printed without a sign, even
 		 when negative.  Assume the typical case where negative sizes
 		 are actually positive values that have wrapped around.  */
 	      size += (f->stat.st_size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
 	
!	      sprintf (p, "%8s ",
 		       human_readable (size, hbuf, human_output_opts,
 				       1, file_output_block_size));
 	    }
 	
 	  p += strlen (p);
--- 3012,3034 ----
 	
 	  if (print_author)
 	    p += format_user (p, f->stat.st_author);
 	
 	  if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
!		  sprintf (p, "%*lu, %*lu ", (file_block_size_size - 1) / 2, (unsigned long) major (f->stat.st_rdev),
!					  (file_block_size_size - 2) / 2, (unsigned long) minor (f->stat.st_rdev));
 	  else
 	    {
 	      char hbuf[LONGEST_HUMAN_READABLE + 1];
 	      uintmax_t size = f->stat.st_size;
 	
 	      /* POSIX requires that the size be printed without a sign, even
 		 when negative.  Assume the typical case where negative sizes
 		 are actually positive values that have wrapped around.  */
 	      size += (f->stat.st_size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
 	
!	      sprintf (p, "%*s ", file_block_size_size,
 		       human_readable (size, hbuf, human_output_opts,
 				       1, file_output_block_size));
 	    }
 	
 	  p += strlen (p);
