grub_errno = GRUB_ERR_NONE;
return 0;
}
- {
- char tmp[grub_strlen (devname) + sizeof (",")];
- grub_memcpy (tmp, devname, grub_strlen (devname));
-
- if (grub_strcmp (devname, current_word) == 0)
- {
- if (add_completion (devname, ")", GRUB_COMPLETION_TYPE_PARTITION))
- {
- grub_device_close (dev);
- return 1;
- }
+ if (grub_strcmp (devname, current_word) == 0)
+ {
+ if (add_completion (devname, ")", GRUB_COMPLETION_TYPE_PARTITION))
+ {
+ grub_device_close (dev);
+ return 1;
+ }
- if (dev->disk)
- if (grub_partition_iterate (dev->disk, iterate_partition, NULL))
- {
- grub_device_close (dev);
- return 1;
- }
- }
- else
- {
- grub_memcpy (tmp + grub_strlen (devname), "", sizeof (""));
- if (add_completion (tmp, "", GRUB_COMPLETION_TYPE_DEVICE))
+ if (dev->disk)
+ if (grub_partition_iterate (dev->disk, iterate_partition, NULL))
{
grub_device_close (dev);
return 1;
}
- }
- }
+ }
+ else if (add_completion (devname, "", GRUB_COMPLETION_TYPE_DEVICE))
+ {
+ grub_device_close (dev);
+ return 1;
+ }
grub_device_close (dev);
grub_errno = GRUB_ERR_NONE;
struct grub_term_output *term;
int y_line_start;
struct grub_term_screen_geometry geo;
+ /* Scratch variables used when updating. Having them here avoids
+ loads of small mallocs. */
+ int orig_num;
+ int down;
+ enum update_mode mode;
};
struct screen
{
int region_start = screen->num_lines;
int region_column = 0;
- int down[screen->nterms];
- enum update_mode mode[screen->nterms];
unsigned i;
for (i = 0; i < screen->nterms; i++)
{
- down[i] = 0;
- mode[i] = NO_LINE;
+ screen->terms[i].down = 0;
+ screen->terms[i].mode = NO_LINE;
}
while (*s)
for (i = 0; i < screen->nterms; i++)
{
- mode[i] = ALL_LINES;
- down[i] = 1; /* XXX not optimal. */
+ screen->terms[i].mode = ALL_LINES;
+ screen->terms[i].down = 1; /* XXX not optimal. */
}
/* Move the cursor. */
const char *p;
struct line *current_linep;
int size;
- int orig_num[screen->nterms], new_num[screen->nterms];
grub_uint32_t *unicode_msg;
/* Find a string delimited by LF. */
}
for (i = 0; i < screen->nterms; i++)
- orig_num[i] = get_logical_num_lines (current_linep,
+ screen->terms[i].orig_num = get_logical_num_lines (current_linep,
&screen->terms[i]);
current_linep->len += size;
- for (i = 0; i < screen->nterms; i++)
- new_num[i] = get_logical_num_lines (current_linep,
- &screen->terms[i]);
/* Update the dirty region. */
if (region_start > screen->line)
}
for (i = 0; i < screen->nterms; i++)
- if (orig_num[i] != new_num[i])
- {
- mode[i] = ALL_LINES;
- down[i] = 1; /* XXX not optimal. */
- }
- else if (mode[i] != ALL_LINES)
- mode[i] = SINGLE_LINE;
+ {
+ int new_num = get_logical_num_lines (current_linep,
+ &screen->terms[i]);
+ if (screen->terms[i].orig_num != new_num)
+ {
+ screen->terms[i].mode = ALL_LINES;
+ screen->terms[i].down = 1; /* XXX not optimal. */
+ }
+ else if (screen->terms[i].mode != ALL_LINES)
+ screen->terms[i].mode = SINGLE_LINE;
+ }
/* Move the cursor. */
advance_to (screen, screen->column + size);
if (update)
for (i = 0; i < screen->nterms; i++)
update_screen (screen, &screen->terms[i],
- region_start, region_column, 0, down[i], mode[i]);
+ region_start, region_column, 0, screen->terms[i].down,
+ screen->terms[i].mode);
return 1;
}
linep = screen->lines + screen->line;
if (linep->len > screen->column)
{
- int orig_num[screen->nterms], new_num;
unsigned i;
for (i = 0; i < screen->nterms; i++)
- orig_num[i] = get_logical_num_lines (linep, &screen->terms[i]);
+ screen->terms[i].orig_num = get_logical_num_lines (linep, &screen->terms[i]);
grub_memmove (linep->buf + screen->column,
linep->buf + screen->column + 1,
{
for (i = 0; i < screen->nterms; i++)
{
+ int new_num;
new_num = get_logical_num_lines (linep, &screen->terms[i]);
- if (orig_num[i] != new_num)
+ if (screen->terms[i].orig_num != new_num)
update_screen (screen, &screen->terms[i],
start, column, 0, 0, ALL_LINES);
else
if (size > 0)
{
- int orig_num[screen->nterms], new_num;
unsigned i;
p = grub_realloc (p, offset + size + 1);
screen->killed_text = p;
for (i = 0; i < screen->nterms; i++)
- orig_num[i] = get_logical_num_lines (linep, &screen->terms[i]);
+ screen->terms[i].orig_num = get_logical_num_lines (linep, &screen->terms[i]);
linep->len = screen->column;
if (update)
{
for (i = 0; i < screen->nterms; i++)
{
+ int new_num;
new_num = get_logical_num_lines (linep, &screen->terms[i]);
- if (orig_num[i] != new_num)
+ if (screen->terms[i].orig_num != new_num)
update_screen (screen, &screen->terms[i],
screen->line, screen->column, 0, 1, ALL_LINES);
else