diagnostics: style: use a boundary to track the caret_info

* src/location.c (caret_info): Replace file and line with pos, a
boundary.  This will allow us to use features of the boundary type,
such as boundary_compute.
This commit is contained in:
Akim Demaille
2019-09-17 00:19:58 +02:00
parent 2274c34e91
commit 576b863e91

View File

@@ -169,9 +169,8 @@ static struct
FILE *source; FILE *source;
/* The last file we tried to open. If non NULL, but SOURCE is NULL, /* The last file we tried to open. If non NULL, but SOURCE is NULL,
it means this file is special and should not be quoted. */ it means this file is special and should not be quoted. */
uniqstr file; boundary pos;
size_t line; /* Offset in SOURCE where line POS.LINE starts. */
/* Offset in SOURCE where line LINE starts. */
size_t offset; size_t offset;
} caret_info; } caret_info;
@@ -181,26 +180,26 @@ caret_set_file (const char *file)
{ {
/* If a different source than before, close and let the rest open /* If a different source than before, close and let the rest open
the new one. */ the new one. */
if (caret_info.file && caret_info.file != file) if (caret_info.pos.file && caret_info.pos.file != file)
{ {
caret_free (); caret_free ();
caret_info.file = NULL; caret_info.pos.file = NULL;
} }
if (!caret_info.file) if (!caret_info.pos.file)
{ {
caret_info.file = file; caret_info.pos.file = file;
if ((caret_info.source = fopen (caret_info.file, "r"))) if ((caret_info.source = fopen (caret_info.pos.file, "r")))
{ {
/* If the file is not regular (imagine #line 1 "/dev/stdin" /* If the file is not regular (imagine #line 1 "/dev/stdin"
in the input file for instance), don't try to quote the in the input file for instance), don't try to quote the
source. Keep caret_info.file set so that we don't try to source. Keep caret_info.file set so that we don't try to
open it again, but leave caret_info.source NULL so that open it again, but leave caret_info.file NULL so that we
we don't try to quote it. */ don't try to quote it. */
struct stat buf; struct stat buf;
if (fstat (fileno (caret_info.source), &buf) == 0 if (fstat (fileno (caret_info.source), &buf) == 0
&& buf.st_mode & S_IFREG) && buf.st_mode & S_IFREG)
{ {
caret_info.line = 1; caret_info.pos.line = 1;
caret_info.offset = 0; caret_info.offset = 0;
} }
else else
@@ -249,21 +248,21 @@ location_caret (location loc, const char *style, FILE *out)
/* If the line we want to quote is seekable (the same line as the previous /* If the line we want to quote is seekable (the same line as the previous
location), just seek it. If it was a previous line, we lost track of it, location), just seek it. If it was a previous line, we lost track of it,
so return to the start of file. */ so return to the start of file. */
if (loc.start.line < caret_info.line) if (loc.start.line < caret_info.pos.line)
{ {
caret_info.line = 1; caret_info.pos.line = 1;
caret_info.offset = 0; caret_info.offset = 0;
} }
fseek (caret_info.source, caret_info.offset, SEEK_SET); fseek (caret_info.source, caret_info.offset, SEEK_SET);
/* Advance to the line's position, keeping track of the offset. */ /* Advance to the line's position, keeping track of the offset. */
while (caret_info.line < loc.start.line) while (caret_info.pos.line < loc.start.line)
{ {
int c = caret_getc (); int c = caret_getc ();
if (c == EOF) if (c == EOF)
/* Something is wrong, that line number does not exist. */ /* Something is wrong, that line number does not exist. */
return; return;
caret_info.line += c == '\n'; caret_info.pos.line += c == '\n';
} }
caret_info.offset = ftell (caret_info.source); caret_info.offset = ftell (caret_info.source);