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
usage(void)12 usage(void)
13 {
14 	fprint(2, "usage: seq [-fformat] [-w] [first [incr]] last\n");
15 	exits("usage");
16 }
17 
18 void
buildfmt(void)19 buildfmt(void)
20 {
21 	int i;
22 	char *dp;
23 	int w, p, maxw, maxp;
24 	static char fmt[16];
25 	char buf[32];
26 
27 	format = "%g\n";
28 	if(!constant)
29 		return;
30 	maxw = 0;
31 	maxp = 0;
32 	for(i=0; i<=nsteps; i++){
33 		sprint(buf, "%g", min+i*incr);
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
main(int argc,char * argv[])51 main(int argc, char *argv[]){
52 	int i, j, n;
53 	char buf[256], ffmt[4096];
54 
55 	ARGBEGIN{
56 	case 'w':
57 		constant++;
58 		break;
59 	case 'f':
60 		format = ARGF();
61 		if(format[strlen(format)-1] != '\n'){
62 			sprint(ffmt, "%s\n", format);
63 			format = ffmt;
64 		}
65 		break;
66 	default:
67 		goto out;
68 	}ARGEND
69     out:
70 	if(argc<1 || argc>3)
71 		usage();
72 	max = atof(argv[argc-1]);
73 	if(argc > 1)
74 		min = atof(argv[0]);
75 	if(argc > 2)
76 		incr = atof(argv[1]);
77 	if(incr == 0){
78 		fprint(2, "seq: zero increment\n");
79 		exits("zero increment");
80 	}
81 	nsteps = (max-min)/incr+.5;
82 	if(!format)
83 		buildfmt();
84 	for(i=0; i<=nsteps; i++){
85 		n = sprint(buf, format, min+i*incr);
86 		if(constant)
87 			for(j=0; buf[j]==' '; j++)
88 				buf[j] ='0';
89 		write(1, buf, n);
90 	}
91 	exits(0);
92 }
93