diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-15 09:16:27 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-15 09:16:27 +0200 |
| commit | cd3dd42c28832da92ee0d4d3afe7cf722e38f80c (patch) | |
| tree | 6c97c10fb539f2d8cb8d3f34eff73ac6bcecf70b | |
| parent | 82a6fb3ea6b49bcf1ef21ab589179ee2d6ffdc09 (diff) | |
| download | busybox-w32-cd3dd42c28832da92ee0d4d3afe7cf722e38f80c.tar.gz busybox-w32-cd3dd42c28832da92ee0d4d3afe7cf722e38f80c.tar.bz2 busybox-w32-cd3dd42c28832da92ee0d4d3afe7cf722e38f80c.zip | |
seq: fix testsuite failures
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | coreutils/seq.c | 67 | ||||
| -rw-r--r-- | docs/posix_conformance.txt | 2 | ||||
| -rwxr-xr-x | testsuite/runtest | 10 | ||||
| -rwxr-xr-x | testsuite/seq.tests | 14 |
4 files changed, 66 insertions, 27 deletions
diff --git a/coreutils/seq.c b/coreutils/seq.c index 4b853c698..bb39a5b54 100644 --- a/coreutils/seq.c +++ b/coreutils/seq.c | |||
| @@ -6,12 +6,10 @@ | |||
| 6 | * | 6 | * |
| 7 | * Licensed under the GPL v2, see the file LICENSE in this tarball. | 7 | * Licensed under the GPL v2, see the file LICENSE in this tarball. |
| 8 | */ | 8 | */ |
| 9 | |||
| 10 | #include "libbb.h" | 9 | #include "libbb.h" |
| 11 | 10 | ||
| 12 | /* This is a NOFORK applet. Be very careful! */ | 11 | /* This is a NOFORK applet. Be very careful! */ |
| 13 | 12 | ||
| 14 | |||
| 15 | int seq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 13 | int seq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 16 | int seq_main(int argc, char **argv) | 14 | int seq_main(int argc, char **argv) |
| 17 | { | 15 | { |
| @@ -19,35 +17,72 @@ int seq_main(int argc, char **argv) | |||
| 19 | OPT_w = (1 << 0), | 17 | OPT_w = (1 << 0), |
| 20 | OPT_s = (1 << 1), | 18 | OPT_s = (1 << 1), |
| 21 | }; | 19 | }; |
| 22 | double last, increment, i; | 20 | double first, last, increment, v; |
| 21 | unsigned n; | ||
| 22 | unsigned width; | ||
| 23 | unsigned frac_part; | ||
| 23 | const char *sep, *opt_s = "\n"; | 24 | const char *sep, *opt_s = "\n"; |
| 24 | unsigned opt = getopt32(argv, "+ws:", &opt_s); | 25 | unsigned opt = getopt32(argv, "+ws:", &opt_s); |
| 25 | unsigned width = 0; | ||
| 26 | 26 | ||
| 27 | argc -= optind; | 27 | argc -= optind; |
| 28 | argv += optind; | 28 | argv += optind; |
| 29 | i = increment = 1; | 29 | first = increment = 1; |
| 30 | errno = 0; | ||
| 30 | switch (argc) { | 31 | switch (argc) { |
| 32 | char *pp; | ||
| 31 | case 3: | 33 | case 3: |
| 32 | increment = atof(argv[1]); | 34 | increment = strtod(argv[1], &pp); |
| 35 | errno |= *pp; | ||
| 33 | case 2: | 36 | case 2: |
| 34 | i = atof(*argv); | 37 | first = strtod(argv[0], &pp); |
| 38 | errno |= *pp; | ||
| 35 | case 1: | 39 | case 1: |
| 36 | last = atof(argv[argc-1]); | 40 | last = strtod(argv[argc-1], &pp); |
| 37 | break; | 41 | if (!errno && *pp == '\0') |
| 42 | break; | ||
| 38 | default: | 43 | default: |
| 39 | bb_show_usage(); | 44 | bb_show_usage(); |
| 40 | } | 45 | } |
| 41 | if (opt & OPT_w) /* Pad to length of start or last */ | ||
| 42 | width = MAX(strlen(*argv), strlen(argv[argc-1])); | ||
| 43 | 46 | ||
| 44 | /* You should note that this is pos-5.0.91 semantics, -- FK. */ | 47 | /* Last checked to be compatible with: coreutils-6.10 */ |
| 48 | width = 0; | ||
| 49 | frac_part = 0; | ||
| 50 | while (1) { | ||
| 51 | char *dot = strchrnul(*argv, '.'); | ||
| 52 | int w = (dot - *argv); | ||
| 53 | int f = strlen(dot); | ||
| 54 | if (width < w) | ||
| 55 | width = w; | ||
| 56 | argv++; | ||
| 57 | if (!*argv) | ||
| 58 | break; | ||
| 59 | /* Why do the above _before_ frac check below? | ||
| 60 | * Try "seq 1 2.0" and "seq 1.0 2.0": | ||
| 61 | * coreutils never pay attention to the number | ||
| 62 | * of fractional digits in last arg. */ | ||
| 63 | if (frac_part < f) | ||
| 64 | frac_part = f; | ||
| 65 | } | ||
| 66 | if (frac_part) { | ||
| 67 | frac_part--; | ||
| 68 | if (frac_part) | ||
| 69 | width += frac_part + 1; | ||
| 70 | } | ||
| 71 | if (!(opt & OPT_w)) | ||
| 72 | width = 0; | ||
| 73 | |||
| 45 | sep = ""; | 74 | sep = ""; |
| 46 | while ((increment > 0 && i <= last) || (increment < 0 && i >= last)) { | 75 | v = first; |
| 47 | printf("%s%0*g", sep, width, i); | 76 | n = 0; |
| 77 | while (increment >= 0 ? v <= last : v >= last) { | ||
| 78 | printf("%s%0*.*f", sep, width, frac_part, v); | ||
| 48 | sep = opt_s; | 79 | sep = opt_s; |
| 49 | i += increment; | 80 | /* v += increment; - would accumulate floating point errors */ |
| 81 | n++; | ||
| 82 | v = first + n * increment; | ||
| 50 | } | 83 | } |
| 51 | bb_putchar('\n'); | 84 | if (n) /* if while loop executed at least once */ |
| 85 | bb_putchar('\n'); | ||
| 86 | |||
| 52 | return fflush(stdout); | 87 | return fflush(stdout); |
| 53 | } | 88 | } |
diff --git a/docs/posix_conformance.txt b/docs/posix_conformance.txt index a9176f503..5451a322d 100644 --- a/docs/posix_conformance.txt +++ b/docs/posix_conformance.txt | |||
| @@ -189,7 +189,7 @@ df POSIX options | |||
| 189 | df Busybox specific options: | 189 | df Busybox specific options: |
| 190 | -a, -m, -B SIZE, -i, -h | 190 | -a, -m, -B SIZE, -i, -h |
| 191 | Remark: | 191 | Remark: |
| 192 | - It seems that GNU df doesnt rount percents up in its output (thus its results are a bit different) | 192 | - It seems that GNU df does not round percents up in its output (thus its results are a bit different) |
| 193 | 193 | ||
| 194 | diff POSIX options | 194 | diff POSIX options |
| 195 | option | exists | compliant | remarks | 195 | option | exists | compliant | remarks |
diff --git a/testsuite/runtest b/testsuite/runtest index cade871a2..2d60591fb 100755 --- a/testsuite/runtest +++ b/testsuite/runtest | |||
| @@ -120,11 +120,13 @@ fi | |||
| 120 | 120 | ||
| 121 | # Populate a directory with links to all busybox applets | 121 | # Populate a directory with links to all busybox applets |
| 122 | 122 | ||
| 123 | # Note: if $LINKSDIR/applet exists, we do not overwrite it. | ||
| 124 | # Useful if one wants to run tests against a standard utility, not an applet. | ||
| 123 | LINKSDIR="$bindir/runtest-tempdir-links" | 125 | LINKSDIR="$bindir/runtest-tempdir-links" |
| 124 | rm -rf "$LINKSDIR" 2>/dev/null | 126 | #rm -rf "$LINKSDIR" 2>/dev/null |
| 125 | mkdir "$LINKSDIR" | 127 | mkdir "$LINKSDIR" 2>/dev/null |
| 126 | for i in $implemented; do | 128 | for i in $implemented; do |
| 127 | ln -s "$bindir/busybox" "$LINKSDIR/$i" | 129 | ln -s "$bindir/busybox" "$LINKSDIR/$i" 2>/dev/null |
| 128 | done | 130 | done |
| 129 | 131 | ||
| 130 | # Set up option flags so tests can be selective. | 132 | # Set up option flags so tests can be selective. |
| @@ -142,7 +144,7 @@ for applet in $applets; do | |||
| 142 | 144 | ||
| 143 | # Is this a new-style test? | 145 | # Is this a new-style test? |
| 144 | if [ -f "$applet.tests" ]; then | 146 | if [ -f "$applet.tests" ]; then |
| 145 | if [ ! -h "$LINKSDIR/$applet" ]; then | 147 | if [ ! -e "$LINKSDIR/$applet" ]; then |
| 146 | # (avoiding bash'ism "${applet:0:4}") | 148 | # (avoiding bash'ism "${applet:0:4}") |
| 147 | if ! echo "$applet" | grep "^all_" >/dev/null; then | 149 | if ! echo "$applet" | grep "^all_" >/dev/null; then |
| 148 | echo "SKIPPED: $applet (not built)" | 150 | echo "SKIPPED: $applet (not built)" |
diff --git a/testsuite/seq.tests b/testsuite/seq.tests index 4e43d0ee1..817e1a724 100755 --- a/testsuite/seq.tests +++ b/testsuite/seq.tests | |||
| @@ -29,16 +29,18 @@ testing "seq count up by 2" "seq 4 2 8" "4\n6\n8\n" "" "" | |||
| 29 | testing "seq count down by 2" "seq 8 -2 4" "8\n6\n4\n" "" "" | 29 | testing "seq count down by 2" "seq 8 -2 4" "8\n6\n4\n" "" "" |
| 30 | testing "seq count wrong way #1" "seq 4 -2 8" "" "" "" | 30 | testing "seq count wrong way #1" "seq 4 -2 8" "" "" "" |
| 31 | testing "seq count wrong way #2" "seq 8 2 4" "" "" "" | 31 | testing "seq count wrong way #2" "seq 8 2 4" "" "" "" |
| 32 | # Fails: first item is printed as 3, not 3.0 | ||
| 33 | # note: makes sense to fix "seq 3 .30 4" case as well | ||
| 34 | testing "seq count by .3" "seq 3 .3 4" "3.0\n3.3\n3.6\n3.9\n" "" "" | 32 | testing "seq count by .3" "seq 3 .3 4" "3.0\n3.3\n3.6\n3.9\n" "" "" |
| 35 | testing "seq count by -.9" "seq .7 -.9 -2.2" "0.7\n-0.2\n-1.1\n-2\n" "" "" | 33 | testing "seq count by .30" "seq 3 .30 4" "3.00\n3.30\n3.60\n3.90\n" "" "" |
| 36 | testing "seq count by zero" "seq 4 0 8 | head -n 10" "" "" "" | 34 | testing "seq count by .30 to 4.000" "seq 3 .30 4.000" "3.00\n3.30\n3.60\n3.90\n" "" "" |
| 35 | testing "seq count by -.9" "seq .7 -.9 -2.2" "0.7\n-0.2\n-1.1\n-2.0\n" "" "" | ||
| 36 | testing "seq count by zero" "seq 4 0 8 | head -n 10" "4\n4\n4\n4\n4\n4\n4\n4\n4\n4\n" "" "" | ||
| 37 | 37 | ||
| 38 | testing "seq one argument with padding" "seq -w 003" "001\n002\n003\n" "" "" | 38 | testing "seq one argument with padding" "seq -w 003" "001\n002\n003\n" "" "" |
| 39 | testing "seq two arguments with padding" "seq -w 005 7" "005\n006\n007\n" "" "" | 39 | testing "seq two arguments with padding" "seq -w 005 7" "005\n006\n007\n" "" "" |
| 40 | testing "seq count down by 3 with padding" "seq -w 8 -3 04" "08\n05\n" "" "" | 40 | testing "seq count down by 3 with padding" "seq -w 8 -3 04" "08\n05\n" "" "" |
| 41 | # Known to fail | 41 | # Looks like a bug in coreutils 6.10: it uses width one less than needed |
| 42 | testing "seq count by .3 with padding" "seq -w 03 .3 0004" "003.0\n003.3\n003.6\n003.9\n" "" "" | 42 | # These tests contain the expected "fixed" output |
| 43 | testing "seq count by .3 with padding 1" "seq -w 09 .3 11" "09.0\n09.3\n09.6\n09.9\n10.2\n10.5\n10.8\n" "" "" | ||
| 44 | testing "seq count by .3 with padding 2" "seq -w 03 .3 0004" "0003.0\n0003.3\n0003.6\n0003.9\n" "" "" | ||
| 43 | 45 | ||
| 44 | exit $FAILCOUNT | 46 | exit $FAILCOUNT |
