515
515
const grub_uint32_t * last_position,
516
516
int margin_left, int margin_right,
517
517
struct grub_term_output *term,
518
struct term_state *state)
518
struct term_state *state,
520
521
const grub_uint32_t *ptr;
521
grub_ssize_t startwidth = get_startwidth (term, margin_left);
522
grub_ssize_t startwidth = dry_run ? 0 : get_startwidth (term, margin_left);
522
523
grub_ssize_t line_width = startwidth;
523
524
grub_ssize_t lastspacewidth = 0;
524
525
grub_ssize_t max_width = get_maxwidth (term, margin_left, margin_right);
525
526
const grub_uint32_t *line_start = str, *last_space = str - 1;
527
529
for (ptr = str; ptr < last_position; ptr++)
561
563
lastspacewidth = line_width - last_width;
563
for (ptr2 = line_start; ptr2 < ptr; ptr2++)
565
/* Skip combining characters on non-UTF8 terminals. */
566
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
567
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
568
&& grub_unicode_get_comb_type (*ptr2)
569
!= GRUB_UNICODE_COMB_NONE)
571
putcode_real (*ptr2, term);
574
grub_print_spaces (term, margin_right);
575
grub_putcode ('\n', term);
576
if (state && ++state->num_lines
577
>= (grub_ssize_t) grub_term_height (term) - 2)
579
state->backlog_ucs4 = (ptr == last_space || *ptr == '\n')
581
state->backlog_len = last_position - state->backlog_ucs4;
569
for (ptr2 = line_start; ptr2 < ptr; ptr2++)
571
/* Skip combining characters on non-UTF8 terminals. */
572
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
573
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
574
&& grub_unicode_get_comb_type (*ptr2)
575
!= GRUB_UNICODE_COMB_NONE)
577
putcode_real (*ptr2, term);
580
grub_print_spaces (term, margin_right);
581
grub_putcode ('\n', term);
582
if (state && ++state->num_lines
583
>= (grub_ssize_t) grub_term_height (term) - 2)
585
state->backlog_ucs4 = (ptr == last_space || *ptr == '\n')
587
state->backlog_len = last_position - state->backlog_ucs4;
585
592
line_width -= lastspacewidth;
586
grub_print_spaces (term, margin_left);
594
grub_print_spaces (term, margin_left);
587
595
if (ptr == last_space || *ptr == '\n')
589
597
line_start = ptr;
594
const grub_uint32_t *ptr2;
595
for (ptr2 = line_start; ptr2 < last_position; ptr2++)
597
/* Skip combining characters on non-UTF8 terminals. */
598
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
599
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
600
&& grub_unicode_get_comb_type (*ptr2)
601
!= GRUB_UNICODE_COMB_NONE)
603
putcode_real (*ptr2, term);
601
if (line_start < last_position)
605
const grub_uint32_t *ptr2;
606
for (ptr2 = line_start; ptr2 < last_position; ptr2++)
608
/* Skip combining characters on non-UTF8 terminals. */
609
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
610
!= GRUB_TERM_CODE_TYPE_UTF8_LOGICAL
611
&& grub_unicode_get_comb_type (*ptr2)
612
!= GRUB_UNICODE_COMB_NONE)
614
putcode_real (*ptr2, term);
617
return dry_run ? lines : 0;
609
620
static struct term_state *
673
684
ret = print_ucs4_terminal (state->backlog_ucs4,
674
685
state->backlog_ucs4 + state->backlog_len,
675
margin_left, margin_right, term, state);
686
margin_left, margin_right, term, state, 0);
678
689
grub_free (state->free);
706
717
print_ucs4_real (const grub_uint32_t * str,
707
718
const grub_uint32_t * last_position,
708
719
int margin_left, int margin_right,
709
struct grub_term_output *term, int backlog)
720
struct grub_term_output *term, int backlog,
711
723
struct term_state *state = NULL;
714
state = find_term_state (term);
728
state = find_term_state (term);
716
if (((term->getxy (term) >> 8) & 0xff) < margin_left)
717
grub_print_spaces (term, margin_left - ((term->getxy (term) >> 8) & 0xff));
730
if (((term->getxy (term) >> 8) & 0xff) < margin_left)
731
grub_print_spaces (term, margin_left - ((term->getxy (term) >> 8) & 0xff));
719
734
if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
720
735
== GRUB_TERM_CODE_TYPE_VISUAL_GLYPHS
743
758
grub_print_error ();
746
ret = put_glyphs_terminal (visual, visual_len, margin_left, margin_right,
763
struct grub_unicode_glyph *vptr;
765
for (vptr = visual; vptr < visual + visual_len; vptr++)
766
if (vptr->base == '\n')
768
if (visual_len && visual[visual_len - 1].base != '\n')
751
state->free = visual;
774
ret = put_glyphs_terminal (visual, visual_len, margin_left,
775
margin_right, term, state);
779
state->free = visual;
754
783
return print_ucs4_terminal (str, last_position, margin_left, margin_right,
784
term, state, dry_run);
762
791
struct grub_term_output *term)
764
793
print_ucs4_real (str, last_position, margin_left, margin_right,
798
grub_ucs4_count_lines (const grub_uint32_t * str,
799
const grub_uint32_t * last_position,
800
int margin_left, int margin_right,
801
struct grub_term_output *term)
803
return print_ucs4_real (str, last_position, margin_left, margin_right,
770
808
grub_xputs_normal (const char *str)