Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/coreutils/seq.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/coreutils/seq.c
r1765 r2725 5 5 * Copyright (C) 2004, Glenn McGrath 6 6 * 7 * Licensed under the GPL v2, see the file LICENSE in this tarball.7 * Licensed under GPLv2, see file LICENSE in this source tree. 8 8 */ 9 10 9 #include "libbb.h" 11 10 12 11 /* This is a NOFORK applet. Be very careful! */ 13 12 14 15 int seq_main(int argc, char **argv); 13 int seq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 16 14 int seq_main(int argc, char **argv) 17 15 { 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; 19 26 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; 21 38 switch (argc) { 22 case 4: 23 increment = atof(argv[2]); 39 char *pp; 24 40 case 3: 25 i = atof(argv[1]); 41 increment = strtod(argv[1], &pp); 42 errno |= *pp; 26 43 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; 29 50 default: 30 51 bb_show_usage(); 31 52 } 32 53 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; 37 76 } 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; 38 84 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(); 40 100 }
Note:
See TracChangeset
for help on using the changeset viewer.