[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: |
Thu, 6 Dec 2012 17:21:50 +0100 |
I have further improved the code, and am considering the following for
maint. I may still add a way to store the opened file's name, but I am
unsure as to whether or not this is useful considering I am not aware
of any plans for multi-file error-checking any time soon.
commit 84d2323d736cf53dd9d612495e2939b775fe752b
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..4557b0e 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,38 +180,34 @@ 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)
+ if (fgetc (caret_info.source) == '\n')
+ ++caret_info.line;
+ 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 {
+ /* 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);
- }
+ } while (++i < end);
+ }
fputc ('\n', out);
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