13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier double min = 1.0; 53e12c5d1SDavid du Colombier double max = 0.0; 63e12c5d1SDavid du Colombier double incr = 1.0; 73e12c5d1SDavid du Colombier int constant = 0; 83e12c5d1SDavid du Colombier int nsteps; 93e12c5d1SDavid du Colombier char *format; 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier void 123e12c5d1SDavid du Colombier usage(void) 133e12c5d1SDavid du Colombier { 143e12c5d1SDavid du Colombier fprint(2, "usage: seq [-fformat] [-w] [first [incr]] last\n"); 153e12c5d1SDavid du Colombier exits("usage"); 163e12c5d1SDavid du Colombier } 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier void 193e12c5d1SDavid du Colombier buildfmt(void) 203e12c5d1SDavid du Colombier { 213e12c5d1SDavid du Colombier char *dp; 223e12c5d1SDavid du Colombier int w, p, maxw, maxp; 233e12c5d1SDavid du Colombier static char fmt[16]; 243e12c5d1SDavid du Colombier char buf[32]; 25*39734e7eSDavid du Colombier double val; 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier format = "%g\n"; 283e12c5d1SDavid du Colombier if(!constant) 293e12c5d1SDavid du Colombier return; 303e12c5d1SDavid du Colombier maxw = 0; 313e12c5d1SDavid du Colombier maxp = 0; 32*39734e7eSDavid du Colombier for(val = min; val <= max; val += incr){ 33*39734e7eSDavid du Colombier sprint(buf, "%g", val); 343e12c5d1SDavid du Colombier if(strchr(buf, 'e')!=0) 353e12c5d1SDavid du Colombier return; 363e12c5d1SDavid du Colombier dp = strchr(buf,'.'); 373e12c5d1SDavid du Colombier w = dp==0? strlen(buf): dp-buf; 383e12c5d1SDavid du Colombier p = dp==0? 0: strlen(strchr(buf,'.')+1); 393e12c5d1SDavid du Colombier if(w>maxw) 403e12c5d1SDavid du Colombier maxw = w; 413e12c5d1SDavid du Colombier if(p>maxp) 423e12c5d1SDavid du Colombier maxp = p; 433e12c5d1SDavid du Colombier } 443e12c5d1SDavid du Colombier if(maxp > 0) 453e12c5d1SDavid du Colombier maxw += maxp+1; 463e12c5d1SDavid du Colombier sprint(fmt,"%%%d.%df\n", maxw, maxp); 473e12c5d1SDavid du Colombier format = fmt; 483e12c5d1SDavid du Colombier } 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier void 513e12c5d1SDavid du Colombier main(int argc, char *argv[]){ 52*39734e7eSDavid du Colombier int j, n; 533e12c5d1SDavid du Colombier char buf[256], ffmt[4096]; 54*39734e7eSDavid du Colombier double val; 553e12c5d1SDavid du Colombier 563e12c5d1SDavid du Colombier ARGBEGIN{ 573e12c5d1SDavid du Colombier case 'w': 583e12c5d1SDavid du Colombier constant++; 593e12c5d1SDavid du Colombier break; 603e12c5d1SDavid du Colombier case 'f': 613e12c5d1SDavid du Colombier format = ARGF(); 623e12c5d1SDavid du Colombier if(format[strlen(format)-1] != '\n'){ 633e12c5d1SDavid du Colombier sprint(ffmt, "%s\n", format); 643e12c5d1SDavid du Colombier format = ffmt; 653e12c5d1SDavid du Colombier } 663e12c5d1SDavid du Colombier break; 673e12c5d1SDavid du Colombier default: 683e12c5d1SDavid du Colombier goto out; 693e12c5d1SDavid du Colombier }ARGEND 703e12c5d1SDavid du Colombier out: 713e12c5d1SDavid du Colombier if(argc<1 || argc>3) 723e12c5d1SDavid du Colombier usage(); 733e12c5d1SDavid du Colombier max = atof(argv[argc-1]); 743e12c5d1SDavid du Colombier if(argc > 1) 753e12c5d1SDavid du Colombier min = atof(argv[0]); 763e12c5d1SDavid du Colombier if(argc > 2) 773e12c5d1SDavid du Colombier incr = atof(argv[1]); 783e12c5d1SDavid du Colombier if(incr == 0){ 793e12c5d1SDavid du Colombier fprint(2, "seq: zero increment\n"); 803e12c5d1SDavid du Colombier exits("zero increment"); 813e12c5d1SDavid du Colombier } 823e12c5d1SDavid du Colombier if(!format) 833e12c5d1SDavid du Colombier buildfmt(); 84*39734e7eSDavid du Colombier for(val = min; val <= max; val += incr){ 85*39734e7eSDavid du Colombier n = sprint(buf, format, val); 863e12c5d1SDavid du Colombier if(constant) 873e12c5d1SDavid du Colombier for(j=0; buf[j]==' '; j++) 883e12c5d1SDavid du Colombier buf[j] ='0'; 893e12c5d1SDavid du Colombier write(1, buf, n); 903e12c5d1SDavid du Colombier } 913e12c5d1SDavid du Colombier exits(0); 923e12c5d1SDavid du Colombier } 93