bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/6] warnings: organize variadic complaints call


From: Theophile Ranquet
Subject: [PATCH 3/6] warnings: organize variadic complaints call
Date: Mon, 1 Oct 2012 15:01:00 +0000

Move the dispatch of variadic complains to complain.c, rather
than do it in a scanner. This is more appropriate.

* src/complain.c (complain_var): Move (and refactor) contents here...
(complain_atp): New.
* src/complain.h: Adjust,
* src/scan-skel.l (at_directive_perform): ... from here.
---
 src/complain.c  | 28 ++++++++++++++++
 src/complain.h  |  2 ++
 src/scan-skel.l | 99 +++++++++++++++++----------------------------------------
 3 files changed, 59 insertions(+), 70 deletions(-)

diff --git a/src/complain.c b/src/complain.c
index 1d43f1d..f1f66d2 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -161,3 +161,31 @@ complain_at_indent (location loc, warnings flags, unsigned 
*indent,
   complains (&loc, flags, message, args);
   va_end (args);
 }
+
+/* This function is used to convert calls to va_list args functions from
+   an argv[] model */
+void
+complain_args (warnings w, location const *locp, int argc, char *argv[])
+{
+  switch (argc)
+  {
+  case 2:
+    complain (locp, w, "%s", _(argv[1]));
+    break;
+  case 3:
+    complain (locp, w, _(argv[1]), argv[2]);
+    break;
+  case 4:
+    complain (locp, w, _(argv[1]), argv[2], argv[3]);
+    break;
+  case 5:
+    complain (locp, w, _(argv[1]), argv[2], argv[3], argv[4]);
+    break;
+  case 6:
+    complain (locp, w, _(argv[1]), argv[2], argv[3], argv[4], argv[5]);
+    break;
+  default:
+    complain (locp, fatal, "too many arguments for complains");
+    break;
+  }
+}
diff --git a/src/complain.h b/src/complain.h
index 31084e0..f89165c 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -69,4 +69,6 @@ void complain_at_indent (location loc, warnings flags, 
unsigned *indent,
 /** Whether an error was reported.  */
 extern bool complaint_issued;
 
+int complain_var (warnings w, bool has_loc, int argc, char *arg[]);
+
 #endif /* !COMPLAIN_H_ */
diff --git a/src/scan-skel.l b/src/scan-skel.l
index 9854727..e3fd606 100644
--- a/src/scan-skel.l
+++ b/src/scan-skel.l
@@ -173,6 +173,7 @@ flag (const char *arg)
     case 'w': return Wother;
     case 'c': return complaint;
     case 'f': return fatal;
+    case 'o': return Wnone;
     default: aver (false); break;
     }
 }
@@ -186,82 +187,40 @@ at_directive_perform (int argc, char *argv[], char 
**outnamep, int *out_linenop)
         fail_for_at_directive_too_many_args (argv[0]);
       fputs (last_component (argv[1]), yyout);
     }
-  else if (STREQ (argv[0], "@warn")
-           || STREQ (argv[0], "@complain")
-           || STREQ (argv[0], "@fatal"))
+  else
     {
-      warnings w = flag (argv[0]);
-      switch (argc)
-        {
-          case 2:
-            complain (NULL, w, "%s", _(argv[1]));
-            break;
-          case 3:
-            complain (NULL, w, _(argv[1]), argv[2]);
-            break;
-          case 4:
-            complain (NULL, w, _(argv[1]), argv[2], argv[3]);
-            break;
-          case 5:
-            complain (NULL, w, _(argv[1]), argv[2], argv[3], argv[4]);
-            break;
-          case 6:
-            complain (NULL, w, _(argv[1]), argv[2], argv[3], argv[4], argv[5]);
-            break;
-          default:
-            fail_for_at_directive_too_many_args (argv[0]);
-            break;
+      warnings w = flag (*argv);
+      if (w & (Wother | complaint | fatal))
+      {
+          location loc;
+          location *locp = NULL;
+          if (STREQ (*argv + strlen (*argv) - 3, "_at"))
+            {
+              boundary_set_from_string (&loc.start, argv[1]);
+              boundary_set_from_string (&loc.end, argv[2]);
+              argc -= 2;
+              argv += 2;
+              locp = &loc;
+            }
+          complain_args (w, locp, argc, argv);
         }
-    }
-  else if (STREQ (argv[0], "@warn_at")
-           || STREQ (argv[0], "@complain_at")
-           || STREQ (argv[0], "@fatal_at"))
-    {
-      warnings w = flag (argv[0]);
-      location loc;
-      if (argc < 4)
-        fail_for_at_directive_too_few_args (argv[0]);
-      boundary_set_from_string (&loc.start, argv[1]);
-      boundary_set_from_string (&loc.end, argv[2]);
-      switch (argc)
+      else if (STREQ (argv[0], "@output"))
         {
-          case 4:
-            complain (&loc, w, "%s", _(argv[3]));
-            break;
-          case 5:
-            complain (&loc, w, _(argv[3]), argv[4]);
-            break;
-          case 6:
-            complain (&loc, w, _(argv[3]), argv[4], argv[5]);
-            break;
-          case 7:
-            complain (&loc, w, _(argv[3]), argv[4], argv[5], argv[6]);
-            break;
-          case 8:
-            complain (&loc, w, _(argv[3]), argv[4], argv[5], argv[6],
-                         argv[7]);
-            break;
-          default:
+          if (argc > 2)
             fail_for_at_directive_too_many_args (argv[0]);
-            break;
+          if (*outnamep)
+            {
+              free (*outnamep);
+              xfclose (yyout);
+            }
+          *outnamep = xstrdup (argv[1]);
+          output_file_name_check (outnamep);
+          yyout = xfopen (*outnamep, "w");
+          *out_linenop = 1;
         }
+      else
+        fail_for_invalid_at (argv[0]);
     }
-  else if (STREQ (argv[0], "@output"))
-    {
-      if (argc > 2)
-        fail_for_at_directive_too_many_args (argv[0]);
-      if (*outnamep)
-        {
-          free (*outnamep);
-          xfclose (yyout);
-        }
-      *outnamep = xstrdup (argv[1]);
-      output_file_name_check (outnamep);
-      yyout = xfopen (*outnamep, "w");
-      *out_linenop = 1;
-    }
-  else
-    fail_for_invalid_at (argv[0]);
 }
 
 static void
-- 
1.7.11.4




reply via email to

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