All of lore.kernel.org
 help / color / mirror / Atom feed
* precision formatting in grub_printf
@ 2008-08-17 17:58 Deepak Vankadaru
  2008-08-17 21:14 ` Robert Millan
  2008-08-18  5:22 ` Deepak Vankadaru
  0 siblings, 2 replies; 10+ messages in thread
From: Deepak Vankadaru @ 2008-08-17 17:58 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 5990 bytes --]

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 #2: Type: text/html, Size: 13873 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2009-03-24 20:39 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-17 17:58 precision formatting in grub_printf Deepak Vankadaru
2008-08-17 21:14 ` Robert Millan
2008-08-18  5:22 ` Deepak Vankadaru
2008-08-22 12:26   ` Deepak Vankadaru
2009-03-12  8:49     ` Deepak Vankadaru
2009-03-13 19:20       ` Robert Millan
2009-03-16 18:38         ` Deepak Vankadaru
2009-03-18 10:09           ` Robert Millan
2009-03-18 10:49             ` Christian Franke
2009-03-24 20:39           ` Christian Franke

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.