[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 6/6] warnings: separate flags_argmatch
From: |
Akim Demaille |
Subject: |
Re: [PATCH 6/6] warnings: separate flags_argmatch |
Date: |
Mon, 1 Oct 2012 15:50:59 +0200 |
Le 1 oct. 2012 à 17:01, Theophile Ranquet a écrit :
> +{
> + int value = 0;
> + if (!err || arg[no + err++] != '\0')
> + value = XARGMATCH (option, arg + no + err, keys, values);
> +
> + if (!value)
In that case I prefer if (value).
> + {
> + /* With a simpler 'if (no)' version, -Werror means -Werror=all
Badly indented.
> + (or rather, -Werror=no-none, but that syntax is invalid).
> + The difference is:
> + - Werror activates all errors, but not the warnings
> + - Werror=all activates errors, and all warnings */
> + if (no ? !err : err)
> + *flags |= all;
> + else
> + *flags &= ~all;
> + }
> + else
> + {
> + if (no)
> + *flags &= ~value;
> + else
> + {
> + if (err)
> + warnings_flag |= value;
> + *flags |= value;
> + }
> + }
> +}
> +/** Decode an option's set of keys.
> + *
> + * \param option option being decoded.
> + * \param keys array of valid subarguments.
> + * \param values array of corresponding (int) values.
> + * \param all the all value.
> + * \param flags the flags to update
> + * \param args comma separated list of effective subarguments to decode.
> + * If 0, then activate all the flags.
> + */
> +static void
> flags_argmatch (const char *option,
> const char * const keys[], const int values[],
> int all, int *flags, char *args)
> {
> if (args)
> {
> - args = strtok (args, ",");
> - while (args)
> + for (args = strtok (args, ","); args; args = strtok (NULL, ","))
Useless { } around.
> {
> - int value = 0;
> - int *save_flags = flags;
> int no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
> int err = STRPREFIX_LIT ("error", args + no) ? 5 : 0;
Made them size_t.
>
> - if (err)
> - flags = &errors_flag;
> - if (!err || args[no + err++] != '\0')
> - value = XARGMATCH (option, args + no + err, keys, values);
> -
> - if (!value)
> - {
> - /* With a simpler 'if (no)' version, -Werror means -Werror=all
> - (or rather, -Werror=no-none, but that syntax is invalid).
> - The difference is:
> - - Werror activates all errors, but not the warnings
> - - Werror=all activates errors, and all warnings */
> - if (no ? !err : err)
> - *flags |= all;
> - else
> - *flags &= ~all;
> - }
> - else
> - {
> - if (no)
> - *flags &= ~value;
> - else
> - {
> - if (err)
> - warnings_flag |= value;
> - *flags |= value;
> - }
> - }
> - flags = save_flags;
> - args = strtok (NULL, ",");
> + flag_argmatch (option, keys,
> + values, all, err ? &errors_flag : flags,
> + args, no, err);
> }
> }
> else
So here is what I installed based on your patch.
commit 20964c33f91dc49b9f1b97a85505dd69776fe41c
Author: Theophile Ranquet <address@hidden>
Date: Mon Oct 1 15:01:03 2012 +0000
warnings: separate flags_argmatch
This function is now a mere iterator that calls flag_argmatch,
a new function, that matches a single option parameter.
* src/getargs.c (flag_argmatch): New, taken from...
(flags_argmatch): Here.
Signed-off-by: Akim Demaille <address@hidden>
diff --git a/src/getargs.c b/src/getargs.c
index db1c386..cf5af69 100644
--- a/src/getargs.c
+++ b/src/getargs.c
@@ -62,69 +62,83 @@ int language_prio = default_prio;
struct bison_language const *language = &valid_languages[0];
const char *include = NULL;
-
-/** Decode an option's set of keys.
+/** Decode an option's key.
*
* \param option option being decoded.
* \param keys array of valid subarguments.
* \param values array of corresponding (int) values.
* \param all the all value.
* \param flags the flags to update
- * \param args comma separated list of effective subarguments to decode.
- * If 0, then activate all the flags.
+ * \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
-flags_argmatch (const char *option,
- const char * const keys[], const int values[],
- int all, int *flags, char *args)
+flag_argmatch (const char *option,
+ const char * const keys[], const int values[],
+ int all, int *flags, char *arg, size_t no, size_t err)
{
- if (args)
+ int value = 0;
+ if (!err || arg[no + err++] != '\0')
+ value = XARGMATCH (option, arg + no + err, keys, values);
+
+ if (value)
{
- args = strtok (args, ",");
- while (args)
+ if (no)
+ *flags &= ~value;
+ else
{
- int value = 0;
- int *save_flags = flags;
- int no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
- int err = STRPREFIX_LIT ("error", args + no) ? 5 : 0;
-
if (err)
- flags = &errors_flag;
- if (!err || args[no + err++] != '\0')
- value = XARGMATCH (option, args + no + err, keys, values);
-
- if (!value)
- {
- /* With a simpler 'if (no)' version, -Werror means -Werror=all
- (or rather, -Werror=no-none, but that syntax is invalid).
- The difference is:
- - Werror activates all errors, but not the warnings
- - Werror=all activates errors, and all warnings */
- if (no ? !err : err)
- *flags |= all;
- else
- *flags &= ~all;
- }
- else
- {
- if (no)
- *flags &= ~value;
- else
- {
- if (err)
- warnings_flag |= value;
- *flags |= value;
- }
- }
- flags = save_flags;
- args = strtok (NULL, ",");
+ warnings_flag |= value;
+ *flags |= value;
}
}
else
+ {
+ /* With a simpler 'if (no)' version, -Werror means -Werror=all
+ (or rather, -Werror=no-none, but that syntax is invalid).
+ The difference is:
+ - Werror activates all errors, but not the warnings
+ - Werror=all activates errors, and all warnings */
+ if (no ? !err : err)
+ *flags |= all;
+ else
+ *flags &= ~all;
+ }
+}
+/** Decode an option's set of keys.
+ *
+ * \param option option being decoded.
+ * \param keys array of valid subarguments.
+ * \param values array of corresponding (int) values.
+ * \param all the all value.
+ * \param flags the flags to update
+ * \param args comma separated list of effective subarguments to decode.
+ * If 0, then activate all the flags.
+ */
+static void
+flags_argmatch (const char *option,
+ const char * const keys[], const int values[],
+ int all, int *flags, char *args)
+{
+ if (args)
+ for (args = strtok (args, ","); args; args = strtok (NULL, ","))
+ {
+ size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
+ size_t err = STRPREFIX_LIT ("error", args + no) ? 5 : 0;
+
+ flag_argmatch (option, keys,
+ values, all, err ? &errors_flag : flags,
+ args, no, err);
+ }
+ else
*flags |= all;
}
- [PATCH 1/6] warnings: remove spurious suffixes on context, (continued)
- [PATCH 1/6] warnings: remove spurious suffixes on context, Theophile Ranquet, 2012/10/01
- [PATCH 4/6] formatting changes, Theophile Ranquet, 2012/10/01
- [PATCH 3/6] warnings: organize variadic complaints call, Theophile Ranquet, 2012/10/01
- [PATCH 5/6] warnings: refactoring, Theophile Ranquet, 2012/10/01
- [PATCH 6/6] warnings: separate flags_argmatch, Theophile Ranquet, 2012/10/01
- Re: [PATCH 6/6] warnings: separate flags_argmatch,
Akim Demaille <=
- [PATCH 2/6] warnings: fusion of complain and complain_at, Theophile Ranquet, 2012/10/01