new utilities.
the .C files compile but are renamed to avoid building automatically.
diff --git a/src/cmd/seq.c b/src/cmd/seq.c
new file mode 100644
index 0000000..062bb8a
--- /dev/null
+++ b/src/cmd/seq.c
@@ -0,0 +1,92 @@
+#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)
+{
+	int i;
+	char *dp;
+	int w, p, maxw, maxp;
+	static char fmt[16];
+	char buf[32];
+
+	format = "%g\n";
+	if(!constant)
+		return;
+	maxw = 0;
+	maxp = 0;
+	for(i=0; i<=nsteps; i++){
+		sprint(buf, "%g", min+i*incr);
+		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 i, j, n;
+	char buf[256], ffmt[4096];
+
+	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");
+	}
+	nsteps = (max-min)/incr+.5;
+	if(!format)
+		buildfmt();
+	for(i=0; i<=nsteps; i++){
+		n = sprint(buf, format, min+i*incr);
+		if(constant)
+			for(j=0; buf[j]==' '; j++)
+				buf[j] ='0';
+		write(1, buf, n);
+	}
+	exits(0);
+}