bison-patches
[Top][All Lists]
Advanced

[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);
   }
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]