--- /home/deepakv/orig/grub2-1.96+20080724/kern/misc.c	2008-06-16 06:12:48.000000000 +0530
+++ kern/misc.c	2008-08-18 04:46:36.000000000 +0530
@@ -565,6 +565,8 @@
       *p++ = (d > 9) ? d + 'a' - 10 : d + '0';
     }
   while (n /= base);
+  if ( p == str)
+    *p++ = '0';
   *p = 0;
 
   grub_reverse (str);
@@ -680,6 +682,12 @@
 	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;
@@ -696,7 +704,8 @@
 	  char tmp[32];
 	  char *p;
 	  unsigned int format1 = 0;
-	  unsigned int format2 = 3;
+	  unsigned int format2 = 1;
+	  grub_bool_t format2_default = TRUE;
 	  char zerofill = ' ';
 	  int rightfill = 0;
 	  int n;
@@ -714,14 +723,15 @@
 	  while (*p && grub_isdigit (*p))
 	    p++;
 
-	  if (p > fmt)
+	  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';
-	      format1 = grub_strtoul (s, 0, 10);
+	      if (p - fmt)
+	        format1 = grub_strtoul (s, 0, 10);
 	      fmt = p;
 	      if (*p && *p == '.')
 		{
@@ -737,6 +747,9 @@
 		      format2 = grub_strtoul (fstr, 0, 10);
 		      fmt = p;
 		    }
+		  else
+		    format2 = 0;
+		  format2_default = FALSE;
 		}
 	    }
 
@@ -777,11 +790,17 @@
 		    n = va_arg (args, int);
 		  grub_itoa (tmp, c, n);
 		}
-	      if (! rightfill && grub_strlen (tmp) < format1)
-		write_fill (zerofill, format1 - grub_strlen (tmp));
+	      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 && grub_strlen (tmp) < format1)
-		write_fill (zerofill, format1 - grub_strlen (tmp));
+	      if (rightfill && format2 < format1)
+		write_fill (zerofill, format1 - format2);
 	      break;
 	      
 	    case 'c':
@@ -843,13 +862,34 @@
 	      p = va_arg (args, char *);
 	      if (p)
 		{
-		  if (!rightfill && grub_strlen (p) < format1)
-		    write_fill (zerofill, format1 - grub_strlen (p));
+		  if ( format2_default )
+		    {
+		      if (!rightfill && grub_strlen (p) < format1)
+		        write_fill (' ', format1 - grub_strlen (p));
 		  
-		  write_str (p);
+		      write_str (p);
 		  
-		  if (rightfill && grub_strlen (p) < format1)
-		    write_fill (zerofill, format1 - grub_strlen (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)");
