seq.c (1683B)
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 = ARGF(); 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 }