Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/seq.c


Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/coreutils/seq.c

    r1765 r2725  
    55 * Copyright (C) 2004, Glenn McGrath
    66 *
    7  * Licensed under the GPL v2, see the file LICENSE in this tarball.
     7 * Licensed under GPLv2, see file LICENSE in this source tree.
    88 */
    9 
    109#include "libbb.h"
    1110
    1211/* This is a NOFORK applet. Be very careful! */
    1312
    14 
    15 int seq_main(int argc, char **argv);
     13int seq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
    1614int seq_main(int argc, char **argv)
    1715{
    18     double last, increment, i;
     16    enum {
     17        OPT_w = (1 << 0),
     18        OPT_s = (1 << 1),
     19    };
     20    double first, last, increment, v;
     21    unsigned n;
     22    unsigned width;
     23    unsigned frac_part;
     24    const char *sep, *opt_s = "\n";
     25    unsigned opt;
    1926
    20     i = increment = 1;
     27#if ENABLE_LOCALE_SUPPORT
     28    /* Undo busybox.c: on input, we want to use dot
     29     * as fractional separator, regardless of current locale */
     30    setlocale(LC_NUMERIC, "C");
     31#endif
     32
     33    opt = getopt32(argv, "+ws:", &opt_s);
     34    argc -= optind;
     35    argv += optind;
     36    first = increment = 1;
     37    errno = 0;
    2138    switch (argc) {
    22         case 4:
    23             increment = atof(argv[2]);
     39            char *pp;
    2440        case 3:
    25             i = atof(argv[1]);
     41            increment = strtod(argv[1], &pp);
     42            errno |= *pp;
    2643        case 2:
    27             last = atof(argv[argc-1]);
    28             break;
     44            first = strtod(argv[0], &pp);
     45            errno |= *pp;
     46        case 1:
     47            last = strtod(argv[argc-1], &pp);
     48            if (!errno && *pp == '\0')
     49                break;
    2950        default:
    3051            bb_show_usage();
    3152    }
    3253
    33     /* You should note that this is pos-5.0.91 semantics, -- FK. */
    34     while ((increment > 0 && i <= last) || (increment < 0 && i >= last)) {
    35         printf("%g\n", i);
    36         i += increment;
     54#if ENABLE_LOCALE_SUPPORT
     55    setlocale(LC_NUMERIC, "");
     56#endif
     57
     58    /* Last checked to be compatible with: coreutils-6.10 */
     59    width = 0;
     60    frac_part = 0;
     61    while (1) {
     62        char *dot = strchrnul(*argv, '.');
     63        int w = (dot - *argv);
     64        int f = strlen(dot);
     65        if (width < w)
     66            width = w;
     67        argv++;
     68        if (!*argv)
     69            break;
     70        /* Why do the above _before_ frac check below?
     71         * Try "seq 1 2.0" and "seq 1.0 2.0":
     72         * coreutils never pay attention to the number
     73         * of fractional digits in last arg. */
     74        if (frac_part < f)
     75            frac_part = f;
    3776    }
     77    if (frac_part) {
     78        frac_part--;
     79        if (frac_part)
     80            width += frac_part + 1;
     81    }
     82    if (!(opt & OPT_w))
     83        width = 0;
    3884
    39     return fflush(stdout);
     85    sep = "";
     86    v = first;
     87    n = 0;
     88    while (increment >= 0 ? v <= last : v >= last) {
     89        if (printf("%s%0*.*f", sep, width, frac_part, v) < 0)
     90            break; /* I/O error, bail out (yes, this really happens) */
     91        sep = opt_s;
     92        /* v += increment; - would accumulate floating point errors */
     93        n++;
     94        v = first + n * increment;
     95    }
     96    if (n) /* if while loop executed at least once */
     97        bb_putchar('\n');
     98
     99    return fflush_all();
    40100}
Note: See TracChangeset for help on using the changeset viewer.