]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/seq.c
git/branch: somewhere in the syncing, the fix for junk files was lost
[plan9front.git] / sys / src / cmd / seq.c
1 #include <u.h>
2 #include <libc.h>
3
4 double  min = 1.0;
5 double  max = 0.0;
6 double  incr = 1.0;
7 int     constant = 0;
8 int     nsteps;
9 char    *format;
10
11 void
12 usage(void)
13 {
14         fprint(2, "usage: seq [-fformat] [-w] [first [incr]] last\n");
15         exits("usage");
16 }
17
18 void
19 buildfmt(void)
20 {
21         char *dp;
22         int w, p, maxw, maxp;
23         static char fmt[16];
24         char buf[32];
25         double val;
26
27         format = "%g\n";
28         if(!constant)
29                 return;
30         maxw = 0;
31         maxp = 0;
32         for(val = min; val <= max; val += incr){
33                 sprint(buf, "%g", val);
34                 if(strchr(buf, 'e')!=0)
35                         return;
36                 dp = strchr(buf,'.');
37                 w = dp==0? strlen(buf): dp-buf;
38                 p = dp==0? 0: strlen(strchr(buf,'.')+1);
39                 if(w>maxw)
40                         maxw = w;
41                 if(p>maxp)
42                         maxp = p;
43         }
44         if(maxp > 0)
45                 maxw += maxp+1;
46         sprint(fmt,"%%%d.%df\n", maxw, maxp);
47         format = fmt;
48 }
49
50 void
51 main(int argc, char *argv[]){
52         int j, n;
53         char buf[256], ffmt[4096];
54         double val;
55
56         ARGBEGIN{
57         case 'w':
58                 constant++;
59                 break;
60         case 'f':
61                 format = EARGF(usage());
62                 if(format[strlen(format)-1] != '\n'){
63                         sprint(ffmt, "%s\n", format);
64                         format = ffmt;
65                 }
66                 break;
67         default:
68                 goto out;
69         }ARGEND
70     out:
71         if(argc<1 || argc>3)
72                 usage();
73         max = atof(argv[argc-1]);
74         if(argc > 1)
75                 min = atof(argv[0]);
76         if(argc > 2)
77                 incr = atof(argv[1]);
78         if(incr == 0){
79                 fprint(2, "seq: zero increment\n");
80                 exits("zero increment");
81         }
82         if(!format)
83                 buildfmt();
84         if(incr > 0){
85                 for(val = min; val <= max; val += incr){
86                         n = sprint(buf, format, val);
87                         if(constant)
88                                 for(j=0; buf[j]==' '; j++)
89                                         buf[j] ='0';
90                         write(1, buf, n);
91                 }
92         }else{
93                 for(val = min; val >= max; val += incr){
94                         n = sprint(buf, format, val);
95                         if(constant)
96                                 for(j=0; buf[j]==' '; j++)
97                                         buf[j] ='0';
98                         write(1, buf, n);
99                 }
100         }
101         exits(0);
102 }