[Top][All Lists]
[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
- [PATCH 0/6] minor code rework and spurious error suffix removed, Theophile Ranquet, 2012/10/01
- [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 <=
- [PATCH 5/6] warnings: refactoring, Theophile Ranquet, 2012/10/01
- [PATCH 6/6] warnings: separate flags_argmatch, Theophile Ranquet, 2012/10/01
- [PATCH 2/6] warnings: fusion of complain and complain_at, Theophile Ranquet, 2012/10/01