You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2005/09/19 01:28:29 UTC
svn commit: r290009 - /incubator/stdcxx/trunk/tests/src/driver.cpp
Author: sebor
Date: Sun Sep 18 16:28:26 2005
New Revision: 290009
URL: http://svn.apache.org/viewcvs?rev=290009&view=rev
Log:
2005-09-18 Martin Sebor <se...@roguewave.com>
* driver.cpp: Removed _rw_opt_no_stdout, _rw_opt_verbose, and
_rw_opt_compat and replaced each with calls to the respective command
line option handler with the special arguments 1, and 0.
(_rw_setopt_verbose): Renamed to _rw_opt_verbose and allowed the handler
to be called in "query mode" to retrieve the state of the option.
(_rw_setopt_compat): Renamed to _rw_opt_compat and implemented query
mode.
(_rw_setopt_stdout): Renamed to _rw_opt_no_stdout and implemented
query mode.
(_rw_use_color): New function. Returns 1 when colorized output can
and should be used.
(_rw_opt_quiet): New handler for the -q|--quiet command line options.
(_rw_vissue_diag): New function called to unconditionally issue
a diagnostic.
(_rw_vdiag): Factored out code into _rw_vissue_diag for readability
and called the function to issue a diagnostic.
(rw_vtest): Used color in the summary table.
Modified:
incubator/stdcxx/trunk/tests/src/driver.cpp
Modified: incubator/stdcxx/trunk/tests/src/driver.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/src/driver.cpp?rev=290009&r1=290008&r2=290009&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/driver.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/driver.cpp Sun Sep 18 16:28:26 2005
@@ -340,18 +340,9 @@
static char diag_pattern [80];
#endif
-/// option: use of stdout disabled
-static int _rw_opt_no_stdout = 0;
-
-// option: verbose diagnostic output
-static int _rw_opt_verbose = 0;
-
// option: use CSV format (comma separated values)
static int _rw_opt_csv = 0;
-// option: use RWTest compatibility format
-static int _rw_opt_compat = 0;
-
static char clause_id [80];
/************************************************************************/
@@ -382,9 +373,81 @@
/************************************************************************/
static int
-_rw_setopt_verbose (int argc, char *argv[])
+_rw_opt_brief (int argc, char *argv[])
+{
+ static int opt_brief;
+
+ if (0 == argc) {
+ // query mode: return the value of the option
+ return opt_brief;
+ }
+
+ if (1 == argc && argv && 0 == argv [0]) {
+ // help mode: set argv[0] to the text of the help message
+
+ static const char helpstr[] = {
+ "Enables brief mode.\n"
+ };
+
+ argv [0] = _RWSTD_CONST_CAST (char*, helpstr);
+
+ return 0;
+ }
+
+ // set mode: enable the option
+ opt_brief = 1;
+
+ return 0;
+}
+
+/************************************************************************/
+
+static int
+_rw_opt_quiet (int argc, char *argv[])
+{
+ static int opt_quiet;
+
+ if (0 == argc) {
+ // query mode: return the value of the option
+ return opt_quiet;
+ }
+
+ if (1 == argc && argv && 0 == argv [0]) {
+ // help mode: set argv[0] to the text of the help message
+
+ static const char helpstr[] = {
+ "Enables quiet mode.\n"
+ "In quiet mode only diagnostics with severity 7 and above are "
+ "issued."
+ };
+
+ argv [0] = _RWSTD_CONST_CAST (char*, helpstr);
+
+ return 0;
+ }
+
+ // set mode: enable the option
+ _rw_diag_mask = ~((1 << 7) | (1 << 8) | (1 << 9));
+ opt_quiet = 1;
+
+ return 0;
+}
+
+/************************************************************************/
+
+static int
+_rw_opt_verbose (int argc, char *argv[])
{
+ static int opt_verbose;
+
+ if (0 == argc) {
+ // query mode: return the value of the option
+ return opt_verbose;
+ }
+
if (1 == argc && argv && 0 == argv [0]) {
+ // help mode: set argv[0] to the text of the help message
+
static const char helpstr[] = {
"Enables verbose mode.\n"
};
@@ -394,7 +457,9 @@
return 0;
}
- _rw_opt_verbose = 1;
+ // set mode: enable the option
+ opt_verbose = 1;
+
return 0;
}
@@ -420,11 +485,20 @@
/************************************************************************/
static int
-_rw_setopt_compat (int argc, char *argv[])
+_rw_opt_compat (int argc, char *argv[])
{
+ static int opt_compat;
+
+ if (0 == argc) {
+ // query mode: return the value of the option
+ return opt_compat;
+ }
+
if (1 == argc && argv && 0 == argv [0]) {
+ // help mode: set argv[0] to the text of the help message
+
static const char helpstr[] = {
- "Enables RWTest compatiblity mode.\n"
+ "Enables RWTest-format compatibility mode.\n"
};
argv [0] = _RWSTD_CONST_CAST (char*, helpstr);
@@ -432,16 +506,27 @@
return 0;
}
- _rw_opt_compat = 1;
+ // set mode: enable the option
+ opt_compat = 1;
+
return 0;
}
/************************************************************************/
static int
-_rw_setopt_stdout (int argc, char *argv[])
+_rw_opt_no_stdout (int argc, char *argv[])
{
+ static int opt_no_stdout;
+
+ if (0 == argc) {
+ // query mode: return the value of the option
+ return opt_no_stdout;
+ }
+
if (1 == argc && argv && 0 == argv [0]) {
+ // help mode: set argv[0] to the text of the help message
+
static const char helpstr[] = {
"Prevents the program from using stdandard output for diagnostic\n"
"messages. Instead, the driver will create a log file with a name\n"
@@ -457,7 +542,9 @@
return 0;
}
- _rw_opt_no_stdout = 1;
+ // set mode: enable the option
+ opt_no_stdout = 1;
+
return 0;
}
@@ -504,9 +591,34 @@
return !(ftestout != 0);
}
+/************************************************************************/
+
_TEST_EXPORT int
rw_vsetopts (const char *opts, va_list va);
+/************************************************************************/
+
+static int
+_rw_use_color ()
+{
+#ifndef _RWSTD_NO_ISATTY
+
+ // is output sent to a terminal?
+ // if so, assume a vt100 compatible terminal for now
+ static const int tty = isatty (fileno (ftestout));
+
+#else // if defined (_RWSTD_NO_ISATTY)
+
+ // FIXME: deal with a missing isatty() and Windows
+ static const int tty = 0;
+
+#endif // _RWSTD_NO_ISATTY
+
+ return 0 != tty;
+}
+
+/************************************************************************/
+
_TEST_EXPORT int
rw_vtest (int argc, char **argv,
const char *file_name,
@@ -533,15 +645,19 @@
"|-csv "
"|-compat "
"o|-output:" // argument optional
+ "b|-brief "
+ "q|-quiet "
"v|-verbose",
- _rw_setopt_stdout,
+ _rw_opt_no_stdout,
_rw_setopt_diags,
_rw_setopt_trace,
_rw_setopt_trace_mask,
_rw_setopt_csv,
- _rw_setopt_compat,
+ _rw_opt_compat,
_rw_setopt_output_file,
- _rw_setopt_verbose,
+ _rw_opt_brief,
+ _rw_opt_quiet,
+ _rw_opt_verbose,
0);
if (3 > nopts) {
@@ -552,11 +668,11 @@
#ifndef _RWSTD_USE_CONFIG
- // enable RWTest compatibility mode
- _rw_setopt_compat (0, 0);
+ // enable RWTest-format compatibility mode
+ _rw_opt_compat (1, 0);
// disable output to stdout
- _rw_setopt_stdout (0, 0);
+ _rw_opt_no_stdout (1, 0);
#endif // _RWSTD_USE_CONFIG
@@ -571,7 +687,7 @@
if (0 == ftestout) {
- if (_rw_opt_no_stdout && file_name) {
+ if (_rw_opt_no_stdout (0, 0) && file_name) {
char fname [256];
const char* const slash = strrchr (file_name, _RWSTD_PATH_SEP);
@@ -628,7 +744,7 @@
fprintf (ftestout,
"# %s\n"
- "# | DIAGNOSTIC | ACTIVE | TOTAL | PASS |\n"
+ "# | DIAGNOSTIC | ACTIVE | TOTAL |INACTIVE|\n"
"# %s\n",
tblrow, tblrow);
@@ -648,10 +764,20 @@
const long pct = den ? num / den : 0;
+ const char* pfx = "";
+ const char* sfx = "";
+
+ static int use_color = _rw_use_color ();
+
+ if (use_color) {
+ pfx = ndiags [i][1] ? diag_msgs [i].esc_pfx : "";
+ sfx = ndiags [i][1] ? diag_msgs [i].esc_sfx : "";
+ }
+
fprintf (ftestout,
- "# | (S%d) %-*s | %6d | %6d | %5ld%% |\n",
+ "# | (S%d) %-*s |%s %6d %s| %6d | %5ld%% |\n",
i, int (sizeof diag_msgs [i].code), diag_msgs [i].code,
- ndiags [i][1], ndiags [i][0], pct);
+ pfx, ndiags [i][1], sfx, ndiags [i][0], pct);
}
}
@@ -660,7 +786,7 @@
fprintf (ftestout, "# %s\n", tblrow);
- if (_rw_opt_compat) {
+ if (_rw_opt_compat (0, 0)) {
// TO DO: get rid of this
@@ -796,14 +922,152 @@
/************************************************************************/
static void
-_rw_vdiag (diag_t diag, int severity, const char *file, int line,
- const char *fmt, va_list va)
+_rw_vissue_diag (diag_t diag, int severity, const char *file, int line,
+ const char *fmt, va_list va)
{
- CHECK_INIT (true, "_rw_vdiag()");
+ CHECK_INIT (true, "_rw_vissue_diag()");
if (0 == fmt)
fmt = "";
+ static char fmterr[] = "*** formatting error ***";
+
+ char *usrbuf = 0;
+ const int nchars = rw_vasnprintf (&usrbuf, 0, fmt, va);
+
+ if (nchars < 0 || 0 == usrbuf)
+ usrbuf = fmterr;
+
+ // compute the number of newline characters in the text
+ int nlines = 0;
+ for (const char *nl = usrbuf; (nl = strchr (nl, '\n')); ++nl)
+ ++nlines;
+
+ static const int use_color = _rw_use_color ();
+
+ const char* const diagstr[] = {
+ use_color ? diag_msgs [severity].esc_pfx : "",
+ *diag_msgs [severity].code ? diag_msgs [severity].code : "UNKNOWN",
+ use_color ? diag_msgs [severity].esc_sfx : "",
+ _rw_opt_verbose (0, 0) && *diag_msgs [severity].desc ?
+ diag_msgs [severity].desc : 0
+ };
+
+ const char* const traced_diag =
+ 0 == severity && diag_msgs [diag].code ? diag_msgs [diag].code : 0;
+
+ const char* const slash = file ? strrchr (file, _RWSTD_PATH_SEP) : 0;
+ if (slash)
+ file = slash + 1;
+
+ char *mybuf = 0;
+
+ if (_rw_opt_csv) {
+
+ // format all fields as comma separated values (CSV):
+ // -- a field containing the quote character, the comma,
+ // or the newline or linefeed character must be enclosed
+ // in a pair of double quotes
+ // -- every occurrence of the double quote character in a field
+ // must be escaped by prepening another double quote character
+ // to it
+
+ // escape all double quotes by prepending the double
+ // quote character to each according to the CSV format
+ char* const newbuf = _rw_escape (usrbuf, 0, '"');
+ if (newbuf != usrbuf) {
+ free (usrbuf);
+ usrbuf = newbuf;
+ }
+
+ mybuf =
+ rw_sprintfa ("%d, " // severity
+ "\"%s%s" // diagnostic
+ "%{?}_%s%{;}%s\", " // traced diagnostic
+ "\"%s\", " // clause
+ "\"%s\", " // file
+ "%d, " // line
+ "\"%s\"", // user text
+ severity,
+ diagstr [0], diagstr [1],
+ 0 != traced_diag, traced_diag, diagstr [2],
+ clause_id,
+ 0 != file ? file : "",
+ line,
+ usrbuf);
+ }
+ else {
+
+ nlines += 2 + ('\0' != *clause_id) + (0 != file) + (0 < line);
+
+ mybuf =
+ rw_sprintfa ("# %s" // escape prefix
+ "%s" // diagnostic
+ "%{?}_%s%{;}" // traced diagnostic
+ "%s " // escape suffix
+ "(S%d)" // severity
+ "%{?}, %s%{;} " // description
+ "(%d lines):\n" // number of lines
+ "# TEXT: %s\n" // user text
+ "%{?}# CLAUSE: %s\n%{;}" // clause if not empty
+ "%{?}# FILE: %s\n%{;}" // file if not null
+ "%{?}# LINE: %d\n%{;}", // line if positive
+ diagstr [0],
+ diagstr [1],
+ 0 != traced_diag, traced_diag,
+ diagstr [2],
+ severity,
+ 0 != diagstr [3], diagstr [3],
+ nlines,
+ usrbuf,
+ '\0' != *clause_id, clause_id,
+ 0 != file, file,
+ 0 < line, line);
+ }
+#if 0 // disabled
+ else {
+
+ mybuf =
+ rw_sprintfa ("# %s%s" // diagnostic
+ "%{?}_%s%{;}%s " // traced diagnostic
+ "(S%d): " // severity
+ "%{?}[%s] %{;}" // clause if not empty
+ "%{?}(%d lines): %{;}" // number of lines if > 1
+ "%{?}%s:" // if (file) then file
+ "%{?}%d:%{;} " // if (0 < line) line
+ "%{:}" // else
+ "%{?}line %d: %{;}" // if (0 < line) line
+ "%{;}" // endif
+ "%s", // user text
+ diagstr [0], diagstr [1],
+ 0 != traced_diag, traced_diag, diagstr [2],
+ severity,
+ '\0' != *clause_id, clause_id,
+ 1 < nlines, nlines,
+ 0 != file, file,
+ 0 < line, line,
+ 0 < line, line,
+ usrbuf);
+ }
+#endif // 0/1
+
+ fprintf (ftestout, "%s\n", mybuf);
+
+ if (mybuf != fmterr)
+ free (mybuf);
+
+ if (usrbuf != fmterr)
+ free (usrbuf);
+}
+
+/************************************************************************/
+
+static void
+_rw_vdiag (diag_t diag, int severity, const char *file, int line,
+ const char *fmt, va_list va)
+{
+ CHECK_INIT (true, "_rw_vdiag()");
+
// check if the diagnostic is expected
const int expected = 0 != _rw_expected (line);
@@ -845,149 +1109,11 @@
++ndiags [diag][1];
}
- if (0 == ((1 << severity) & _rw_diag_mask)) {
-
- assert (0 != fmt);
-
- static char fmterr[] = "*** formatting error ***";
-
- char *usrbuf = 0;
- const int nchars = rw_vasnprintf (&usrbuf, 0, fmt, va);
-
- if (nchars < 0 || 0 == usrbuf)
- usrbuf = fmterr;
-
- // compute the number of newline characters in the text
- int nlines = 0;
- for (const char *nl = usrbuf; (nl = strchr (nl, '\n')); ++nl)
- ++nlines;
-
-#ifndef _RWSTD_NO_ISATTY
-
- // is output sent to a terminal?
- // if so, assume a vt100 compatible terminal for now
- static const int tty = isatty (fileno (ftestout));
-
-#else // if defined (_RWSTD_NO_ISATTY)
-
- // FIXME: deal with a missing isatty() and Windows
- static const int tty = 0;
-
-#endif // _RWSTD_NO_ISATTY
+ const int sevbit = (1 << severity);
- const char* const diagstr[] = {
- tty ? diag_msgs [severity].esc_pfx : "",
- *diag_msgs [severity].code ? diag_msgs [severity].code : "UNKNOWN",
- tty ? diag_msgs [severity].esc_sfx : "",
- _rw_opt_verbose && *diag_msgs [severity].desc ?
- diag_msgs [severity].desc : 0
- };
-
- const char* const traced_diag =
- 0 == severity && diag_msgs [diag].code ? diag_msgs [diag].code : 0;
-
- const char* const slash = file ? strrchr (file, _RWSTD_PATH_SEP) : 0;
- if (slash)
- file = slash + 1;
-
- char *mybuf = 0;
-
- if (_rw_opt_csv) {
-
- // format all fields as comma separated values (CSV):
- // -- a field containing the quote character, the comma,
- // or the newline or linefeed character must be enclosed
- // in a pair of double quotes
- // -- every occurrence of the double quote character in a field
- // must be escaped by prepening another double quote character
- // to it
-
- // escape all double quotes by prepending the double
- // quote character to each according to the CSV format
- char* const newbuf = _rw_escape (usrbuf, 0, '"');
- if (newbuf != usrbuf) {
- free (usrbuf);
- usrbuf = newbuf;
- }
-
- mybuf =
- rw_sprintfa ("%d, " // severity
- "\"%s%s" // diagnostic
- "%{?}_%s%{;}%s\", " // traced diagnostic
- "\"%s\", " // clause
- "\"%s\", " // file
- "%d, " // line
- "\"%s\"", // user text
- severity,
- diagstr [0], diagstr [1],
- 0 != traced_diag, traced_diag, diagstr [2],
- clause_id,
- 0 != file ? file : "",
- line,
- usrbuf);
- }
- else {
-
- nlines += 2 + ('\0' != *clause_id) + (0 != file) + (0 < line);
-
- mybuf =
- rw_sprintfa ("# %s" // escape prefix
- "%s" // diagnostic
- "%{?}_%s%{;}" // traced diagnostic
- "%s " // escape suffix
- "(S%d)" // severity
- "%{?}, %s%{;} " // description
- "(%d lines):\n" // number of lines
- "# TEXT: %s\n" // user text
- "%{?}# CLAUSE: %s\n%{;}" // clause if not empty
- "%{?}# FILE: %s\n%{;}" // file if not null
- "%{?}# LINE: %d\n%{;}", // line if positive
- diagstr [0],
- diagstr [1],
- 0 != traced_diag, traced_diag,
- diagstr [2],
- severity,
- 0 != diagstr [3], diagstr [3],
- nlines,
- usrbuf,
- '\0' != *clause_id, clause_id,
- 0 != file, file,
- 0 < line, line);
- }
-#if 0
- else {
-
- mybuf =
- rw_sprintfa ("# %s%s" // diagnostic
- "%{?}_%s%{;}%s " // traced diagnostic
- "(S%d): " // severity
- "%{?}[%s] %{;}" // clause if not empty
- "%{?}(%d lines): %{;}" // number of lines if > 1
- "%{?}%s:" // if (file) then file
- "%{?}%d:%{;} " // if (0 < line) line
- "%{:}" // else
- "%{?}line %d: %{;}" // if (0 < line) line
- "%{;}" // endif
- "%s", // user text
- diagstr [0], diagstr [1],
- 0 != traced_diag, traced_diag, diagstr [2],
- severity,
- '\0' != *clause_id, clause_id,
- 1 < nlines, nlines,
- 0 != file, file,
- 0 < line, line,
- 0 < line, line,
- usrbuf);
- }
-#endif // 0/1
-
- fprintf (ftestout, "%s\n", mybuf);
-
- if (mybuf != fmterr)
- free (mybuf);
-
- if (usrbuf != fmterr)
- free (usrbuf);
+ if (0 == (sevbit & _rw_diag_mask)) {
+ // issue the diagnostic
+ _rw_vissue_diag (diag, severity, file, line, fmt, va);
}
if (diag_fatal == diag && severity) {