bison-patches
[Top][All Lists]
Advanced

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

Re: [PATCH 7/8] style: more argument handling of -W into the diagnostics


From: Akim Demaille
Subject: Re: [PATCH 7/8] style: more argument handling of -W into the diagnostics module
Date: Sat, 16 Feb 2013 14:31:48 +0100

Pushed as follows (including a fix in the title)

commit 12bc1c9e47a5c043e1d2bba599846732b93d062c
Author: Akim Demaille <address@hidden>
Date:   Thu Feb 14 14:35:24 2013 +0100

    style: move argument handling of -W into the diagnostics module
    
    This allows to reduce the number of public interfaces.
    
    * src/getargs.c (--yacc): Use warning_argmatch instead of tweaking
    directly warnings_flag (which will be private).
    (warning_argmatch, warnings_argmatch): Move to...
    * src/complain.h, src/complain.c: here.
    
    * src/getargs.h, src/getargs.c (warnings_args, warnings_types): Move to...
    * src/complain.c: here, now private.
    
    * src/complain.h (severity, warnings_flag): Move to...
    * src/complain.c: here, now private.

diff --git a/src/complain.c b/src/complain.c
index 2bc276e..1162da2 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -22,6 +22,7 @@
 #include <config.h>
 #include "system.h"
 
+#include <argmatch.h>
 #include <stdarg.h>
 #include <progname.h>
 
@@ -33,10 +34,133 @@
 err_status complaint_status = status_none;
 
 bool warnings_are_errors = false;
-severity warnings_flag[warnings_size];
+
+/** Diagnostics severity.  */
+typedef enum
+  {
+    severity_disabled = 0,
+    severity_unset = 1,
+    severity_warning = 2,
+    severity_error = 3,
+    severity_fatal = 4
+  } severity;
+
+
+/** For each warning type, its severity.  */
+static severity warnings_flag[warnings_size];
 
 static unsigned *indent_ptr = 0;
 
+/*------------------------.
+| --warnings's handling.  |
+`------------------------*/
+
+static const char * const warnings_args[] =
+{
+  "none",
+  "midrule-values",
+  "yacc",
+  "conflicts-sr",
+  "conflicts-rr",
+  "deprecated",
+  "precedence",
+  "other",
+  "all",
+  "error",
+  0
+};
+
+static const int warnings_types[] =
+{
+  Wnone,
+  Wmidrule_values,
+  Wyacc,
+  Wconflicts_sr,
+  Wconflicts_rr,
+  Wdeprecated,
+  Wprecedence,
+  Wother,
+  Wall,
+  Werror
+};
+
+ARGMATCH_VERIFY (warnings_args, warnings_types);
+
+void
+warning_argmatch (char const *arg, size_t no, size_t err)
+{
+  int value = XARGMATCH ("--warning", arg + no + err,
+                         warnings_args, warnings_types);
+
+  /* -Wnone == -Wno-all, and -Wno-none == -Wall.  */
+  if (!value)
+    {
+      value = Wall;
+      no = !no;
+    }
+
+  if (no)
+    {
+      size_t b;
+      for (b = 0; b < warnings_size; ++b)
+        if (value & 1 << b)
+          {
+            if (err)
+              {
+                /* -Wno-error=foo: if foo enabled as an error,
+                   make it a warning.  */
+                if (warnings_flag[b] == severity_error)
+                  warnings_flag[b] = severity_warning;
+              }
+            else
+              /* -Wno-foo.  */
+              warnings_flag[b] = severity_disabled;
+          }
+    }
+  else
+    {
+      size_t b;
+      for (b = 0; b < warnings_size; ++b)
+        if (value & 1 << b)
+          /* -Wfoo and -Werror=foo. */
+          warnings_flag[b] = err ? severity_error : severity_warning;
+    }
+}
+
+/** Decode a comma-separated list of arguments from -W.
+ *
+ *  \param args     comma separated list of effective subarguments to decode.
+ *                  If 0, then activate all the flags.
+ */
+
+void
+warnings_argmatch (char *args)
+{
+  if (args)
+    for (args = strtok (args, ","); args; args = strtok (NULL, ","))
+      if (STREQ (args, "error"))
+        warnings_are_errors = true;
+      else if (STREQ (args, "no-error"))
+        {
+          warnings_are_errors = false;
+          warning_argmatch ("no-error=all", 3, 6);
+        }
+      else
+        {
+          size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
+          size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0;
+
+          warning_argmatch (args, no, err);
+        }
+  else
+    warning_argmatch ("all", 0, 0);
+}
+
+
+/*-----------.
+| complain.  |
+`-----------*/
+
 void
 complain_init (void)
 {
diff --git a/src/complain.h b/src/complain.h
index c7f93e1..10ea19b 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -42,6 +42,39 @@ typedef enum
     warnings_size           /**< The number of warnings.  Must be last.  */
   } warning_bit;
 
+/** Whether -Werror was set. */
+extern bool warnings_are_errors;
+
+/** Decode a single argument from -W.
+ *
+ *  \param arg      the subarguments to decode.
+ *                  If null, then activate all the flags.
+ *  \param no       length of the potential "no-" prefix.
+ *                  Can be 0 or 3. If 3, negate the action of the subargument.
+ *  \param err      length of a potential "error=".
+ *                  Can be 0 or 6. If 6, treat the subargument as a CATEGORY.
+ *
+ *  If VALUE != 0 then KEY sets flags and no-KEY clears them.
+ *  If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all
+ *  flags from \c all.  Thus no-none = all and no-all = none.
+ */
+void warning_argmatch (char const *arg, size_t no, size_t err);
+
+/** Decode a comma-separated list of arguments from -W.
+ *
+ *  \param args     comma separated list of effective subarguments to decode.
+ *                  If 0, then activate all the flags.
+ */
+void warnings_argmatch (char *args);
+
+
+/*-----------.
+| complain.  |
+`-----------*/
+
+/** Initialize this module.  */
+void complain_init (void);
+
 typedef enum
   {
     /**< Issue no warnings.  */
@@ -67,25 +100,6 @@ typedef enum
   } warnings;
 
 
-/** For each warning type, its severity.  */
-typedef enum
-  {
-    severity_disabled = 0,
-    severity_unset = 1,
-    severity_warning = 2,
-    severity_error = 3,
-    severity_fatal = 4
-  } severity;
-
-/** Whether -Werror was set. */
-extern bool warnings_are_errors;
-
-/** For each warning type, its severity.  */
-extern severity warnings_flag[];
-
-/** Initialize this module.  */
-void complain_init (void);
-
 /** Make a complaint, with maybe a location.  */
 void complain (location const *loc, warnings flags, char const *message, ...)
   __attribute__ ((__format__ (__printf__, 3, 4)));
diff --git a/src/getargs.c b/src/getargs.c
index 844036e..fd96fe1 100644
--- a/src/getargs.c
+++ b/src/getargs.c
@@ -223,123 +223,6 @@ static const int trace_types[] =
 ARGMATCH_VERIFY (trace_args, trace_types);
 
 
-/*------------------------.
-| --warnings's handling.  |
-`------------------------*/
-
-/** Decode a single argument from -W.
- *
- *  \param arg      the subarguments to decode.
- *                  If null, then activate all the flags.
- *  \param no       length of the potential "no-" prefix.
- *                  Can be 0 or 3. If 3, negate the action of the subargument.
- *  \param err      length of a potential "error=".
- *                  Can be 0 or 6. If 6, treat the subargument as a CATEGORY.
- *
- *  If VALUE != 0 then KEY sets flags and no-KEY clears them.
- *  If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all
- *  flags from \c all.  Thus no-none = all and no-all = none.
- */
-static void
-warning_argmatch (char const *arg, size_t no, size_t err)
-{
-  int value = XARGMATCH ("--warning", arg + no + err,
-                         warnings_args, warnings_types);
-
-  /* -Wnone == -Wno-all, and -Wno-none == -Wall.  */
-  if (!value)
-    {
-      value = Wall;
-      no = !no;
-    }
-
-  if (no)
-    {
-      size_t b;
-      for (b = 0; b < warnings_size; ++b)
-        if (value & 1 << b)
-          {
-            if (err)
-              {
-                /* -Wno-error=foo: if foo enabled as an error,
-                   make it a warning.  */
-                if (warnings_flag[b] == severity_error)
-                  warnings_flag[b] = severity_warning;
-              }
-            else
-              /* -Wno-foo.  */
-              warnings_flag[b] = severity_disabled;
-          }
-    }
-  else
-    {
-      size_t b;
-      for (b = 0; b < warnings_size; ++b)
-        if (value & 1 << b)
-          /* -Wfoo and -Werror=foo. */
-          warnings_flag[b] = err ? severity_error : severity_warning;
-    }
-}
-
-/** Decode a comma-separated list of arguments from -W.
- *
- *  \param args     comma separated list of effective subarguments to decode.
- *                  If 0, then activate all the flags.
- */
-static void
-warnings_argmatch (char *args)
-{
-  if (args)
-    for (args = strtok (args, ","); args; args = strtok (NULL, ","))
-      if (STREQ (args, "error"))
-        warnings_are_errors = true;
-      else if (STREQ (args, "no-error"))
-        {
-          warnings_are_errors = false;
-          warning_argmatch ("no-error=all", 3, 6);
-        }
-      else
-        {
-          size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
-          size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0;
-
-          warning_argmatch (args, no, err);
-        }
-  else
-    warning_argmatch ("all", 0, 0);
-}
-
-const char * const warnings_args[] =
-{
-  "none",
-  "midrule-values",
-  "yacc",
-  "conflicts-sr",
-  "conflicts-rr",
-  "deprecated",
-  "precedence",
-  "other",
-  "all",
-  "error",
-  0
-};
-
-const int warnings_types[] =
-{
-  Wnone,
-  Wmidrule_values,
-  Wyacc,
-  Wconflicts_sr,
-  Wconflicts_rr,
-  Wdeprecated,
-  Wprecedence,
-  Wother,
-  Wall,
-  Werror
-};
-
-ARGMATCH_VERIFY (warnings_args, warnings_types);
-
 /*-----------------------.
 | --feature's handling.  |
 `-----------------------*/
@@ -804,7 +687,7 @@ getargs (int argc, char *argv[])
         break;
 
       case 'y':
-        warnings_flag[warning_yacc] = severity_error;
+        warning_argmatch ("error=yacc", 0, 6);
         yacc_flag = true;
         break;
 
diff --git a/src/getargs.h b/src/getargs.h
index 2fba265..5d4dfb0 100644
--- a/src/getargs.h
+++ b/src/getargs.h
@@ -121,13 +121,6 @@ enum feature
 /** What additional features to use.  */
 extern int feature_flag;
 
-/*------------.
-| --warning.  |
-`------------*/
-/* Null-terminated list.  */
-extern const char * const warnings_args[];
-extern const int warnings_types[];
-
 
 /** Process the command line arguments.
  *




reply via email to

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