899cd696bc68416d80bd7d610308719c21a65630
[oweals/busybox.git] / coreutils / seq.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * seq implementation for busybox
4  *
5  * Copyright (C) 2004, Glenn McGrath
6  *
7  * Licensed under the GPL v2, see the file LICENSE in this tarball.
8  */
9
10 #include "libbb.h"
11
12 /* This is a NOFORK applet. Be very careful! */
13
14
15 int seq_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
16 int seq_main(int argc, char **argv)
17 {
18         double last, increment, i;
19         enum { OPT_w = 1 };
20         unsigned opt = getopt32(argv, "+w");
21         unsigned width = 0;
22
23         argc -= optind;
24         argv += optind;
25         i = increment = 1;
26         switch (argc) {
27                 case 3:
28                         increment = atof(argv[1]);
29                 case 2:
30                         i = atof(*argv);
31                 case 1:
32                         last = atof(argv[argc-1]);
33                         break;
34                 default:
35                         bb_show_usage();
36         }
37         if (opt & OPT_w) /* Pad to length of start or last */
38                 width = MAX(strlen(*argv), strlen(argv[argc-1]));
39
40         /* You should note that this is pos-5.0.91 semantics, -- FK. */
41         while ((increment > 0 && i <= last) || (increment < 0 && i >= last)) {
42                 printf("%0*g\n", width, i);
43                 i += increment;
44         }
45
46         return fflush(stdout);
47 }