123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #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);
- }
|