[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/4] errors: show carets
From: |
Théophile Ranquet |
Subject: |
Re: [PATCH 2/4] errors: show carets |
Date: |
Fri, 7 Dec 2012 11:04:28 +0100 |
I have applied all your suggestions, and installed the following into (maint):
commit dbda56040076e602f3494c5499a50d0452b162b5
Author: Theophile Ranquet <address@hidden>
Date: Thu Dec 6 13:17:55 2012 +0100
carets: improve the code
* src/location.c: Remove duplicate documentations.
(caret_info): Stylistic change.
(location_caret): Many reworks.
diff --git a/src/location.c b/src/location.c
index 6e5306c..24301ec 100644
--- a/src/location.c
+++ b/src/location.c
@@ -143,15 +143,13 @@ location_print (FILE *out, location loc)
same file all over for each error. */
struct caret_info
{
- FILE* source;
+ FILE *source;
size_t line;
size_t offset;
};
static struct caret_info caret_info = { NULL, 1, 0 };
-/* Free any allocated ressources and close any open file handles that are
- left-over by the usage of location_caret. */
void
cleanup_caret ()
{
@@ -159,11 +157,10 @@ cleanup_caret ()
fclose (caret_info.source);
}
-/* Output to OUT the line and caret corresponding to location LOC. */
void
location_caret (FILE *out, location loc)
{
- /* FIXME: find a way to support X-file locations, and only open once each
+ /* FIXME: find a way to support multifile locations, and only open once each
file. That would make the procedure future-proof. */
if (! (caret_info.source
|| (caret_info.source = fopen (loc.start.file, "r")))
@@ -183,41 +180,36 @@ location_caret (FILE *out, location loc)
}
/* Advance to the line's position, keeping track of the offset. */
- {
- int i;
- for (i = caret_info.line; i < loc.start.line; caret_info.offset++)
- if (fgetc (caret_info.source) == '\n')
- ++i;
- }
- caret_info.line = loc.start.line;
+ while (caret_info.line < loc.start.line)
+ caret_info.line += fgetc (caret_info.source) == '\n';
+ caret_info.offset = ftell (caret_info.source);
/* Read the actual line. Don't update the offset, so that we keep a pointer
to the start of the line. */
{
- ssize_t len = 0;
char *buf = NULL;
- if ((len = getline (&buf, (size_t*) &len, caret_info.source)) != -1)
+ size_t size = 0;
+ ssize_t len = getline (&buf, &size, caret_info.source);
+ if (0 < len)
{
/* The caret of a multiline location ends with the first line. */
int end = loc.start.line != loc.end.line ? len : loc.end.column;
- if (len)
- {
- int i = loc.start.column;
- /* Quote the file, indent by a single column. */
- fputc (' ', out);
- fwrite (buf, 1, len, out);
-
- /* Print the caret, with the same indent as above. */
- fputc (' ', out);
- fprintf (out, "%*s", loc.start.column - 1, "");
- do {
- fputc ('^', out);
- } while (++i < end);
- }
+ /* Quote the file, indent by a single column. */
+ fputc (' ', out);
+ fwrite (buf, 1, len, out);
+
+ /* Print the caret, with the same indent as above. */
+ fprintf (out, " %*s", loc.start.column - 1, "");
+ {
+ int i = loc.start.column;
+ do
+ fputc ('^', out);
+ while (++i < end);
+ }
fputc ('\n', out);
- free (buf);
}
+ free (buf);
}
}
[PATCH 4/4] doc: document carets, Theophile Ranquet, 2012/12/04
[PATCH 3/4] tests: check carets, Theophile Ranquet, 2012/12/04
Re: [PATCH 0/4] {maint} caret errors, Akim Demaille, 2012/12/04