Attached the same in unified diff format.

This is listed in known bugs (http://grub.enbug.org/KnownBugs)

On Sun, Aug 17, 2008 at 11:28 PM, Deepak Vankadaru <
[EMAIL PROTECTED]> wrote:

> Hi
>
> I have implemented precision formatting support in grub_printf. Following
> is the diff (of kern/misc.c)
>
> Thanks
> Deepak
>
> ###############start of diff
> *** kern/misc.c    2008-08-18 04:46:36.000000000 +0530
> --- /home/deepakv/orig/grub2-1.96+20080724/kern/misc.c    2008-06-16
> 06:12:48.000000000 +0530
> ***************
> *** 565,572 ****
>         *p++ = (d > 9) ? d + 'a' - 10 : d + '0';
>       }
>     while (n /= base);
> -   if ( p == str)
> -     *p++ = '0';
>     *p = 0;
>
>     grub_reverse (str);
> --- 565,570 ----
> ***************
> *** 682,693 ****
>       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;
> --- 680,685 ----
> ***************
> *** 704,711 ****
>         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;
> --- 696,702 ----
>         char tmp[32];
>         char *p;
>         unsigned int format1 = 0;
> !       unsigned int format2 = 3;
>         char zerofill = ' ';
>         int rightfill = 0;
>         int n;
> ***************
> *** 723,737 ****
>         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 == '.')
>           {
> --- 714,727 ----
>         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 == '.')
>           {
> ***************
> *** 747,755 ****
>                 format2 = grub_strtoul (fstr, 0, 10);
>                 fmt = p;
>               }
> -           else
> -             format2 = 0;
> -           format2_default = FALSE;
>           }
>           }
>
> --- 737,742 ----
> ***************
> *** 790,806 ****
>               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':
> --- 777,787 ----
>               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':
> ***************
> *** 862,895 ****
>             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)");
> --- 843,855 ----
>             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)");
>
> ###############end of diff
>
> ######start of test case
> int main()
> {
>     typedef int (*printf_ptr)(char const *str, ...);
>     printf_ptr p;
>     if(getenv("GRUB_PRINTF"))
>     {
>         printf("using grub_printf\n");
>         p = grub_printf;
>     }
>     else
>     {
>         printf("using printf\n");
>         p = printf;
>     }
>     p("##%4.2d##\n",1);
>     p("##%4.2d##\n",12);
>     p("##%4.2d##\n",123);
>     p("##%4.2d##\n",1234);
>     p("##%4.2d##\n",12345);
>     p("##%3.3d##\n",12);
>     p("##%3.3d##\n",123);
>     p("##%3.3d##\n",1234);
>     p("##%2.4d##\n",12345);
>     p("##%2.4d##\n",1234);
>     p("##%2.4d##\n",123);
>     p("##%2.4d##\n",12);
>     p("##%2.4d##\n",1);
>     p("##%.0d##\n",0);
>     p("##%.0d##\n",1);
>     p("##%4.2s##\n","1");
>     p("##%4.2s##\n","12");
>     p("##%4.2s##\n","123");
>     p("##%4.2s##\n","1234");
>     p("##%4.2s##\n","12345");
>     p("##%3.3s##\n","12");
>     p("##%3.3s##\n","123");
>     p("##%3.3s##\n","1234");
>     p("##%2.4s##\n","12345");
>     p("##%2.4s##\n","1234");
>     p("##%2.4s##\n","123");
>     p("##%2.4s##\n","12");
>     p("##%2.4s##\n","1");
>     return 0;
> }
>

Attachment: misc.c.diff
Description: Binary data

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to