#include <u.h> | |
#include <libc.h> | |
double min = 1.0; | |
double max = 0.0; | |
double incr = 1.0; | |
int constant = 0; | |
int nsteps; | |
char *format; | |
void | |
usage(void) | |
{ | |
fprint(2, "usage: seq [-fformat] [-w] [first [incr]] last\n"); | |
exits("usage"); | |
} | |
void | |
buildfmt(void) | |
{ | |
char *dp; | |
int w, p, maxw, maxp; | |
static char fmt[16]; | |
char buf[32]; | |
double val; | |
format = "%g\n"; | |
if(!constant) | |
return; | |
maxw = 0; | |
maxp = 0; | |
for(val = min; val <= max; val += incr){ | |
sprint(buf, "%g", val); | |
if(strchr(buf, 'e')!=0) | |
return; | |
dp = strchr(buf,'.'); | |
w = dp==0? strlen(buf): dp-buf; | |
p = dp==0? 0: strlen(strchr(buf,'.')+1); | |
if(w>maxw) | |
maxw = w; | |
if(p>maxp) | |
maxp = p; | |
} | |
if(maxp > 0) | |
maxw += maxp+1; | |
sprint(fmt,"%%%d.%df\n", maxw, maxp); | |
format = fmt; | |
} | |
void | |
main(int argc, char *argv[]){ | |
int j, n; | |
char buf[256], ffmt[4096]; | |
double val; | |
ARGBEGIN{ | |
case 'w': | |
constant++; | |
break; | |
case 'f': | |
format = ARGF(); | |
if(format[strlen(format)-1] != '\n'){ | |
sprint(ffmt, "%s\n", format); | |
format = ffmt; | |
} | |
break; | |
default: | |
goto out; | |
}ARGEND | |
out: | |
if(argc<1 || argc>3) | |
usage(); | |
max = atof(argv[argc-1]); | |
if(argc > 1) | |
min = atof(argv[0]); | |
if(argc > 2) | |
incr = atof(argv[1]); | |
if(incr == 0){ | |
fprint(2, "seq: zero increment\n"); | |
exits("zero increment"); | |
} | |
if(!format) | |
buildfmt(); | |
if(incr > 0){ | |
for(val = min; val <= max; val += incr){ | |
n = sprint(buf, format, val); | |
if(constant) | |
for(j=0; buf[j]==' '; j++) | |
buf[j] ='0'; | |
write(1, buf, n); | |
} | |
}else{ | |
for(val = min; val >= max; val += incr){ | |
n = sprint(buf, format, val); | |
if(constant) | |
for(j=0; buf[j]==' '; j++) | |
buf[j] ='0'; | |
write(1, buf, n); | |
} | |
} | |
exits(0); | |
} |