9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

seq.c (1482B)


      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 	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
     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 }