summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Schubiger <schubiger@gmail.com>2008-02-18 22:39:22 +0100
committerJim Meyering <meyering@redhat.com>2008-02-19 15:41:16 +0100
commit4f3ff2e7007a6591294e1a656782b5f239f9840c (patch)
tree7ed8264c7566377c6730cddaaf3b47567e73151b
parenta1e715698a038af7ff341011a2aeecf6729c8de9 (diff)
downloadcoreutils-4f3ff2e7007a6591294e1a656782b5f239f9840c.tar.xz
seq: give better diagnostics for invalid formats.
* src/seq.c: (validate_format): New function. (main): Use it. * tests/misc/seq (fmt-d, fmt-e): Test for expected diagnostics with invalid formats. * NEWS: Mention this change. * TODO: Remove this item. [jm: src/seq.c: make diagnostics more consistent tests/misc/seq (fmt-eos1): adjust the expected diagnostic ]
-rw-r--r--NEWS2
-rw-r--r--TODO2
-rw-r--r--src/seq.c28
-rwxr-xr-xtests/misc/seq6
4 files changed, 35 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index daa5633b6..233e514d3 100644
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,8 @@ GNU coreutils NEWS -*- outline -*-
ls --color no longer outputs unnecessary escape sequences
+ seq gives better diagnostics for invalid formats.
+
** Consistency
mkdir and split now write --verbose output to stdout, not stderr.
diff --git a/TODO b/TODO
index 8c6b6fc1b..3f4d26c62 100644
--- a/TODO
+++ b/TODO
@@ -61,8 +61,6 @@ printf: consider adapting builtins/printf.def from bash
df: add `--total' option, suggested here http://bugs.debian.org/186007
-seq: give better diagnostics for invalid formats:
- e.g. no or too many % directives
seq: consider allowing format string to contain no %-directives
tail: don't use xlseek; it *exits*.
diff --git a/src/seq.c b/src/seq.c
index b073fd169..c7e8cb971 100644
--- a/src/seq.c
+++ b/src/seq.c
@@ -177,6 +177,33 @@ scan_arg (const char *arg)
return ret;
}
+/* Validate the format, FMT. Print a diagnostic and exit
+ if there is not exactly one %-directive. */
+
+static void
+validate_format (char const *fmt)
+{
+ unsigned int n_directives = 0;
+ char const *p;
+
+ for (p = fmt; *p; p++)
+ {
+ if (p[0] == '%' && p[1] != '%' && p[1] != '\0')
+ {
+ ++n_directives;
+ ++p;
+ }
+ }
+ if (! n_directives)
+ {
+ error (0, 0, _("no %% directive in format string %s"), quote (fmt));
+ usage (EXIT_FAILURE);
+ }
+ else if (1 < n_directives)
+ error (EXIT_FAILURE, 0, _("too many %% directives in format string %s"),
+ quote (fmt));
+}
+
/* If FORMAT is a valid printf format for a double argument, return
its long double equivalent, possibly allocated from dynamic
storage, and store into *LAYOUT a description of the output layout;
@@ -405,6 +432,7 @@ main (int argc, char **argv)
if (format_str)
{
+ validate_format (format_str);
char const *f = long_double_format (format_str, &layout);
if (! f)
{
diff --git a/tests/misc/seq b/tests/misc/seq
index 1a153a310..f48289bdf 100755
--- a/tests/misc/seq
+++ b/tests/misc/seq
@@ -87,10 +87,14 @@ my @Tests =
# "seq: memory exhausted". In coreutils-6.0..6.8, it would mistakenly
# succeed and print a blank line.
['fmt-eos1', qw(-f % 1), {EXIT => 1},
- {ERR => "seq: invalid format string: `%'\n" . $try_help }],
+ {ERR => "seq: no % directive in format string `%'\n" . $try_help }],
['fmt-eos2', qw(-f %g% 1), {EXIT => 1},
{ERR => "seq: invalid format string: `%g%'\n" . $try_help }],
+ ['fmt-d', qw(-f "" 1), {EXIT => 1},
+ {ERR => "seq: no % directive in format string `'\n" . $try_help }],
+ ['fmt-e', qw(-f %g%g 1), {EXIT => 1},
+ {ERR => "seq: too many % directives in format string `%g%g'\n"}],
);
# Append a newline to each entry in the OUT array.