Dedup remapping code
This commit is contained in:
parent
3830c087bb
commit
7a476ba0a3
1 changed files with 66 additions and 62 deletions
122
normal/charset.c
122
normal/charset.c
|
@ -1067,11 +1067,10 @@ map_code (grub_uint32_t in, struct grub_term_output *term)
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put a Unicode character. */
|
static void
|
||||||
void
|
putglyph (const struct grub_unicode_glyph *c, struct grub_term_output *term)
|
||||||
grub_putcode (grub_uint32_t code, struct grub_term_output *term)
|
|
||||||
{
|
{
|
||||||
struct grub_unicode_glyph c =
|
struct grub_unicode_glyph c2 =
|
||||||
{
|
{
|
||||||
.variant = 0,
|
.variant = 0,
|
||||||
.attributes = 0,
|
.attributes = 0,
|
||||||
|
@ -1079,20 +1078,14 @@ grub_putcode (grub_uint32_t code, struct grub_term_output *term)
|
||||||
.combining = 0
|
.combining = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
if (grub_unicode_get_comb_type (code) != GRUB_UNICODE_COMB_NONE
|
if (c->base == '\t' && term->getxy)
|
||||||
&& ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
|
||||||
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
|
|
||||||
&& (term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
|
||||||
!= GRUB_TERM_CODE_TYPE_UTF8_VISUAL))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (code == '\t' && term->getxy)
|
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
n = 8 - ((term->getxy () >> 8) & 7);
|
n = 8 - ((term->getxy () >> 8) & 7);
|
||||||
|
c2.base = ' ';
|
||||||
while (n--)
|
while (n--)
|
||||||
grub_putcode (' ', term);
|
(term->putchar) (&c2);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1102,24 +1095,60 @@ grub_putcode (grub_uint32_t code, struct grub_term_output *term)
|
||||||
|| (term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
|| (term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
||||||
== GRUB_TERM_CODE_TYPE_UTF8_VISUAL)
|
== GRUB_TERM_CODE_TYPE_UTF8_VISUAL)
|
||||||
{
|
{
|
||||||
grub_uint8_t str[20], *ptr;
|
int i;
|
||||||
|
for (i = -1; i < (int) c->ncomb; i++)
|
||||||
grub_ucs4_to_utf8 (&code, 1, str, sizeof (str));
|
|
||||||
|
|
||||||
for (ptr = str; *ptr; ptr++)
|
|
||||||
{
|
{
|
||||||
c.base = *ptr;
|
grub_uint8_t u8[20], *ptr;
|
||||||
(term->putchar) (&c);
|
grub_uint32_t code;
|
||||||
|
|
||||||
|
if (i == -1)
|
||||||
|
code = c->base;
|
||||||
|
else
|
||||||
|
code = c->combining[i].code;
|
||||||
|
|
||||||
|
grub_ucs4_to_utf8 (&code, 1, u8, sizeof (u8));
|
||||||
|
|
||||||
|
for (ptr = u8; *ptr; ptr++)
|
||||||
|
{
|
||||||
|
c2.base = *ptr;
|
||||||
|
(term->putchar) (&c2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
(term->putchar) (c);
|
||||||
|
|
||||||
|
if (c->base == '\n')
|
||||||
{
|
{
|
||||||
c.base = map_code (code, term);
|
c2.base = '\r';
|
||||||
(term->putchar) (&c);
|
(term->putchar) (&c2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code == '\n')
|
static void
|
||||||
grub_putcode ('\r', term);
|
putcode_real (grub_uint32_t code, struct grub_term_output *term)
|
||||||
|
{
|
||||||
|
struct grub_unicode_glyph c =
|
||||||
|
{
|
||||||
|
.variant = 0,
|
||||||
|
.attributes = 0,
|
||||||
|
.ncomb = 0,
|
||||||
|
.combining = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
c.base = map_code (code, term);
|
||||||
|
putglyph (&c, term);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put a Unicode character. */
|
||||||
|
void
|
||||||
|
grub_putcode (grub_uint32_t code, struct grub_term_output *term)
|
||||||
|
{
|
||||||
|
/* Combining character by itself? */
|
||||||
|
if (grub_unicode_get_comb_type (code) != GRUB_UNICODE_COMB_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
putcode_real (code, term);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1167,43 +1196,11 @@ grub_print_ucs4 (const grub_uint32_t * str,
|
||||||
}
|
}
|
||||||
for (visual_ptr = visual; visual_ptr < visual + visual_len; visual_ptr++)
|
for (visual_ptr = visual; visual_ptr < visual + visual_len; visual_ptr++)
|
||||||
{
|
{
|
||||||
struct grub_unicode_glyph c = {
|
|
||||||
.variant = 0,
|
|
||||||
.attributes = 0,
|
|
||||||
.ncomb = 0,
|
|
||||||
.combining = 0
|
|
||||||
};
|
|
||||||
if (visual_ptr->base == '\n')
|
if (visual_ptr->base == '\n')
|
||||||
grub_print_spaces (term, margin_right);
|
grub_print_spaces (term, margin_right);
|
||||||
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
putglyph (visual_ptr, term);
|
||||||
== GRUB_TERM_CODE_TYPE_UTF8_VISUAL)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = -1; i < (int) visual_ptr->ncomb; i++)
|
|
||||||
{
|
|
||||||
grub_uint8_t u8[20], *ptr;
|
|
||||||
|
|
||||||
if (i == -1)
|
|
||||||
grub_ucs4_to_utf8 (&visual_ptr->base, 1, u8, sizeof (u8));
|
|
||||||
else
|
|
||||||
grub_ucs4_to_utf8 (&visual_ptr->combining[i].code,
|
|
||||||
1, u8, sizeof (u8));
|
|
||||||
|
|
||||||
for (ptr = u8; *ptr; ptr++)
|
|
||||||
{
|
|
||||||
c.base = *ptr;
|
|
||||||
(term->putchar) (&c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
term->putchar (visual_ptr);
|
|
||||||
if (visual_ptr->base == '\n')
|
if (visual_ptr->base == '\n')
|
||||||
{
|
|
||||||
c.base = '\r';
|
|
||||||
term->putchar (&c);
|
|
||||||
grub_print_spaces (term, margin_left);
|
grub_print_spaces (term, margin_left);
|
||||||
}
|
|
||||||
grub_free (visual_ptr->combining);
|
grub_free (visual_ptr->combining);
|
||||||
}
|
}
|
||||||
grub_free (visual);
|
grub_free (visual);
|
||||||
|
@ -1253,11 +1250,18 @@ grub_print_ucs4 (const grub_uint32_t * str,
|
||||||
lastspacewidth = line_width - last_width;
|
lastspacewidth = line_width - last_width;
|
||||||
|
|
||||||
for (ptr2 = line_start; ptr2 < ptr; ptr2++)
|
for (ptr2 = line_start; ptr2 < ptr; ptr2++)
|
||||||
grub_putcode (*ptr2, term);
|
{
|
||||||
|
/* Skip combining characters on non-UTF8 terminals. */
|
||||||
|
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
|
||||||
|
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
|
||||||
|
&& grub_unicode_get_comb_type (*ptr2)
|
||||||
|
!= GRUB_UNICODE_COMB_NONE)
|
||||||
|
continue;
|
||||||
|
putcode_real (*ptr2, term);
|
||||||
|
}
|
||||||
|
|
||||||
grub_print_spaces (term, margin_right);
|
grub_print_spaces (term, margin_right);
|
||||||
grub_putcode ('\n', term);
|
grub_putcode ('\n', term);
|
||||||
grub_putcode ('\r', term);
|
|
||||||
line_width -= lastspacewidth;
|
line_width -= lastspacewidth;
|
||||||
grub_print_spaces (term, margin_left);
|
grub_print_spaces (term, margin_left);
|
||||||
if (ptr == last_space || *ptr == '\n')
|
if (ptr == last_space || *ptr == '\n')
|
||||||
|
|
Loading…
Reference in a new issue