Reorg
diff --git a/src/cmd/mk/Make.FreeBSD-386 b/src/cmd/mk/Make.FreeBSD-386
deleted file mode 100644
index 087ed3a..0000000
--- a/src/cmd/mk/Make.FreeBSD-386
+++ /dev/null
@@ -1,7 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I. -I$(PREFIX)/include
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O	# default, can be overriden by Make.$(SYSNAME)
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.HP-UX-9000 b/src/cmd/mk/Make.HP-UX-9000
deleted file mode 100644
index edbdc11..0000000
--- a/src/cmd/mk/Make.HP-UX-9000
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS=-O -c -Ae -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.Linux-386 b/src/cmd/mk/Make.Linux-386
deleted file mode 100644
index 74b0252..0000000
--- a/src/cmd/mk/Make.Linux-386
+++ /dev/null
@@ -1,7 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O	# default, can be overriden by Make.$(SYSNAME)
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.OSF1-alpha b/src/cmd/mk/Make.OSF1-alpha
deleted file mode 100644
index 3d45279..0000000
--- a/src/cmd/mk/Make.OSF1-alpha
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS+=-g -c -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.SunOS-sun4u b/src/cmd/mk/Make.SunOS-sun4u
deleted file mode 100644
index c5fe67b..0000000
--- a/src/cmd/mk/Make.SunOS-sun4u
+++ /dev/null
@@ -1,2 +0,0 @@
-include Make.SunOS-sun4u-$(CC)
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.SunOS-sun4u-cc b/src/cmd/mk/Make.SunOS-sun4u-cc
deleted file mode 100644
index 829301d..0000000
--- a/src/cmd/mk/Make.SunOS-sun4u-cc
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS+=-g -c -I. -O
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/mk/Make.SunOS-sun4u-gcc b/src/cmd/mk/Make.SunOS-sun4u-gcc
deleted file mode 100644
index 5c41594..0000000
--- a/src/cmd/mk/Make.SunOS-sun4u-gcc
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/mk/Makefile b/src/cmd/mk/Makefile
index df21b60..4a71846 100644
--- a/src/cmd/mk/Makefile
+++ b/src/cmd/mk/Makefile
@@ -1,27 +1,7 @@
-
-# this works in gnu make
-SYSNAME:=${shell uname}
-OBJTYPE:=${shell uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'}
-
-# this works in bsd make
-SYSNAME!=uname
-OBJTYPE!=uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'
-
-# the gnu rules will mess up bsd but not vice versa,
-# hence the gnu rules come first.
-
-include Make.$(SYSNAME)-$(OBJTYPE)
-
-PREFIX=/usr/local
-
-NUKEFILES=
-
-TGZFILES=
+9SRC=..
+include $(9SRC)/Makehdr
 
 TARG=mk
-VERSION=2.0
-PORTPLACE=devel/mk
-NAME=mk
 
 OFILES=\
 	arc.$O\
@@ -51,67 +31,7 @@
 	mk.h\
 	fns.h\
 
-all: $(TARG)
+LDFLAGS+=-lregexp9 -lbio -lfmt -lutf
 
-TGZFILES+=mk.pdf
+include $(9SRC)/Makeone
 
-install: $(LIB)
-	test -d $(PREFIX)/man/man1 || mkdir $(PREFIX)/man/man1
-	test -d $(PREFIX)/doc || mkdir $(PREFIX)/doc
-	install -m 0755 mk $(PREFIX)/bin/mk
-	cat mk.1 | sed 's;DOCPREFIX;$(PREFIX);g' >mk.1a
-	install -m 0644 mk.1a $(PREFIX)/man/man1/mk.1
-	install -m 0644 mk.pdf $(PREFIX)/doc/mk.pdf
-
-
-$(TARG): $(OFILES)
-	$(CC) -o $(TARG) $(OFILES) -L$(PREFIX)/lib -lregexp9 -lbio -lfmt -lutf
-
-
-.c.$O:
-	$(CC) $(CFLAGS) -I$(PREFIX)/include $*.c
-
-%.$O: %.c
-	$(CC) $(CFLAGS) -I$(PREFIX)/include $*.c
-
-
-$(OFILES): $(HFILES)
-
-tgz:
-	rm -rf $(NAME)-$(VERSION)
-	mkdir $(NAME)-$(VERSION)
-	cp Makefile Make.* README LICENSE NOTICE *.[ch137] rpm.spec bundle.ports $(TGZFILES) $(NAME)-$(VERSION)
-	tar cf - $(NAME)-$(VERSION) | gzip >$(NAME)-$(VERSION).tgz
-	rm -rf $(NAME)-$(VERSION)
-
-clean:
-	rm -f $(OFILES) $(LIB)
-
-nuke:
-	rm -f $(OFILES) *.tgz *.rpm $(NUKEFILES)
-
-rpm:
-	make tgz
-	cp $(NAME)-$(VERSION).tgz /usr/src/RPM/SOURCES
-	rpm -ba rpm.spec
-	cp /usr/src/RPM/SRPMS/$(NAME)-$(VERSION)-1.src.rpm .
-	cp /usr/src/RPM/RPMS/i586/$(NAME)-$(VERSION)-1.i586.rpm .
-	scp *.rpm rsc@amsterdam.lcs.mit.edu:public_html/software
-
-PORTDIR=/usr/ports/$(PORTPLACE)
-
-ports:
-	make tgz
-	rm -rf $(PORTDIR)
-	mkdir $(PORTDIR)
-	cp $(NAME)-$(VERSION).tgz /usr/ports/distfiles
-	cat bundle.ports | (cd $(PORTDIR) && awk '$$1=="---" && $$3=="---" { ofile=$$2; next} {if(ofile) print >ofile}')
-	(cd $(PORTDIR); make makesum)
-	(cd $(PORTDIR); make)
-	(cd $(PORTDIR); /usr/local/bin/portlint)
-	rm -rf $(PORTDIR)/work
-	shar `find $(PORTDIR)` > ports.shar
-	(cd $(PORTDIR); tar cf - *) | gzip >$(NAME)-$(VERSION)-ports.tgz
-	scp *.tgz rsc@amsterdam.lcs.mit.edu:public_html/software
-
-.phony: all clean nuke install tgz rpm ports
diff --git a/src/cmd/mk/Makefile.MID b/src/cmd/mk/Makefile.MID
deleted file mode 100644
index f840b18..0000000
--- a/src/cmd/mk/Makefile.MID
+++ /dev/null
@@ -1,45 +0,0 @@
-TARG=mk
-VERSION=2.0
-PORTPLACE=devel/mk
-NAME=mk
-
-OFILES=\
-	arc.$O\
-	archive.$O\
-	bufblock.$O\
-	env.$O\
-	file.$O\
-	graph.$O\
-	job.$O\
-	lex.$O\
-	main.$O\
-	match.$O\
-	mk.$O\
-	parse.$O\
-	recipe.$O\
-	rule.$O\
-	run.$O\
-	sh.$O\
-	shprint.$O\
-	symtab.$O\
-	var.$O\
-	varsub.$O\
-	word.$O\
-	unix.$O\
-
-HFILES=\
-	mk.h\
-	fns.h\
-
-all: $(TARG)
-
-TGZFILES+=mk.pdf
-
-install: $(LIB)
-	test -d $(PREFIX)/man/man1 || mkdir $(PREFIX)/man/man1
-	test -d $(PREFIX)/doc || mkdir $(PREFIX)/doc
-	install -m 0755 mk $(PREFIX)/bin/mk
-	cat mk.1 | sed 's;DOCPREFIX;$(PREFIX);g' >mk.1a
-	install -m 0644 mk.1a $(PREFIX)/man/man1/mk.1
-	install -m 0644 mk.pdf $(PREFIX)/doc/mk.pdf
-
diff --git a/src/cmd/mk/bundle.ports b/src/cmd/mk/bundle.ports
deleted file mode 100644
index 4649831..0000000
--- a/src/cmd/mk/bundle.ports
+++ /dev/null
@@ -1,46 +0,0 @@
---- Makefile ---
-# New ports collection makefile for: mk
-# Date Created:		11 Feb 2003
-# Whom:			rsc
-#
-# THIS LINE NEEDS REPLACING.  IT'S HERE TO GET BY PORTLINT
-# $FreeBSD: ports/devel/mk/Makefile,v 1.1 2003/02/12 00:51:22 rsc Exp $
-
-PORTNAME=	mk
-PORTVERSION=	2.0
-CATEGORIES=	devel
-MASTER_SITES=	http://pdos.lcs.mit.edu/~rsc/software/
-EXTRACT_SUFX=	.tgz
-
-MAINTAINER=	rsc@post.harvard.edu
-
-DEPENDS=	${PORTSDIR}/devel/libutf \
-	${PORTSDIR}/devel/libfmt \
-	${PORTSDIR}/devel/libbio \
-	${PORTSDIR}/devel/libregexp9
-
-MAN1=		mk.1
-USE_REINPLACE=	yes
-
-.include <bsd.port.pre.mk>
-
-post-patch:
-	${REINPLACE_CMD} -e 's,$$(PREFIX),${PREFIX},g' ${WRKSRC}/Makefile
-
-.include <bsd.port.post.mk>
---- pkg-comment ---
-Streamlined replacement for make
---- pkg-descr ---
-Mk is a streamlined replacement for make, written for 
-Tenth Edition Research Unix by Andrew Hume.
-
-WWW: http://pdos.lcs.mit.edu/~rsc/software/#mk
-
-Russ Cox
-rsc@post.harvard.edu
---- pkg-plist ---
-bin/mk
-doc/mk.pdf
---- /dev/null ---
-This is just a way to make sure blank lines don't
-creep into pkg-plist.
diff --git a/src/cmd/mk/mkfile b/src/cmd/mk/mkfile
deleted file mode 100644
index 1015135..0000000
--- a/src/cmd/mk/mkfile
+++ /dev/null
@@ -1,9 +0,0 @@
-all:V: Makefile Make.FreeBSD-386 Make.Linux-386 Make.HP-UX-9000 Make.OSF1-alpha \
-	Make.SunOS-sun4u Make.SunOS-sun4u-cc Make.SunOS-sun4u-gcc \
-	Make.NetBSD-386 Make.Darwin-PowerMacintosh
-
-Makefile:D: ../libutf/Makefile.TOP Makefile.MID ../libutf/Makefile.CMD ../libutf/Makefile.BOT
-	cat $prereq >$target
-
-Make.%: ../libutf/Make.%
-	cp $prereq $target
diff --git a/src/cmd/mk/rpm.spec b/src/cmd/mk/rpm.spec
deleted file mode 100644
index be75e6b..0000000
--- a/src/cmd/mk/rpm.spec
+++ /dev/null
@@ -1,29 +0,0 @@
-Summary: Streamlined replacement for make
-Name: mk
-Version: 2.0
-Release: 1
-Group: Development/Utils
-Copyright: Public Domain
-Packager: Russ Cox <rsc@post.harvard.edu>
-Source: http://pdos.lcs.mit.edu/~rsc/software/mk-2.0.tgz
-URL: http://pdos.lcs.mit.edu/~rsc/software/#mk
-Requires: libfmt libbio libregexp9 libutf
-
-%description
-Mk is a streamlined replacement for make, written for 
-Tenth Edition Research Unix by Andrew Hume.
-
-http://plan9.bell-labs.com/sys/doc/mk.pdf
-%prep
-%setup
-
-%build
-make
-
-%install
-make install
-
-%files
-/usr/local/doc/mk.pdf
-/usr/local/man/man1/mk.1
-/usr/local/bin/mk
diff --git a/src/cmd/sam/Makefile b/src/cmd/sam/Makefile
index f5e9146..bf2917d 100644
--- a/src/cmd/sam/Makefile
+++ b/src/cmd/sam/Makefile
@@ -1,18 +1,34 @@
-H=errors.h mesg.h parse.h plumb.h sam.h
-SRC= address.c buff.c cmd.c disk.c error.c file.c io.c\
-     list.c mesg.c moveto.c multi.c unix.c rasp.c regexp.c\
-     sam.c shell.c string.c sys.c util.c xec.c plumb.c
+9SRC=..
+include $(9SRC)/Makehdr
 
-CC=gcc
-PREFIX=$(HOME)
-#PREFIX=/usr/local
-CFLAGS=-I. -I$(PREFIX)/include -O -g
-LDFLAGS=-L$(PREFIX)/lib
-LDLIBS=-l9 -lfmt -lutf
+TARG=sam
+OFILES=sam.$O\
+	address.$O\
+	buff.$O\
+	cmd.$O\
+	disk.$O\
+	error.$O\
+	file.$O\
+	io.$O\
+	list.$O\
+	mesg.$O\
+	moveto.$O\
+	multi.$O\
+	plumb.$O\
+	rasp.$O\
+	regexp.$O\
+	shell.$O\
+	string.$O\
+	sys.$O\
+	unix.$O\
+	util.$O\
+	xec.$O\
 
-all: sam
-sam: $(SRC) $(H)
-	$(CC) -o $@ $(CFLAGS) $(SRC) $(LDFLAGS) $(LDLIBS)
-clean:
-	rm -f *.o *~
-	rm -f sam
+HFILES=sam.h\
+	errors.h\
+	mesg.h\
+
+LDFLAGS+=-l9 -lfmt -lutf
+
+include $(9SRC)/Makeone
+
diff --git a/src/cmd/sam/address.c b/src/cmd/sam/address.c
index 85cca17..c59b013 100644
--- a/src/cmd/sam/address.c
+++ b/src/cmd/sam/address.c
@@ -27,7 +27,7 @@
 			break;
 
 		case '$':
-			a.r.p1 = a.r.p2 = f->_.nc;
+			a.r.p1 = a.r.p2 = f->b.nc;
 			break;
 
 		case '\'':
@@ -52,7 +52,7 @@
 			break;
 
 		case '*':
-			a.r.p1 = 0, a.r.p2 = f->_.nc;
+			a.r.p1 = 0, a.r.p2 = f->b.nc;
 			return a;
 
 		case ',':
@@ -69,7 +69,7 @@
 			if(ap->next)
 				a2 = address(ap->next, a, 0);
 			else
-				a2.f = a.f, a2.r.p1 = a2.r.p2 = f->_.nc;
+				a2.f = a.f, a2.r.p1 = a2.r.p2 = f->b.nc;
 			if(a1.f != a2.f)
 				error(Eorder);
 			a.f = a1.f, a.r.p1 = a1.r.p1, a.r.p2 = a2.r.p2;
@@ -101,7 +101,7 @@
 		if(!execute(f, p, INFINITY))
 			error(Esearch);
 		if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p1==p){
-			if(++p>f->_.nc)
+			if(++p>f->b.nc)
 				p = 0;
 			if(!execute(f, p, INFINITY))
 				panic("address");
@@ -111,7 +111,7 @@
 			error(Esearch);
 		if(sel.p[0].p1==sel.p[0].p2 && sel.p[0].p2==p){
 			if(--p<0)
-				p = f->_.nc;
+				p = f->b.nc;
 			if(!bexecute(f, p))
 				panic("address");
 		}
@@ -156,10 +156,10 @@
 	/* A little dirty... */
 	if(menu == 0)
 		menu = fileopen();
-	bufreset(menu);
-	bufinsert(menu, 0, genstr.s, genstr.n);
+	bufreset(&menu->b);
+	bufinsert(&menu->b, 0, genstr.s, genstr.n);
 	compile(r);
-	return execute(menu, 0, menu->_.nc);
+	return execute(menu, 0, menu->b.nc);
 }
 
 Address
@@ -171,7 +171,7 @@
 		addr.r.p2 = addr.r.p1-=l;
 	else if(sign > 0)
 		addr.r.p1 = addr.r.p2+=l;
-	if(addr.r.p1<0 || addr.r.p2>addr.f->_.nc)
+	if(addr.r.p1<0 || addr.r.p2>addr.f->b.nc)
 		error(Erange);
 	return addr;
 }
@@ -203,14 +203,14 @@
 				n = filereadc(f, p++)=='\n';
 			}
 			while(n < l){
-				if(p >= f->_.nc)
+				if(p >= f->b.nc)
 					error(Erange);
 				if(filereadc(f, p++) == '\n')
 					n++;
 			}
 			a.r.p1 = p;
 		}
-		while(p < f->_.nc && filereadc(f, p++)!='\n')
+		while(p < f->b.nc && filereadc(f, p++)!='\n')
 			;
 		a.r.p2 = p;
 	}else{
diff --git a/src/cmd/sam/buff.c b/src/cmd/sam/buff.c
index 30493c3..9a525b6 100644
--- a/src/cmd/sam/buff.c
+++ b/src/cmd/sam/buff.c
@@ -91,8 +91,8 @@
 		i = b->cbi;
 	}
 	blp = &b->bl[i];
-	while(q+(*blp)->_.n <= q0 && q+(*blp)->_.n < b->nc){
-		q += (*blp)->_.n;
+	while(q+(*blp)->u.n <= q0 && q+(*blp)->u.n < b->nc){
+		q += (*blp)->u.n;
 		i++;
 		blp++;
 		if(i >= b->nbl)
@@ -102,8 +102,8 @@
 	/* remember position */
 	b->cbi = i;
 	b->cq = q;
-	sizecache(b, bl->_.n);
-	b->cnc = bl->_.n;
+	sizecache(b, bl->u.n);
+	b->cnc = bl->u.n;
 	/*read block*/
 	diskread(disk, bl, b->c, b->cnc);
 }
diff --git a/src/cmd/sam/cmd.c b/src/cmd/sam/cmd.c
index 8c152f9..6b773f8 100644
--- a/src/cmd/sam/cmd.c
+++ b/src/cmd/sam/cmd.c
@@ -185,14 +185,14 @@
 {
 	Posn p;
 
-	for(p=cmdpt; p<cmd->_.nc; p++){
+	for(p=cmdpt; p<cmd->b.nc; p++){
 		if(terminp >= &termline[BLOCKSIZE]){
-			cmdpt = cmd->_.nc;
+			cmdpt = cmd->b.nc;
 			error(Etoolong);
 		}
 		*terminp++ = filereadc(cmd, p);
 	}
-	cmdpt = cmd->_.nc;
+	cmdpt = cmd->b.nc;
 }
 
 void
diff --git a/src/cmd/sam/disk.c b/src/cmd/sam/disk.c
index 83b2553..f27e94b 100644
--- a/src/cmd/sam/disk.c
+++ b/src/cmd/sam/disk.c
@@ -64,20 +64,20 @@
 	size = ntosize(n, &i);
 	b = d->free[i];
 	if(b)
-		d->free[i] = b->_.next;
+		d->free[i] = b->u.next;
 	else{
 		/* allocate in chunks to reduce malloc overhead */
 		if(blist == nil){
 			blist = emalloc(100*sizeof(Block));
 			for(j=0; j<100-1; j++)
-				blist[j]._.next = &blist[j+1];
+				blist[j].u.next = &blist[j+1];
 		}
 		b = blist;
-		blist = b->_.next;
+		blist = b->u.next;
 		b->addr = d->addr;
 		d->addr += size;
 	}
-	b->_.n = n;
+	b->u.n = n;
 	return b;
 }
 
@@ -86,8 +86,8 @@
 {
 	uint i;
 
-	ntosize(b->_.n, &i);
-	b->_.next = d->free[i];
+	ntosize(b->u.n, &i);
+	b->u.next = d->free[i];
 	d->free[i] = b;
 }
 
@@ -98,7 +98,7 @@
 	Block *b;
 
 	b = *bp;
-	size = ntosize(b->_.n, nil);
+	size = ntosize(b->u.n, nil);
 	nsize = ntosize(n, nil);
 	if(size != nsize){
 		diskrelease(d, b);
@@ -107,16 +107,16 @@
 	}
 	if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
 		panic("write error to temp file");
-	b->_.n = n;
+	b->u.n = n;
 }
 
 void
 diskread(Disk *d, Block *b, Rune *r, uint n)
 {
-	if(n > b->_.n)
+	if(n > b->u.n)
 		panic("internal error: diskread");
 
-	ntosize(b->_.n, nil);	/* called only for sanity check on Maxblock */
+	ntosize(b->u.n, nil);	/* called only for sanity check on Maxblock */
 	if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
 		panic("read error from temp file");
 }
diff --git a/src/cmd/sam/file.c b/src/cmd/sam/file.c
index 0428379..bc3c0f4 100644
--- a/src/cmd/sam/file.c
+++ b/src/cmd/sam/file.c
@@ -114,7 +114,7 @@
 
 	mp0n = merge.p0+merge.n;
 	if(mp0n != p0){
-		bufread(f, mp0n, merge.buf+merge.nbuf, p0-mp0n);
+		bufread(&f->b, mp0n, merge.buf+merge.nbuf, p0-mp0n);
 		merge.nbuf += p0-mp0n;
 		merge.n = p0-merge.p0;
 	}
@@ -268,11 +268,11 @@
 void
 fileinsert(File *f, uint p0, Rune *s, uint ns)
 {
-	if(p0 > f->_.nc)
+	if(p0 > f->b.nc)
 		panic("internal error: fileinsert");
 	if(f->seq > 0)
 		fileuninsert(f, &f->delta, p0, ns);
-	bufinsert(f, p0, s, ns);
+	bufinsert(&f->b, p0, s, ns);
 	if(ns)
 		f->mod = TRUE;
 }
@@ -294,11 +294,11 @@
 void
 filedelete(File *f, uint p0, uint p1)
 {
-	if(!(p0<=p1 && p0<=f->_.nc && p1<=f->_.nc))
+	if(!(p0<=p1 && p0<=f->b.nc && p1<=f->b.nc))
 		panic("internal error: filedelete");
 	if(f->seq > 0)
 		fileundelete(f, &f->delta, p0, p1);
-	bufdelete(f, p0, p1);
+	bufdelete(&f->b, p0, p1);
 	if(p1 > p0)
 		f->mod = TRUE;
 }
@@ -321,7 +321,7 @@
 		n = p1 - i;
 		if(n > RBUFSIZE)
 			n = RBUFSIZE;
-		bufread(f, i, buf, n);
+		bufread(&f->b, i, buf, n);
 		bufinsert(delta, delta->nc, buf, n);
 	}
 	fbuffree(buf);
@@ -334,9 +334,9 @@
 {
 	Rune r;
 
-	if(q >= f->_.nc)
+	if(q >= f->b.nc)
 		return -1;
-	bufread(f, q, &r, 1);
+	bufread(&f->b, q, &r, 1);
 	return r;
 }
 
@@ -402,7 +402,7 @@
 {
 	if(f->seq > 0)
 		panic("undo in file.load unimplemented");
-	return bufload(f, p0, fd, nulls);
+	return bufload(&f->b, p0, fd, nulls);
 }
 
 int
@@ -525,7 +525,7 @@
 			if(canredo)
 				fileundelete(f, epsilon, u.p0, u.p0+u.n);
 			f->mod = u.mod;
-			bufdelete(f, u.p0, u.p0+u.n);
+			bufdelete(&f->b, u.p0, u.p0+u.n);
 			raspdelete(f, u.p0, u.p0+u.n, flag);
 			*q0p = u.p0;
 			*q1p = u.p0;
@@ -543,7 +543,7 @@
 				if(n > RBUFSIZE)
 					n = RBUFSIZE;
 				bufread(delta, up+i, buf, n);
-				bufinsert(f, u.p0+i, buf, n);
+				bufinsert(&f->b, u.p0+i, buf, n);
 				raspinsert(f, u.p0+i, buf, n, flag);
 			}
 			fbuffree(buf);
@@ -601,7 +601,7 @@
 fileclose(File *f)
 {
 	Strclose(&f->name);
-	bufclose(f);
+	bufclose(&f->b);
 	bufclose(&f->delta);
 	bufclose(&f->epsilon);
 	if(f->rasp)
diff --git a/src/cmd/sam/io.c b/src/cmd/sam/io.c
index 236090a..c066963 100644
--- a/src/cmd/sam/io.c
+++ b/src/cmd/sam/io.c
@@ -53,7 +53,7 @@
 		error(Eappend);
 	n = writeio(f);
 	if(f->name.s[0]==0 || samename){
-		if(addr.r.p1==0 && addr.r.p2==f->_.nc)
+		if(addr.r.p1==0 && addr.r.p2==f->b.nc)
 			f->cleanseq = f->seq;
 		state(f, f->cleanseq==f->seq? Clean : Dirty);
 	}
@@ -87,7 +87,7 @@
 	*nulls = FALSE;
 	b = 0;
 	if(f->unread){
-		nt = bufload(f, 0, io, nulls);
+		nt = bufload(&f->b, 0, io, nulls);
 		if(toterm)
 			raspload(f);
 	}else
@@ -149,7 +149,7 @@
 			n = BLOCKSIZE;
 		else
 			n = addr.r.p2-p;
-		bufread(f, p, genbuf, n);
+		bufread(&f->b, p, genbuf, n);
 		c = Strtoc(tmprstr(genbuf, n));
 		m = strlen(c);
 		if(Write(io, c, m) != m){
@@ -188,8 +188,7 @@
 		argv[0] = "samterm";
 		*end = 0;
 		exec(samterm, argv);
-		fprint(2, "can't exec: ");
-		perror(samterm);
+		fprint(2, "can't exec %s: %r\n", samterm);
 		_exits("damn");
 	}
 	if(pipe(ph2t)==-1 || pipe(pt2h)==-1)
diff --git a/src/cmd/sam/mesg.c b/src/cmd/sam/mesg.c
index 189c11a..ec0aa85 100644
--- a/src/cmd/sam/mesg.c
+++ b/src/cmd/sam/mesg.c
@@ -101,7 +101,7 @@
 int
 rcvchar(void){
 	static uchar buf[64];
-	static i, nleft = 0;
+	static int i, nleft = 0;
 
 	if(nleft <= 0){
 		nleft = read(0, (char *)buf, sizeof buf);
@@ -116,9 +116,9 @@
 int
 rcv(void){
 	int c;
-	static state = 0;
-	static count = 0;
-	static i = 0;
+	static int state = 0;
+	static int count = 0;
+	static int i = 0;
 
 	while((c=rcvchar()) != -1)
 		switch(state){
@@ -235,17 +235,17 @@
 		journaln(0, p1-p0);
 		if(f->unread)
 			panic("Trequest: unread");
-		if(p1>f->_.nc)
-			p1 = f->_.nc;
-		if(p0>f->_.nc) /* can happen e.g. scrolling during command */
-			p0 = f->_.nc;
+		if(p1>f->b.nc)
+			p1 = f->b.nc;
+		if(p0>f->b.nc) /* can happen e.g. scrolling during command */
+			p0 = f->b.nc;
 		if(p0 == p1){
 			i = 0;
 			r.p1 = r.p2 = p0;
 		}else{
 			r = rdata(f->rasp, p0, p1-p0);
 			i = r.p2-r.p1;
-			bufread(f, r.p1, buf, i);
+			bufread(&f->b, r.p1, buf, i);
 		}
 		buf[i]=0;
 		outTslS(Hdata, f->tag, r.p1, tmprstr(buf, i+1));
@@ -271,9 +271,9 @@
 		if(f->unread)
 			load(f);
 		else{
-			if(f->_.nc>0){
-				rgrow(f->rasp, 0L, f->_.nc);
-				outTsll(Hgrow, f->tag, 0L, f->_.nc);
+			if(f->b.nc>0){
+				rgrow(f->rasp, 0L, f->b.nc);
+				outTsll(Hgrow, f->tag, 0L, f->b.nc);
 			}
 			outTs(Hcheck0, f->tag);
 			moveto(f, f->dot.r);
@@ -302,7 +302,7 @@
 		loginsert(f, p0, str->s, str->n);
 		if(fileupdate(f, FALSE, FALSE))
 			seq++;
-		if(f==cmd && p0==f->_.nc-i && i>0 && str->s[i-1]=='\n'){
+		if(f==cmd && p0==f->b.nc-i && i>0 && str->s[i-1]=='\n'){
 			freetmpstr(str);
 			termlocked++;
 			termcommand();
@@ -370,7 +370,7 @@
 		journaln(0, i);
 		f = whichfile(i);
 		addr.r.p1 = 0;
-		addr.r.p2 = f->_.nc;
+		addr.r.p2 = f->b.nc;
 		if(f->name.s[0] == 0)
 			error(Enoname);
 		Strduplstr(&genstr, &f->name);
@@ -427,9 +427,9 @@
 		outTl(Hsnarflen, genstr.n);
 		if(genstr.s[genstr.n-1] != '\n')
 			Straddc(&genstr, '\n');
-		loginsert(cmd, cmd->_.nc, genstr.s, genstr.n);
+		loginsert(cmd, cmd->b.nc, genstr.s, genstr.n);
 		fileupdate(cmd, FALSE, TRUE);
-		cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->_.nc;
+		cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc;
 		telldot(cmd);
 		termcommand();
 		break;
@@ -522,7 +522,7 @@
 			p = p0;
 			while(p0>0 && (i=filereadc(f, p0 - 1))!=' ' && i!='\t' && i!='\n')
 				p0--;
-			while(p1<f->_.nc && (i=filereadc(f, p1))!=' ' && i!='\t' && i!='\n')
+			while(p1<f->b.nc && (i=filereadc(f, p1))!=' ' && i!='\t' && i!='\n')
 				p1++;
 			sprint(cbuf, "click=%ld", p-p0);
 			pm->attr = plumbunpackattr(cbuf);
@@ -559,13 +559,13 @@
 		return;
 	bufreset(buf);
 	/* Stage through genbuf to avoid compaction problems (vestigial) */
-	if(p2 > f->_.nc){
-		fprint(2, "bad snarf addr p1=%ld p2=%ld f->_.nc=%d\n", p1, p2, f->_.nc); /*ZZZ should never happen, can remove */
-		p2 = f->_.nc;
+	if(p2 > f->b.nc){
+		fprint(2, "bad snarf addr p1=%ld p2=%ld f->b.nc=%d\n", p1, p2, f->b.nc); /*ZZZ should never happen, can remove */
+		p2 = f->b.nc;
 	}
 	for(l=p1; l<p2; l+=i){
 		i = p2-l>BLOCKSIZE? BLOCKSIZE : p2-l;
-		bufread(f, l, genbuf, i);
+		bufread(&f->b, l, genbuf, i);
 		bufinsert(buf, buf->nc, tmprstr(genbuf, i)->s, i);
 	}
 }
@@ -609,7 +609,7 @@
 		if(p1-p0 >= TBLOCKSIZE)
 			error(Etoolong);
 		Strinsure(&genstr, p1-p0);
-		bufread(f, p0, genbuf, p1-p0);
+		bufread(&f->b, p0, genbuf, p1-p0);
 		memmove(genstr.s, genbuf, RUNESIZE*(p1-p0));
 		genstr.n = p1-p0;
 	}else{
diff --git a/src/cmd/sam/mkfile b/src/cmd/sam/mkfile
deleted file mode 100644
index cb60497..0000000
--- a/src/cmd/sam/mkfile
+++ /dev/null
@@ -1,40 +0,0 @@
-</$objtype/mkfile
-
-TARG=sam
-OFILES=sam.$O\
-	address.$O\
-	buff.$O\
-	cmd.$O\
-	disk.$O\
-	error.$O\
-	file.$O\
-	io.$O\
-	list.$O\
-	mesg.$O\
-	moveto.$O\
-	multi.$O\
-	plan9.$O\
-	rasp.$O\
-	regexp.$O\
-	shell.$O\
-	string.$O\
-	sys.$O\
-	util.$O\
-	xec.$O\
-
-HFILES=sam.h\
-	errors.h\
-	mesg.h\
-
-BIN=/$objtype/bin
-</sys/src/cmd/mkone
-
-address.$O cmd.$O parse.$O xec.$O unix.$O:	parse.h
-
-safeinstall: $O.out
-	mv $BIN/$TARG $BIN/o$TARG
-	cp $prereq $BIN/$TARG
-
-safeinstallall:V:
-	for (objtype in $CPUS)
-		mk safeinstall
diff --git a/src/cmd/sam/moveto.c b/src/cmd/sam/moveto.c
index a84578c..94fad3e 100644
--- a/src/cmd/sam/moveto.c
+++ b/src/cmd/sam/moveto.c
@@ -39,8 +39,8 @@
 	int nl, nc, c;
 	Posn p, oldp0;
 
-	if(p0 > f->_.nc)
-		p0 = f->_.nc;
+	if(p0 > f->b.nc)
+		p0 = f->b.nc;
 	oldp0 = p0;
 	p = p0;
 	for(nl=nc=c=0; c!=-1 && nl<ls && nc<ls*CHARSHIFT; nc++)
@@ -85,7 +85,7 @@
 
 	for(;;){
 		if(dir > 0){
-			if(*p >= f->_.nc)
+			if(*p >= f->b.nc)
 				break;
 			c = filereadc(f, (*p)++);
 		}else{
@@ -126,7 +126,7 @@
 	Rune *r, *l;
 	Posn p;
 
-	if(p1 > f->_.nc)
+	if(p1 > f->b.nc)
 		return;
 	f->dot.r.p1 = f->dot.r.p2 = p1;
 	for(i=0; left[i]; i++){
@@ -147,7 +147,7 @@
 		}
 		/* try right match */
 		p = p1;
-		if(p1 == f->_.nc)
+		if(p1 == f->b.nc)
 			c = '\n';
 		else
 			c = filereadc(f, p);
@@ -156,14 +156,14 @@
 				f->dot.r.p1 = p;
 				if(c!='\n' || p!=0 || filereadc(f, 0)=='\n')
 					f->dot.r.p1++;
-				f->dot.r.p2 = p1+(p1<f->_.nc && c=='\n');
+				f->dot.r.p2 = p1+(p1<f->b.nc && c=='\n');
 			}
 			return;
 		}
 	}
 	/* try filling out word to right */
 	p = p1;
-	while(p < f->_.nc && alnum(filereadc(f, p++)))
+	while(p < f->b.nc && alnum(filereadc(f, p++)))
 		f->dot.r.p2++;
 	/* try filling out word to left */
 	p = p1;
diff --git a/src/cmd/sam/rasp.c b/src/cmd/sam/rasp.c
index 45ac820..c5cc570 100644
--- a/src/cmd/sam/rasp.c
+++ b/src/cmd/sam/rasp.c
@@ -35,10 +35,10 @@
 {
 	if(f->rasp == nil)
 		return;
-	grown = f->_.nc;
+	grown = f->b.nc;
 	growpos = 0;
-	if(f->_.nc)
-		rgrow(f->rasp, 0, f->_.nc);
+	if(f->b.nc)
+		rgrow(f->rasp, 0, f->b.nc);
 	raspdone(f, 1);
 }
 
@@ -55,14 +55,14 @@
 void
 raspdone(File *f, int toterm)
 {
-	if(f->dot.r.p1 > f->_.nc)
-		f->dot.r.p1 = f->_.nc;
-	if(f->dot.r.p2 > f->_.nc)
-		f->dot.r.p2 = f->_.nc;
-	if(f->mark.p1 > f->_.nc)
-		f->mark.p1 = f->_.nc;
-	if(f->mark.p2 > f->_.nc)
-		f->mark.p2 = f->_.nc;
+	if(f->dot.r.p1 > f->b.nc)
+		f->dot.r.p1 = f->b.nc;
+	if(f->dot.r.p2 > f->b.nc)
+		f->dot.r.p2 = f->b.nc;
+	if(f->mark.p1 > f->b.nc)
+		f->mark.p1 = f->b.nc;
+	if(f->mark.p2 > f->b.nc)
+		f->mark.p2 = f->b.nc;
 	if(f->rasp == nil)
 		return;
 	if(grown)
diff --git a/src/cmd/sam/regexp.c b/src/cmd/sam/regexp.c
index dee4377..d4c8505 100644
--- a/src/cmd/sam/regexp.c
+++ b/src/cmd/sam/regexp.c
@@ -700,7 +700,7 @@
 			case 3:
 					goto Return;
 				list[0][0].inst = list[1][0].inst = 0;
-				p = f->_.nc;
+				p = f->b.nc;
 				goto doloop;
 			default:
 				goto Return;
@@ -758,7 +758,7 @@
 				}
 				break;
 			case EOL:
-				if(p==f->_.nc || filereadc(f, p)=='\n')
+				if(p==f->b.nc || filereadc(f, p)=='\n')
 					goto Step;
 				break;
 			case CCLASS:
diff --git a/src/cmd/sam/sam b/src/cmd/sam/sam
deleted file mode 100755
index 733b555..0000000
--- a/src/cmd/sam/sam
+++ /dev/null
Binary files differ
diff --git a/src/cmd/sam/sam.c b/src/cmd/sam/sam.c
index 81ccaf7..864faec 100644
--- a/src/cmd/sam/sam.c
+++ b/src/cmd/sam/sam.c
@@ -148,7 +148,7 @@
 	io = -1;
 	for(i=0; i<file.nused; i++){
 		f = file.filepptr[i];
-		if(f==cmd || f->_.nc==0 || !fileisdirty(f))
+		if(f==cmd || f->b.nc==0 || !fileisdirty(f))
 			continue;
 		if(io == -1){
 			sprint(buf, "%s/sam.save", home);
@@ -164,7 +164,7 @@
 		}else
 			sprint(buf, "nameless.%d", nblank++);
 		fprint(io, "#!%s '%s' $* <<'---%s'\n", SAMSAVECMD, buf, buf);
-		addr.r.p1 = 0, addr.r.p2 = f->_.nc;
+		addr.r.p1 = 0, addr.r.p2 = f->b.nc;
 		writeio(f);
 		fprint(io, "\n---%s\n", (char *)buf);
 	}
@@ -299,7 +299,7 @@
 {
 	if(cmd && cmd->seq!=0){
 		fileupdate(cmd, FALSE, downloaded);
-		cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->_.nc;
+		cmd->dot.r.p1 = cmd->dot.r.p2 = cmd->b.nc;
 		telldot(cmd);
 	}
 }
@@ -354,9 +354,9 @@
 	if(cmd == 'r')
 		logdelete(f, addr.r.p1, addr.r.p2);
 	if(cmd=='e' || cmd=='I'){
-		logdelete(f, (Posn)0, f->_.nc);
-		addr.r.p2 = f->_.nc;
-	}else if(f->_.nc!=0 || (f->name.s[0] && Strcmp(&genstr, &f->name)!=0))
+		logdelete(f, (Posn)0, f->b.nc);
+		addr.r.p2 = f->b.nc;
+	}else if(f->b.nc!=0 || (f->name.s[0] && Strcmp(&genstr, &f->name)!=0))
 		empty = FALSE;
 	if((io = open(genc, OREAD))<0) {
 		if (curfile && curfile->unread)
@@ -485,17 +485,17 @@
 		fileclose(flist);
 	flist = fileopen();
 
-	addr.r.p1 = 0, addr.r.p2 = flist->_.nc;
+	addr.r.p1 = 0, addr.r.p2 = flist->b.nc;
 	retcode = plan9(flist, '<', s, FALSE);
 	fileupdate(flist, FALSE, FALSE);
 	flist->seq = 0;
-	if (flist->_.nc > BLOCKSIZE)
+	if (flist->b.nc > BLOCKSIZE)
 		error(Etoolong);
 	Strzero(&genstr);
-	Strinsure(&genstr, flist->_.nc);
-	bufread(flist, (Posn)0, genbuf, flist->_.nc);
-	memmove(genstr.s, genbuf, flist->_.nc*RUNESIZE);
-	genstr.n = flist->_.nc;
+	Strinsure(&genstr, flist->b.nc);
+	bufread(&flist->b, (Posn)0, genbuf, flist->b.nc);
+	memmove(genstr.s, genbuf, flist->b.nc*RUNESIZE);
+	genstr.n = flist->b.nc;
 	Straddc(&genstr, '\0');
 	return retcode;
 }
@@ -673,7 +673,7 @@
 		ni = addr.r.p2-p;
 		if(ni > BLOCKSIZE)
 			ni = BLOCKSIZE;
-		bufread(f, p, genbuf, ni);
+		bufread(&f->b, p, genbuf, ni);
 		loginsert(addr2.f, addr2.r.p2, tmprstr(genbuf, ni)->s, ni);
 	}
 	addr2.f->ndot.r.p2 = addr2.r.p2+(f->dot.r.p2-f->dot.r.p1);
diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
index 6a2708c..c6b6873 100644
--- a/src/cmd/sam/sam.h
+++ b/src/cmd/sam/sam.h
@@ -110,11 +110,10 @@
 struct Block
 {
 	uint		addr;	/* disk address in bytes */
-	union
-	{
+	union {
 		uint	n;	/* number of used runes in block */
 		Block	*next;	/* pointer to next in free list */
-	} _;
+	} u;
 };
 
 struct Disk
@@ -151,7 +150,7 @@
 
 struct File
 {
-	Buffer _;				/* the data */
+	Buffer 	b;				/* the data */
 	Buffer		delta;		/* transcript of changes */
 	Buffer		epsilon;	/* inversion of delta for redo */
 	String		name;		/* name of associated file */
diff --git a/src/cmd/sam/xec.c b/src/cmd/sam/xec.c
index 42acab0..b4c68bd 100644
--- a/src/cmd/sam/xec.c
+++ b/src/cmd/sam/xec.c
@@ -231,7 +231,7 @@
 					j = c-'0';
 					if(sel.p[j].p2-sel.p[j].p1>BLOCKSIZE)
 						error(Elongtag);
-					bufread(f, sel.p[j].p1, genbuf, sel.p[j].p2-sel.p[j].p1);
+					bufread(&f->b, sel.p[j].p1, genbuf, sel.p[j].p2-sel.p[j].p1);
 					Strinsert(&genstr, tmprstr(genbuf, (sel.p[j].p2-sel.p[j].p1)), genstr.n);
 				}else
 				 	Straddc(&genstr, c);
@@ -240,7 +240,7 @@
 			else{
 				if(sel.p[0].p2-sel.p[0].p1>BLOCKSIZE)
 					error(Elongrhs);
-				bufread(f, sel.p[0].p1, genbuf, sel.p[0].p2-sel.p[0].p1);
+				bufread(&f->b, sel.p[0].p1, genbuf, sel.p[0].p2-sel.p[0].p1);
 				Strinsert(&genstr,
 					tmprstr(genbuf, (int)(sel.p[0].p2-sel.p[0].p1)),
 					genstr.n);
@@ -390,15 +390,15 @@
 
 	p1 = addr.r.p1;
 	p2 = addr.r.p2;
-	if(p2 > f->_.nc){
-		fprint(2, "bad display addr p1=%ld p2=%ld f->_.nc=%d\n", p1, p2, f->_.nc); /*ZZZ should never happen, can remove */
-		p2 = f->_.nc;
+	if(p2 > f->b.nc){
+		fprint(2, "bad display addr p1=%ld p2=%ld f->b.nc=%d\n", p1, p2, f->b.nc); /*ZZZ should never happen, can remove */
+		p2 = f->b.nc;
 	}
 	while(p1 < p2){
 		np = p2-p1;
 		if(np>BLOCKSIZE-1)
 			np = BLOCKSIZE-1;
-		bufread(f, p1, genbuf, np);
+		bufread(&f->b, p1, genbuf, np);
 		genbuf[np] = 0;
 		c = Strtoc(tmprstr(genbuf, np+1));
 		if(downloaded)
diff --git a/src/cmd/samterm/Make.Darwin-PowerMacintosh b/src/cmd/samterm/Make.Darwin-PowerMacintosh
deleted file mode 100644
index 14b8d4e..0000000
--- a/src/cmd/samterm/Make.Darwin-PowerMacintosh
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I. -I${PREFIX}/include
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.FreeBSD-386 b/src/cmd/samterm/Make.FreeBSD-386
deleted file mode 100644
index 087ed3a..0000000
--- a/src/cmd/samterm/Make.FreeBSD-386
+++ /dev/null
@@ -1,7 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I. -I$(PREFIX)/include
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O	# default, can be overriden by Make.$(SYSNAME)
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.HP-UX-9000 b/src/cmd/samterm/Make.HP-UX-9000
deleted file mode 100644
index edbdc11..0000000
--- a/src/cmd/samterm/Make.HP-UX-9000
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS=-O -c -Ae -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.Linux-386 b/src/cmd/samterm/Make.Linux-386
deleted file mode 100644
index 74b0252..0000000
--- a/src/cmd/samterm/Make.Linux-386
+++ /dev/null
@@ -1,7 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O	# default, can be overriden by Make.$(SYSNAME)
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.NetBSD-386 b/src/cmd/samterm/Make.NetBSD-386
deleted file mode 100644
index 087ed3a..0000000
--- a/src/cmd/samterm/Make.NetBSD-386
+++ /dev/null
@@ -1,7 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c -I. -I$(PREFIX)/include
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O	# default, can be overriden by Make.$(SYSNAME)
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.OSF1-alpha b/src/cmd/samterm/Make.OSF1-alpha
deleted file mode 100644
index 3d45279..0000000
--- a/src/cmd/samterm/Make.OSF1-alpha
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS+=-g -c -I.
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.SunOS-sun4u b/src/cmd/samterm/Make.SunOS-sun4u
deleted file mode 100644
index c5fe67b..0000000
--- a/src/cmd/samterm/Make.SunOS-sun4u
+++ /dev/null
@@ -1,2 +0,0 @@
-include Make.SunOS-sun4u-$(CC)
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.SunOS-sun4u-cc b/src/cmd/samterm/Make.SunOS-sun4u-cc
deleted file mode 100644
index 829301d..0000000
--- a/src/cmd/samterm/Make.SunOS-sun4u-cc
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=cc
-CFLAGS+=-g -c -I. -O
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Make.SunOS-sun4u-gcc b/src/cmd/samterm/Make.SunOS-sun4u-gcc
deleted file mode 100644
index 5c41594..0000000
--- a/src/cmd/samterm/Make.SunOS-sun4u-gcc
+++ /dev/null
@@ -1,6 +0,0 @@
-CC=gcc
-CFLAGS+=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -O2 -g -c
-O=o
-AR=ar
-ARFLAGS=rvc
-NAN=nan64.$O
diff --git a/src/cmd/samterm/Makefile b/src/cmd/samterm/Makefile
index 1706b12..8e7afe3 100644
--- a/src/cmd/samterm/Makefile
+++ b/src/cmd/samterm/Makefile
@@ -1,22 +1,5 @@
-
-# this works in gnu make
-SYSNAME:=${shell uname}
-OBJTYPE:=${shell uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'}
-
-# this works in bsd make
-SYSNAME!=uname
-OBJTYPE!=uname -m | sed 's;i.86;386;; s;/.*;;; s; ;;g'
-
-# the gnu rules will mess up bsd but not vice versa,
-# hence the gnu rules come first.
-
-include Make.$(SYSNAME)-$(OBJTYPE)
-
-PREFIX=/usr/local
-
-NUKEFILES=
-
-TGZFILES=
+9SRC=..
+include $(9SRC)/Makehdr
 
 TARG=samterm
 OFILES=\
@@ -33,62 +16,12 @@
 HFILES=\
 	samterm.h\
 	flayer.h\
-	$(PREFIX)/include/frame.h\
+	../sam/sam.h\
+	../sam/mesg.h\
+	$(9SRC)/include/frame.h\
+	$(9SRC)/include/draw.h\
 
-all: $(TARG)
+CFLAGS+=-I../sam
+LDFLAGS+=-lframe -ldraw -lthread -l9 -lregexp9 -lbio -lfmt -lutf -L$(X11)/lib -lX11 -lm
 
-install:
-	install -c -m 0755 samterm $(PREFIX)/bin/samterm
-
-
-$(TARG): $(OFILES)
-	$(CC) -o $(TARG) $(OFILES) -L$(PREFIX)/lib -lframe -ldraw -lthread -l9 -lregexp9 -lbio -lfmt -lutf -L/usr/X11R6/lib -lX11 -lm -ldraw
-
-
-.c.$O:
-	$(CC) $(CFLAGS) -I/usr/X11R6/include -I../sam -I$(PREFIX)/include $*.c
-
-%.$O: %.c
-	$(CC) $(CFLAGS) -I/usr/X11R6/include -I../sam -I$(PREFIX)/include $*.c
-
-
-$(OFILES): $(HFILES)
-
-tgz:
-	rm -rf $(NAME)-$(VERSION)
-	mkdir $(NAME)-$(VERSION)
-	cp Makefile Make.* README LICENSE NOTICE *.[ch137] rpm.spec bundle.ports $(TGZFILES) $(NAME)-$(VERSION)
-	tar cf - $(NAME)-$(VERSION) | gzip >$(NAME)-$(VERSION).tgz
-	rm -rf $(NAME)-$(VERSION)
-
-clean:
-	rm -f $(OFILES) $(LIB)
-
-nuke:
-	rm -f $(OFILES) *.tgz *.rpm $(NUKEFILES)
-
-rpm:
-	make tgz
-	cp $(NAME)-$(VERSION).tgz /usr/src/RPM/SOURCES
-	rpm -ba rpm.spec
-	cp /usr/src/RPM/SRPMS/$(NAME)-$(VERSION)-1.src.rpm .
-	cp /usr/src/RPM/RPMS/i586/$(NAME)-$(VERSION)-1.i586.rpm .
-	scp *.rpm rsc@amsterdam.lcs.mit.edu:public_html/software
-
-PORTDIR=/usr/ports/$(PORTPLACE)
-
-ports:
-	make tgz
-	rm -rf $(PORTDIR)
-	mkdir $(PORTDIR)
-	cp $(NAME)-$(VERSION).tgz /usr/ports/distfiles
-	cat bundle.ports | (cd $(PORTDIR) && awk '$$1=="---" && $$3=="---" { ofile=$$2; next} {if(ofile) print >ofile}')
-	(cd $(PORTDIR); make makesum)
-	(cd $(PORTDIR); make)
-	(cd $(PORTDIR); /usr/local/bin/portlint)
-	rm -rf $(PORTDIR)/work
-	shar `find $(PORTDIR)` > ports.shar
-	(cd $(PORTDIR); tar cf - *) | gzip >$(NAME)-$(VERSION)-ports.tgz
-	scp *.tgz rsc@amsterdam.lcs.mit.edu:public_html/software
-
-.phony: all clean nuke install tgz rpm ports
+include ../Makeone
diff --git a/src/cmd/samterm/Makefile.MID b/src/cmd/samterm/Makefile.MID
deleted file mode 100644
index e65f98a..0000000
--- a/src/cmd/samterm/Makefile.MID
+++ /dev/null
@@ -1,22 +0,0 @@
-TARG=samterm
-OFILES=\
-	main.$O\
-	icons.$O\
-	menu.$O\
-	mesg.$O\
-	rasp.$O\
-	scroll.$O\
-	flayer.$O\
-	io.$O\
-	plan9.$O\
-
-HFILES=\
-	samterm.h\
-	flayer.h\
-	$(PREFIX)/include/frame.h\
-
-all: $(TARG)
-
-install:
-	install -c -m 0755 samterm $(PREFIX)/bin/samterm
-
diff --git a/src/cmd/samterm/mkfile b/src/cmd/samterm/mkfile
deleted file mode 100644
index 1015135..0000000
--- a/src/cmd/samterm/mkfile
+++ /dev/null
@@ -1,9 +0,0 @@
-all:V: Makefile Make.FreeBSD-386 Make.Linux-386 Make.HP-UX-9000 Make.OSF1-alpha \
-	Make.SunOS-sun4u Make.SunOS-sun4u-cc Make.SunOS-sun4u-gcc \
-	Make.NetBSD-386 Make.Darwin-PowerMacintosh
-
-Makefile:D: ../libutf/Makefile.TOP Makefile.MID ../libutf/Makefile.CMD ../libutf/Makefile.BOT
-	cat $prereq >$target
-
-Make.%: ../libutf/Make.%
-	cp $prereq $target
diff --git a/src/cmd/samterm/samterm b/src/cmd/samterm/samterm
deleted file mode 100755
index c5333ec..0000000
--- a/src/cmd/samterm/samterm
+++ /dev/null
Binary files differ