From: Robert Millan <rmh@aybabtu.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: gettext: print_timeout
Date: Thu, 24 Dec 2009 22:23:36 +0100 [thread overview]
Message-ID: <20091224212335.GK12122@thorin> (raw)
In-Reply-To: <20091213013155.GA13074@pina.cat>
On Sun, Dec 13, 2009 at 01:31:55AM +0000, Carles Pina i Estany wrote:
>
> If ok I would commit.
Was this checked in? ISTR having OKed it on IRC, but I don't see it
in ChangeLog.
> === modified file 'ChangeLog'
> --- ChangeLog 2009-12-12 00:43:32 +0000
> +++ ChangeLog 2009-12-13 00:44:09 +0000
> @@ -1,3 +1,10 @@
> +2009-12-13 Carles Pina i Estany <carles@pina.cat>
> +
> + * normal/menu_text.c (utf8_to_ucs4): New definition.
> + (print_message_indented): Use `utf8_to_ucs'.
> + (print_timeout): Prints the whole string so avoid problems with
> + multi-byte and multi-width characters.
> +
> 2009-12-12 Robert Millan <rmh@aybabtu.com>
>
> * gendistlist.sh (EXTRA_DISTFILES): Add `genvideolist.sh'.
>
> === modified file 'normal/menu_text.c'
> --- normal/menu_text.c 2009-12-08 00:08:52 +0000
> +++ normal/menu_text.c 2009-12-13 01:26:09 +0000
> @@ -77,35 +77,50 @@ getstringwidth (grub_uint32_t * str, con
> return width;
> }
>
> +static int
> +utf8_to_ucs4 (const char *msg, grub_uint32_t **unicode_msg,
> + grub_uint32_t **last_position)
> +{
> + grub_ssize_t msg_len = grub_strlen (msg);
> +
> + *unicode_msg = grub_malloc (grub_strlen (msg) * sizeof (grub_uint32_t));
> +
> + if (!*unicode_msg)
> + {
> + grub_printf ("utf8_to_ucs4 ERROR1: %s", msg);
> + return -1;
> + }
> +
> + msg_len = grub_utf8_to_ucs4 (*unicode_msg, msg_len,
> + (grub_uint8_t *) msg, -1, 0);
> +
> + *last_position = *unicode_msg + msg_len;
> +
> + if (msg_len < 0)
> + {
> + grub_printf ("utf8_to_ucs4 ERROR2: %s", msg);
> + grub_free (*unicode_msg);
> + }
> + return msg_len;
> +}
> +
> static void
> print_message_indented (const char *msg)
> {
> const int line_len = GRUB_TERM_WIDTH - grub_getcharwidth ('m') * 15;
>
> grub_uint32_t *unicode_msg;
> + grub_uint32_t *last_position;
>
> - grub_ssize_t msg_len = grub_strlen (msg);
> -
> - unicode_msg = grub_malloc (msg_len * sizeof (*unicode_msg));
> + int msg_len;
>
> - msg_len = grub_utf8_to_ucs4 (unicode_msg, msg_len,
> - (grub_uint8_t *) msg, -1, 0);
> -
> - if (!unicode_msg)
> - {
> - grub_printf ("print_message_indented ERROR1: %s", msg);
> - return;
> - }
> + msg_len = utf8_to_ucs4 (msg, &unicode_msg, &last_position);
>
> if (msg_len < 0)
> {
> - grub_printf ("print_message_indented ERROR2: %s", msg);
> - grub_free (unicode_msg);
> return;
> }
>
> - const grub_uint32_t *last_position = unicode_msg + msg_len;
> -
> grub_uint32_t *current_position = unicode_msg;
>
> grub_uint32_t *next_new_line = unicode_msg;
> @@ -368,22 +383,39 @@ get_entry_number (const char *name)
> }
>
> static void
> -print_timeout (int timeout, int offset, int second_stage)
> +print_timeout (int timeout, int offset,
> + int second_stage __attribute__ ((unused)))
> {
> const char *msg =
> _("The highlighted entry will be booted automatically in %ds.");
> - const int msg_localized_len = grub_strlen (msg);
> - const int number_spaces = GRUB_TERM_WIDTH - msg_localized_len - 3;
>
> - char *msg_end = grub_strchr (msg, '%');
> + char *msg_formatted = grub_malloc (sizeof (char) *
> + (grub_strlen (msg) + 1 + 6));
> + /* 5: max string length that `timeout' can have. */
> +
> + grub_sprintf (msg_formatted, msg, timeout);
> +
> + grub_uint32_t *unicode_msg;
> + grub_uint32_t *last_position;
> +
> + int msg_len = utf8_to_ucs4 (msg_formatted, &unicode_msg, &last_position);
> + if (msg_len < 0)
> + {
> + return;
> + }
>
> - grub_gotoxy (second_stage ? (msg_end - msg + 3) : 3, GRUB_TERM_HEIGHT - 3);
> - grub_printf (second_stage ? msg_end : msg, timeout);
> - print_spaces (second_stage ? number_spaces : 0);
> + grub_gotoxy (3, GRUB_TERM_HEIGHT - 3);
> + grub_print_ucs4 (unicode_msg, last_position);
> +
> + int strwidth = getstringwidth (unicode_msg, last_position);
> +
> + print_spaces (GRUB_TERM_WIDTH - strwidth - 3);
> +
> + grub_free(unicode_msg);
>
> grub_gotoxy (GRUB_TERM_CURSOR_X, GRUB_TERM_FIRST_ENTRY_Y + offset);
> grub_refresh ();
> -};
> +}
>
> /* Show the menu and handle menu entry selection. Returns the menu entry
> index that should be executed or -1 if no entry should be executed (e.g.,
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
--
Robert Millan
"Be the change you want to see in the world" -- Gandhi
next prev parent reply other threads:[~2009-12-24 21:23 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-13 1:31 gettext: print_timeout Carles Pina i Estany
2009-12-24 21:23 ` Robert Millan [this message]
2009-12-24 22:38 ` Carles Pina i Estany
-- strict thread matches above, loose matches on Subject: below --
2009-12-11 23:53 Carles Pina i Estany
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091224212335.GK12122@thorin \
--to=rmh@aybabtu.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.