*** kern/misc.c.org	2009-03-16 04:14:32.466999000 -0700
--- kern/misc.c	2009-03-16 04:36:57.679110000 -0700
***************
*** 691,696 ****
--- 691,702 ----
  	write_char (*s++);
      }
  
+   void write_str_limit (const char *s, int count)
+     {
+       while (*s && count--)
+ 	write_char (*s++);
+     }
+ 
    void write_fill (const char ch, int n)
      {
        int i;
***************
*** 707,713 ****
  	  char tmp[32];
  	  char *p;
  	  unsigned int format1 = 0;
! 	  unsigned int format2 = 3;
  	  char zerofill = ' ';
  	  int rightfill = 0;
  	  int n;
--- 713,720 ----
  	  char tmp[32];
  	  char *p;
  	  unsigned int format1 = 0;
! 	  unsigned int format2 = 1;
! 	  grub_bool_t format2_default = TRUE;
  	  char zerofill = ' ';
  	  int rightfill = 0;
  	  int n;
***************
*** 725,738 ****
  	  while (*p && grub_isdigit (*p))
  	    p++;
  
! 	  if (p > fmt)
  	    {
  	      char s[p - fmt + 1];
  	      grub_strncpy (s, fmt, p - fmt);
  	      s[p - fmt] = 0;
  	      if (s[0] == '0')
  		zerofill = '0';
! 	      format1 = grub_strtoul (s, 0, 10);
  	      fmt = p;
  	      if (*p && *p == '.')
  		{
--- 732,746 ----
  	  while (*p && grub_isdigit (*p))
  	    p++;
  
! 	  if (p > fmt || *p == '.')
  	    {
  	      char s[p - fmt + 1];
  	      grub_strncpy (s, fmt, p - fmt);
  	      s[p - fmt] = 0;
  	      if (s[0] == '0')
  		zerofill = '0';
! 	      if (p - fmt)
! 	        format1 = grub_strtoul (s, 0, 10);
  	      fmt = p;
  	      if (*p && *p == '.')
  		{
***************
*** 748,753 ****
--- 756,764 ----
  		      format2 = grub_strtoul (fstr, 0, 10);
  		      fmt = p;
  		    }
+ 		  else
+ 		    format2 = 0;
+ 		  format2_default = FALSE;
  		}
  	    }
  
***************
*** 788,798 ****
  		    n = va_arg (args, int);
  		  grub_itoa (tmp, c, n);
  		}
! 	      if (! rightfill && grub_strlen (tmp) < format1)
! 		write_fill (zerofill, format1 - grub_strlen (tmp));
  	      write_str (tmp);
! 	      if (rightfill && grub_strlen (tmp) < format1)
! 		write_fill (zerofill, format1 - grub_strlen (tmp));
  	      break;
  	      
  	    case 'c':
--- 799,815 ----
  		    n = va_arg (args, int);
  		  grub_itoa (tmp, c, n);
  		}
! 	      if ( format2 == 0 && grub_strcmp (tmp, "0") == 0)
! 		break;
! 	      if ( grub_strlen (tmp) > format2)
! 	        format2 = grub_strlen (tmp);
! 	      if (! rightfill && format2 < format1)
! 		write_fill (zerofill, format1 - format2);
! 	      if ( grub_strlen (tmp) < format2)
! 		write_fill ('0', format2 - grub_strlen (tmp));
  	      write_str (tmp);
! 	      if (rightfill && format2 < format1)
! 		write_fill (zerofill, format1 - format2);
  	      break;
  	      
  	    case 'c':
***************
*** 867,879 ****
  	      p = va_arg (args, char *);
  	      if (p)
  		{
! 		  if (!rightfill && grub_strlen (p) < format1)
! 		    write_fill (zerofill, format1 - grub_strlen (p));
  		  
! 		  write_str (p);
  		  
! 		  if (rightfill && grub_strlen (p) < format1)
! 		    write_fill (zerofill, format1 - grub_strlen (p));
  		}
  	      else
  		write_str ("(null)");
--- 884,917 ----
  	      p = va_arg (args, char *);
  	      if (p)
  		{
! 		  if ( format2_default )
! 		    {
! 		      if (!rightfill && grub_strlen (p) < format1)
! 		        write_fill (' ', format1 - grub_strlen (p));
  		  
! 		      write_str (p);
  		  
! 		      if (rightfill && grub_strlen (p) < format1)
! 		        write_fill (' ', format1 - grub_strlen (p));
! 		    }
! 		    else
! 		    {
! 		      if (!rightfill && format2 < format1)
! 		        write_fill (' ', format1 - format2);
! 		  
! 		      if ( grub_strlen (p) < format2)
! 		        {
! 		          if ( format2 <= format1)
! 		            write_fill (' ', format2 - grub_strlen (p));
! 		          else
! 		            write_fill (' ', format1 - grub_strlen (p));
! 		        }
! 
! 		      write_str_limit (p, format2);
! 		  
! 		      if (rightfill && format2 < format1)
! 		        write_fill (' ', format1 - format2);
! 		    }
  		}
  	      else
  		write_str ("(null)");
