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;
> }
>
misc.c.diff
Description: Binary data
_______________________________________________ Grub-devel mailing list [email protected] http://lists.gnu.org/mailman/listinfo/grub-devel
