mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-23 03:03:02 +00:00
diagnostics: isolate caret_set_column
* src/location.c (caret_info): Add width and skip members. (caret_set_column): New. Use it.
This commit is contained in:
@@ -224,6 +224,13 @@ static struct
|
|||||||
size_t offset;
|
size_t offset;
|
||||||
/* Length of the current line. */
|
/* Length of the current line. */
|
||||||
int line_len;
|
int line_len;
|
||||||
|
/* Given the initial column to display, the offset (number of
|
||||||
|
characters to skip at the beginning of the line). */
|
||||||
|
int skip;
|
||||||
|
|
||||||
|
/* Available width to quote the source file. Eight chars are
|
||||||
|
consumed by the left-margin (with line number). */
|
||||||
|
int width;
|
||||||
} caret_info;
|
} caret_info;
|
||||||
|
|
||||||
void caret_init (void)
|
void caret_init (void)
|
||||||
@@ -352,6 +359,31 @@ caret_set_line (int line)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compute CARET_INFO.WIDTH and CARET_INFO.SKIP based on the fact that
|
||||||
|
the first column to display in the current line is COL. */
|
||||||
|
static bool
|
||||||
|
caret_set_column (int col)
|
||||||
|
{
|
||||||
|
/* Available width. Eight chars are consumed by the left-margin
|
||||||
|
(with line number). */
|
||||||
|
caret_info.width = screen_width - 8;
|
||||||
|
caret_info.skip = 0;
|
||||||
|
if (caret_info.width < caret_info.line_len)
|
||||||
|
{
|
||||||
|
/* We cannot quote the whole line. Make sure we can see the
|
||||||
|
beginning of the location. */
|
||||||
|
caret_info.skip = caret_info.width < col ? col - 10 : 0;
|
||||||
|
}
|
||||||
|
/* If we skip the initial part, we insert "..." before. */
|
||||||
|
if (caret_info.skip)
|
||||||
|
caret_info.width -= 3;
|
||||||
|
/* If the end of line does not fit, we also need to truncate the
|
||||||
|
end, and leave "..." there. */
|
||||||
|
if (caret_info.width < caret_info.line_len - caret_info.skip)
|
||||||
|
caret_info.width -= 3;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
location_caret (location loc, const char *style, FILE *out)
|
location_caret (location loc, const char *style, FILE *out)
|
||||||
{
|
{
|
||||||
@@ -361,24 +393,11 @@ location_caret (location loc, const char *style, FILE *out)
|
|||||||
return;
|
return;
|
||||||
if (!caret_set_line (loc.start.line))
|
if (!caret_set_line (loc.start.line))
|
||||||
return;
|
return;
|
||||||
|
if (!caret_set_column (loc.start.column))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Available width. Eight chars are consumed by the left-margin
|
const int width = caret_info.width;
|
||||||
(with line number). */
|
const int skip = caret_info.skip;
|
||||||
int width = screen_width - 8;
|
|
||||||
int skip = 0;
|
|
||||||
if (width < caret_info.line_len)
|
|
||||||
{
|
|
||||||
/* We cannot quote the whole line. Make sure we can see the
|
|
||||||
beginning of the location. */
|
|
||||||
skip = width < loc.start.column ? loc.start.column - 10 : 0;
|
|
||||||
}
|
|
||||||
/* If we skip the initial part, we insert "..." before. */
|
|
||||||
if (skip)
|
|
||||||
width -= 3;
|
|
||||||
/* If the end of line does not fit, we also need to truncate the
|
|
||||||
end, and leave "..." there. */
|
|
||||||
if (width < caret_info.line_len - skip)
|
|
||||||
width -= 3;
|
|
||||||
|
|
||||||
/* Read the actual line. Don't update the offset, so that we keep a pointer
|
/* Read the actual line. Don't update the offset, so that we keep a pointer
|
||||||
to the start of the line. */
|
to the start of the line. */
|
||||||
|
|||||||
Reference in New Issue
Block a user