diff --git a/include/README b/include/README
deleted file mode 100644
index b8fb5231a99fdc60c340260e21805a30c6313172..0000000000000000000000000000000000000000
--- a/include/README
+++ /dev/null
@@ -1,6 +0,0 @@
-The header files under this directory are strictly internal to the gc
-toolchain, so please don't copy them to the system include file
-directory (/usr/include, /usr/local/include, etc.)
-
-Also note that they must be kept as is in $GOROOT/include, or cmd/dist
-will malfunction.
diff --git a/include/ar.h b/include/ar.h
deleted file mode 100644
index 350941738c7043a6448406fc7439eb85cb3b70db..0000000000000000000000000000000000000000
--- a/include/ar.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Inferno utils/include/ar.h
-// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-enum {
-	SARMAG = 8,
-	SARNAME = 16,
-	SAR_HDR = 16+44,
-};
-
-#define	ARMAG	"!<arch>\n"
-#define	ARFMAG	"`\n"
-/*c2go
-char ARMAG[] = "!<arch>\n";
-char ARFMAG[] = "`\n";
-*/
-
-typedef struct ArHdr ArHdr;
-struct	ArHdr
-{
-	char	name[SARNAME];
-	char	date[12];
-	char	uid[6];
-	char	gid[6];
-	char	mode[8];
-	char	size[10];
-	char	fmag[2];
-};
diff --git a/include/bio.h b/include/bio.h
deleted file mode 100644
index 982b881f160539dc9a5a41e8a0f71292d119e418..0000000000000000000000000000000000000000
--- a/include/bio.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/include/bio.h
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef _BIO_H_
-#define _BIO_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifdef AUTOLIB
-AUTOLIB(bio)
-#endif
-
-typedef	struct	Biobuf	Biobuf;
-
-enum
-{
-	Bsize		= 8*1024,
-	Bungetsize	= 4,		/* space for ungetc */
-	Bmagic		= 0x314159,
-	Beof		= -1,
-	Bbad		= -2,
-
-	Binactive	= 0,		/* states */
-	Bractive,
-	Bwactive,
-	Bracteof,
-
-	Bend
-};
-
-struct	Biobuf
-{
-	int	icount;		/* neg num of bytes at eob */
-	int	ocount;		/* num of bytes at bob */
-	int	rdline;		/* num of bytes after rdline */
-	int	runesize;	/* num of bytes of last getrune */
-	int	state;		/* r/w/inactive */
-	int	fid;		/* open file */
-	int	flag;		/* magic if malloc'ed */
-	vlong	offset;		/* offset of buffer in file */
-	int	bsize;		/* size of buffer */
-	unsigned char*	bbuf;		/* pointer to beginning of buffer */
-	unsigned char*	ebuf;		/* pointer to end of buffer */
-	unsigned char*	gbuf;		/* pointer to good data in buf */
-	unsigned char	b[Bungetsize+Bsize];
-};
-
-/*
- * These macros get 1-, 2-, and 4-byte integer values by reading the
- * next few bytes in little-endian order.
- */
-#define	BGETC(bp)\
-	((bp)->icount?(int)((bp)->ebuf[(bp)->icount++]):Bgetc((bp)))
-#define	BGETLE2(bp)\
-	((bp)->icount<=-2?((bp)->icount+=2,((bp)->ebuf[(bp)->icount-2])|((bp)->ebuf[(bp)->icount-1]<<8)):Bgetle2((bp)))
-#define	BGETLE4(bp)\
-	(int)((bp)->icount<=-4?((bp)->icount+=4,((bp)->ebuf[(bp)->icount-4])|((bp)->ebuf[(bp)->icount-3]<<8)|((bp)->ebuf[(bp)->icount-2]<<16)|((uint32)(bp)->ebuf[(bp)->icount-1]<<24)):Bgetle4((bp)))
-
-/*
- * These macros put 1-, 2-, and 4-byte integer values by writing the
- * next few bytes in little-endian order.
- */
-#define	BPUTC(bp,c)\
-	((bp)->ocount?(bp)->ebuf[(bp)->ocount++]=(unsigned char)(c),0:Bputc((bp),(c)))
-#define	BPUTLE2(bp,c)\
-	((bp)->ocount<=-2?(bp)->ocount+=2,(bp)->ebuf[(bp)->ocount-2]=(unsigned char)(c),(bp)->ebuf[(bp)->ocount-1]=(unsigned char)(c>>8),0:Bputle2((bp),(c)))
-#define	BPUTLE4(bp,c)\
-	((bp)->ocount<=-4?(bp)->ocount+=4,(bp)->ebuf[(bp)->ocount-4]=(unsigned char)(c),(bp)->ebuf[(bp)->ocount-3]=(unsigned char)(c>>8),(bp)->ebuf[(bp)->ocount-2]=(unsigned char)(c>>16),(bp)->ebuf[(bp)->ocount-1]=(unsigned char)(c>>24),0:Bputle4((bp),(c)))
-
-#define	BOFFSET(bp)\
-	(((bp)->state==Bractive)?\
-		(bp)->offset + (bp)->icount:\
-	(((bp)->state==Bwactive)?\
-		(bp)->offset + ((bp)->bsize + (bp)->ocount):\
-		-1))
-#define	BLINELEN(bp)\
-	(bp)->rdline
-#define	BFILDES(bp)\
-	(bp)->fid
-
-int	Bbuffered(Biobuf*);
-Biobuf*	Bfdopen(int, int);
-int	Bfildes(Biobuf*);
-int	Bflush(Biobuf*);
-int	Bgetc(Biobuf*);
-int	Bgetle2(Biobuf*);
-int	Bgetle4(Biobuf*);
-int	Bgetd(Biobuf*, double*);
-long	Bgetrune(Biobuf*);
-int	Binit(Biobuf*, int, int);
-int	Binits(Biobuf*, int, int, unsigned char*, int);
-int	Blinelen(Biobuf*);
-vlong	Boffset(Biobuf*);
-Biobuf*	Bopen(char*, int);
-int	Bprint(Biobuf*, char*, ...);
-int	Bputc(Biobuf*, int);
-int	Bputle2(Biobuf*, int);
-int	Bputle4(Biobuf*, int);
-int	Bputrune(Biobuf*, long);
-void*	Brdline(Biobuf*, int);
-char*	Brdstr(Biobuf*, int, int);
-long	Bread(Biobuf*, void*, long);
-vlong	Bseek(Biobuf*, vlong, int);
-int	Bterm(Biobuf*);
-int	Bungetc(Biobuf*);
-int	Bungetrune(Biobuf*);
-long	Bwrite(Biobuf*, void*, long);
-int	Bvprint(Biobuf*, char*, va_list);
-/*c2go
-int	BGETC(Biobuf*);
-int	BGETLE2(Biobuf*);
-int	BGETLE4(Biobuf*);
-int	BPUTC(Biobuf*, int);
-int	BPUTLE2(Biobuf*, int);
-int	BPUTLE4(Biobuf*, int);
-*/
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
diff --git a/include/fmt.h b/include/fmt.h
deleted file mode 100644
index 2280f25250b7adfdfadf7aa0b1ad329ee6bc69d2..0000000000000000000000000000000000000000
--- a/include/fmt.h
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef _FMT_H_
-#define _FMT_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <stdarg.h>
-#include <utf.h>
-
-typedef struct Fmt	Fmt;
-struct Fmt{
-	unsigned char	runes;		/* output buffer is runes or chars? */
-	void	*start;			/* of buffer */
-	void	*to;			/* current place in the buffer */
-	void	*stop;			/* end of the buffer; overwritten if flush fails */
-	int	(*flush)(Fmt *);	/* called when to == stop */
-	void	*farg;			/* to make flush a closure */
-	int	nfmt;			/* num chars formatted so far */
-	va_list	args;			/* args passed to dofmt */
-	Rune	r;			/* % format Rune */
-	int	width;
-	int	prec;
-	unsigned long	flags;
-	char	*decimal;	/* decimal point; cannot be "" */
-
-	/* For %'d */
-	char *thousands;	/* separator for thousands */
-
-	/*
-	 * Each char is an integer indicating #digits before next separator. Values:
-	 *	\xFF: no more grouping (or \x7F; defined to be CHAR_MAX in POSIX)
-	 *	\x00: repeat previous indefinitely
-	 *	\x**: count that many
-	 */
-	char	*grouping;		/* descriptor of separator placement */
-};
-
-enum{
-	FmtWidth	= 1,
-	FmtLeft		= FmtWidth << 1,
-	FmtPrec		= FmtLeft << 1,
-	FmtSharp	= FmtPrec << 1,
-	FmtSpace	= FmtSharp << 1,
-	FmtSign		= FmtSpace << 1,
-	FmtApost		= FmtSign << 1,
-	FmtZero		= FmtApost << 1,
-	FmtUnsigned	= FmtZero << 1,
-	FmtShort	= FmtUnsigned << 1,
-	FmtLong		= FmtShort << 1,
-	FmtVLong	= FmtLong << 1,
-	FmtComma	= FmtVLong << 1,
-	FmtByte		= FmtComma << 1,
-	FmtLDouble	= FmtByte << 1,
-
-	FmtFlag		= FmtLDouble << 1
-};
-
-extern	int	(*fmtdoquote)(int);
-
-/* Edit .+1,/^$/ | cfn $PLAN9/src/lib9/fmt/?*.c | grep -v static |grep -v __ */
-int		dofmt(Fmt *f, char *fmt);
-int		dorfmt(Fmt *f, const Rune *fmt);
-double		fmtcharstod(int(*f)(void*), void *vp);
-int		fmtfdflush(Fmt *f);
-int		fmtfdinit(Fmt *f, int fd, char *buf, int size);
-int		fmtinstall(int c, int (*f)(Fmt*));
-int		fmtnullinit(Fmt*);
-void		fmtlocaleinit(Fmt*, char*, char*, char*);
-int		fmtprint(Fmt *f, char *fmt, ...);
-int		fmtrune(Fmt *f, int r);
-int		fmtrunestrcpy(Fmt *f, Rune *s);
-int		fmtstrcpy(Fmt *f, char *s);
-char*		fmtstrflush(Fmt *f);
-int		fmtstrinit(Fmt *f);
-double		fmtstrtod(const char *as, char **aas);
-int		fmtvprint(Fmt *f, char *fmt, va_list args);
-int		fprint(int fd, char *fmt, ...);
-int		print(char *fmt, ...);
-void		quotefmtinstall(void);
-int		quoterunestrfmt(Fmt *f);
-int		quotestrfmt(Fmt *f);
-Rune*		runefmtstrflush(Fmt *f);
-int		runefmtstrinit(Fmt *f);
-Rune*		runeseprint(Rune *buf, Rune *e, char *fmt, ...);
-Rune*		runesmprint(char *fmt, ...);
-int		runesnprint(Rune *buf, int len, char *fmt, ...);
-int		runesprint(Rune *buf, char *fmt, ...);
-Rune*		runevseprint(Rune *buf, Rune *e, char *fmt, va_list args);
-Rune*		runevsmprint(char *fmt, va_list args);
-int		runevsnprint(Rune *buf, int len, char *fmt, va_list args);
-char*		seprint(char *buf, char *e, char *fmt, ...);
-char*		smprint(char *fmt, ...);
-int		snprint(char *buf, int len, char *fmt, ...);
-int		sprint(char *buf, char *fmt, ...);
-int		vfprint(int fd, char *fmt, va_list args);
-char*		vseprint(char *buf, char *e, char *fmt, va_list args);
-char*		vsmprint(char *fmt, va_list args);
-int		vsnprint(char *buf, int len, char *fmt, va_list args);
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
diff --git a/include/libc.h b/include/libc.h
deleted file mode 100644
index d82a19ccce8f3b78f8fdb92e7f681484fffb5f81..0000000000000000000000000000000000000000
--- a/include/libc.h
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
-Derived from Inferno include/kern.h and
-Plan 9 from User Space include/libc.h
-
-http://code.google.com/p/inferno-os/source/browse/include/kern.h
-http://code.swtch.com/plan9port/src/tip/include/libc.h
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-	Portions Copyright © 2001-2007 Russ Cox.  All rights reserved.
-	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * Lib9 is miscellany from the Plan 9 C library that doesn't
- * fit into libutf or into libfmt, but is still missing from traditional
- * Unix C libraries.
- */
-#ifndef _LIBC_H_
-#define _LIBC_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#include <utf.h>
-#include <fmt.h>
-
-/*
- * Begin trimmed down usual libc.h
- */
-
-#ifndef nil
-#define	nil	((void*)0)
-#endif
-#define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
-
-#ifndef offsetof
-#define offsetof(s, m)	(ulong)(&(((s*)0)->m))
-#endif
-
-extern	char*	strecpy(char*, char*, char*);
-extern  int tokenize(char*, char**, int);
-
-extern  double  p9cputime(void);
-#ifndef NOPLAN9DEFINES
-#define cputime     p9cputime
-#endif
-/*
- * one-of-a-kind
- */
-enum
-{
-	PNPROC		= 1,
-	PNGROUP		= 2
-};
-int isInf(double, int);
-
-extern	int	p9atoi(char*);
-extern	long	p9atol(char*);
-extern	vlong	p9atoll(char*);
-extern	double	fmtcharstod(int(*)(void*), void*);
-extern	char*	cleanname(char*);
-extern	int	exitcode(char*);
-extern	void	exits(char*);
-extern	double	frexp(double, int*);
-extern	char*	p9getenv(char*);
-extern	int	p9putenv(char*, char*);
-extern	int	getfields(char*, char**, int, int, char*);
-extern	int	gettokens(char *, char **, int, char *);
-extern	char*	p9getwd(char*, int);
-extern	void	p9longjmp(p9jmp_buf, int);
-extern	void	p9notejmp(void*, p9jmp_buf, int);
-extern	void	perror(const char*);
-extern	int	postnote(int, int, char *);
-extern	double	p9pow10(int);
-extern	char*	p9ctime(long);
-#define p9setjmp(b)	sigsetjmp((void*)(b), 1)
-
-extern	void	sysfatal(char*, ...);
-
-#ifndef NOPLAN9DEFINES
-#define atoi		p9atoi
-#define atol		p9atol
-#define atoll		p9atoll
-#define getenv		p9getenv
-#define	getwd		p9getwd
-#define	longjmp		p9longjmp
-#undef  setjmp
-#define setjmp		p9setjmp
-#define putenv		p9putenv
-#define notejmp		p9notejmp
-#define jmp_buf		p9jmp_buf
-#define pow10		p9pow10
-#undef  strtod
-#define strtod		fmtstrtod
-#define charstod	fmtcharstod
-#define ctime	p9ctime
-#endif
-
-/*
- * system calls
- *
- */
-#define	STATMAX	65535U	/* max length of machine-independent stat structure */
-#define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
-#define	ERRMAX	128	/* max length of error string */
-
-#define	MORDER	0x0003	/* mask for bits defining order of mounting */
-#define	MREPL	0x0000	/* mount replaces object */
-#define	MBEFORE	0x0001	/* mount goes before others in union directory */
-#define	MAFTER	0x0002	/* mount goes after others in union directory */
-#define	MCREATE	0x0004	/* permit creation in mounted directory */
-#define	MCACHE	0x0010	/* cache some data */
-#define	MMASK	0x0017	/* all bits on */
-
-#define	OREAD	0	/* open for read */
-#define	OWRITE	1	/* write */
-#define	ORDWR	2	/* read and write */
-#define	OEXEC	3	/* execute, == read but check execute permission */
-#define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
-#define	ORCLOSE	64	/* or'ed in, remove on close */
-#define	ODIRECT	128	/* or'ed in, direct access */
-#define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
-#define	OAPPEND	0x4000	/* or'ed in, append only */
-
-#define	AEXIST	0	/* accessible: exists */
-#define	AEXEC	1	/* execute access */
-#define	AWRITE	2	/* write access */
-#define	AREAD	4	/* read access */
-
-/* Segattch */
-#define	SG_RONLY	0040	/* read only */
-#define	SG_CEXEC	0100	/* detach on exec */
-
-#define	NCONT	0	/* continue after note */
-#define	NDFLT	1	/* terminate after note */
-#define	NSAVE	2	/* clear note but hold state */
-#define	NRSTR	3	/* restore saved state */
-
-/* bits in Qid.type */
-#define QTDIR		0x80		/* type bit for directories */
-#define QTAPPEND	0x40		/* type bit for append only files */
-#define QTEXCL		0x20		/* type bit for exclusive use files */
-#define QTMOUNT		0x10		/* type bit for mounted channel */
-#define QTAUTH		0x08		/* type bit for authentication file */
-#define QTTMP		0x04		/* type bit for non-backed-up file */
-#define QTSYMLINK	0x02		/* type bit for symbolic link */
-#define QTFILE		0x00		/* type bits for plain file */
-
-/* bits in Dir.mode */
-#define DMDIR		0x80000000	/* mode bit for directories */
-#define DMAPPEND	0x40000000	/* mode bit for append only files */
-#define DMEXCL		0x20000000	/* mode bit for exclusive use files */
-#define DMMOUNT		0x10000000	/* mode bit for mounted channel */
-#define DMAUTH		0x08000000	/* mode bit for authentication file */
-#define DMTMP		0x04000000	/* mode bit for non-backed-up file */
-#define DMSYMLINK	0x02000000	/* mode bit for symbolic link (Unix, 9P2000.u) */
-#define DMDEVICE	0x00800000	/* mode bit for device file (Unix, 9P2000.u) */
-#define DMNAMEDPIPE	0x00200000	/* mode bit for named pipe (Unix, 9P2000.u) */
-#define DMSOCKET	0x00100000	/* mode bit for socket (Unix, 9P2000.u) */
-#define DMSETUID	0x00080000	/* mode bit for setuid (Unix, 9P2000.u) */
-#define DMSETGID	0x00040000	/* mode bit for setgid (Unix, 9P2000.u) */
-
-#define DMREAD		0x4		/* mode bit for read permission */
-#define DMWRITE		0x2		/* mode bit for write permission */
-#define DMEXEC		0x1		/* mode bit for execute permission */
-
-#ifdef RFMEM	/* FreeBSD, OpenBSD, NetBSD */
-#undef RFFDG
-#undef RFNOTEG
-#undef RFPROC
-#undef RFMEM
-#undef RFNOWAIT
-#undef RFCFDG
-#undef RFNAMEG
-#undef RFENVG
-#undef RFCENVG
-#undef RFCFDG
-#undef RFCNAMEG
-#endif
-
-enum
-{
-	RFNAMEG		= (1<<0),
-	RFENVG		= (1<<1),
-	RFFDG		= (1<<2),
-	RFNOTEG		= (1<<3),
-	RFPROC		= (1<<4),
-	RFMEM		= (1<<5),
-	RFNOWAIT	= (1<<6),
-	RFCNAMEG	= (1<<10),
-	RFCENVG		= (1<<11),
-	RFCFDG		= (1<<12)
-/*	RFREND		= (1<<13), */
-/*	RFNOMNT		= (1<<14) */
-};
-
-typedef
-struct Qid
-{
-	uvlong	path;
-	ulong	vers;
-	uchar	type;
-} Qid;
-
-typedef
-struct Dir {
-	/* system-modified data */
-	ushort	type;	/* server type */
-	uint	dev;	/* server subtype */
-	/* file data */
-	Qid	qid;	/* unique id from server */
-	ulong	mode;	/* permissions */
-	ulong	atime;	/* last read time */
-	ulong	mtime;	/* last write time */
-	vlong	length;	/* file length */
-	char	*name;	/* last element of path */
-	char	*uid;	/* owner name */
-	char	*gid;	/* group name */
-	char	*muid;	/* last modifier name */
-
-	/* 9P2000.u extensions */
-	uint	uidnum;		/* numeric uid */
-	uint	gidnum;		/* numeric gid */
-	uint	muidnum;	/* numeric muid */
-	char	*ext;		/* extended info */
-} Dir;
-
-typedef
-struct Waitmsg
-{
-	int pid;	/* of loved one */
-	ulong time[3];	/* of loved one & descendants */
-	char	*msg;
-} Waitmsg;
-
-extern	void	_exits(char*);
-
-extern	void	abort(void);
-extern	long	p9alarm(ulong);
-extern	int	await(char*, int);
-extern	int	awaitfor(int, char*, int);
-extern	int	awaitnohang(char*, int);
-extern	int	p9chdir(char*);
-extern	int	close(int);
-extern	int	p9create(char*, int, ulong);
-extern	int	p9dup(int, int);
-extern	int	errstr(char*, uint);
-extern	int	p9exec(char*, char*[]);
-extern	int	p9execl(char*, ...);
-extern	int	p9rfork(int);
-extern	int	noted(int);
-extern	int	notify(void(*)(void*, char*));
-extern	int	noteenable(char*);
-extern	int	notedisable(char*);
-extern	int	notifyon(char*);
-extern	int	notifyoff(char*);
-extern	int	p9open(char*, int);
-extern	int	fd2path(int, char*, int);
-extern	long	readn(int, void*, long);
-extern	int	remove(const char*);
-extern	vlong	p9seek(int, vlong, int);
-extern	int	p9sleep(long);
-extern	Waitmsg*	p9wait(void);
-extern	Waitmsg*	p9waitfor(int);
-extern	Waitmsg*	waitnohang(void);
-extern	int	p9waitpid(void);
-extern	ulong	rendezvous(ulong, ulong);
-
-extern	char*	getgoos(void);
-extern	char*	getgoarch(void);
-extern	char*	getgoroot(void);
-extern	char*	getgoversion(void);
-extern	char*	getgoarm(void);
-extern	char*	getgo386(void);
-extern	char*	getgoextlinkenabled(void);
-extern	char*	getgohostos(void);
-extern	char*	getgohostarch(void);
-
-extern	char*	mktempdir(void);
-extern	void	removeall(char*);
-extern	int	runcmd(char**);
-
-extern	void	flagcount(char*, char*, int*);
-extern	void	flagint32(char*, char*, int32*);
-extern	void	flagint64(char*, char*, int64*);
-extern	void	flagstr(char*, char*, char**);
-extern	void	flagparse(int*, char***, void (*usage)(void));
-extern	void	flagfn0(char*, char*, void(*fn)(void));
-extern	void	flagfn1(char*, char*, void(*fn)(char*));
-extern	void	flagfn2(char*, char*, void(*fn)(char*, char*));
-extern	void	flagprint(int);
-
-#ifdef _WIN32
-
-#if !defined(_WIN64) && !defined(__MINGW64_VERSION_MAJOR)
-#define execv(prog, argv) execv(prog, (const char* const*)(argv))
-#define execvp(prog, argv) execvp(prog, (const char**)(argv))
-#endif
-
-#undef  getwd
-#define getwd(s, ns) getcwd(s, ns)
-#undef  lseek
-#define lseek(fd, n, base) _lseeki64(fd, n, base)
-#define mkdir(path, perm) mkdir(path)
-#else
-#define O_BINARY 0
-#endif
-
-#ifndef NOPLAN9DEFINES
-#define alarm		p9alarm
-#define	dup		p9dup
-#define	exec		p9exec
-#define	execl	p9execl
-#define	seek		p9seek
-#define sleep		p9sleep
-#define wait		p9wait
-#define waitpid		p9waitpid
-#define rfork		p9rfork
-#define create		p9create
-#undef open
-#define open		p9open
-#define	waitfor		p9waitfor
-#endif
-
-extern	Dir*	dirstat(char*);
-extern	Dir*	dirfstat(int);
-extern	int	dirwstat(char*, Dir*);
-extern	int	dirfwstat(int, Dir*);
-extern	void	nulldir(Dir*);
-extern	long	dirreadall(int, Dir**);
-extern	void	rerrstr(char*, uint);
-extern	char*	sysname(void);
-extern	void	werrstr(char*, ...);
-extern	char*	getns(void);
-extern	char*	get9root(void);
-extern	char*	unsharp(char*);
-
-/* external names that we don't want to step on */
-#ifndef NOPLAN9DEFINES
-#define main	p9main
-#endif
-
-/* compiler directives on plan 9 */
-#define	SET(x)	((x)=0)
-#define	USED(x)	if(x){}else{}
-#ifdef __GNUC__
-#	if __GNUC__ >= 3
-#		undef USED
-#		define USED(x) ((void)(x))
-#	endif
-#endif
-
-/* command line */
-extern char	*argv0;
-extern void __fixargv0(void);
-#define	ARGBEGIN	for((void)(argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
-			    argv[0] && argv[0][0]=='-' && argv[0][1];\
-			    argc--, argv++) {\
-				char *_args, *_argt;\
-				Rune _argc;\
-				_args = &argv[0][1];\
-				if(_args[0]=='-' && _args[1]==0){\
-					argc--; argv++; break;\
-				}\
-				_argc = 0;\
-				while(*_args && (_args += chartorune(&_argc, _args)))\
-				switch(_argc)
-#define	ARGEND		SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
-#define	ARGF()		(_argt=_args, _args="",\
-				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
-#define	EARGF(x)	(_argt=_args, _args="",\
-				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
-
-#define	ARGC()		_argc
-
-#if defined(__cplusplus)
-}
-#endif
-#endif	/* _LIB9_H_ */
diff --git a/include/link.h b/include/link.h
deleted file mode 100644
index 3df9b102c0f7cf40e6618e06faf1cbc59411ad18..0000000000000000000000000000000000000000
--- a/include/link.h
+++ /dev/null
@@ -1,406 +0,0 @@
-// Derived from Inferno utils/6l/l.h and related files.
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-typedef	struct	LSym	LSym;
-typedef	struct	Reloc	Reloc;
-typedef	struct	Auto	Auto;
-typedef	struct	Link	Link;
-typedef	struct	LinkArch	LinkArch;
-typedef	struct	Library	Library;
-
-typedef	struct	Pcln	Pcln;
-typedef	struct	Pcdata	Pcdata;
-typedef	struct	Pciter	Pciter;
-
-struct	Reloc
-{
-	int32	off;
-	uchar	siz;
-	uchar	done;
-	int32	type;
-	int32	variant; // RV_*: variant on computed value
-	int64	add;
-	int64	xadd;
-	LSym*	sym;
-	LSym*	xsym;
-};
-
-struct	LSym
-{
-	char*	name;
-	char*	extname;	// name used in external object files
-	short	type;
-	short	version;
-	uchar	dupok;
-	uchar	cfunc;
-	uchar	external;
-	uchar	nosplit;
-	uchar	reachable;
-	uchar	cgoexport;
-	uchar	special;
-	uchar	stkcheck;
-	uchar	hide;
-	uchar	leaf;	// arm only
-	uchar	localentry;	// ppc64: instrs between global & local entry
-	uchar	onlist;	// on the textp or datap lists
-	int32	dynid;
-	int32	sig;
-	int32	plt;
-	int32	got;
-	int32	align;	// if non-zero, required alignment in bytes
-	int32	elfsym;
-	int32	args;	// size of stack frame incoming arguments area
-	int32	locals;	// size of stack frame locals area (arm only?)
-	vlong	value;
-	vlong	size;
-	LSym*	hash;	// in hash table
-	LSym*	allsym;	// in all symbol list
-	LSym*	next;	// in text or data list
-	LSym*	sub;	// in SSUB list
-	LSym*	outer;	// container of sub
-	LSym*	gotype;
-	LSym*	reachparent;
-	LSym*	queue;
-	char*	file;
-	char*	dynimplib;
-	char*	dynimpvers;
-	void*	sect;
-	
-	// STEXT
-	Auto*	autom;
-	Pcln*	pcln;
-
-	// SDATA, SBSS
-	uchar*	p;
-	int	np;
-	int32	maxp;
-	Reloc*	r;
-	int32	nr;
-	int32	maxr;
-};
-
-// LSym.type
-enum
-{
-	Sxxx,
-
-	/* order here is order in output file */
-	/* readonly, executable */
-	STEXT,
-	SELFRXSECT,
-	
-	/* readonly, non-executable */
-	STYPE,
-	SSTRING,
-	SGOSTRING,
-	SGOFUNC,
-	SRODATA,
-	SFUNCTAB,
-	STYPELINK,
-	SSYMTAB, // TODO: move to unmapped section
-	SPCLNTAB,
-	SELFROSECT,
-	
-	/* writable, non-executable */
-	SMACHOPLT,
-	SELFSECT,
-	SMACHO,	/* Mach-O __nl_symbol_ptr */
-	SMACHOGOT,
-	SWINDOWS,
-	SELFGOT,	/* also .toc in ppc64 ABI */
-	SNOPTRDATA,
-	SINITARR,
-	SDATA,
-	SBSS,
-	SNOPTRBSS,
-	STLSBSS,
-
-	/* not mapped */
-	SXREF,
-	SMACHOSYMSTR,
-	SMACHOSYMTAB,
-	SMACHOINDIRECTPLT,
-	SMACHOINDIRECTGOT,
-	SFILE,
-	SFILEPATH,
-	SCONST,
-	SDYNIMPORT,
-	SHOSTOBJ,
-
-	SSUB = 1<<8,	/* sub-symbol, linked from parent via ->sub list */
-	SMASK = SSUB - 1,
-	SHIDDEN = 1<<9, // hidden or local symbol
-};
-
-// Reloc.type
-enum
-{
-	R_ADDR = 1,
-	R_ADDRPOWER, // relocation for loading 31-bit address using addis and addi/ld/st for Power
-	R_SIZE,
-	R_CALL, // relocation for direct PC-relative call
-	R_CALLARM, // relocation for ARM direct call
-	R_CALLIND, // marker for indirect call (no actual relocating necessary)
-	R_CALLPOWER, // relocation for Power direct call
-	R_CONST,
-	R_PCREL,
-	R_TLS,
-	R_TLS_LE, // TLS local exec offset from TLS segment register
-	R_TLS_IE, // TLS initial exec offset from TLS base pointer
-	R_GOTOFF,
-	R_PLT0,
-	R_PLT1,
-	R_PLT2,
-	R_USEFIELD,
-	R_POWER_TOC,		// ELF R_PPC64_TOC16*
-};
-
-// Reloc.variant
-enum
-{
-	RV_NONE,		// identity variant
-	RV_POWER_LO,		// x & 0xFFFF
-	RV_POWER_HI,		// x >> 16
-	RV_POWER_HA,		// (x + 0x8000) >> 16
-	RV_POWER_DS,		// x & 0xFFFC, check x&0x3 == 0
-
-	RV_CHECK_OVERFLOW = 1<<8,	// check overflow flag
-	RV_TYPE_MASK = (RV_CHECK_OVERFLOW - 1),
-};
-
-// Auto.name
-enum
-{
-	A_AUTO = 1,
-	A_PARAM,
-};
-
-struct	Auto
-{
-	LSym*	asym;
-	Auto*	link;
-	int32	aoffset;
-	int16	name;
-	LSym*	gotype;
-};
-
-enum
-{
-	LINKHASH = 100003,
-};
-
-struct	Library
-{
-	char *objref;	// object where we found the reference
-	char *srcref;	// src file where we found the reference
-	char *file;	// object file
-	char *pkg;	// import path
-};
-
-struct Pcdata
-{
-	uchar *p;
-	int n;
-	int m;
-};
-
-struct Pcln
-{
-	Pcdata pcsp;
-	Pcdata pcfile;
-	Pcdata pcline;
-	Pcdata *pcdata;
-	int npcdata;
-	LSym **funcdata;
-	int64 *funcdataoff;
-	int nfuncdata;
-	
-	LSym **file;
-	int nfile;
-	int mfile;
-
-	LSym *lastfile;
-	int lastindex;
-};
-
-// Pcdata iterator.
-//	for(pciterinit(ctxt, &it, &pcd); !it.done; pciternext(&it)) { it.value holds in [it.pc, it.nextpc) }
-struct Pciter
-{
-	Pcdata d;
-	uchar *p;
-	uint32 pc;
-	uint32 nextpc;
-	uint32 pcscale;
-	int32 value;
-	int start;
-	int done;
-};
-
-void	pciterinit(Link*, Pciter*, Pcdata*);
-void	pciternext(Pciter*);
-
-// symbol version, incremented each time a file is loaded.
-// version==1 is reserved for savehist.
-enum
-{
-	HistVersion = 1,
-};
-
-// Link holds the context for writing object code from a compiler
-// to be linker input or for reading that input into the linker.
-struct	Link
-{
-	int32	thechar; // '5' (arm), '6' (amd64), etc.
-	char*	thestring; // full name of architecture ("arm", "amd64", ..)
-	int32	goarm; // for arm only, GOARM setting
-	int	headtype;
-
-	LinkArch*	arch;
-	int32	debugasm;	// -S flag in compiler
-	int32	debugvlog;	// -v flag in linker
-	Biobuf*	bso;	// for -v flag
-	int32	windows;
-	char*	goroot;
-
-	// hash table of all symbols
-	LSym*	hash[LINKHASH];
-	LSym*	allsym;
-	int32	nsymbol;
-	
-	// code generation
-	LSym*	tlsg;
-
-	// for reading input files (during linker)
-	char**	libdir;
-	int32	nlibdir;
-	int32	maxlibdir;
-	Library*	library;
-	int	libraryp;
-	int	nlibrary;
-	int	tlsoffset;
-	void	(*diag)(char*, ...);
-	LSym*	cursym;
-	int	version;
-	LSym*	textp;
-	LSym*	etextp;
-	int32	nhistfile;
-	LSym*	filesyms;
-};
-
-enum {
-	LittleEndian = 0x04030201,
-	BigEndian = 0x01020304,
-};
-
-// LinkArch is the definition of a single architecture.
-struct LinkArch
-{
-	char*	name; // "arm", "amd64", and so on
-	int	thechar;	// '5', '6', and so on
-	int32	endian; // LittleEndian or BigEndian
-
-	int	minlc;
-	int	ptrsize;
-	int	regsize;
-};
-
-/* executable header types */
-enum {
-	Hunknown = 0,
-	Hdarwin,
-	Hdragonfly,
-	Helf,
-	Hfreebsd,
-	Hlinux,
-	Hnacl,
-	Hnetbsd,
-	Hopenbsd,
-	Hplan9,
-	Hsolaris,
-	Hwindows,
-};
-
-enum
-{
-	LinkAuto = 0,
-	LinkInternal,
-	LinkExternal,
-};
-
-extern	uchar	fnuxi8[8];
-extern	uchar	fnuxi4[4];
-extern	uchar	inuxi1[1];
-extern	uchar	inuxi2[2];
-extern	uchar	inuxi4[4];
-extern	uchar	inuxi8[8];
-
-vlong	addaddr(Link *ctxt, LSym *s, LSym *t);
-vlong	addaddrplus(Link *ctxt, LSym *s, LSym *t, vlong add);
-vlong	addaddrplus4(Link *ctxt, LSym *s, LSym *t, vlong add);
-void	addlib(Link *ctxt, char *src, char *obj, char *pathname);
-void	addlibpath(Link *ctxt, char *srcref, char *objref, char *file, char *pkg);
-vlong	addpcrelplus(Link *ctxt, LSym *s, LSym *t, vlong add);
-Reloc*	addrel(LSym *s);
-vlong	addsize(Link *ctxt, LSym *s, LSym *t);
-vlong	adduint16(Link *ctxt, LSym *s, uint16 v);
-vlong	adduint32(Link *ctxt, LSym *s, uint32 v);
-vlong	adduint64(Link *ctxt, LSym *s, uint64 v);
-vlong	adduint8(Link *ctxt, LSym *s, uint8 v);
-vlong	adduintxx(Link *ctxt, LSym *s, uint64 v, int wid);
-vlong	atolwhex(char *s);
-void*	emallocz(long n);
-void*	erealloc(void *p, long n);
-char*	estrdup(char *p);
-char*	expandpkg(char *t0, char *pkg);
-int	find1(int32 l, int c);
-char*	headstr(int v);
-int	headtype(char *name);
-void	ldobjfile(Link *ctxt, Biobuf *f, char *pkg, int64 len, char *pn);
-LSym*	linklookup(Link *ctxt, char *name, int v);
-Link*	linknew(LinkArch *arch);
-LSym*	linknewsym(Link *ctxt, char *symb, int v);
-LSym*	linkrlookup(Link *ctxt, char *name, int v);
-void	nuxiinit(LinkArch *arch);
-void	pciterinit(Link *ctxt, Pciter *it, Pcdata *d);
-void	pciternext(Pciter *it);
-vlong	setaddr(Link *ctxt, LSym *s, vlong off, LSym *t);
-vlong	setaddrplus(Link *ctxt, LSym *s, vlong off, LSym *t, vlong add);
-vlong	setuint32(Link *ctxt, LSym *s, vlong r, uint32 v);
-vlong	setuint8(Link *ctxt, LSym *s, vlong r, uint8 v);
-vlong	setuintxx(Link *ctxt, LSym *s, vlong off, uint64 v, vlong wid);
-void	symgrow(Link *ctxt, LSym *s, vlong lsiz);
-
-extern	LinkArch	link386;
-extern	LinkArch	linkamd64;
-extern	LinkArch	linkamd64p32;
-extern	LinkArch	linkarm;
-extern	LinkArch	linkppc64;
-extern	LinkArch	linkppc64le;
diff --git a/include/plan9/386/u.h b/include/plan9/386/u.h
deleted file mode 100644
index 1c4076b5ea295688cdb12d722e040feb8de53164..0000000000000000000000000000000000000000
--- a/include/plan9/386/u.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/386/include/u.h"
-
-typedef	char	int8;
-typedef	uchar	uint8;
-typedef	short	int16;
-typedef	ushort	uint16;
-typedef	int	int32;
-typedef	uint	uint32;
-typedef	vlong	int64;
-typedef	uvlong	uint64;
-typedef	int	intptr;
-typedef	float	float32;
-typedef	double	float64;
diff --git a/include/plan9/amd64/u.h b/include/plan9/amd64/u.h
deleted file mode 100644
index c2d4999383c95e2c60b45b13a2bfb549d6639ab2..0000000000000000000000000000000000000000
--- a/include/plan9/amd64/u.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/amd64/include/u.h"
-
-typedef	char	int8;
-typedef	uchar	uint8;
-typedef	short	int16;
-typedef	ushort	uint16;
-typedef	int	int32;
-typedef	uint	uint32;
-typedef	vlong	int64;
-typedef	uvlong	uint64;
-typedef	vlong	intptr;
-typedef	float	float32;
-typedef	double	float64;
diff --git a/include/plan9/ar.h b/include/plan9/ar.h
deleted file mode 100644
index 350941738c7043a6448406fc7439eb85cb3b70db..0000000000000000000000000000000000000000
--- a/include/plan9/ar.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Inferno utils/include/ar.h
-// http://code.google.com/p/inferno-os/source/browse/utils/include/ar.h
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-enum {
-	SARMAG = 8,
-	SARNAME = 16,
-	SAR_HDR = 16+44,
-};
-
-#define	ARMAG	"!<arch>\n"
-#define	ARFMAG	"`\n"
-/*c2go
-char ARMAG[] = "!<arch>\n";
-char ARFMAG[] = "`\n";
-*/
-
-typedef struct ArHdr ArHdr;
-struct	ArHdr
-{
-	char	name[SARNAME];
-	char	date[12];
-	char	uid[6];
-	char	gid[6];
-	char	mode[8];
-	char	size[10];
-	char	fmag[2];
-};
diff --git a/include/plan9/arm/u.h b/include/plan9/arm/u.h
deleted file mode 100644
index 19249aa480546c8d403b624b1f5cfb830aa7564a..0000000000000000000000000000000000000000
--- a/include/plan9/arm/u.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/arm/include/u.h"
-
-typedef	char	int8;
-typedef	uchar	uint8;
-typedef	short	int16;
-typedef	ushort	uint16;
-typedef	int	int32;
-typedef	uint	uint32;
-typedef	vlong	int64;
-typedef	uvlong	uint64;
-typedef	int	intptr;
diff --git a/include/plan9/bio.h b/include/plan9/bio.h
deleted file mode 100644
index 13d5e0ef20377d9e9d2d1b61c22afa5be36bca77..0000000000000000000000000000000000000000
--- a/include/plan9/bio.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../bio.h"
-
-#define fmtcharstod charstod
-#define lseek seek
diff --git a/include/plan9/errno.h b/include/plan9/errno.h
deleted file mode 100644
index 1ed572acedd15c53149d6208376d00c6d5168cc9..0000000000000000000000000000000000000000
--- a/include/plan9/errno.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-int errno;
-
-#define ERANGE 1001
diff --git a/include/plan9/fmt.h b/include/plan9/fmt.h
deleted file mode 100644
index b4a4fe79153e38a10ee337e200af5e606c07f26a..0000000000000000000000000000000000000000
--- a/include/plan9/fmt.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../fmt.h"
-
-#pragma	varargck	argpos	fmtprint	2
-#pragma	varargck	argpos	fprint		2
-#pragma	varargck	argpos	print		1
-#pragma	varargck	argpos	runeseprint	3
-#pragma	varargck	argpos	runesmprint	1
-#pragma	varargck	argpos	runesnprint	3
-#pragma	varargck	argpos	runesprint	2
-#pragma	varargck	argpos	seprint		3
-#pragma	varargck	argpos	smprint		1
-#pragma	varargck	argpos	snprint		3
-#pragma	varargck	argpos	sprint		2
-
-#pragma	varargck	type	"lld"	vlong
-#pragma	varargck	type	"llo"	vlong
-#pragma	varargck	type	"llx"	vlong
-#pragma	varargck	type	"llb"	vlong
-#pragma	varargck	type	"lld"	uvlong
-#pragma	varargck	type	"llo"	uvlong
-#pragma	varargck	type	"llx"	uvlong
-#pragma	varargck	type	"llb"	uvlong
-#pragma	varargck	type	"ld"	long
-#pragma	varargck	type	"lo"	long
-#pragma	varargck	type	"lx"	long
-#pragma	varargck	type	"lb"	long
-#pragma	varargck	type	"ld"	ulong
-#pragma	varargck	type	"lo"	ulong
-#pragma	varargck	type	"lx"	ulong
-#pragma	varargck	type	"lb"	ulong
-#pragma	varargck	type	"d"	int
-#pragma	varargck	type	"o"	int
-#pragma	varargck	type	"x"	int
-#pragma	varargck	type	"c"	int
-#pragma	varargck	type	"C"	int
-#pragma	varargck	type	"b"	int
-#pragma	varargck	type	"d"	uint
-#pragma	varargck	type	"x"	uint
-#pragma	varargck	type	"c"	uint
-#pragma	varargck	type	"C"	uint
-#pragma	varargck	type	"b"	uint
-#pragma	varargck	type	"f"	double
-#pragma	varargck	type	"e"	double
-#pragma	varargck	type	"g"	double
-#pragma	varargck	type	"s"	char*
-#pragma	varargck	type	"q"	char*
-#pragma	varargck	type	"S"	Rune*
-#pragma	varargck	type	"Q"	Rune*
-#pragma	varargck	type	"r"	void
-#pragma	varargck	type	"%"	void
-#pragma	varargck	type	"n"	int*
-#pragma	varargck	type	"p"	uintptr
-#pragma	varargck	type	"p"	void*
-#pragma	varargck	flag	','
-#pragma	varargck	flag	' '
-#pragma	varargck	flag	'h'
-#pragma	varargck	type	"<"	void*
-#pragma	varargck	type	"["	void*
-#pragma	varargck	type	"H"	void*
-#pragma	varargck	type	"lH"	void*
diff --git a/include/plan9/libc.h b/include/plan9/libc.h
deleted file mode 100644
index 9a880505a4d91348e02b6363cb02a1476855257e..0000000000000000000000000000000000000000
--- a/include/plan9/libc.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "/sys/include/ctype.h"
-#include "fmt.h"
-#include "utf.h"
-#include "libc_plan9.h"
-
-char*	getgoos(void);
-char*	getgoarch(void);
-char*	getgoroot(void);
-char*	getgoversion(void);
-char*	getgoarm(void);
-char*	getgo386(void);
-char*	getgoextlinkenabled(void);
-char*	getgohostos(void);
-char*	getgohostarch(void);
-
-int	runcmd(char**);
-
-void	flagcount(char*, char*, int*);
-void	flagint32(char*, char*, int32*);
-void	flagint64(char*, char*, int64*);
-void	flagstr(char*, char*, char**);
-void	flagparse(int*, char***, void (*usage)(void));
-void	flagfn0(char*, char*, void(*fn)(void));
-void	flagfn1(char*, char*, void(*fn)(char*));
-void	flagfn2(char*, char*, void(*fn)(char*, char*));
-void	flagprint(int);
-
-// The libraries use size_t to avoid -Wconversion warnings from GCC
-// when calling standard library functions like memcpy.
-typedef unsigned long size_t;
-
-// math.h
-#define HUGE_VAL 1.79769313486231e+308
diff --git a/include/plan9/link.h b/include/plan9/link.h
deleted file mode 100644
index f65971efceb4b85fa81695506e8bc7d496f2be89..0000000000000000000000000000000000000000
--- a/include/plan9/link.h
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../link.h"
diff --git a/include/plan9/mklibc.rc b/include/plan9/mklibc.rc
deleted file mode 100755
index 449e15fdffa65c15f4e52d4096536c5d1824beb2..0000000000000000000000000000000000000000
--- a/include/plan9/mklibc.rc
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/rc
-
-pattern='/umuldiv/d
-	/rune routines/,/^\/\*/d
-	/print routines/,/^\/\*/d
-	/error string for/,/^\/\*/d'
-
-sed -e $pattern /sys/include/libc.h | awk '/^enum/ && !n++, /^};/ {next}1'
diff --git a/include/plan9/stdarg.h b/include/plan9/stdarg.h
deleted file mode 100644
index b562a3a6e83d28244e1f09a02fa36f79e626791f..0000000000000000000000000000000000000000
--- a/include/plan9/stdarg.h
+++ /dev/null
@@ -1,3 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
diff --git a/include/plan9/utf.h b/include/plan9/utf.h
deleted file mode 100644
index 03c26d69d0c76271ca3c05f6a42030bf037fad67..0000000000000000000000000000000000000000
--- a/include/plan9/utf.h
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "../utf.h"
diff --git a/include/u.h b/include/u.h
deleted file mode 100644
index 6f857820deafb1b80156ec09c425052236f88ae1..0000000000000000000000000000000000000000
--- a/include/u.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
-Plan 9 from User Space include/u.h
-http://code.swtch.com/plan9port/src/tip/include/u.h
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef _U_H_
-#define _U_H_ 1
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define __BSD_VISIBLE 1 /* FreeBSD 5.x */
-#if defined(__sun__)
-#	define __EXTENSIONS__ 1 /* SunOS */
-#	if defined(__SunOS5_6__) || defined(__SunOS5_7__) || defined(__SunOS5_8__)
-		/* NOT USING #define __MAKECONTEXT_V2_SOURCE 1 / * SunOS */
-#	else
-#		define __MAKECONTEXT_V2_SOURCE 1
-#	endif
-#endif
-#define _BSD_SOURCE 1
-#define _NETBSD_SOURCE 1	/* NetBSD */
-#define _DEFAULT_SOURCE 1	/* glibc > 2.19 */
-#define _SVID_SOURCE 1
-#if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__sun__)
-#	define _XOPEN_SOURCE 1000
-#	define _XOPEN_SOURCE_EXTENDED 1
-#endif
-#if defined(__FreeBSD__)
-#	include <sys/cdefs.h>
-	/* for strtoll */
-#	undef __ISO_C_VISIBLE
-#	define __ISO_C_VISIBLE 1999
-#	undef __LONG_LONG_SUPPORTED
-#	define __LONG_LONG_SUPPORTED
-#endif
-#define _LARGEFILE64_SOURCE 1
-#define _FILE_OFFSET_BITS 64
-
-#include <inttypes.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <setjmp.h>
-#include <stddef.h>
-#include <math.h>
-#include <ctype.h>	/* for tolower */
-#include <time.h>
-
-#ifdef _WIN32
-#include <signal.h>
-#endif
-
-/*
- * OS-specific crap
- */
-#define _NEEDUCHAR 1
-#define _NEEDUSHORT 1
-#define _NEEDUINT 1
-#define _NEEDULONG 1
-
-#ifdef _WIN32
-typedef jmp_buf sigjmp_buf;
-#endif
-typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
-
-#if defined(__linux__)
-#	include <sys/types.h>
-#	if defined(__Linux26__)
-#		include <pthread.h>
-#		define PLAN9PORT_USING_PTHREADS 1
-#	endif
-#	if defined(__USE_MISC)
-#		undef _NEEDUSHORT
-#		undef _NEEDUINT
-#		undef _NEEDULONG
-#	endif
-#elif defined(__sun__)
-#	include <sys/types.h>
-#	include <pthread.h>
-#	define PLAN9PORT_USING_PTHREADS 1
-#	undef _NEEDUSHORT
-#	undef _NEEDUINT
-#	undef _NEEDULONG
-#	define nil 0	/* no cast to void* */
-#elif defined(__FreeBSD__)
-#	include <sys/types.h>
-#	include <osreldate.h>
-#	if __FreeBSD_version >= 500000
-#		define PLAN9PORT_USING_PTHREADS 1
-#		include <pthread.h>
-#	endif
-#	if !defined(_POSIX_SOURCE)
-#		undef _NEEDUSHORT
-#		undef _NEEDUINT
-#	endif
-#elif defined(__APPLE__)
-#	include <sys/types.h>
-#	include <pthread.h>
-#	define PLAN9PORT_USING_PTHREADS 1
-#	if __GNUC__ < 4
-#		undef _NEEDUSHORT
-#		undef _NEEDUINT
-#	endif
-#	undef _ANSI_SOURCE
-#	undef _POSIX_C_SOURCE
-#	undef _XOPEN_SOURCE
-#	if !defined(NSIG)
-#		define NSIG 32
-#	endif
-#	define _NEEDLL 1
-#elif defined(__NetBSD__)
-#	include <sched.h>
-#	include <sys/types.h>
-#	undef _NEEDUSHORT
-#	undef _NEEDUINT
-#	undef _NEEDULONG
-#elif defined(__OpenBSD__)
-#	include <sys/types.h>
-#	undef _NEEDUSHORT
-#	undef _NEEDUINT
-#	undef _NEEDULONG
-#elif defined(_WIN32)
-#else
-	/* No idea what system this is -- try some defaults */
-#	include <pthread.h>
-#	define PLAN9PORT_USING_PTHREADS 1
-#endif
-
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-typedef signed char schar;
-
-#ifdef _NEEDUCHAR
-	typedef unsigned char uchar;
-#endif
-#ifdef _NEEDUSHORT
-	typedef unsigned short ushort;
-#endif
-#ifdef _NEEDUINT
-	typedef unsigned int uint;
-#endif
-#ifdef _NEEDULONG
-	typedef unsigned long ulong;
-#endif
-typedef unsigned long long uvlong;
-typedef long long vlong;
-
-typedef uint64_t u64int;
-typedef int64_t s64int;
-typedef uint8_t u8int;
-typedef int8_t s8int;
-typedef uint16_t u16int;
-typedef int16_t s16int;
-typedef uintptr_t uintptr;
-typedef intptr_t intptr;
-typedef uint32_t u32int;
-typedef int32_t s32int;
-
-typedef s8int int8;
-typedef u8int uint8;
-typedef s16int int16;
-typedef u16int uint16;
-typedef s32int int32;
-typedef u32int uint32;
-typedef s64int int64;
-typedef u64int uint64;
-
-typedef float float32;
-typedef double float64;
-
-#undef _NEEDUCHAR
-#undef _NEEDUSHORT
-#undef _NEEDUINT
-#undef _NEEDULONG
-
-#define getcallerpc(x)	__builtin_return_address(0)
-
-#ifndef SIGBUS
-#define SIGBUS SIGSEGV /* close enough */
-#endif
-
-/*
- * Funny-named symbols to tip off 9l to autolink.
- */
-#define AUTOLIB(x)	static int __p9l_autolib_ ## x = 1;
-#define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x = 1;
-
-/*
- * Gcc is too smart for its own good.
- */
-#if defined(__GNUC__)
-#	undef strcmp	/* causes way too many warnings */
-#	if __GNUC__ >= 4 || (__GNUC__==3 && !defined(__APPLE_CC__) && !defined(_WIN32))
-#		undef AUTOLIB
-#		define AUTOLIB(x) int __p9l_autolib_ ## x __attribute__ ((weak));
-#		undef AUTOFRAMEWORK
-#		define AUTOFRAMEWORK(x) int __p9l_autoframework_ ## x __attribute__ ((weak));
-#	else
-#		undef AUTOLIB
-#		define AUTOLIB(x) static int __p9l_autolib_ ## x __attribute__ ((unused));
-#		undef AUTOFRAMEWORK
-#		define AUTOFRAMEWORK(x) static int __p9l_autoframework_ ## x __attribute__ ((unused));
-#	endif
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
diff --git a/include/utf.h b/include/utf.h
deleted file mode 100644
index be1c46e7f2e5e71750263653a2bd66ef021a5974..0000000000000000000000000000000000000000
--- a/include/utf.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../src/lib9/utf/utf.h"
diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
index f21331055f177df02b396ba4f3833cd3f33332b9..c13bace3604cd771003a9bd19fe74af66766ab4d 100644
--- a/src/cmd/dist/build.go
+++ b/src/cmd/dist/build.go
@@ -10,7 +10,6 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
-	"runtime"
 	"strings"
 )
 
@@ -457,49 +456,9 @@ func setup() {
 }
 
 /*
- * C library and tool building
+ * Tool building
  */
 
-// gccargs is the gcc command line to use for compiling a single C file.
-var proto_gccargs = []string{
-	"-Wall",
-	// native Plan 9 compilers don't like non-standard prototypes
-	// so let gcc catch them.
-	"-Wstrict-prototypes",
-	"-Wextra",
-	"-Wunused",
-	"-Wno-sign-compare",
-	"-Wno-missing-braces",
-	"-Wno-parentheses",
-	"-Wno-unknown-pragmas",
-	"-Wno-switch",
-	"-Wno-comment",
-	"-Wno-missing-field-initializers",
-	"-fno-common",
-	"-ggdb",
-	"-pipe",
-}
-
-// gccargs2 is the second part of gccargs.
-// it is used if the environment isn't defining CFLAGS.
-var proto_gccargs2 = []string{
-	// on older versions of GCC, -Wuninitialized is not supported
-	// without -O, so put it here together with -O settings in case
-	// the user's $CFLAGS doesn't include -O.
-	"-Wuninitialized",
-	"-O2",
-}
-
-func init() {
-	if runtime.GOOS == "netbsd" && runtime.GOARCH == "arm" {
-		// GCC 4.5.4 (NetBSD nb1 20120916) on ARM is known to mis-optimize gc/mparith3.c
-		// Fix available at http://patchwork.ozlabs.org/patch/64562/.
-		proto_gccargs2[1] = "-O1"
-	}
-}
-
-var gccargs, ldargs []string
-
 // deptab lists changes to the default dependencies for a given prefix.
 // deps ending in /* read the whole directory; deps beginning with -
 // exclude files with that prefix.
@@ -517,8 +476,6 @@ var deptab = []struct {
 
 // depsuffix records the allowed suffixes for source files.
 var depsuffix = []string{
-	".c",
-	".h",
 	".s",
 	".go",
 }
@@ -561,40 +518,7 @@ func install(dir string) {
 	path := pathf("%s/src/%s", goroot, dir)
 	name := filepath.Base(dir)
 
-	// set up gcc command line on first run.
-	if gccargs == nil {
-		gccargs = splitfields(defaultcc + " " + defaultcflags)
-		gccargs = append(gccargs, proto_gccargs...)
-		if defaultcflags == "" {
-			gccargs = append(gccargs, proto_gccargs2...)
-		}
-		if strings.Contains(gccargs[0], "clang") {
-			// disable ASCII art in clang errors, if possible
-			gccargs = append(gccargs, "-fno-caret-diagnostics")
-			// clang is too smart about unused command-line arguments
-			gccargs = append(gccargs, "-Qunused-arguments")
-		}
-		// disable word wrapping in error messages
-		gccargs = append(gccargs, "-fmessage-length=0")
-		if gohostos == "darwin" && gohostarch != "arm" {
-			// golang.org/issue/5261
-			gccargs = append(gccargs, "-mmacosx-version-min=10.6")
-		}
-	}
-	if ldargs == nil && defaultldflags != "" {
-		ldargs = splitfields(defaultldflags)
-	}
-
-	isgo := true
 	ispkg := !strings.HasPrefix(dir, "cmd/") || strings.HasPrefix(dir, "cmd/internal/") || strings.HasPrefix(dir, "cmd/asm/internal/")
-	islib := false
-
-	// Legacy C exceptions.
-	switch dir {
-	case "lib9", "libbio", "liblink", "cmd/gc", "cmd/ld":
-		islib = true
-		isgo = false
-	}
 
 	// Start final link command line.
 	// Note: code below knows that link.p[targ] is the target.
@@ -603,27 +527,13 @@ func install(dir string) {
 		targ      int
 		ispackcmd bool
 	)
-	switch {
-	case islib:
-		// C library.
-		prefix := ""
-		if !strings.HasPrefix(name, "lib") {
-			prefix = "lib"
-		}
-		link = []string{"ar", "rsc", pathf("%s/pkg/obj/%s_%s/%s%s.a", goroot, gohostos, gohostarch, prefix, name)}
-		if gohostos == "plan9" {
-			link[1] = "rc"
-		}
-		targ = len(link) - 1
-
-	case ispkg:
+	if ispkg {
 		// Go library (package).
 		ispackcmd = true
 		link = []string{"pack", pathf("%s/pkg/%s_%s/%s.a", goroot, goos, goarch, dir)}
 		targ = len(link) - 1
 		xmkdirall(filepath.Dir(link[targ]))
-
-	case dir == "cmd/go" || dir == "cmd/cgo":
+	} else {
 		// Go command.
 		elem := name
 		if elem == "go" {
@@ -631,27 +541,6 @@ func install(dir string) {
 		}
 		link = []string{fmt.Sprintf("%s/%sl", tooldir, gochar), "-o", pathf("%s/%s%s", tooldir, elem, exe)}
 		targ = len(link) - 1
-
-	default:
-		// C command. Use gccargs and ldargs.
-		if gohostos == "plan9" {
-			link = []string{fmt.Sprintf("%sl", gohostchar), "-o", pathf("%s/%s", tooldir, name)}
-			targ = len(link) - 1
-		} else {
-			link = append(link, gccargs...)
-			link = append(link, ldargs...)
-			if sflag {
-				link = append(link, "-static")
-			}
-			link = append(link, "-o", pathf("%s/%s%s", tooldir, name, exe))
-			targ = len(link) - 1
-			switch gohostarch {
-			case "amd64":
-				link = append(link, "-m64")
-			case "386":
-				link = append(link, "-m32")
-			}
-		}
 	}
 	ttarg := mtime(link[targ])
 
@@ -669,30 +558,11 @@ func install(dir string) {
 		return !strings.HasPrefix(p, ".") && (!strings.HasPrefix(p, "_") || !strings.HasSuffix(p, ".go"))
 	})
 
-	var libs []string
-
 	for _, dt := range deptab {
 		if dir == dt.prefix || strings.HasSuffix(dt.prefix, "/") && strings.HasPrefix(dir, dt.prefix) {
 			for _, p := range dt.dep {
 				p = os.ExpandEnv(p)
-				switch {
-				case strings.HasSuffix(p, ".a"):
-					libs = append(libs, p)
-
-				case strings.HasSuffix(p, "/*"):
-					dir := strings.TrimSuffix(p, "/*")
-					for _, name := range xreaddir(pathf("%s/%s", path, dir)) {
-						files = append(files, pathf("%s/%s", dir, name))
-					}
-
-				case strings.HasPrefix(p, "-"):
-					files = filter(files, func(s string) bool {
-						return !strings.HasPrefix(s, p[1:])
-					})
-
-				default:
-					files = append(files, p)
-				}
+				files = append(files, p)
 			}
 		}
 	}
@@ -737,15 +607,6 @@ func install(dir string) {
 		return
 	}
 
-	if !stale {
-		for _, p := range libs {
-			if mtime(p).After(ttarg) {
-				stale = true
-				break
-			}
-		}
-	}
-
 	if !stale {
 		return
 	}
@@ -788,7 +649,7 @@ func install(dir string) {
 	built:
 	}
 
-	if (goos != gohostos || goarch != gohostarch) && isgo {
+	if goos != gohostos || goarch != gohostarch {
 		// We've generated the right files; the go command can do the build.
 		if vflag > 1 {
 			errprintf("skip build for cross-compile %s\n", dir)
@@ -797,111 +658,47 @@ func install(dir string) {
 	}
 
 	var archive string
-	if isgo {
-		// The next loop will compile individual non-Go files.
-		// Hand the Go files to the compiler en masse.
-		// For package runtime, this writes go_asm.h, which
-		// the assembly files will need.
-		pkg := dir
-		if strings.HasPrefix(dir, "cmd/") {
-			pkg = "main"
-		}
-		b := pathf("%s/_go_.a", workdir)
-		clean = append(clean, b)
-		if !ispackcmd {
-			link = append(link, b)
-		} else {
-			archive = b
-		}
-		compile := []string{pathf("%s/%sg", tooldir, gochar), "-pack", "-o", b, "-p", pkg}
-		if dir == "runtime" {
-			compile = append(compile, "-+", "-asmhdr", pathf("%s/go_asm.h", workdir))
-		}
-		compile = append(compile, gofiles...)
-		run(path, CheckExit|ShowOutput, compile...)
+	// The next loop will compile individual non-Go files.
+	// Hand the Go files to the compiler en masse.
+	// For package runtime, this writes go_asm.h, which
+	// the assembly files will need.
+	pkg := dir
+	if strings.HasPrefix(dir, "cmd/") {
+		pkg = "main"
+	}
+	b := pathf("%s/_go_.a", workdir)
+	clean = append(clean, b)
+	if !ispackcmd {
+		link = append(link, b)
+	} else {
+		archive = b
+	}
+	compile := []string{pathf("%s/%sg", tooldir, gochar), "-pack", "-o", b, "-p", pkg}
+	if dir == "runtime" {
+		compile = append(compile, "-+", "-asmhdr", pathf("%s/go_asm.h", workdir))
 	}
+	compile = append(compile, gofiles...)
+	run(path, CheckExit|ShowOutput, compile...)
 
 	// Compile the files.
 	for _, p := range files {
-		if !strings.HasSuffix(p, ".c") && !strings.HasSuffix(p, ".s") {
+		if !strings.HasSuffix(p, ".s") {
 			continue
 		}
-		name := filepath.Base(p)
 
 		var compile []string
-		if !isgo {
-			// C library or tool.
-			if gohostos == "plan9" {
-				compile = []string{
-					gohostchar + "c", "-FTVwp",
-					"-DPLAN9",
-					"-D__STDC__=1",
-					"-D__SIZE_TYPE__=ulong", // for GNU bison
-					pathf("-I%s/include/plan9", goroot),
-					pathf("-I%s/include/plan9/%s", goroot, gohostarch),
-				}
-			} else {
-				compile = gccargs[0:len(gccargs):len(gccargs)]
-				compile = append(compile, "-c")
-				switch gohostarch {
-				case "amd64":
-					compile = append(compile, "-m64")
-				case "386":
-					compile = append(compile, "-m32")
-				}
-				compile = append(compile, "-I", pathf("%s/include", goroot))
-			}
-
-			if dir == "lib9" {
-				compile = append(compile, "-DPLAN9PORT")
-			}
-
-			compile = append(compile, "-I", path)
-
-			// lib9/goos.c gets the default constants hard-coded.
-			if name == "goos.c" {
-				compile = append(compile,
-					"-D", fmt.Sprintf("GOOS=%q", goos),
-					"-D", fmt.Sprintf("GOARCH=%q", goarch),
-					"-D", fmt.Sprintf("GOHOSTOS=%q", gohostos),
-					"-D", fmt.Sprintf("GOHOSTARCH=%q", gohostarch),
-					"-D", fmt.Sprintf("GOROOT=%q", goroot_final),
-					"-D", fmt.Sprintf("GOVERSION=%q", findgoversion()),
-					"-D", fmt.Sprintf("GOARM=%q", goarm),
-					"-D", fmt.Sprintf("GO386=%q", go386),
-					"-D", fmt.Sprintf("GO_EXTLINK_ENABLED=%q", goextlinkenabled),
-				)
-			}
-
-			// liblink/go.c records the GOEXPERIMENT setting used during the build.
-			if name == "go.c" {
-				compile = append(compile,
-					"-D", fmt.Sprintf("GOEXPERIMENT=%q", os.Getenv("GOEXPERIMENT")))
-			}
-		} else {
-			// Assembly file for a Go package.
-			compile = []string{
-				pathf("%s/%sa", tooldir, gochar),
-				"-I", workdir,
-				"-I", pathf("%s/pkg/%s_%s", goroot, goos, goarch),
-				"-D", "GOOS_" + goos,
-				"-D", "GOARCH_" + goarch,
-				"-D", "GOOS_GOARCH_" + goos + "_" + goarch,
-			}
+		// Assembly file for a Go package.
+		compile = []string{
+			pathf("%s/%sa", tooldir, gochar),
+			"-I", workdir,
+			"-I", pathf("%s/pkg/%s_%s", goroot, goos, goarch),
+			"-D", "GOOS_" + goos,
+			"-D", "GOARCH_" + goarch,
+			"-D", "GOOS_GOARCH_" + goos + "_" + goarch,
 		}
 
 		doclean := true
 		b := pathf("%s/%s", workdir, filepath.Base(p))
-		if !isgo && gohostos == "darwin" {
-			// To debug C programs on OS X, it is not enough to say -ggdb
-			// on the command line.  You have to leave the object files
-			// lying around too.  Leave them in pkg/obj/, which does not
-			// get removed when this tool exits.
-			obj := pathf("%s/pkg/obj/%s", goroot, dir)
-			xmkdirall(obj)
-			b = pathf("%s/%s", obj, filepath.Base(p))
-			doclean = false
-		}
 
 		// Change the last character of the output file (which was c or s).
 		if gohostos == "plan9" {
@@ -919,20 +716,12 @@ func install(dir string) {
 	}
 	bgwait()
 
-	if isgo && ispackcmd {
+	if ispackcmd {
 		xremove(link[targ])
 		dopack(link[targ], archive, link[targ+1:])
 		return
 	}
 
-	if !islib && !isgo {
-		// C binaries need the libraries explicitly, and -lm.
-		link = append(link, libs...)
-		if gohostos != "plan9" {
-			link = append(link, "-lm")
-		}
-	}
-
 	// Remove target before writing it.
 	xremove(link[targ])
 	run("", CheckExit|ShowOutput, link...)
@@ -1128,9 +917,6 @@ var cleantab = []string{
 	"cmd/9g",
 	"cmd/9l",
 	"cmd/go",
-	"lib9",
-	"libbio",
-	"liblink",
 
 	// Go packages.
 	"bufio",
diff --git a/src/lib9/Makefile b/src/lib9/Makefile
deleted file mode 100644
index 62aba5dca70f55d17e405cabf30766131503571a..0000000000000000000000000000000000000000
--- a/src/lib9/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2012 The Go Authors.  All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
diff --git a/src/lib9/_exits.c b/src/lib9/_exits.c
deleted file mode 100644
index af55181b9002ff50d30e23cb3e8952535bc4a296..0000000000000000000000000000000000000000
--- a/src/lib9/_exits.c
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_exits.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_exits.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-_exits(char *s)
-{
-	if(s == 0 || *s == 0)
-		_exit(0);
-	_exit(exitcode(s));
-}
diff --git a/src/lib9/_p9dir.c b/src/lib9/_p9dir.c
deleted file mode 100644
index 6b5a04eadd5b393cc7bebfdf02c365a1115ac7fa..0000000000000000000000000000000000000000
--- a/src/lib9/_p9dir.c
+++ /dev/null
@@ -1,184 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_p9dir.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_p9dir.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-
-/*
- * Caching the last group and passwd looked up is
- * a significant win (stupidly enough) on most systems.
- * It's not safe for threaded programs, but neither is using
- * getpwnam in the first place, so I'm not too worried.
- */
-int
-_p9dir(struct stat *lst, struct stat *st, char *name, Dir *d, char **str, char *estr)
-{
-	char *s;
-	char tmp[20];
-	int sz, fd;
-
-#ifdef _WIN32
-	USED(lst);
-#endif
-	fd = -1;
-	USED(fd);
-	sz = 0;
-	if(d)
-		memset(d, 0, sizeof *d);
-
-	/* name */
-	s = strrchr(name, '/');
-	if(s)
-		s++;
-	if(!s || !*s)
-		s = name;
-	if(*s == '/')
-		s++;
-	if(*s == 0)
-		s = "/";
-	if(d){
-		if(*str + strlen(s)+1 > estr)
-			d->name = "oops";
-		else{
-			strcpy(*str, s);
-			d->name = *str;
-			*str += strlen(*str)+1;
-		}
-	}
-	sz += (int)strlen(s)+1;
-
-	/* user */
-	snprint(tmp, sizeof tmp, "%d", (int)st->st_uid);
-	s = tmp;
-	sz += (int)strlen(s)+1;
-	if(d){
-		if(*str+strlen(s)+1 > estr)
-			d->uid = "oops";
-		else{
-			strcpy(*str, s);
-			d->uid = *str;
-			*str += strlen(*str)+1;
-		}
-	}
-
-	/* group */
-	snprint(tmp, sizeof tmp, "%d", (int)st->st_gid);
-	s = tmp;
-	sz += (int)strlen(s)+1;
-	if(d){
-		if(*str + strlen(s)+1 > estr)
-			d->gid = "oops";
-		else{
-			strcpy(*str, s);
-			d->gid = *str;
-			*str += strlen(*str)+1;
-		}
-	}
-
-	if(d){
-		d->type = 'M';
-
-		d->muid = "";
-		d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino;
-#ifdef _HAVESTGEN
-		d->qid.vers = st->st_gen;
-#endif
-		if(d->qid.vers == 0)
-			d->qid.vers = (ulong)(st->st_mtime + st->st_ctime);
-		d->mode = st->st_mode&0777;
-		d->atime = (ulong)st->st_atime;
-		d->mtime = (ulong)st->st_mtime;
-		d->length = st->st_size;
-
-		if(S_ISDIR(st->st_mode)){
-			d->length = 0;
-			d->mode |= DMDIR;
-			d->qid.type = QTDIR;
-		}
-#ifdef S_ISLNK
-		if(S_ISLNK(lst->st_mode))	/* yes, lst not st */
-			d->mode |= DMSYMLINK;
-#endif
-		if(S_ISFIFO(st->st_mode))
-			d->mode |= DMNAMEDPIPE;
-#ifdef S_ISSOCK
-		if(S_ISSOCK(st->st_mode))
-			d->mode |= DMSOCKET;
-#endif
-		if(S_ISBLK(st->st_mode)){
-			d->mode |= DMDEVICE;
-			d->qid.path = ('b'<<16)|st->st_rdev;
-		}
-		if(S_ISCHR(st->st_mode)){
-			d->mode |= DMDEVICE;
-			d->qid.path = ('c'<<16)|st->st_rdev;
-		}
-		/* fetch real size for disks */
-		if(S_ISBLK(st->st_mode) && (fd = open(name, O_RDONLY)) >= 0){
-			d->length = 0;
-			close(fd);
-		}
-#if defined(DIOCGMEDIASIZE)
-		if(isdisk(st)){
-			int fd;
-			off_t mediasize;
-
-			if((fd = open(name, O_RDONLY)) >= 0){
-				if(ioctl(fd, DIOCGMEDIASIZE, &mediasize) >= 0)
-					d->length = mediasize;
-				close(fd);
-			}
-		}
-#elif defined(_HAVEDISKLABEL)
-		if(isdisk(st)){
-			int fd, n;
-			struct disklabel lab;
-
-			if((fd = open(name, O_RDONLY)) < 0)
-				goto nosize;
-			if(ioctl(fd, DIOCGDINFO, &lab) < 0)
-				goto nosize;
-			n = minor(st->st_rdev)&7;
-			if(n >= lab.d_npartitions)
-				goto nosize;
-
-			d->length = (vlong)(lab.d_partitions[n].p_size) * lab.d_secsize;
-
-		nosize:
-			if(fd >= 0)
-				close(fd);
-		}
-#endif
-	}
-
-	return sz;
-}
-
diff --git a/src/lib9/atoi.c b/src/lib9/atoi.c
deleted file mode 100644
index 5b002df75e464c84d49fa37acae74cd0f4f0f5f0..0000000000000000000000000000000000000000
--- a/src/lib9/atoi.c
+++ /dev/null
@@ -1,47 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/ato*.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/atoi.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-atoi(char *s)
-{
-	return (int)strtol(s, 0, 0);
-}
-
-long
-atol(char *s)
-{
-	return strtol(s, 0, 0);
-}
-
-vlong
-atoll(char *s)
-{
-	return strtoll(s, 0, 0);
-}
diff --git a/src/lib9/await.c b/src/lib9/await.c
deleted file mode 100644
index dfb155b2435b2371c69cc46e4d6a23d38d7e0fda..0000000000000000000000000000000000000000
--- a/src/lib9/await.c
+++ /dev/null
@@ -1,182 +0,0 @@
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/await.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/await.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-Portions Copyright 2009 The Go Authors.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#ifndef WCOREDUMP	/* not on Mac OS X Tiger */
-#define WCOREDUMP(status) 0
-#endif
-
-static struct {
-	int sig;
-	char *str;
-} tab[] = {
-	SIGHUP,		"hangup",
-	SIGINT,		"interrupt",
-	SIGQUIT,		"quit",
-	SIGILL,		"sys: illegal instruction",
-	SIGTRAP,		"sys: breakpoint",
-	SIGABRT,		"sys: abort",
-#ifdef SIGEMT
-	SIGEMT,		"sys: emulate instruction executed",
-#endif
-	SIGFPE,		"sys: fp: trap",
-	SIGKILL,		"sys: kill",
-	SIGBUS,		"sys: bus error",
-	SIGSEGV,		"sys: segmentation violation",
-	SIGALRM,		"alarm",
-	SIGTERM,		"kill",
-	SIGURG,		"sys: urgent condition on socket",
-	SIGSTOP,		"sys: stop",
-	SIGTSTP,		"sys: tstp",
-	SIGCONT,		"sys: cont",
-	SIGCHLD,		"sys: child",
-	SIGTTIN,		"sys: ttin",
-	SIGTTOU,		"sys: ttou",
-#ifdef SIGIO	/* not on Mac OS X Tiger */
-	SIGIO,		"sys: i/o possible on fd",
-#endif
-	SIGXCPU,		"sys: cpu time limit exceeded",
-	SIGXFSZ,		"sys: file size limit exceeded",
-	SIGVTALRM,	"sys: virtual time alarm",
-	SIGPROF,		"sys: profiling timer alarm",
-#ifdef SIGWINCH	/* not on Mac OS X Tiger */
-	SIGWINCH,	"sys: window size change",
-#endif
-#ifdef SIGINFO
-	SIGINFO,		"sys: status request",
-#endif
-	SIGUSR1,		"sys: usr1",
-	SIGUSR2,		"sys: usr2",
-	SIGPIPE,		"sys: write on closed pipe",
-};
-
-char*
-_p9sigstr(int sig, char *tmp)
-{
-	int i;
-
-	for(i=0; i<nelem(tab); i++)
-		if(tab[i].sig == sig)
-			return tab[i].str;
-	if(tmp == nil)
-		return nil;
-	sprint(tmp, "sys: signal %d", sig);
-	return tmp;
-}
-
-int
-_p9strsig(char *s)
-{
-	int i;
-
-	for(i=0; i<nelem(tab); i++)
-		if(strcmp(s, tab[i].str) == 0)
-			return tab[i].sig;
-	return 0;
-}
-
-static Waitmsg*
-_wait(int pid4, int opt)
-{
-	int pid, status, cd;
-	struct rusage ru;
-	char tmp[64];
-	ulong u, s;
-	Waitmsg *w;
-
-	w = malloc(sizeof *w + 200);
-	if(w == nil)
-		return nil;
-	memset(w, 0, sizeof *w);
-	w->msg = (char*)&w[1];
-
-	for(;;){
-		/* On Linux, pid==-1 means anyone; on SunOS, it's pid==0. */
-		if(pid4 == -1)
-			pid = wait3(&status, opt, &ru);
-		else
-			pid = wait4(pid4, &status, opt, &ru);
-		if(pid <= 0) {
-			free(w);
-			return nil;
-		}
-		u = (ulong)(ru.ru_utime.tv_sec*1000+((ru.ru_utime.tv_usec+500)/1000));
-		s = (ulong)(ru.ru_stime.tv_sec*1000+((ru.ru_stime.tv_usec+500)/1000));
-		w->pid = pid;
-		w->time[0] = u;
-		w->time[1] = s;
-		w->time[2] = u+s;
-		if(WIFEXITED(status)){
-			if(status)
-				sprint(w->msg, "%d", status);
-			return w;
-		}
-		if(WIFSIGNALED(status)){
-			cd = WCOREDUMP(status);
-			sprint(w->msg, "signal: %s", _p9sigstr(WTERMSIG(status), tmp));
-			if(cd)
-				strcat(w->msg, " (core dumped)");
-			return w;
-		}
-	}
-}
-
-Waitmsg*
-p9wait(void)
-{
-	return _wait(-1, 0);
-}
-
-Waitmsg*
-p9waitfor(int pid)
-{
-	return _wait(pid, 0);
-}
-
-Waitmsg*
-p9waitnohang(void)
-{
-	return _wait(-1, WNOHANG);
-}
-
-int
-p9waitpid(void)
-{
-	int status;
-	return wait(&status);
-}
diff --git a/src/lib9/cleanname.c b/src/lib9/cleanname.c
deleted file mode 100644
index cb8fce6a5f3580317415eb102d81fd252580bad4..0000000000000000000000000000000000000000
--- a/src/lib9/cleanname.c
+++ /dev/null
@@ -1,80 +0,0 @@
-// +build !plan9
-
-/*
-Inferno libkern/cleanname.c
-http://code.google.com/p/inferno-os/source/browse/libkern/cleanname.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-/*
- * In place, rewrite name to compress multiple /, eliminate ., and process ..
- */
-#define SEP(x)	((x)=='/' || (x) == 0)
-char*
-cleanname(char *name)
-{
-	char *p, *q, *dotdot;
-	int rooted;
-
-	rooted = name[0] == '/';
-
-	/*
-	 * invariants:
-	 *	p points at beginning of path element we're considering.
-	 *	q points just past the last path element we wrote (no slash).
-	 *	dotdot points just past the point where .. cannot backtrack
-	 *		any further (no slash).
-	 */
-	p = q = dotdot = name+rooted;
-	while(*p) {
-		if(p[0] == '/')	/* null element */
-			p++;
-		else if(p[0] == '.' && SEP(p[1]))
-			p += 1;	/* don't count the separator in case it is nul */
-		else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) {
-			p += 2;
-			if(q > dotdot) {	/* can backtrack */
-				while(--q > dotdot && *q != '/')
-					;
-			} else if(!rooted) {	/* /.. is / but ./../ is .. */
-				if(q != name)
-					*q++ = '/';
-				*q++ = '.';
-				*q++ = '.';
-				dotdot = q;
-			}
-		} else {	/* real path element */
-			if(q != name+rooted)
-				*q++ = '/';
-			while((*q = *p) != '/' && *q != 0)
-				p++, q++;
-		}
-	}
-	if(q == name)	/* empty string is really ``.'' */
-		*q++ = '.';
-	*q = '\0';
-	return name;
-}
diff --git a/src/lib9/create.c b/src/lib9/create.c
deleted file mode 100644
index 4ac7f7d619bec79124185ffa4a5957f1c3c858ad..0000000000000000000000000000000000000000
--- a/src/lib9/create.c
+++ /dev/null
@@ -1,85 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/create.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/create.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#define _GNU_SOURCE	/* for Linux O_DIRECT */
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <sys/file.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <libc.h>
-#include <sys/stat.h>
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-int
-p9create(char *path, int mode, ulong perm)
-{
-	int fd, umode, rclose;
-
-	rclose = mode&ORCLOSE;
-	mode &= ~ORCLOSE;
-
-	/* XXX should get mode mask right? */
-	fd = -1;
-	if(perm&DMDIR){
-		if(mode != OREAD){
-			werrstr("bad mode in directory create");
-			goto out;
-		}
-		if(mkdir(path, perm&0777) < 0)
-			goto out;
-		fd = open(path, O_RDONLY);
-	}else{
-		umode = (mode&3)|O_CREAT|O_TRUNC;
-		mode &= ~(3|OTRUNC);
-		if(mode&ODIRECT){
-			umode |= O_DIRECT;
-			mode &= ~ODIRECT;
-		}
-		if(mode&OEXCL){
-			umode |= O_EXCL;
-			mode &= ~OEXCL;
-		}
-		if(mode&OAPPEND){
-			umode |= O_APPEND;
-			mode &= ~OAPPEND;
-		}
-		if(mode){
-			werrstr("unsupported mode in create");
-			goto out;
-		}
-		umode |= O_BINARY;
-		fd = open(path, umode, perm);
-	}
-out:
-	if(fd >= 0){
-		if(rclose)
-			remove(path);
-	}
-	return fd;
-}
diff --git a/src/lib9/ctime.c b/src/lib9/ctime.c
deleted file mode 100644
index e16ad4a5e51632cabac6b7fd3cd299c81fee0d97..0000000000000000000000000000000000000000
--- a/src/lib9/ctime.c
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-
-char*
-p9ctime(long t)
-{
-	static char buf[100];
-	time_t tt;
-	struct tm *tm;
-	
-	tt = t;
-	tm = localtime(&tt);
-	snprint(buf, sizeof buf, "%3.3s %3.3s %02d %02d:%02d:%02d %3.3s %d\n",
-		&"SunMonTueWedThuFriSat"[tm->tm_wday*3],
-		&"JanFebMarAprMayJunJulAugSepOctNovDec"[tm->tm_mon*3],
-		tm->tm_mday,
-		tm->tm_hour,
-		tm->tm_min,
-		tm->tm_sec,
-		"XXX",  // tm_zone is unavailable on windows, and no one cares
-		tm->tm_year + 1900);
-	return buf;
-}
diff --git a/src/lib9/dirfstat.c b/src/lib9/dirfstat.c
deleted file mode 100644
index c092a2a0725c2a620123580edd49133a4fadf933..0000000000000000000000000000000000000000
--- a/src/lib9/dirfstat.c
+++ /dev/null
@@ -1,56 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirfstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirfstat.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#include <sys/stat.h>
-
-extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
-
-Dir*
-dirfstat(int fd)
-{
-	struct stat st;
-	int nstr;
-	Dir *d;
-	char *str, tmp[100];
-
-	if(fstat(fd, &st) < 0)
-		return nil;
-
-	snprint(tmp, sizeof tmp, "/dev/fd/%d", fd);
-	nstr = _p9dir(&st, &st, tmp, nil, nil, nil);
-	d = malloc(sizeof(Dir)+(size_t)nstr);
-	if(d == nil)
-		return nil;
-	memset(d, 0, sizeof(Dir)+(size_t)nstr);
-	str = (char*)&d[1];
-	_p9dir(&st, &st, tmp, d, &str, str+nstr);
-	return d;
-}
-
diff --git a/src/lib9/dirfwstat.c b/src/lib9/dirfwstat.c
deleted file mode 100644
index 4666e21079df446f5eacfc75abd4a632b0d70450..0000000000000000000000000000000000000000
--- a/src/lib9/dirfwstat.c
+++ /dev/null
@@ -1,84 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirfwstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirfwstat.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define NOPLAN9DEFINES
-#include <u.h>
-#include <libc.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__linux__)
-/* do nothing -- futimes exists and is fine */
-
-#elif defined(__SunOS5_9__)
-/* use futimesat */
-static int
-futimes(int fd, struct timeval *tv)
-{
-	return futimesat(fd, 0, tv);
-}
-
-#else
-/* provide dummy */
-/* rename just in case -- linux provides an unusable one */
-#undef futimes
-#define futimes myfutimes
-static int
-futimes(int fd, struct timeval *tv)
-{
-	USED(fd);
-	USED(tv);
-	werrstr("futimes not available");
-	return -1;
-}
-
-#endif
-
-int
-dirfwstat(int fd, Dir *dir)
-{
-	int ret;
-	struct timeval tv[2];
-
-	ret = 0;
-#ifndef _WIN32
-	if(~dir->mode != 0){
-		if(fchmod(fd, (mode_t)dir->mode) < 0)
-			ret = -1;
-	}
-#endif
-	if(~dir->mtime != 0){
-		tv[0].tv_sec = (time_t)dir->mtime;
-		tv[0].tv_usec = 0;
-		tv[1].tv_sec = (time_t)dir->mtime;
-		tv[1].tv_usec = 0;
-		if(futimes(fd, tv) < 0)
-			ret = -1;
-	}
-	return ret;
-}
-
diff --git a/src/lib9/dirstat.c b/src/lib9/dirstat.c
deleted file mode 100644
index 33f0d7cf26e58b10acf46040efa9edd2b59b1ea0..0000000000000000000000000000000000000000
--- a/src/lib9/dirstat.c
+++ /dev/null
@@ -1,65 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirstat.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#include <sys/stat.h>
-
-extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
-
-Dir*
-dirstat(char *file)
-{
-	struct stat lst;
-	struct stat st;
-	int nstr;
-	Dir *d;
-	char *str;
-
-#ifdef _WIN32
-	if(stat(file, &st) < 0)
-		return nil;
-	lst = st;
-#else
-	if(lstat(file, &lst) < 0)
-		return nil;
-	st = lst;
-	if((lst.st_mode&S_IFMT) == S_IFLNK)
-		stat(file, &st);
-#endif
-
-	nstr = _p9dir(&lst, &st, file, nil, nil, nil);
-	d = malloc(sizeof(Dir)+(size_t)nstr);
-	if(d == nil)
-		return nil;
-	memset(d, 0, sizeof(Dir)+(size_t)nstr);
-	str = (char*)&d[1];
-	_p9dir(&lst, &st, file, d, &str, str+nstr);
-	return d;
-}
-
diff --git a/src/lib9/dirwstat.c b/src/lib9/dirwstat.c
deleted file mode 100644
index 22e25fff7b770b1138dfc32d1d92edab6f9981c6..0000000000000000000000000000000000000000
--- a/src/lib9/dirwstat.c
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dirwstat.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dirwstat.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include <sys/time.h>
-#include <utime.h>
-
-int
-dirwstat(char *file, Dir *dir)
-{
-	struct utimbuf ub;
-
-	/* BUG handle more */
-	if(~dir->mtime == 0)
-		return 0;
-
-	ub.actime = (time_t)dir->mtime;
-	ub.modtime = (time_t)dir->mtime;
-	return utime(file, &ub);
-}
diff --git a/src/lib9/dup.c b/src/lib9/dup.c
deleted file mode 100644
index 5cac831d6862f1e40d3345765c51f6f99ef4ca23..0000000000000000000000000000000000000000
--- a/src/lib9/dup.c
+++ /dev/null
@@ -1,38 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/dup.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/dup.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-#undef dup
-
-int
-p9dup(int old, int new)
-{
-	if(new == -1)
-		return dup(old);
-	return dup2(old, new);
-}
diff --git a/src/lib9/errstr.c b/src/lib9/errstr.c
deleted file mode 100644
index 9d919755d183b1831e6ad3172f0eb30064789647..0000000000000000000000000000000000000000
--- a/src/lib9/errstr.c
+++ /dev/null
@@ -1,107 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/errstr.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/errstr.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * We assume there's only one error buffer for the whole system.
- * If you use ffork, you need to provide a _syserrstr.  Since most
- * people will use libthread (which provides a _syserrstr), this is
- * okay.
- */
-
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-
-enum
-{
-	EPLAN9 = 0x19283745
-};
-
-char *(*_syserrstr)(void);
-static char xsyserr[ERRMAX];
-static char*
-getsyserr(void)
-{
-	char *s;
-
-	s = nil;
-	if(_syserrstr)
-		s = (*_syserrstr)();
-	if(s == nil)
-		s = xsyserr;
-	return s;
-}
-
-int
-errstr(char *err, uint n)
-{
-	char tmp[ERRMAX];
-	char *syserr;
-
-	strecpy(tmp, tmp+ERRMAX, err);
-	rerrstr(err, n);
-	syserr = getsyserr();
-	strecpy(syserr, syserr+ERRMAX, tmp);
-	errno = EPLAN9;
-	return 0;
-}
-
-void
-rerrstr(char *err, uint n)
-{
-	char *syserr;
-
-	syserr = getsyserr();
-	if(errno == EINTR)
-		strcpy(syserr, "interrupted");
-	else if(errno != EPLAN9)
-		strcpy(syserr, strerror(errno));
-	strecpy(err, err+n, syserr);
-}
-
-/* replaces __errfmt in libfmt */
-
-int
-__errfmt(Fmt *f)
-{
-	if(errno == EPLAN9)
-		return fmtstrcpy(f, getsyserr());
-	return fmtstrcpy(f, strerror(errno));
-}
-
-void
-werrstr(char *fmt, ...)
-{
-	va_list arg;
-	char buf[ERRMAX];
-
-	va_start(arg, fmt);
-	vseprint(buf, buf+ERRMAX, fmt, arg);
-	va_end(arg);
-	errstr(buf, ERRMAX);
-}
-
diff --git a/src/lib9/exec.c b/src/lib9/exec.c
deleted file mode 100644
index 8e5fc57848e554d6b0defc3649b29b1b1f43daf8..0000000000000000000000000000000000000000
--- a/src/lib9/exec.c
+++ /dev/null
@@ -1,35 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/exec.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/exec.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-int
-exec(char *prog, char *argv[])
-{
-	/* to mimic plan 9 should be just exec, but execvp is a better fit for unix */
-	return execvp(prog, argv);
-}
diff --git a/src/lib9/execl.c b/src/lib9/execl.c
deleted file mode 100644
index fd4d23daaf513a8a0ddd175034db2aea2b9fab20..0000000000000000000000000000000000000000
--- a/src/lib9/execl.c
+++ /dev/null
@@ -1,55 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/execl.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/execl.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-int
-execl(char *prog, ...)
-{
-	int i;
-	va_list arg;
-	char **argv;
-
-	va_start(arg, prog);
-	for(i=0; va_arg(arg, char*) != nil; i++)
-		;
-	va_end(arg);
-
-	argv = malloc((size_t)(i+1)*sizeof(char*));
-	if(argv == nil)
-		return -1;
-
-	va_start(arg, prog);
-	for(i=0; (argv[i] = va_arg(arg, char*)) != nil; i++)
-		;
-	va_end(arg);
-
-	exec(prog, argv);
-	free(argv);
-	return -1;
-}
-
diff --git a/src/lib9/exitcode.c b/src/lib9/exitcode.c
deleted file mode 100644
index fc863445f5ea9f8de54e499507e129208cec916f..0000000000000000000000000000000000000000
--- a/src/lib9/exitcode.c
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/exitcode.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/exitcode.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-exitcode(char *s)
-{
-	USED(s);
-	return 1;
-}
-
diff --git a/src/lib9/exits.c b/src/lib9/exits.c
deleted file mode 100644
index 0be7cb9f10531a6a9f80b087fd3eb801d976e127..0000000000000000000000000000000000000000
--- a/src/lib9/exits.c
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/_exits.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/_exits.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <libc.h>
-
-void
-exits(char *s)
-{
-	if(s == 0 || *s == 0)
-		exit(0);
-	exit(exitcode(s));
-}
diff --git a/src/lib9/flag.c b/src/lib9/flag.c
deleted file mode 100644
index db46b980950667ff4ef34652a8336b9687dd33c6..0000000000000000000000000000000000000000
--- a/src/lib9/flag.c
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-// Flag hash.
-typedef struct Flag Flag;
-
-struct Flag
-{
-	char *name;
-	int namelen;
-	char *desc;
-	int iscount;
-	void (*set)(char*, void*);
-	void (*set2)(char*, char*, void*);
-	void *arg;
-	Flag *next;
-	Flag *allnext;
-};
-
-static Flag *curflag;
-
-static Flag *fhash[512];
-static Flag *first, *last;
-
-char *argv0;
-
-/*
- * Mac OS can't deal with files that only declare data.
- * ARGBEGIN mentions this function so that this file gets pulled in.
- */
-void __fixargv0(void) { }
-
-// FNV-1 hash. http://isthe.com/chongo/tech/comp/fnv/
-static uint32
-fnv(char *p, int n)
-{
-	uint32 h;
-	
-	h = 2166136261U;
-	while(n-- > 0)
-		h = (h*16777619) ^ (uchar)*p++;
-	return h;
-}
-
-static Flag*
-lookflag(char *name, int namelen, int creat)
-{
-	uint32 h;
-	Flag *f;
-
-	h = fnv(name, namelen) & (nelem(fhash)-1);
-	for(f=fhash[h]; f; f=f->next) {
-		if(f->namelen == namelen && memcmp(f->name, name, (size_t)namelen) == 0) {
-			if(creat)
-				sysfatal("multiple definitions of flag -%s", name);
-			return f;
-		}
-	}
-	
-	if(!creat)
-		return nil;
-
-	f = malloc(sizeof *f);
-	if(f == nil)
-		sysfatal("out of memory");
-	memset(f, 0, sizeof *f);
-	f->name = name;
-	f->namelen = namelen;
-	f->next = fhash[h];
-	if(first == nil)
-		first = f;
-	else
-		last->allnext = f;
-	last = f;
-	fhash[h] = f;
-	return f;
-}
-
-static void
-count(char *arg, void *p)
-{
-	int *ip;
-	
-	ip = p;
-	if(arg != nil)
-		*ip = atoi(arg);
-	else
-		(*ip)++;
-}
-
-void
-flagcount(char *name, char *desc, int *p)
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->iscount = 1;
-	f->set = count;
-	f->arg = p;
-}
-
-static void
-atollwhex(char *s, void *p)
-{
-	char *t;
-
-	*(int64*)p = strtoll(s, &t, 0);
-	if(*s == '\0' || *t != '\0')
-		sysfatal("invalid numeric argument -%s=%s", curflag->name, s);
-}
-
-void
-flagint64(char *name, char *desc, int64 *p)
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set = atollwhex;
-	f->arg = p;
-}
-
-static void
-atolwhex(char *s, void *p)
-{
-	char *t;
-
-	*(int32*)p = (int32)strtol(s, &t, 0);
-	if(*s == '\0' || *t != '\0')
-		sysfatal("invalid numeric argument -%s=%s", curflag->name, s);
-}
-
-void
-flagint32(char *name, char *desc, int32 *p)
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set = atolwhex;
-	f->arg = p;
-}
-
-static void
-string(char *s, void *p)
-{
-	*(char**)p = s;
-}
-
-void
-flagstr(char *name, char *desc, char **p)
-{
-
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set = string;
-	f->arg = p;
-}	
-
-static void
-fn0(char *s, void *p)
-{
-	USED(s);
-	((void(*)(void))p)();
-}
-
-void
-flagfn0(char *name, char *desc, void (*fn)(void))
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set = fn0;
-	f->arg = fn;
-	f->iscount = 1;
-}
-
-static void
-fn1(char *s, void *p)
-{
-	((void(*)(char*))p)(s);
-}
-
-void
-flagfn1(char *name, char *desc, void (*fn)(char*))
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set = fn1;
-	f->arg = fn;
-}
-
-static void
-fn2(char *s, char *t, void *p)
-{
-	((void(*)(char*, char*))p)(s, t);
-}
-
-void
-flagfn2(char *name, char *desc, void (*fn)(char*, char*))
-{
-	Flag *f;
-	
-	f = lookflag(name, (int)strlen(name), 1);
-	f->desc = desc;
-	f->set2 = fn2;
-	f->arg = fn;
-}
-
-void
-flagparse(int *argcp, char ***argvp, void (*usage)(void))
-{
-	int argc;
-	char **argv, *p, *q;
-	char *name;
-	int namelen;
-	Flag *f;
-	
-	argc = *argcp;
-	argv = *argvp;
-
-	argv0 = argv[0];
-	argc--;
-	argv++;
-	
-	while(argc > 0) {
-		p = *argv;
-		// stop before non-flag or -
-		if(*p != '-' || p[1] == '\0')
-			break;
-		argc--;
-		argv++;
-		// stop after --
-		if(p[1] == '-' && p[2] == '\0') {
-			break;
-		}
-		
-		// turn --foo into -foo
-		if(p[1] == '-' && p[2] != '-')
-			p++;
-		
-		// allow -flag=arg if present
-		name = p+1;
-		q = strchr(name, '=');
-		if(q != nil)
-			namelen = (int)(q++ - name);
-		else
-			namelen = (int)strlen(name);
-		f = lookflag(name, namelen, 0);
-		if(f == nil) {
-			if(strcmp(p, "-h") == 0 || strcmp(p, "-help") == 0 || strcmp(p, "-?") == 0)
-				usage();
-			sysfatal("unknown flag %s", p);
-		}
-		curflag = f;
-
-		// otherwise consume next argument if non-boolean
-		if(!f->iscount && q == nil) {
-			if(argc-- == 0)
-				sysfatal("missing argument to flag %s", p);
-			q = *argv++;
-		}
-		
-		// and another if we need two
-		if(f->set2 != nil) {
-			if(argc-- == 0)
-				sysfatal("missing second argument to flag %s", p);
-			f->set2(q, *argv++, f->arg);
-			continue;
-		}
-
-		f->set(q, f->arg);			
-	}
-	
-	*argcp = argc;
-	*argvp = argv;		
-}
-
-void
-flagprint(int fd)
-{
-	Flag *f;
-	char *p, *q;
-	
-	for(f=first; f; f=f->allnext) {
-		p = f->desc;
-		if(p == nil || *p == '\0') // undocumented flag
-			continue;
-		q = strstr(p, ": ");
-		if(q)
-			fprint(fd, "  -%s %.*s\n    \t%s\n", f->name, utfnlen(p, q-p), p, q+2);
-		else if(f->namelen > 1)
-			fprint(fd, "  -%s\n    \t%s\n", f->name, p);
-		else
-			fprint(fd, "  -%s\t%s\n", f->name, p);
-	}
-}
diff --git a/src/lib9/fmt/charstod.c b/src/lib9/fmt/charstod.c
deleted file mode 100644
index b8096e8fbaccd4ed54b9dd348604d51d2e99811d..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/charstod.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Reads a floating-point number by interpreting successive characters
- * returned by (*f)(vp).  The last call it makes to f terminates the
- * scan, so is not a character in the number.  It may therefore be
- * necessary to back up the input stream up one byte after calling charstod.
- */
-
-double
-fmtcharstod(int(*f)(void*), void *vp)
-{
-	double num, dem;
-	int neg, eneg, dig, exp, c;
-
-	num = 0;
-	neg = 0;
-	dig = 0;
-	exp = 0;
-	eneg = 0;
-
-	c = (*f)(vp);
-	while(c == ' ' || c == '\t')
-		c = (*f)(vp);
-	if(c == '-' || c == '+'){
-		if(c == '-')
-			neg = 1;
-		c = (*f)(vp);
-	}
-	while(c >= '0' && c <= '9'){
-		num = num*10 + c-'0';
-		c = (*f)(vp);
-	}
-	if(c == '.')
-		c = (*f)(vp);
-	while(c >= '0' && c <= '9'){
-		num = num*10 + c-'0';
-		dig++;
-		c = (*f)(vp);
-	}
-	if(c == 'e' || c == 'E'){
-		c = (*f)(vp);
-		if(c == '-' || c == '+'){
-			if(c == '-'){
-				dig = -dig;
-				eneg = 1;
-			}
-			c = (*f)(vp);
-		}
-		while(c >= '0' && c <= '9'){
-			exp = exp*10 + c-'0';
-			c = (*f)(vp);
-		}
-	}
-	exp -= dig;
-	if(exp < 0){
-		exp = -exp;
-		eneg = !eneg;
-	}
-	dem = __fmtpow10(exp);
-	if(eneg)
-		num /= dem;
-	else
-		num *= dem;
-	if(neg)
-		return -num;
-	return num;
-}
diff --git a/src/lib9/fmt/dofmt.c b/src/lib9/fmt/dofmt.c
deleted file mode 100644
index 3b9dc361213707b16fa72c07be3cd30cb9ce9a68..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/dofmt.c
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/* format the output into f->to and return the number of characters fmted  */
-int
-dofmt(Fmt *f, char *fmt)
-{
-	Rune rune, *rt, *rs;
-	Rune r;
-	char *t, *s;
-	int n, nfmt;
-
-	nfmt = f->nfmt;
-	for(;;){
-		if(f->runes){
-			rt = (Rune*)f->to;
-			rs = (Rune*)f->stop;
-			while((r = (Rune)*(uchar*)fmt) && r != '%'){
-				if(r < Runeself)
-					fmt++;
-				else{
-					fmt += chartorune(&rune, fmt);
-					r = rune;
-				}
-				FMTRCHAR(f, rt, rs, r);
-			}
-			fmt++;
-			f->nfmt += (int)(rt - (Rune *)f->to);
-			f->to = rt;
-			if(!r)
-				return f->nfmt - nfmt;
-			f->stop = rs;
-		}else{
-			t = (char*)f->to;
-			s = (char*)f->stop;
-			while((r = (Rune)*(uchar*)fmt) && r != '%'){
-				if(r < Runeself){
-					FMTCHAR(f, t, s, r);
-					fmt++;
-				}else{
-					n = chartorune(&rune, fmt);
-					if(t + n > s){
-						t = (char*)__fmtflush(f, t, n);
-						if(t != nil)
-							s = (char*)f->stop;
-						else
-							return -1;
-					}
-					while(n--)
-						*t++ = *fmt++;
-				}
-			}
-			fmt++;
-			f->nfmt += (int)(t - (char *)f->to);
-			f->to = t;
-			if(!r)
-				return f->nfmt - nfmt;
-			f->stop = s;
-		}
-
-		fmt = (char*)__fmtdispatch(f, fmt, 0);
-		if(fmt == nil)
-			return -1;
-	}
-}
-
-void *
-__fmtflush(Fmt *f, void *t, int len)
-{
-	if(f->runes)
-		f->nfmt += (int)((Rune*)t - (Rune*)f->to);
-	else
-		f->nfmt += (int)((char*)t - (char *)f->to);
-	f->to = t;
-	if(f->flush == 0 || (*f->flush)(f) == 0 || (char*)f->to + len > (char*)f->stop){
-		f->stop = f->to;
-		return nil;
-	}
-	return f->to;
-}
-
-/*
- * put a formatted block of memory sz bytes long of n runes into the output buffer,
- * left/right justified in a field of at least f->width characters (if FmtWidth is set)
- */
-int
-__fmtpad(Fmt *f, int n)
-{
-	char *t, *s;
-	int i;
-
-	t = (char*)f->to;
-	s = (char*)f->stop;
-	for(i = 0; i < n; i++)
-		FMTCHAR(f, t, s, ' ');
-	f->nfmt += (int)(t - (char *)f->to);
-	f->to = t;
-	return 0;
-}
-
-int
-__rfmtpad(Fmt *f, int n)
-{
-	Rune *t, *s;
-	int i;
-
-	t = (Rune*)f->to;
-	s = (Rune*)f->stop;
-	for(i = 0; i < n; i++)
-		FMTRCHAR(f, t, s, ' ');
-	f->nfmt += (int)(t - (Rune *)f->to);
-	f->to = t;
-	return 0;
-}
-
-int
-__fmtcpy(Fmt *f, const void *vm, int n, int sz)
-{
-	Rune *rt, *rs, r;
-	char *t, *s, *m, *me;
-	ulong fl;
-	int nc, w;
-
-	m = (char*)vm;
-	me = m + sz;
-	fl = f->flags;
-	w = 0;
-	if(fl & FmtWidth)
-		w = f->width;
-	if((fl & FmtPrec) && n > f->prec)
-		n = f->prec;
-	if(f->runes){
-		if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
-			return -1;
-		rt = (Rune*)f->to;
-		rs = (Rune*)f->stop;
-		for(nc = n; nc > 0; nc--){
-			r = *(uchar*)m;
-			if(r < Runeself)
-				m++;
-			else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
-				m += chartorune(&r, m);
-			else
-				break;
-			FMTRCHAR(f, rt, rs, r);
-		}
-		f->nfmt += (int)(rt - (Rune *)f->to);
-		f->to = rt;
-		if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
-			return -1;
-	}else{
-		if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
-			return -1;
-		t = (char*)f->to;
-		s = (char*)f->stop;
-		for(nc = n; nc > 0; nc--){
-			r = *(uchar*)m;
-			if(r < Runeself)
-				m++;
-			else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
-				m += chartorune(&r, m);
-			else
-				break;
-			FMTRUNE(f, t, s, r);
-		}
-		f->nfmt += (int)(t - (char *)f->to);
-		f->to = t;
-		if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-int
-__fmtrcpy(Fmt *f, const void *vm, int n)
-{
-	Rune r, *m, *me, *rt, *rs;
-	char *t, *s;
-	ulong fl;
-	int w;
-
-	m = (Rune*)vm;
-	fl = f->flags;
-	w = 0;
-	if(fl & FmtWidth)
-		w = f->width;
-	if((fl & FmtPrec) && n > f->prec)
-		n = f->prec;
-	if(f->runes){
-		if(!(fl & FmtLeft) && __rfmtpad(f, w - n) < 0)
-			return -1;
-		rt = (Rune*)f->to;
-		rs = (Rune*)f->stop;
-		for(me = m + n; m < me; m++)
-			FMTRCHAR(f, rt, rs, *m);
-		f->nfmt += (int)(rt - (Rune *)f->to);
-		f->to = rt;
-		if(fl & FmtLeft && __rfmtpad(f, w - n) < 0)
-			return -1;
-	}else{
-		if(!(fl & FmtLeft) && __fmtpad(f, w - n) < 0)
-			return -1;
-		t = (char*)f->to;
-		s = (char*)f->stop;
-		for(me = m + n; m < me; m++){
-			r = *m;
-			FMTRUNE(f, t, s, r);
-		}
-		f->nfmt += (int)(t - (char *)f->to);
-		f->to = t;
-		if(fl & FmtLeft && __fmtpad(f, w - n) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-/* fmt out one character */
-int
-__charfmt(Fmt *f)
-{
-	char x[1];
-
-	x[0] = (char)va_arg(f->args, int);
-	f->prec = 1;
-	return __fmtcpy(f, (const char*)x, 1, 1);
-}
-
-/* fmt out one rune */
-int
-__runefmt(Fmt *f)
-{
-	Rune x[1];
-
-	x[0] = (Rune)va_arg(f->args, int);
-	return __fmtrcpy(f, (const void*)x, 1);
-}
-
-/* public helper routine: fmt out a null terminated string already in hand */
-int
-fmtstrcpy(Fmt *f, char *s)
-{
-	int i, j;
-
-	if(!s)
-		return __fmtcpy(f, "<nil>", 5, 5);
-	/* if precision is specified, make sure we don't wander off the end */
-	if(f->flags & FmtPrec){
-#ifdef PLAN9PORT
-		Rune r;
-		i = 0;
-		for(j=0; j<f->prec && s[i]; j++)
-			i += chartorune(&r, s+i);
-#else
-		/* ANSI requires precision in bytes, not Runes */
-		for(i=0; i<f->prec; i++)
-			if(s[i] == 0)
-				break;
-		j = utfnlen(s, i);	/* won't print partial at end */
-#endif
-		return __fmtcpy(f, s, j, i);
-	}
-	return __fmtcpy(f, s, utflen(s), (int)strlen(s));
-}
-
-/* fmt out a null terminated utf string */
-int
-__strfmt(Fmt *f)
-{
-	char *s;
-
-	s = va_arg(f->args, char *);
-	return fmtstrcpy(f, s);
-}
-
-/* public helper routine: fmt out a null terminated rune string already in hand */
-int
-fmtrunestrcpy(Fmt *f, Rune *s)
-{
-	Rune *e;
-	int n, p;
-
-	if(!s)
-		return __fmtcpy(f, "<nil>", 5, 5);
-	/* if precision is specified, make sure we don't wander off the end */
-	if(f->flags & FmtPrec){
-		p = f->prec;
-		for(n = 0; n < p; n++)
-			if(s[n] == 0)
-				break;
-	}else{
-		for(e = s; *e; e++)
-			;
-		n = (int)(e - s);
-	}
-	return __fmtrcpy(f, s, n);
-}
-
-/* fmt out a null terminated rune string */
-int
-__runesfmt(Fmt *f)
-{
-	Rune *s;
-
-	s = va_arg(f->args, Rune *);
-	return fmtrunestrcpy(f, s);
-}
-
-/* fmt a % */
-int
-__percentfmt(Fmt *f)
-{
-	Rune x[1];
-
-	x[0] = f->r;
-	f->prec = 1;
-	return __fmtrcpy(f, (const void*)x, 1);
-}
-
-/* fmt an integer */
-int
-__ifmt(Fmt *f)
-{
-	char buf[140], *p, *conv;
-	/* 140: for 64 bits of binary + 3-byte sep every 4 digits */
-	uvlong vu;
-	ulong fl, u;
-	int neg, base, i, n, w, isv;
-	int ndig, len, excess, bytelen;
-	char *grouping;
-	char *thousands;
-
-	neg = 0;
-	fl = f->flags;
-	isv = 0;
-	vu = 0;
-	u = 0;
-#ifndef PLAN9PORT
-	/*
-	 * Unsigned verbs for ANSI C
-	 */
-	switch(f->r){
-	case 'o':
-	case 'p':
-	case 'u':
-	case 'x':
-	case 'X':
-		fl |= FmtUnsigned;
-		fl &= ~(FmtSign|FmtSpace);
-		break;
-	}
-#endif
-	if(f->r == 'p'){
-		u = (uintptr)va_arg(f->args, void*);
-		f->r = 'x';
-		fl |= FmtUnsigned;
-	}else if(fl & FmtVLong){
-		isv = 1;
-		if(fl & FmtUnsigned)
-			vu = va_arg(f->args, uvlong);
-		else
-			vu = (uvlong)va_arg(f->args, vlong);
-	}else if(fl & FmtLong){
-		if(fl & FmtUnsigned)
-			u = va_arg(f->args, ulong);
-		else
-			u = (ulong)va_arg(f->args, long);
-	}else if(fl & FmtByte){
-		if(fl & FmtUnsigned)
-			u = (uchar)va_arg(f->args, int);
-		else
-			u = (ulong)(char)va_arg(f->args, int);
-	}else if(fl & FmtShort){
-		if(fl & FmtUnsigned)
-			u = (ushort)va_arg(f->args, int);
-		else
-			u = (ulong)(short)va_arg(f->args, int);
-	}else{
-		if(fl & FmtUnsigned)
-			u = va_arg(f->args, uint);
-		else
-			u = (ulong)va_arg(f->args, int);
-	}
-	conv = "0123456789abcdef";
-	grouping = "\4";	/* for hex, octal etc. (undefined by spec but nice) */
-	thousands = f->thousands;
-	switch(f->r){
-	case 'd':
-	case 'i':
-	case 'u':
-		base = 10;
-		grouping = f->grouping;
-		break;
-	case 'X':
-		conv = "0123456789ABCDEF";
-		/* fall through */
-	case 'x':
-		base = 16;
-		thousands = ":";
-		break;
-	case 'b':
-		base = 2;
-		thousands = ":";
-		break;
-	case 'o':
-		base = 8;
-		break;
-	default:
-		return -1;
-	}
-	if(!(fl & FmtUnsigned)){
-		if(isv && (vlong)vu < 0){
-			vu = (uvlong)-(vlong)vu;
-			neg = 1;
-		}else if(!isv && (long)u < 0){
-			u = (ulong)-(long)u;
-			neg = 1;
-		}
-	}
-	p = buf + sizeof buf - 1;
-	n = 0;	/* in runes */
-	excess = 0;	/* number of bytes > number runes */
-	ndig = 0;
-	len = utflen(thousands);
-	bytelen = (int)strlen(thousands);
-	if(isv){
-		while(vu){
-			i = (int)(vu % (uvlong)base);
-			vu /= (uvlong)base;
-			if((fl & FmtComma) && n % 4 == 3){
-				*p-- = ',';
-				n++;
-			}
-			if((fl & FmtApost) && __needsep(&ndig, &grouping)){
-				n += len;
-				excess += bytelen - len;
-				p -= bytelen;
-				memmove(p+1, thousands, (size_t)bytelen);
-			}
-			*p-- = conv[i];
-			n++;
-		}
-	}else{
-		while(u){
-			i = (int)(u % (ulong)base);
-			u /= (ulong)base;
-			if((fl & FmtComma) && n % 4 == 3){
-				*p-- = ',';
-				n++;
-			}
-			if((fl & FmtApost) && __needsep(&ndig, &grouping)){
-				n += len;
-				excess += bytelen - len;
-				p -= bytelen;
-				memmove(p+1, thousands, (size_t)bytelen);
-			}
-			*p-- = conv[i];
-			n++;
-		}
-	}
-	if(n == 0){
-		/*
-		 * "The result of converting a zero value with
-		 * a precision of zero is no characters."  - ANSI
-		 *
-		 * "For o conversion, # increases the precision, if and only if
-		 * necessary, to force the first digit of the result to be a zero
-		 * (if the value and precision are both 0, a single 0 is printed)." - ANSI
-		 */
-		if(!(fl & FmtPrec) || f->prec != 0 || (f->r == 'o' && (fl & FmtSharp))){
-			*p-- = '0';
-			n = 1;
-			if(fl & FmtApost)
-				__needsep(&ndig, &grouping);
-		}
-	}
-	for(w = f->prec; n < w && p > buf+3; n++){
-		if((fl & FmtApost) && __needsep(&ndig, &grouping)){
-			n += len;
-			excess += bytelen - len;
-			p -= bytelen;
-			memmove(p+1, thousands, (size_t)bytelen);
-		}
-		*p-- = '0';
-	}
-	if(neg || (fl & (FmtSign|FmtSpace)))
-		n++;
-	if(fl & FmtSharp){
-		if(base == 16)
-			n += 2;
-		else if(base == 8){
-			if(p[1] == '0')
-				fl &= ~(ulong)FmtSharp;
-			else
-				n++;
-		}
-	}
-	if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){
-		w = 0;
-		if(fl & FmtWidth)
-			w = f->width;
-		for(; n < w && p > buf+3; n++){
-			if((fl & FmtApost) && __needsep(&ndig, &grouping)){
-				n += len;
-				excess += bytelen - len;
-				p -= bytelen;
-				memmove(p+1, thousands, (size_t)bytelen);
-			}
-			*p-- = '0';
-		}
-		f->flags &= ~(ulong)FmtWidth;
-	}
-	if(fl & FmtSharp){
-		if(base == 16)
-			*p-- = (char)f->r;
-		if(base == 16 || base == 8)
-			*p-- = '0';
-	}
-	if(neg)
-		*p-- = '-';
-	else if(fl & FmtSign)
-		*p-- = '+';
-	else if(fl & FmtSpace)
-		*p-- = ' ';
-	f->flags &= ~(ulong)FmtPrec;
-	return __fmtcpy(f, p + 1, n, n + excess);
-}
-
-int
-__countfmt(Fmt *f)
-{
-	void *p;
-	ulong fl;
-
-	fl = f->flags;
-	p = va_arg(f->args, void*);
-	if(fl & FmtVLong){
-		*(vlong*)p = f->nfmt;
-	}else if(fl & FmtLong){
-		*(long*)p = f->nfmt;
-	}else if(fl & FmtByte){
-		*(char*)p = (char)f->nfmt;
-	}else if(fl & FmtShort){
-		*(short*)p = (short)f->nfmt;
-	}else{
-		*(int*)p = f->nfmt;
-	}
-	return 0;
-}
-
-int
-__flagfmt(Fmt *f)
-{
-	switch(f->r){
-	case ',':
-		f->flags |= FmtComma;
-		break;
-	case '-':
-		f->flags |= FmtLeft;
-		break;
-	case '+':
-		f->flags |= FmtSign;
-		break;
-	case '#':
-		f->flags |= FmtSharp;
-		break;
-	case '\'':
-		f->flags |= FmtApost;
-		break;
-	case ' ':
-		f->flags |= FmtSpace;
-		break;
-	case 'u':
-		f->flags |= FmtUnsigned;
-		break;
-	case 'h':
-		if(f->flags & FmtShort)
-			f->flags |= FmtByte;
-		f->flags |= FmtShort;
-		break;
-	case 'L':
-		f->flags |= FmtLDouble;
-		break;
-	case 'l':
-		if(f->flags & FmtLong)
-			f->flags |= FmtVLong;
-		f->flags |= FmtLong;
-		break;
-	}
-	return 1;
-}
-
-/* default error format */
-int
-__badfmt(Fmt *f)
-{
-	char x[2+UTFmax];
-	int n;
-
-	x[0] = '%';
-	n = 1 + runetochar(x+1, &f->r);
-	x[n++] = '%';
-	f->prec = n;
-	__fmtcpy(f, (const void*)x, n, n);
-	return 0;
-}
diff --git a/src/lib9/fmt/dorfmt.c b/src/lib9/fmt/dorfmt.c
deleted file mode 100644
index f760d47e5e85948812dda0145fb320c727e9c899..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/dorfmt.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/* format the output into f->to and return the number of characters fmted  */
-
-/* BUG: THIS FILE IS NOT UPDATED TO THE  NEW SPEC */
-int
-dorfmt(Fmt *f, const Rune *fmt)
-{
-	Rune *rt, *rs;
-	Rune r;
-	char *t, *s;
-	int nfmt;
-
-	nfmt = f->nfmt;
-	for(;;){
-		if(f->runes){
-			rt = (Rune*)f->to;
-			rs = (Rune*)f->stop;
-			while((r = *fmt++) && r != '%'){
-				FMTRCHAR(f, rt, rs, r);
-			}
-			f->nfmt += (int)(rt - (Rune *)f->to);
-			f->to = rt;
-			if(!r)
-				return f->nfmt - nfmt;
-			f->stop = rs;
-		}else{
-			t = (char*)f->to;
-			s = (char*)f->stop;
-			while((r = *fmt++) && r != '%'){
-				FMTRUNE(f, t, f->stop, r);
-			}
-			f->nfmt += (int)(t - (char *)f->to);
-			f->to = t;
-			if(!r)
-				return f->nfmt - nfmt;
-			f->stop = s;
-		}
-
-		fmt = (Rune*)__fmtdispatch(f, (Rune*)fmt, 1);
-		if(fmt == nil)
-			return -1;
-	}
-}
diff --git a/src/lib9/fmt/errfmt.c b/src/lib9/fmt/errfmt.c
deleted file mode 100644
index a86709398e932d37a3cf32367c47eec2be2c3a01..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/errfmt.c
+++ /dev/null
@@ -1,32 +0,0 @@
-// +build plan9
-
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-__errfmt(Fmt *f)
-{
-	char buf[ERRMAX];
-
-	rerrstr(buf, sizeof buf);
-	return __fmtcpy(f, buf, utflen(buf), strlen(buf));
-}
diff --git a/src/lib9/fmt/fltfmt.c b/src/lib9/fmt/fltfmt.c
deleted file mode 100644
index 6fe8192211412c0b52c04553e0f536e516990b41..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fltfmt.c
+++ /dev/null
@@ -1,683 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-enum
-{
-	FDIGIT	= 30,
-	FDEFLT	= 6,
-	NSIGNIF	= 17
-};
-
-/*
- * first few powers of 10, enough for about 1/2 of the
- * total space for doubles.
- */
-static double pows10[] =
-{
-	  1e0,   1e1,   1e2,   1e3,   1e4,   1e5,   1e6,   1e7,   1e8,   1e9,
-	 1e10,  1e11,  1e12,  1e13,  1e14,  1e15,  1e16,  1e17,  1e18,  1e19,
-	 1e20,  1e21,  1e22,  1e23,  1e24,  1e25,  1e26,  1e27,  1e28,  1e29,
-	 1e30,  1e31,  1e32,  1e33,  1e34,  1e35,  1e36,  1e37,  1e38,  1e39,
-	 1e40,  1e41,  1e42,  1e43,  1e44,  1e45,  1e46,  1e47,  1e48,  1e49,
-	 1e50,  1e51,  1e52,  1e53,  1e54,  1e55,  1e56,  1e57,  1e58,  1e59,
-	 1e60,  1e61,  1e62,  1e63,  1e64,  1e65,  1e66,  1e67,  1e68,  1e69,
-	 1e70,  1e71,  1e72,  1e73,  1e74,  1e75,  1e76,  1e77,  1e78,  1e79,
-	 1e80,  1e81,  1e82,  1e83,  1e84,  1e85,  1e86,  1e87,  1e88,  1e89,
-	 1e90,  1e91,  1e92,  1e93,  1e94,  1e95,  1e96,  1e97,  1e98,  1e99,
-	1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
-	1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
-	1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
-	1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
-	1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
-	1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
-};
-
-#undef	pow10
-#define	npows10 ((int)(sizeof(pows10)/sizeof(pows10[0])))
-#define	pow10(x)  fmtpow10(x)
-
-static double
-pow10(int n)
-{
-	double d;
-	int neg;
-
-	neg = 0;
-	if(n < 0){
-		neg = 1;
-		n = -n;
-	}
-
-	if(n < npows10)
-		d = pows10[n];
-	else{
-		d = pows10[npows10-1];
-		for(;;){
-			n -= npows10 - 1;
-			if(n < npows10){
-				d *= pows10[n];
-				break;
-			}
-			d *= pows10[npows10 - 1];
-		}
-	}
-	if(neg)
-		return 1./d;
-	return d;
-}
-
-/*
- * add 1 to the decimal integer string a of length n.
- * if 99999 overflows into 10000, return 1 to tell caller
- * to move the virtual decimal point.
- */
-static int
-xadd1(char *a, int n)
-{
-	char *b;
-	int c;
-
-	if(n < 0 || n > NSIGNIF)
-		return 0;
-	for(b = a+n-1; b >= a; b--) {
-		c = *b + 1;
-		if(c <= '9') {
-			*b = (char)c;
-			return 0;
-		}
-		*b = '0';
-	}
-	/*
-	 * need to overflow adding digit.
-	 * shift number down and insert 1 at beginning.
-	 * decimal is known to be 0s or we wouldn't
-	 * have gotten this far.  (e.g., 99999+1 => 00000)
-	 */
-	a[0] = '1';
-	return 1;
-}
-
-/*
- * subtract 1 from the decimal integer string a.
- * if 10000 underflows into 09999, make it 99999
- * and return 1 to tell caller to move the virtual
- * decimal point.  this way, xsub1 is inverse of xadd1.
- */
-static int
-xsub1(char *a, int n)
-{
-	char *b;
-	int c;
-
-	if(n < 0 || n > NSIGNIF)
-		return 0;
-	for(b = a+n-1; b >= a; b--) {
-		c = *b - 1;
-		if(c >= '0') {
-			if(c == '0' && b == a) {
-				/*
-				 * just zeroed the top digit; shift everyone up.
-				 * decimal is known to be 9s or we wouldn't
-				 * have gotten this far.  (e.g., 10000-1 => 09999)
-				 */
-				*b = '9';
-				return 1;
-			}
-			*b = (char)c;
-			return 0;
-		}
-		*b = '9';
-	}
-	/*
-	 * can't get here.  the number a is always normalized
-	 * so that it has a nonzero first digit.
-	 */
-	abort();
-	return 0;
-}
-
-/*
- * format exponent like sprintf(p, "e%+02d", e)
- */
-static void
-xfmtexp(char *p, int e, int ucase)
-{
-	char se[9];
-	int i;
-
-	*p++ = ucase ? 'E' : 'e';
-	if(e < 0) {
-		*p++ = '-';
-		e = -e;
-	} else
-		*p++ = '+';
-	i = 0;
-	while(e) {
-		se[i++] = (char)(e % 10 + '0');
-		e /= 10;
-	}
-	while(i < 2)
-		se[i++] = '0';
-	while(i > 0)
-		*p++ = se[--i];
-	*p = '\0';
-}
-
-/*
- * compute decimal integer m, exp such that:
- *	f = m*10^exp
- *	m is as short as possible with losing exactness
- * assumes special cases (NaN, +Inf, -Inf) have been handled.
- */
-static void
-xdtoa(double f, char *s, int *exp, int *neg, int *ns)
-{
-	int d, e2, e, ee, i, ndigit;
-	int oerrno;
-	char c;
-	char tmp[NSIGNIF+10];
-	double g;
-
-	oerrno = errno; /* in case strtod smashes errno */
-
-	/*
-	 * make f non-negative.
-	 */
-	*neg = 0;
-	if(f < 0) {
-		f = -f;
-		*neg = 1;
-	}
-
-	/*
-	 * must handle zero specially.
-	 */
-	if(f == 0){
-		*exp = 0;
-		s[0] = '0';
-		s[1] = '\0';
-		*ns = 1;
-		return;
-	}
-
-	/*
-	 * find g,e such that f = g*10^e.
-	 * guess 10-exponent using 2-exponent, then fine tune.
-	 */
-	frexp(f, &e2);
-	e = (int)(e2 * .301029995664);
-	g = f * pow10(-e);
-	while(g < 1) {
-		e--;
-		g = f * pow10(-e);
-	}
-	while(g >= 10) {
-		e++;
-		g = f * pow10(-e);
-	}
-
-	/*
-	 * convert NSIGNIF digits as a first approximation.
-	 */
-	for(i=0; i<NSIGNIF; i++) {
-		d = (int)g;
-		s[i] = (char)(d+'0');
-		g = (g-d) * 10;
-	}
-	s[i] = 0;
-
-	/*
-	 * adjust e because s is 314159... not 3.14159...
-	 */
-	e -= NSIGNIF-1;
-	xfmtexp(s+NSIGNIF, e, 0);
-
-	/*
-	 * adjust conversion until strtod(s) == f exactly.
-	 */
-	for(i=0; i<10; i++) {
-		g = strtod(s, nil);
-		if(f > g) {
-			if(xadd1(s, NSIGNIF)) {
-				/* gained a digit */
-				e--;
-				xfmtexp(s+NSIGNIF, e, 0);
-			}
-			continue;
-		}
-		if(f < g) {
-			if(xsub1(s, NSIGNIF)) {
-				/* lost a digit */
-				e++;
-				xfmtexp(s+NSIGNIF, e, 0);
-			}
-			continue;
-		}
-		break;
-	}
-
-	/*
-	 * play with the decimal to try to simplify.
-	 */
-
-	/*
-	 * bump last few digits up to 9 if we can
-	 */
-	for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) {
-		c = s[i];
-		if(c != '9') {
-			s[i] = '9';
-			g = strtod(s, nil);
-			if(g != f) {
-				s[i] = c;
-				break;
-			}
-		}
-	}
-
-	/*
-	 * add 1 in hopes of turning 9s to 0s
-	 */
-	if(s[NSIGNIF-1] == '9') {
-		strcpy(tmp, s);
-		ee = e;
-		if(xadd1(tmp, NSIGNIF)) {
-			ee--;
-			xfmtexp(tmp+NSIGNIF, ee, 0);
-		}
-		g = strtod(tmp, nil);
-		if(g == f) {
-			strcpy(s, tmp);
-			e = ee;
-		}
-	}
-
-	/*
-	 * bump last few digits down to 0 as we can.
-	 */
-	for(i=NSIGNIF-1; i>=NSIGNIF-3; i--) {
-		c = s[i];
-		if(c != '0') {
-			s[i] = '0';
-			g = strtod(s, nil);
-			if(g != f) {
-				s[i] = c;
-				break;
-			}
-		}
-	}
-
-	/*
-	 * remove trailing zeros.
-	 */
-	ndigit = NSIGNIF;
-	while(ndigit > 1 && s[ndigit-1] == '0'){
-		e++;
-		--ndigit;
-	}
-	s[ndigit] = 0;
-	*exp = e;
-	*ns = ndigit;
-	errno = oerrno;
-}
-
-#ifdef PLAN9PORT
-static char *special[] = { "NaN", "NaN", "+Inf", "+Inf", "-Inf", "-Inf" };
-#else
-static char *special[] = { "nan", "NAN", "inf", "INF", "-inf", "-INF" };
-#endif
-
-int
-__efgfmt(Fmt *fmt)
-{
-	char buf[NSIGNIF+10], *dot, *digits, *p, *s, suf[10], *t;
-	double f;
-	int c, chr, dotwid, e, exp, ndigits, neg, newndigits;
-	int pad, point, prec, realchr, sign, sufwid, ucase, wid, z1, z2;
-	ulong fl;
-	Rune r, *rs, *rt;
-
-	if(fmt->flags&FmtLong)
-		f = (double)va_arg(fmt->args, long double);
-	else
-		f = va_arg(fmt->args, double);
-
-	/*
-	 * extract formatting flags
-	 */
-	fl = fmt->flags;
-	fmt->flags = 0;
-	prec = FDEFLT;
-	if(fl & FmtPrec)
-		prec = fmt->prec;
-	chr = (int)fmt->r;
-	ucase = 0;
-	switch(chr) {
-	case 'A':
-	case 'E':
-	case 'F':
-	case 'G':
-		chr += 'a'-'A';
-		ucase = 1;
-		break;
-	}
-
-	/*
-	 * pick off special numbers.
-	 */
-	if(__isNaN(f)) {
-		s = special[0+ucase];
-	special:
-		fmt->flags = fl & (FmtWidth|FmtLeft);
-		return __fmtcpy(fmt, s, (int)strlen(s), (int)strlen(s));
-	}
-	if(__isInf(f, 1)) {
-		s = special[2+ucase];
-		goto special;
-	}
-	if(__isInf(f, -1)) {
-		s = special[4+ucase];
-		goto special;
-	}
-
-	/*
-	 * get exact representation.
-	 */
-	digits = buf;
-	xdtoa(f, digits, &exp, &neg, &ndigits);
-
-	/*
-	 * get locale's decimal point.
-	 */
-	dot = fmt->decimal;
-	if(dot == nil)
-		dot = ".";
-	dotwid = utflen(dot);
-
-	/*
-	 * now the formatting fun begins.
-	 * compute parameters for actual fmt:
-	 *
-	 *	pad: number of spaces to insert before/after field.
-	 *	z1: number of zeros to insert before digits
-	 *	z2: number of zeros to insert after digits
-	 *	point: number of digits to print before decimal point
-	 *	ndigits: number of digits to use from digits[]
-	 *	suf: trailing suffix, like "e-5"
-	 */
-	realchr = chr;
-	switch(chr){
-	case 'g':
-		/*
-		 * convert to at most prec significant digits. (prec=0 means 1)
-		 */
-		if(prec == 0)
-			prec = 1;
-		if(ndigits > prec) {
-			if(digits[prec] >= '5' && xadd1(digits, prec))
-				exp++;
-			exp += ndigits-prec;
-			ndigits = prec;
-		}
-
-		/*
-		 * extra rules for %g (implemented below):
-		 *	trailing zeros removed after decimal unless FmtSharp.
-		 *	decimal point only if digit follows.
-		 */
-
-		/* fall through to %e */
-	default:
-	case 'e':
-		/*
-		 * one significant digit before decimal, no leading zeros.
-		 */
-		point = 1;
-		z1 = 0;
-
-		/*
-		 * decimal point is after ndigits digits right now.
-		 * slide to be after first.
-		 */
-		e  = exp + (ndigits-1);
-
-		/*
-		 * if this is %g, check exponent and convert prec
-		 */
-		if(realchr == 'g') {
-			if(-4 <= e && e < prec)
-				goto casef;
-			prec--;	/* one digit before decimal; rest after */
-		}
-
-		/*
-		 * compute trailing zero padding or truncate digits.
-		 */
-		if(1+prec >= ndigits)
-			z2 = 1+prec - ndigits;
-		else {
-			/*
-			 * truncate digits
-			 */
-			assert(realchr != 'g');
-			newndigits = 1+prec;
-			if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) {
-				/*
-				 * had 999e4, now have 100e5
-				 */
-				e++;
-			}
-			ndigits = newndigits;
-			z2 = 0;
-		}
-		xfmtexp(suf, e, ucase);
-		sufwid = (int)strlen(suf);
-		break;
-
-	casef:
-	case 'f':
-		/*
-		 * determine where digits go with respect to decimal point
-		 */
-		if(ndigits+exp > 0) {
-			point = ndigits+exp;
-			z1 = 0;
-		} else {
-			point = 1;
-			z1 = 1 + -(ndigits+exp);
-		}
-
-		/*
-		 * %g specifies prec = number of significant digits
-		 * convert to number of digits after decimal point
-		 */
-		if(realchr == 'g')
-			prec += z1 - point;
-
-		/*
-		 * compute trailing zero padding or truncate digits.
-		 */
-		if(point+prec >= z1+ndigits)
-			z2 = point+prec - (z1+ndigits);
-		else {
-			/*
-			 * truncate digits
-			 */
-			assert(realchr != 'g');
-			newndigits = point+prec - z1;
-			if(newndigits < 0) {
-				z1 += newndigits;
-				newndigits = 0;
-			} else if(newndigits == 0) {
-				/* perhaps round up */
-				if(digits[0] >= '5'){
-					digits[0] = '1';
-					newndigits = 1;
-					goto newdigit;
-				}
-			} else if(digits[newndigits] >= '5' && xadd1(digits, newndigits)) {
-				/*
-				 * digits was 999, is now 100; make it 1000
-				 */
-				digits[newndigits++] = '0';
-			newdigit:
-				/*
-				 * account for new digit
-				 */
-				if(z1)	/* 0.099 => 0.100 or 0.99 => 1.00*/
-					z1--;
-				else	/* 9.99 => 10.00 */
-					point++;
-			}
-			z2 = 0;
-			ndigits = newndigits;
-		}
-		sufwid = 0;
-		break;
-	}
-
-	/*
-	 * if %g is given without FmtSharp, remove trailing zeros.
-	 * must do after truncation, so that e.g. print %.3g 1.001
-	 * produces 1, not 1.00.  sorry, but them's the rules.
-	 */
-	if(realchr == 'g' && !(fl & FmtSharp)) {
-		if(z1+ndigits+z2 >= point) {
-			if(z1+ndigits < point)
-				z2 = point - (z1+ndigits);
-			else{
-				z2 = 0;
-				while(z1+ndigits > point && digits[ndigits-1] == '0')
-					ndigits--;
-			}
-		}
-	}
-
-	/*
-	 * compute width of all digits and decimal point and suffix if any
-	 */
-	wid = z1+ndigits+z2;
-	if(wid > point)
-		wid += dotwid;
-	else if(wid == point){
-		if(fl & FmtSharp)
-			wid += dotwid;
-		else
-			point++;	/* do not print any decimal point */
-	}
-	wid += sufwid;
-
-	/*
-	 * determine sign
-	 */
-	sign = 0;
-	if(neg)
-		sign = '-';
-	else if(fl & FmtSign)
-		sign = '+';
-	else if(fl & FmtSpace)
-		sign = ' ';
-	if(sign)
-		wid++;
-
-	/*
-	 * compute padding
-	 */
-	pad = 0;
-	if((fl & FmtWidth) && fmt->width > wid)
-		pad = fmt->width - wid;
-	if(pad && !(fl & FmtLeft) && (fl & FmtZero)){
-		z1 += pad;
-		point += pad;
-		pad = 0;
-	}
-
-	/*
-	 * format the actual field.  too bad about doing this twice.
-	 */
-	if(fmt->runes){
-		if(pad && !(fl & FmtLeft) && __rfmtpad(fmt, pad) < 0)
-			return -1;
-		rt = (Rune*)fmt->to;
-		rs = (Rune*)fmt->stop;
-		if(sign)
-			FMTRCHAR(fmt, rt, rs, sign);
-		while(z1>0 || ndigits>0 || z2>0) {
-			if(z1 > 0){
-				z1--;
-				c = '0';
-			}else if(ndigits > 0){
-				ndigits--;
-				c = *digits++;
-			}else{
-				z2--;
-				c = '0';
-			}
-			FMTRCHAR(fmt, rt, rs, c);
-			if(--point == 0) {
-				for(p = dot; *p; ){
-					p += chartorune(&r, p);
-					FMTRCHAR(fmt, rt, rs, r);
-				}
-			}
-		}
-		fmt->nfmt += (int)(rt - (Rune*)fmt->to);
-		fmt->to = rt;
-		if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0)
-			return -1;
-		if(pad && (fl & FmtLeft) && __rfmtpad(fmt, pad) < 0)
-			return -1;
-	}else{
-		if(pad && !(fl & FmtLeft) && __fmtpad(fmt, pad) < 0)
-			return -1;
-		t = (char*)fmt->to;
-		s = (char*)fmt->stop;
-		if(sign)
-			FMTCHAR(fmt, t, s, sign);
-		while(z1>0 || ndigits>0 || z2>0) {
-			if(z1 > 0){
-				z1--;
-				c = '0';
-			}else if(ndigits > 0){
-				ndigits--;
-				c = *digits++;
-			}else{
-				z2--;
-				c = '0';
-			}
-			FMTCHAR(fmt, t, s, c);
-			if(--point == 0)
-				for(p=dot; *p; p++)
-					FMTCHAR(fmt, t, s, *p);
-		}
-		fmt->nfmt += (int)(t - (char*)fmt->to);
-		fmt->to = t;
-		if(sufwid && __fmtcpy(fmt, suf, sufwid, sufwid) < 0)
-			return -1;
-		if(pad && (fl & FmtLeft) && __fmtpad(fmt, pad) < 0)
-			return -1;
-	}
-	return 0;
-}
-
diff --git a/src/lib9/fmt/fmt.c b/src/lib9/fmt/fmt.c
deleted file mode 100644
index 7e576773b0c576e84a0a0e69620a2572f1112248..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmt.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-enum
-{
-	Maxfmt = 64
-};
-
-typedef struct Convfmt Convfmt;
-struct Convfmt
-{
-	int	c;
-	volatile	Fmts	fmt;	/* for spin lock in fmtfmt; avoids race due to write order */
-};
-
-static struct
-{
-	/* lock by calling __fmtlock, __fmtunlock */
-	int	nfmt;
-	Convfmt	fmt[Maxfmt];
-} fmtalloc;
-
-static Convfmt knownfmt[] = {
-	' ',	__flagfmt,
-	'#',	__flagfmt,
-	'%',	__percentfmt,
-	'\'',	__flagfmt,
-	'+',	__flagfmt,
-	',',	__flagfmt,
-	'-',	__flagfmt,
-	'C',	__runefmt,	/* Plan 9 addition */
-	'E',	__efgfmt,
-#ifndef PLAN9PORT
-	'F',	__efgfmt,	/* ANSI only */
-#endif
-	'G',	__efgfmt,
-#ifndef PLAN9PORT
-	'L',	__flagfmt,	/* ANSI only */
-#endif
-	'S',	__runesfmt,	/* Plan 9 addition */
-	'X',	__ifmt,
-	'b',	__ifmt,		/* Plan 9 addition */
-	'c',	__charfmt,
-	'd',	__ifmt,
-	'e',	__efgfmt,
-	'f',	__efgfmt,
-	'g',	__efgfmt,
-	'h',	__flagfmt,
-#ifndef PLAN9PORT
-	'i',	__ifmt,		/* ANSI only */
-#endif
-	'l',	__flagfmt,
-	'n',	__countfmt,
-	'o',	__ifmt,
-	'p',	__ifmt,
-	'r',	__errfmt,
-	's',	__strfmt,
-#ifdef PLAN9PORT
-	'u',	__flagfmt,
-#else
-	'u',	__ifmt,
-#endif
-	'x',	__ifmt,
-	0,	nil,
-};
-
-
-int	(*fmtdoquote)(int);
-
-/*
- * __fmtlock() must be set
- */
-static int
-__fmtinstall(int c, Fmts f)
-{
-	Convfmt *p, *ep;
-
-	if(c<=0 || c>=65536)
-		return -1;
-	if(!f)
-		f = __badfmt;
-
-	ep = &fmtalloc.fmt[fmtalloc.nfmt];
-	for(p=fmtalloc.fmt; p<ep; p++)
-		if(p->c == c)
-			break;
-
-	if(p == &fmtalloc.fmt[Maxfmt])
-		return -1;
-
-	p->fmt = f;
-	if(p == ep){	/* installing a new format character */
-		fmtalloc.nfmt++;
-		p->c = c;
-	}
-
-	return 0;
-}
-
-int
-fmtinstall(int c, int (*f)(Fmt*))
-{
-	int ret;
-
-	__fmtlock();
-	ret = __fmtinstall(c, f);
-	__fmtunlock();
-	return ret;
-}
-
-static Fmts
-fmtfmt(int c)
-{
-	Convfmt *p, *ep;
-
-	ep = &fmtalloc.fmt[fmtalloc.nfmt];
-	for(p=fmtalloc.fmt; p<ep; p++)
-		if(p->c == c){
-			while(p->fmt == nil)	/* loop until value is updated */
-				;
-			return p->fmt;
-		}
-
-	/* is this a predefined format char? */
-	__fmtlock();
-	for(p=knownfmt; p->c; p++)
-		if(p->c == c){
-			__fmtinstall(p->c, p->fmt);
-			__fmtunlock();
-			return p->fmt;
-		}
-	__fmtunlock();
-
-	return __badfmt;
-}
-
-void*
-__fmtdispatch(Fmt *f, void *fmt, int isrunes)
-{
-	Rune rune, r;
-	int i, n;
-
-	f->flags = 0;
-	f->width = f->prec = 0;
-
-	for(;;){
-		if(isrunes){
-			r = *(Rune*)fmt;
-			fmt = (Rune*)fmt + 1;
-		}else{
-			fmt = (char*)fmt + chartorune(&rune, (char*)fmt);
-			r = rune;
-		}
-		f->r = r;
-		switch(r){
-		case '\0':
-			return nil;
-		case '.':
-			f->flags |= FmtWidth|FmtPrec;
-			continue;
-		case '0':
-			if(!(f->flags & FmtWidth)){
-				f->flags |= FmtZero;
-				continue;
-			}
-			/* fall through */
-		case '1': case '2': case '3': case '4':
-		case '5': case '6': case '7': case '8': case '9':
-			i = 0;
-			while(r >= '0' && r <= '9'){
-				i = i * 10 + (int)r - '0';
-				if(isrunes){
-					r = *(Rune*)fmt;
-					fmt = (Rune*)fmt + 1;
-				}else{
-					r = (Rune)*(char*)fmt;
-					fmt = (char*)fmt + 1;
-				}
-			}
-			if(isrunes)
-				fmt = (Rune*)fmt - 1;
-			else
-				fmt = (char*)fmt - 1;
-		numflag:
-			if(f->flags & FmtWidth){
-				f->flags |= FmtPrec;
-				f->prec = i;
-			}else{
-				f->flags |= FmtWidth;
-				f->width = i;
-			}
-			continue;
-		case '*':
-			i = va_arg(f->args, int);
-			if(i < 0){
-				/*
-				 * negative precision =>
-				 * ignore the precision.
-				 */
-				if(f->flags & FmtPrec){
-					f->flags &= ~(ulong)FmtPrec;
-					f->prec = 0;
-					continue;
-				}
-				i = -i;
-				f->flags |= FmtLeft;
-			}
-			goto numflag;
-		}
-		n = (*fmtfmt((int)r))(f);
-		if(n < 0)
-			return nil;
-		if(n == 0)
-			return fmt;
-	}
-}
diff --git a/src/lib9/fmt/fmtdef.h b/src/lib9/fmt/fmtdef.h
deleted file mode 100644
index 4bbd9f5781fc7cd53d97a189e2d3be902e03c03e..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtdef.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/*
- * dofmt -- format to a buffer
- * the number of characters formatted is returned,
- * or -1 if there was an error.
- * if the buffer is ever filled, flush is called.
- * it should reset the buffer and return whether formatting should continue.
- */
-
-typedef int (*Fmts)(Fmt*);
-
-typedef struct Quoteinfo Quoteinfo;
-struct Quoteinfo
-{
-	int	quoted;		/* if set, string must be quoted */
-	int	nrunesin;	/* number of input runes that can be accepted */
-	int	nbytesin;	/* number of input bytes that can be accepted */
-	int	nrunesout;	/* number of runes that will be generated */
-	int	nbytesout;	/* number of bytes that will be generated */
-};
-
-/* Edit .+1,/^$/ |cfn |grep -v static | grep __ */
-double       __Inf(int sign);
-double       __NaN(void);
-int          __badfmt(Fmt *f);
-int          __charfmt(Fmt *f);
-int          __countfmt(Fmt *f);
-int          __efgfmt(Fmt *fmt);
-int          __errfmt(Fmt *f);
-int          __flagfmt(Fmt *f);
-int          __fmtFdFlush(Fmt *f);
-int          __fmtcpy(Fmt *f, const void *vm, int n, int sz);
-void*        __fmtdispatch(Fmt *f, void *fmt, int isrunes);
-void *       __fmtflush(Fmt *f, void *t, int len);
-void         __fmtlock(void);
-int          __fmtpad(Fmt *f, int n);
-double       __fmtpow10(int n);
-int          __fmtrcpy(Fmt *f, const void *vm, int n);
-void         __fmtunlock(void);
-int          __ifmt(Fmt *f);
-int          __isInf(double d, int sign);
-int          __isNaN(double d);
-int          __needsep(int*, char**);
-int          __needsquotes(char *s, int *quotelenp);
-int          __percentfmt(Fmt *f);
-void         __quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout);
-int          __quotestrfmt(int runesin, Fmt *f);
-int          __rfmtpad(Fmt *f, int n);
-int          __runefmt(Fmt *f);
-int          __runeneedsquotes(Rune *r, int *quotelenp);
-int          __runesfmt(Fmt *f);
-int          __strfmt(Fmt *f);
-
-#define FMTCHAR(f, t, s, c)\
-	do{\
-	if(t + 1 > (char*)s){\
-		t = (char*)__fmtflush(f, t, 1);\
-		if(t != nil)\
-			s = (char*)f->stop;\
-		else\
-			return -1;\
-	}\
-	*t++ = (char)c;\
-	}while(0)
-
-#define FMTRCHAR(f, t, s, c)\
-	do{\
-	if(t + 1 > (Rune*)s){\
-		t = (Rune*)__fmtflush(f, t, sizeof(Rune));\
-		if(t != nil)\
-			s = (Rune*)f->stop;\
-		else\
-			return -1;\
-	}\
-	*t++ = (Rune)c;\
-	}while(0)
-
-#define FMTRUNE(f, t, s, r)\
-	do{\
-	Rune _rune;\
-	int _runelen;\
-	if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
-		t = (char*)__fmtflush(f, t, _runelen);\
-		if(t != nil)\
-			s = (char*)f->stop;\
-		else\
-			return -1;\
-	}\
-	if(r < Runeself)\
-		*t++ = (char)r;\
-	else{\
-		_rune = r;\
-		t += runetochar(t, &_rune);\
-	}\
-	}while(0)
-
-#ifdef va_copy
-#	define VA_COPY(a,b) va_copy(a,b)
-#	define VA_END(a) va_end(a)
-#else
-#	define VA_COPY(a,b) (a) = (b)
-#	define VA_END(a)
-#endif
-
diff --git a/src/lib9/fmt/fmtfd.c b/src/lib9/fmt/fmtfd.c
deleted file mode 100644
index dde05b7a5e0364ceac229af6e48478e7da28b0bc..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtfd.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * public routine for final flush of a formatting buffer
- * to a file descriptor; returns total char count.
- */
-int
-fmtfdflush(Fmt *f)
-{
-	if(__fmtFdFlush(f) <= 0)
-		return -1;
-	return f->nfmt;
-}
-
-/*
- * initialize an output buffer for buffered printing
- */
-int
-fmtfdinit(Fmt *f, int fd, char *buf, int size)
-{
-	f->runes = 0;
-	f->start = buf;
-	f->to = buf;
-	f->stop = buf + size;
-	f->flush = __fmtFdFlush;
-	f->farg = (void*)(uintptr)fd;
-	f->flags = 0;
-	f->nfmt = 0;
-	fmtlocaleinit(f, nil, nil, nil);
-	return 0;
-}
diff --git a/src/lib9/fmt/fmtfdflush.c b/src/lib9/fmt/fmtfdflush.c
deleted file mode 100644
index 401acbea731bf3029c8bf5d2225aa6fb70f05450..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtfdflush.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * generic routine for flushing a formatting buffer
- * to a file descriptor
- */
-int
-__fmtFdFlush(Fmt *f)
-{
-	int n;
-
-	n = (int)((char*)f->to - (char*)f->start);
-	if(n && (int)write((int)(uintptr)f->farg, f->start, (size_t)n) != n)
-		return 0;
-	f->to = f->start;
-	return 1;
-}
diff --git a/src/lib9/fmt/fmtlocale.c b/src/lib9/fmt/fmtlocale.c
deleted file mode 100644
index 64ed10f7b98d2051761d488d3b66131b1388dd01..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtlocale.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Fill in the internationalization stuff in the State structure.
- * For nil arguments, provide the sensible defaults:
- *	decimal is a period
- *	thousands separator is a comma
- *	thousands are marked every three digits
- */
-void
-fmtlocaleinit(Fmt *f, char *decimal, char *thousands, char *grouping)
-{
-	if(decimal == nil || decimal[0] == '\0')
-		decimal = ".";
-	if(thousands == nil)
-		thousands = ",";
-	if(grouping == nil)
-		grouping = "\3";
-	f->decimal = decimal;
-	f->thousands = thousands;
-	f->grouping = grouping;
-}
-
-/*
- * We are about to emit a digit in e.g. %'d.  If that digit would
- * overflow a thousands (e.g.) grouping, tell the caller to emit
- * the thousands separator.  Always advance the digit counter
- * and pointer into the grouping descriptor.
- */
-int
-__needsep(int *ndig, char **grouping)
-{
-	int group;
-
-	(*ndig)++;
-	group = *(unsigned char*)*grouping;
-	/* CHAR_MAX means no further grouping. \0 means we got the empty string */
-	if(group == 0xFF || group == 0x7f || group == 0x00)
-		return 0;
-	if(*ndig > group){
-		/* if we're at end of string, continue with this grouping; else advance */
-		if((*grouping)[1] != '\0')
-			(*grouping)++;
-		*ndig = 1;
-		return 1;
-	}
-	return 0;
-}
-
diff --git a/src/lib9/fmt/fmtlock.c b/src/lib9/fmt/fmtlock.c
deleted file mode 100644
index 297acd8f92880fb65a2e79bad77898bf8aaaf1e7..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtlock.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-void
-__fmtlock(void)
-{
-}
-
-void
-__fmtunlock(void)
-{
-}
diff --git a/src/lib9/fmt/fmtnull.c b/src/lib9/fmt/fmtnull.c
deleted file mode 100644
index b8caacbf7b7d88d013ec6c76d55db114d0ac5a7e..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtnull.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Absorb output without using resources.
- */
-static Rune nullbuf[32];
-
-static int
-__fmtnullflush(Fmt *f)
-{
-	f->to = nullbuf;
-	f->nfmt = 0;
-	return 0;
-}
-
-int
-fmtnullinit(Fmt *f)
-{
-	memset(f, 0, sizeof *f);
-	f->runes = 1;
-	f->start = nullbuf;
-	f->to = nullbuf;
-	f->stop = nullbuf+nelem(nullbuf);
-	f->flush = __fmtnullflush;
-	fmtlocaleinit(f, nil, nil, nil);
-	return 0;
-}
-
diff --git a/src/lib9/fmt/fmtprint.c b/src/lib9/fmt/fmtprint.c
deleted file mode 100644
index 6848ab4ebb892331839539aafdf28b7ceb059bf8..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtprint.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * Format a string into the output buffer.
- * Designed for formats which themselves call fmt.
- * Flags, precision and width are preserved.
- */
-int
-fmtprint(Fmt *f, char *fmt, ...)
-{
-	int n;
-	va_list va;
-
-	va_start(va, fmt);
-	n = fmtvprint(f, fmt, va);
-	va_end(va);
-	return n;
-}
-
diff --git a/src/lib9/fmt/fmtquote.c b/src/lib9/fmt/fmtquote.c
deleted file mode 100644
index 93b2abbe799502333bb74fd97c45f27549399a01..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtquote.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * How many bytes of output UTF will be produced by quoting (if necessary) this string?
- * How many runes? How much of the input will be consumed?
- * The parameter q is filled in by __quotesetup.
- * The string may be UTF or Runes (s or r).
- * Return count does not include NUL.
- * Terminate the scan at the first of:
- *	NUL in input
- *	count exceeded in input
- *	count exceeded on output
- * *ninp is set to number of input bytes accepted.
- * nin may be <0 initially, to avoid checking input by count.
- */
-void
-__quotesetup(char *s, Rune *r, int nin, int nout, Quoteinfo *q, int sharp, int runesout)
-{
-	int w;
-	Rune c;
-
-	q->quoted = 0;
-	q->nbytesout = 0;
-	q->nrunesout = 0;
-	q->nbytesin = 0;
-	q->nrunesin = 0;
-	if(sharp || nin==0 || (s && *s=='\0') || (r && *r=='\0')){
-		if(nout < 2)
-			return;
-		q->quoted = 1;
-		q->nbytesout = 2;
-		q->nrunesout = 2;
-	}
-	for(; nin!=0; nin--){
-		if(s)
-			w = chartorune(&c, s);
-		else{
-			c = *r;
-			w = runelen(c);
-		}
-
-		if(c == '\0')
-			break;
-		if(runesout){
-			if(q->nrunesout+1 > nout)
-				break;
-		}else{
-			if(q->nbytesout+w > nout)
-				break;
-		}
-
-		if((c <= L' ') || (c == L'\'') || (fmtdoquote!=nil && fmtdoquote((int)c))){
-			if(!q->quoted){
-				if(runesout){
-					if(1+q->nrunesout+1+1 > nout)	/* no room for quotes */
-						break;
-				}else{
-					if(1+q->nbytesout+w+1 > nout)	/* no room for quotes */
-						break;
-				}
-				q->nrunesout += 2;	/* include quotes */
-				q->nbytesout += 2;	/* include quotes */
-				q->quoted = 1;
-			}
-			if(c == '\'')	{
-				if(runesout){
-					if(1+q->nrunesout+1 > nout)	/* no room for quotes */
-						break;
-				}else{
-					if(1+q->nbytesout+w > nout)	/* no room for quotes */
-						break;
-				}
-				q->nbytesout++;
-				q->nrunesout++;	/* quotes reproduce as two characters */
-			}
-		}
-
-		/* advance input */
-		if(s)
-			s += w;
-		else
-			r++;
-		q->nbytesin += w;
-		q->nrunesin++;
-
-		/* advance output */
-		q->nbytesout += w;
-		q->nrunesout++;
-
-#ifndef PLAN9PORT
-		/* ANSI requires precision in bytes, not Runes. */
-		nin-= w-1;	/* and then n-- in the loop */
-#endif
-	}
-}
-
-static int
-qstrfmt(char *sin, Rune *rin, Quoteinfo *q, Fmt *f)
-{
-	Rune r, *rm, *rme;
-	char *t, *s, *m, *me;
-	Rune *rt, *rs;
-	ulong fl;
-	int nc, w;
-
-	m = sin;
-	me = m + q->nbytesin;
-	rm = rin;
-	rme = rm + q->nrunesin;
-
-	fl = f->flags;
-	w = 0;
-	if(fl & FmtWidth)
-		w = f->width;
-	if(f->runes){
-		if(!(fl & FmtLeft) && __rfmtpad(f, w - q->nrunesout) < 0)
-			return -1;
-	}else{
-		if(!(fl & FmtLeft) && __fmtpad(f, w - q->nbytesout) < 0)
-			return -1;
-	}
-	t = (char*)f->to;
-	s = (char*)f->stop;
-	rt = (Rune*)f->to;
-	rs = (Rune*)f->stop;
-	if(f->runes)
-		FMTRCHAR(f, rt, rs, '\'');
-	else
-		FMTRUNE(f, t, s, '\'');
-	for(nc = q->nrunesin; nc > 0; nc--){
-		if(sin){
-			r = *(uchar*)m;
-			if(r < Runeself)
-				m++;
-			else if((me - m) >= UTFmax || fullrune(m, (int)(me-m)))
-				m += chartorune(&r, m);
-			else
-				break;
-		}else{
-			if(rm >= rme)
-				break;
-			r = *(uchar*)rm++;
-		}
-		if(f->runes){
-			FMTRCHAR(f, rt, rs, r);
-			if(r == '\'')
-				FMTRCHAR(f, rt, rs, r);
-		}else{
-			FMTRUNE(f, t, s, r);
-			if(r == '\'')
-				FMTRUNE(f, t, s, r);
-		}
-	}
-
-	if(f->runes){
-		FMTRCHAR(f, rt, rs, '\'');
-		USED(rs);
-		f->nfmt += (int)(rt - (Rune *)f->to);
-		f->to = rt;
-		if(fl & FmtLeft && __rfmtpad(f, w - q->nrunesout) < 0)
-			return -1;
-	}else{
-		FMTRUNE(f, t, s, '\'');
-		USED(s);
-		f->nfmt += (int)(t - (char *)f->to);
-		f->to = t;
-		if(fl & FmtLeft && __fmtpad(f, w - q->nbytesout) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-int
-__quotestrfmt(int runesin, Fmt *f)
-{
-	int nin, outlen;
-	Rune *r;
-	char *s;
-	Quoteinfo q;
-
-	nin = -1;
-	if(f->flags&FmtPrec)
-		nin = f->prec;
-	if(runesin){
-		r = va_arg(f->args, Rune *);
-		s = nil;
-	}else{
-		s = va_arg(f->args, char *);
-		r = nil;
-	}
-	if(!s && !r)
-		return __fmtcpy(f, (void*)"<nil>", 5, 5);
-
-	if(f->flush)
-		outlen = 0x7FFFFFFF;	/* if we can flush, no output limit */
-	else if(f->runes)
-		outlen = (int)((Rune*)f->stop - (Rune*)f->to);
-	else
-		outlen = (int)((char*)f->stop - (char*)f->to);
-
-	__quotesetup(s, r, nin, outlen, &q, f->flags&FmtSharp, f->runes);
-/*print("bytes in %d bytes out %d runes in %d runesout %d\n", q.nbytesin, q.nbytesout, q.nrunesin, q.nrunesout); */
-
-	if(runesin){
-		if(!q.quoted)
-			return __fmtrcpy(f, r, q.nrunesin);
-		return qstrfmt(nil, r, &q, f);
-	}
-
-	if(!q.quoted)
-		return __fmtcpy(f, s, q.nrunesin, q.nbytesin);
-	return qstrfmt(s, nil, &q, f);
-}
-
-int
-quotestrfmt(Fmt *f)
-{
-	return __quotestrfmt(0, f);
-}
-
-int
-quoterunestrfmt(Fmt *f)
-{
-	return __quotestrfmt(1, f);
-}
-
-void
-quotefmtinstall(void)
-{
-	fmtinstall('q', quotestrfmt);
-	fmtinstall('Q', quoterunestrfmt);
-}
-
-int
-__needsquotes(char *s, int *quotelenp)
-{
-	Quoteinfo q;
-
-	__quotesetup(s, nil, -1, 0x7FFFFFFF, &q, 0, 0);
-	*quotelenp = q.nbytesout;
-
-	return q.quoted;
-}
-
-int
-__runeneedsquotes(Rune *r, int *quotelenp)
-{
-	Quoteinfo q;
-
-	__quotesetup(nil, r, -1, 0x7FFFFFFF, &q, 0, 0);
-	*quotelenp = q.nrunesout;
-
-	return q.quoted;
-}
diff --git a/src/lib9/fmt/fmtrune.c b/src/lib9/fmt/fmtrune.c
deleted file mode 100644
index 2bc8d28e6f1312f11c55e829bb9723bd80720d55..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtrune.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-fmtrune(Fmt *f, int r)
-{
-	Rune *rt;
-	char *t;
-	int n;
-
-	if(f->runes){
-		rt = (Rune*)f->to;
-		FMTRCHAR(f, rt, f->stop, r);
-		f->to = rt;
-		n = 1;
-	}else{
-		t = (char*)f->to;
-		FMTRUNE(f, t, f->stop, (Rune)r);
-		n = (int)(t - (char*)f->to);
-		f->to = t;
-	}
-	f->nfmt += n;
-	return 0;
-}
diff --git a/src/lib9/fmt/fmtstr.c b/src/lib9/fmt/fmtstr.c
deleted file mode 100644
index a6ca7721d025c5ac811ca13c31dc1b75174c0f76..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtstr.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-fmtstrflush(Fmt *f)
-{
-	if(f->start == nil)
-		return nil;
-	*(char*)f->to = '\0';
-	f->to = f->start;
-	return (char*)f->start;
-}
diff --git a/src/lib9/fmt/fmtvprint.c b/src/lib9/fmt/fmtvprint.c
deleted file mode 100644
index f18d27bbad019c5e465f727f67aa407e8688baa9..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fmtvprint.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-
-/*
- * Format a string into the output buffer.
- * Designed for formats which themselves call fmt.
- * Flags, precision and width are preserved.
- */
-int
-fmtvprint(Fmt *f, char *fmt, va_list args)
-{
-	va_list va;
-	int n, w, p;
-	unsigned long fl;
-
-	w = f->width;
-	p = f->prec;
-	fl = f->flags;
-	VA_COPY(va, f->args);
-	VA_END(f->args);
-	VA_COPY(f->args, args);
-	n = dofmt(f, fmt);
-	VA_END(f->args);
-	VA_COPY(f->args, va);
-	VA_END(va);
-	f->width = w;
-	f->prec = p;
-	f->flags = fl;
-	if(n >= 0)
-		return 0;
-	return n;
-}
diff --git a/src/lib9/fmt/fprint.c b/src/lib9/fmt/fprint.c
deleted file mode 100644
index 70cb1385a432b7e6d19e5f786e2b0f737f8b2cfa..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/fprint.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-fprint(int fd, char *fmt, ...)
-{
-	int n;
-	va_list args;
-
-	va_start(args, fmt);
-	n = vfprint(fd, fmt, args);
-	va_end(args);
-	return n;
-}
diff --git a/src/lib9/fmt/nan64.c b/src/lib9/fmt/nan64.c
deleted file mode 100644
index 1ea702741e7119a43055082d4441e014a2ad9742..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/nan64.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-/*
- * 64-bit IEEE not-a-number routines.
- * This is big/little-endian portable assuming that
- * the 64-bit doubles and 64-bit integers have the
- * same byte ordering.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static uvlong uvnan    = ((uvlong)0x7FF00000<<32)|0x00000001;
-static uvlong uvinf    = ((uvlong)0x7FF00000<<32)|0x00000000;
-static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000;
-
-/* gcc sees through the obvious casts. */
-static uvlong
-d2u(double d)
-{
-	union {
-		uvlong v;
-		double d;
-	} u;
-	assert(sizeof(u.d) == sizeof(u.v));
-	u.d = d;
-	return u.v;
-}
-
-static double
-u2d(uvlong v)
-{
-	union {
-		uvlong v;
-		double d;
-	} u;
-	assert(sizeof(u.d) == sizeof(u.v));
-	u.v = v;
-	return u.d;
-}
-
-double
-__NaN(void)
-{
-	return u2d(uvnan);
-}
-
-int
-__isNaN(double d)
-{
-	uvlong x;
-
-	x = d2u(d);
-	/* IEEE 754: exponent bits 0x7FF and non-zero mantissa */
-	return (x&uvinf) == uvinf && (x&~uvneginf) != 0;
-}
-
-double
-__Inf(int sign)
-{
-	return u2d(sign < 0 ? uvneginf : uvinf);
-}
-
-int
-__isInf(double d, int sign)
-{
-	uvlong x;
-
-	x = d2u(d);
-	if(sign == 0)
-		return x==uvinf || x==uvneginf;
-	else if(sign > 0)
-		return x==uvinf;
-	else
-		return x==uvneginf;
-}
diff --git a/src/lib9/fmt/pow10.c b/src/lib9/fmt/pow10.c
deleted file mode 100644
index e146884a8f8d42bd08cefc66e93e64a8ac791472..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/pow10.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-/*
- * this table might overflow 127-bit exponent representations.
- * in that case, truncate it after 1.0e38.
- * it is important to get all one can from this
- * routine since it is used in atof to scale numbers.
- * the presumption is that C converts fp numbers better
- * than multipication of lower powers of 10.
- */
-
-static
-double	tab[] =
-{
-	1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9,
-	1.0e10,1.0e11,1.0e12,1.0e13,1.0e14,1.0e15,1.0e16,1.0e17,1.0e18,1.0e19,
-	1.0e20,1.0e21,1.0e22,1.0e23,1.0e24,1.0e25,1.0e26,1.0e27,1.0e28,1.0e29,
-	1.0e30,1.0e31,1.0e32,1.0e33,1.0e34,1.0e35,1.0e36,1.0e37,1.0e38,1.0e39,
-	1.0e40,1.0e41,1.0e42,1.0e43,1.0e44,1.0e45,1.0e46,1.0e47,1.0e48,1.0e49,
-	1.0e50,1.0e51,1.0e52,1.0e53,1.0e54,1.0e55,1.0e56,1.0e57,1.0e58,1.0e59,
-	1.0e60,1.0e61,1.0e62,1.0e63,1.0e64,1.0e65,1.0e66,1.0e67,1.0e68,1.0e69,
-};
-
-double
-__fmtpow10(int n)
-{
-	int m;
-
-	if(n < 0) {
-		n = -n;
-		if(n < (int)(sizeof(tab)/sizeof(tab[0])))
-			return 1/tab[n];
-		m = n/2;
-		return __fmtpow10(-m) * __fmtpow10(m-n);
-	}
-	if(n < (int)(sizeof(tab)/sizeof(tab[0])))
-		return tab[n];
-	m = n/2;
-	return __fmtpow10(m) * __fmtpow10(n-m);
-}
diff --git a/src/lib9/fmt/print.c b/src/lib9/fmt/print.c
deleted file mode 100644
index 5c39457d6dc7a56f24763a545021e7ef078d3dc1..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/print.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-print(char *fmt, ...)
-{
-	int n;
-	va_list args;
-
-	va_start(args, fmt);
-	n = vfprint(1, fmt, args);
-	va_end(args);
-	return n;
-}
diff --git a/src/lib9/fmt/seprint.c b/src/lib9/fmt/seprint.c
deleted file mode 100644
index 88779d90adca93ebf7e6031f0356a806df671945..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/seprint.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-seprint(char *buf, char *e, char *fmt, ...)
-{
-	char *p;
-	va_list args;
-
-	va_start(args, fmt);
-	p = vseprint(buf, e, fmt, args);
-	va_end(args);
-	return p;
-}
diff --git a/src/lib9/fmt/smprint.c b/src/lib9/fmt/smprint.c
deleted file mode 100644
index c13ffd7ddc95b4e704d1c4cd389d9955572b11ca..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/smprint.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-smprint(char *fmt, ...)
-{
-	va_list args;
-	char *p;
-
-	va_start(args, fmt);
-	p = vsmprint(fmt, args);
-	va_end(args);
-	return p;
-}
diff --git a/src/lib9/fmt/snprint.c b/src/lib9/fmt/snprint.c
deleted file mode 100644
index 372399c448aa349ba6efaff7013f1ac1f1e948c3..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/snprint.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-snprint(char *buf, int len, char *fmt, ...)
-{
-	int n;
-	va_list args;
-
-	va_start(args, fmt);
-	n = vsnprint(buf, len, fmt, args);
-	va_end(args);
-	return n;
-}
-
diff --git a/src/lib9/fmt/sprint.c b/src/lib9/fmt/sprint.c
deleted file mode 100644
index 02655ad123c0b1371131baa49674e9a237db622f..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/sprint.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-sprint(char *buf, char *fmt, ...)
-{
-	int n;
-	uint len;
-	va_list args;
-
-	len = 1<<30;  /* big number, but sprint is deprecated anyway */
-	/*
-	 * on PowerPC, the stack is near the top of memory, so
-	 * we must be sure not to overflow a 32-bit pointer.
-	 *
-	 * careful!  gcc-4.2 assumes buf+len < buf can never be true and
-	 * optimizes the test away.  casting to uintptr works around this bug.
-	 */
-	if((uintptr)buf+len < (uintptr)buf)
-		len = (uint)-(uintptr)buf-1;
-
-	va_start(args, fmt);
-	n = (int)vsnprint(buf, (int)len, fmt, args);
-	va_end(args);
-	return n;
-}
diff --git a/src/lib9/fmt/strtod.c b/src/lib9/fmt/strtod.c
deleted file mode 100644
index ec185d2d5f762c14ca4bbd48d50b4c76a06f4e59..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/strtod.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <errno.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static ulong
-umuldiv(ulong a, ulong b, ulong c)
-{
-	double d;
-
-	d = ((double)a * (double)b) / (double)c;
-	if(d >= 4294967295.)
-		d = 4294967295.;
-	return (ulong)d;
-}
-
-/*
- * This routine will convert to arbitrary precision
- * floating point entirely in multi-precision fixed.
- * The answer is the closest floating point number to
- * the given decimal number. Exactly half way are
- * rounded ala ieee rules.
- * Method is to scale input decimal between .500 and .999...
- * with external power of 2, then binary search for the
- * closest mantissa to this decimal number.
- * Nmant is is the required precision. (53 for ieee dp)
- * Nbits is the max number of bits/word. (must be <= 28)
- * Prec is calculated - the number of words of fixed mantissa.
- */
-enum
-{
-	Nbits	= 28,				/* bits safely represented in a ulong */
-	Nmant	= 53,				/* bits of precision required */
-	Prec	= (Nmant+Nbits+1)/Nbits,	/* words of Nbits each to represent mantissa */
-	Sigbit	= 1<<(Prec*Nbits-Nmant),	/* first significant bit of Prec-th word */
-	Ndig	= 1500,
-	One	= (ulong)(1<<Nbits),
-	Half	= (ulong)(One>>1),
-	Maxe	= 310,
-
-	Fsign	= 1<<0,		/* found - */
-	Fesign	= 1<<1,		/* found e- */
-	Fdpoint	= 1<<2,		/* found . */
-
-	S0	= 0,		/* _		_S0	+S1	#S2	.S3 */
-	S1,			/* _+		#S2	.S3 */
-	S2,			/* _+#		#S2	.S4	eS5 */
-	S3,			/* _+.		#S4 */
-	S4,			/* _+#.#	#S4	eS5 */
-	S5,			/* _+#.#e	+S6	#S7 */
-	S6,			/* _+#.#e+	#S7 */
-	S7			/* _+#.#e+#	#S7 */
-};
-
-static	int	xcmp(char*, char*);
-static	int	fpcmp(char*, ulong*);
-static	void	frnorm(ulong*);
-static	void	divascii(char*, int*, int*, int*);
-static	void	mulascii(char*, int*, int*, int*);
-
-typedef	struct	Tab	Tab;
-struct	Tab
-{
-	int	bp;
-	int	siz;
-	char*	cmp;
-};
-
-double
-fmtstrtod(const char *as, char **aas)
-{
-	int na, ex, dp, bp, c, i, flag, state;
-	ulong low[Prec], hig[Prec], mid[Prec];
-	double d;
-	char *s, a[Ndig];
-
-	flag = 0;	/* Fsign, Fesign, Fdpoint */
-	na = 0;		/* number of digits of a[] */
-	dp = 0;		/* na of decimal point */
-	ex = 0;		/* exonent */
-
-	state = S0;
-	for(s=(char*)as;; s++) {
-		c = *s;
-		if(c >= '0' && c <= '9') {
-			switch(state) {
-			case S0:
-			case S1:
-			case S2:
-				state = S2;
-				break;
-			case S3:
-			case S4:
-				state = S4;
-				break;
-
-			case S5:
-			case S6:
-			case S7:
-				state = S7;
-				ex = ex*10 + (c-'0');
-				continue;
-			}
-			if(na == 0 && c == '0') {
-				dp--;
-				continue;
-			}
-			if(na < Ndig-50)
-				a[na++] = (char)c;
-			continue;
-		}
-		switch(c) {
-		case '\t':
-		case '\n':
-		case '\v':
-		case '\f':
-		case '\r':
-		case ' ':
-			if(state == S0)
-				continue;
-			break;
-		case '-':
-			if(state == S0)
-				flag |= Fsign;
-			else
-				flag |= Fesign;
-		case '+':
-			if(state == S0)
-				state = S1;
-			else
-			if(state == S5)
-				state = S6;
-			else
-				break;	/* syntax */
-			continue;
-		case '.':
-			flag |= Fdpoint;
-			dp = na;
-			if(state == S0 || state == S1) {
-				state = S3;
-				continue;
-			}
-			if(state == S2) {
-				state = S4;
-				continue;
-			}
-			break;
-		case 'e':
-		case 'E':
-			if(state == S2 || state == S4) {
-				state = S5;
-				continue;
-			}
-			break;
-		}
-		break;
-	}
-
-	/*
-	 * clean up return char-pointer
-	 */
-	switch(state) {
-	case S0:
-		if(xcmp(s, "nan") == 0) {
-			if(aas != nil)
-				*aas = s+3;
-			goto retnan;
-		}
-	case S1:
-		if(xcmp(s, "infinity") == 0) {
-			if(aas != nil)
-				*aas = s+8;
-			goto retinf;
-		}
-		if(xcmp(s, "inf") == 0) {
-			if(aas != nil)
-				*aas = s+3;
-			goto retinf;
-		}
-	case S3:
-		if(aas != nil)
-			*aas = (char*)as;
-		goto ret0;	/* no digits found */
-	case S6:
-		s--;		/* back over +- */
-	case S5:
-		s--;		/* back over e */
-		break;
-	}
-	if(aas != nil)
-		*aas = s;
-
-	if(flag & Fdpoint)
-	while(na > 0 && a[na-1] == '0')
-		na--;
-	if(na == 0)
-		goto ret0;	/* zero */
-	a[na] = 0;
-	if(!(flag & Fdpoint))
-		dp = na;
-	if(flag & Fesign)
-		ex = -ex;
-	dp += ex;
-	if(dp < -Maxe){
-		errno = ERANGE;
-		goto ret0;	/* underflow by exp */
-	} else
-	if(dp > +Maxe)
-		goto retinf;	/* overflow by exp */
-
-	/*
-	 * normalize the decimal ascii number
-	 * to range .[5-9][0-9]* e0
-	 */
-	bp = 0;		/* binary exponent */
-	while(dp > 0)
-		divascii(a, &na, &dp, &bp);
-	while(dp < 0 || a[0] < '5')
-		mulascii(a, &na, &dp, &bp);
-
-	/* close approx by naive conversion */
-	mid[0] = 0;
-	mid[1] = 1;
-	for(i=0; (c=a[i]) != '\0'; i++) {
-		mid[0] = mid[0]*10 + (ulong)(c-'0');
-		mid[1] = mid[1]*10;
-		if(i >= 8)
-			break;
-	}
-	low[0] = umuldiv(mid[0], One, mid[1]);
-	hig[0] = umuldiv(mid[0]+1, One, mid[1]);
-	for(i=1; i<Prec; i++) {
-		low[i] = 0;
-		hig[i] = One-1;
-	}
-
-	/* binary search for closest mantissa */
-	for(;;) {
-		/* mid = (hig + low) / 2 */
-		c = 0;
-		for(i=0; i<Prec; i++) {
-			mid[i] = hig[i] + low[i];
-			if(c)
-				mid[i] += One;
-			c = mid[i] & 1;
-			mid[i] >>= 1;
-		}
-		frnorm(mid);
-
-		/* compare */
-		c = fpcmp(a, mid);
-		if(c > 0) {
-			c = 1;
-			for(i=0; i<Prec; i++)
-				if(low[i] != mid[i]) {
-					c = 0;
-					low[i] = mid[i];
-				}
-			if(c)
-				break;	/* between mid and hig */
-			continue;
-		}
-		if(c < 0) {
-			for(i=0; i<Prec; i++)
-				hig[i] = mid[i];
-			continue;
-		}
-
-		/* only hard part is if even/odd roundings wants to go up */
-		c = mid[Prec-1] & (Sigbit-1);
-		if(c == Sigbit/2 && (mid[Prec-1]&Sigbit) == 0)
-			mid[Prec-1] -= (ulong)c;
-		break;	/* exactly mid */
-	}
-
-	/* normal rounding applies */
-	c = mid[Prec-1] & (Sigbit-1);
-	mid[Prec-1] -= (ulong)c;
-	if(c >= Sigbit/2) {
-		mid[Prec-1] += Sigbit;
-		frnorm(mid);
-	}
-	goto out;
-
-ret0:
-	return 0;
-
-retnan:
-	return __NaN();
-
-retinf:
-	/*
-	 * Unix strtod requires these.  Plan 9 would return Inf(0) or Inf(-1). */
-	errno = ERANGE;
-	if(flag & Fsign)
-		return -HUGE_VAL;
-	return HUGE_VAL;
-
-out:
-	d = 0;
-	for(i=0; i<Prec; i++)
-		d = d*One + (double)mid[i];
-	if(flag & Fsign)
-		d = -d;
-	d = ldexp(d, bp - Prec*Nbits);
-	if(d == 0){	/* underflow */
-		errno = ERANGE;
-	}
-	return d;
-}
-
-static void
-frnorm(ulong *f)
-{
-	int i;
-	ulong c;
-
-	c = 0;
-	for(i=Prec-1; i>0; i--) {
-		f[i] += c;
-		c = f[i] >> Nbits;
-		f[i] &= One-1;
-	}
-	f[0] += c;
-}
-
-static int
-fpcmp(char *a, ulong* f)
-{
-	ulong tf[Prec];
-	int i, d, c;
-
-	for(i=0; i<Prec; i++)
-		tf[i] = f[i];
-
-	for(;;) {
-		/* tf *= 10 */
-		for(i=0; i<Prec; i++)
-			tf[i] = tf[i]*10;
-		frnorm(tf);
-		d = (int)(tf[0] >> Nbits) + '0';
-		tf[0] &= One-1;
-
-		/* compare next digit */
-		c = *a;
-		if(c == 0) {
-			if('0' < d)
-				return -1;
-			if(tf[0] != 0)
-				goto cont;
-			for(i=1; i<Prec; i++)
-				if(tf[i] != 0)
-					goto cont;
-			return 0;
-		}
-		if(c > d)
-			return +1;
-		if(c < d)
-			return -1;
-		a++;
-	cont:;
-	}
-}
-
-static void
-divby(char *a, int *na, int b)
-{
-	int n, c;
-	char *p;
-
-	p = a;
-	n = 0;
-	while(n>>b == 0) {
-		c = *a++;
-		if(c == 0) {
-			while(n) {
-				c = n*10;
-				if(c>>b)
-					break;
-				n = c;
-			}
-			goto xx;
-		}
-		n = n*10 + c-'0';
-		(*na)--;
-	}
-	for(;;) {
-		c = n>>b;
-		n -= c<<b;
-		*p++ = (char)(c + '0');
-		c = *a++;
-		if(c == 0)
-			break;
-		n = n*10 + c-'0';
-	}
-	(*na)++;
-xx:
-	while(n) {
-		n = n*10;
-		c = n>>b;
-		n -= c<<b;
-		*p++ = (char)(c + '0');
-		(*na)++;
-	}
-	*p = 0;
-}
-
-static	Tab	tab1[] =
-{
-	 1,  0, "",
-	 3,  1, "7",
-	 6,  2, "63",
-	 9,  3, "511",
-	13,  4, "8191",
-	16,  5, "65535",
-	19,  6, "524287",
-	23,  7, "8388607",
-	26,  8, "67108863",
-	27,  9, "134217727",
-};
-
-static void
-divascii(char *a, int *na, int *dp, int *bp)
-{
-	int b, d;
-	Tab *t;
-
-	d = *dp;
-	if(d >= (int)(nelem(tab1)))
-		d = (int)(nelem(tab1))-1;
-	t = tab1 + d;
-	b = t->bp;
-	if(memcmp(a, t->cmp, (size_t)t->siz) > 0)
-		d--;
-	*dp -= d;
-	*bp += b;
-	divby(a, na, b);
-}
-
-static void
-mulby(char *a, char *p, char *q, int b)
-{
-	int n, c;
-
-	n = 0;
-	*p = 0;
-	for(;;) {
-		q--;
-		if(q < a)
-			break;
-		c = *q - '0';
-		c = (c<<b) + n;
-		n = c/10;
-		c -= n*10;
-		p--;
-		*p = (char)(c + '0');
-	}
-	while(n) {
-		c = n;
-		n = c/10;
-		c -= n*10;
-		p--;
-		*p = (char)(c + '0');
-	}
-}
-
-static	Tab	tab2[] =
-{
-	 1,  1, "",				/* dp = 0-0 */
-	 3,  3, "125",
-	 6,  5, "15625",
-	 9,  7, "1953125",
-	13, 10, "1220703125",
-	16, 12, "152587890625",
-	19, 14, "19073486328125",
-	23, 17, "11920928955078125",
-	26, 19, "1490116119384765625",
-	27, 19, "7450580596923828125",		/* dp 8-9 */
-};
-
-static void
-mulascii(char *a, int *na, int *dp, int *bp)
-{
-	char *p;
-	int d, b;
-	Tab *t;
-
-	d = -*dp;
-	if(d >= (int)(nelem(tab2)))
-		d = (int)(nelem(tab2))-1;
-	t = tab2 + d;
-	b = t->bp;
-	if(memcmp(a, t->cmp, (size_t)t->siz) < 0)
-		d--;
-	p = a + *na;
-	*bp -= b;
-	*dp += d;
-	*na += d;
-	mulby(a, p+d, p, b);
-}
-
-static int
-xcmp(char *a, char *b)
-{
-	int c1, c2;
-
-	while((c1 = *b++) != '\0') {
-		c2 = *a++;
-		if(isupper(c2))
-			c2 = tolower(c2);
-		if(c1 != c2)
-			return 1;
-	}
-	return 0;
-}
diff --git a/src/lib9/fmt/test.c b/src/lib9/fmt/test.c
deleted file mode 100644
index d82ff78baf48f10b140ad8dcf07df3ac9f105ef9..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/test.c
+++ /dev/null
@@ -1,67 +0,0 @@
-// +build ignore
-
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-main(int argc, char *argv[])
-{
-	quotefmtinstall();
-	print("hello world\n");
-	print("x: %x\n", 0x87654321);
-	print("u: %u\n", 0x87654321);
-	print("d: %d\n", 0x87654321);
-	print("s: %s\n", "hi there");
-	print("q: %q\n", "hi i'm here");
-	print("c: %c\n", '!');
-	print("g: %g %g %g\n", 3.14159, 3.14159e10, 3.14159e-10);
-	print("e: %e %e %e\n", 3.14159, 3.14159e10, 3.14159e-10);
-	print("f: %f %f %f\n", 3.14159, 3.14159e10, 3.14159e-10);
-	print("smiley: %C\n", (Rune)0x263a);
-	print("%g %.18g\n", 2e25, 2e25);
-	print("%2.18g\n", 1.0);
-	print("%2.18f\n", 1.0);
-	print("%f\n", 3.1415927/4);
-	print("%d\n", 23);
-	print("%i\n", 23);
-	print("%0.10d\n", 12345);
-
-	/* test %4$d formats */
-	print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222);
-	print("%3$d %4$06d %2$d %1$d\n", 444, 333, 111, 222);
-	print("%3$d %4$*5$06d %2$d %1$d\n", 444, 333, 111, 222, 20);
-	print("%3$hd %4$*5$06d %2$d %1$d\n", 444, 333, (short)111, 222, 20);
-	print("%3$lld %4$*5$06d %2$d %1$d\n", 444, 333, 111LL, 222, 20);
-
-	/* test %'d formats */
-	print("%'d %'d %'d\n", 1, 2222, 33333333);
-	print("%'019d\n", 0);
-	print("%08d %08d %08d\n", 1, 2222, 33333333);
-	print("%'08d %'08d %'08d\n", 1, 2222, 33333333);
-	print("%'x %'X %'b\n", 0x11111111, 0xabcd1234, 12345);
-	print("%'lld %'lld %'lld\n", 1LL, 222222222LL, 3333333333333LL);
-	print("%019lld %019lld %019lld\n", 1LL, 222222222LL, 3333333333333LL);
-	print("%'019lld %'019lld %'019lld\n", 1LL, 222222222LL, 3333333333333LL);
-	print("%'020lld %'020lld %'020lld\n", 1LL, 222222222LL, 3333333333333LL);
-	print("%'llx %'llX %'llb\n", 0x111111111111LL, 0xabcd12345678LL, 112342345LL);
-	return 0;
-}
diff --git a/src/lib9/fmt/vfprint.c b/src/lib9/fmt/vfprint.c
deleted file mode 100644
index a23c5a0c658c68629233753606e1a7e9b72bcd88..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/vfprint.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-vfprint(int fd, char *fmt, va_list args)
-{
-	Fmt f;
-	char buf[256];
-	int n;
-
-	fmtfdinit(&f, fd, buf, sizeof(buf));
-	VA_COPY(f.args,args);
-	n = dofmt(&f, fmt);
-	VA_END(f.args);
-	if(n > 0 && __fmtFdFlush(&f) == 0)
-		return -1;
-	return n;
-}
diff --git a/src/lib9/fmt/vseprint.c b/src/lib9/fmt/vseprint.c
deleted file mode 100644
index c9fbfb95603f949ff14f2602e1a1b2392c005565..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/vseprint.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-char*
-vseprint(char *buf, char *e, char *fmt, va_list args)
-{
-	Fmt f;
-
-	if(e <= buf)
-		return nil;
-	f.runes = 0;
-	f.start = buf;
-	f.to = buf;
-	f.stop = e - 1;
-	f.flush = 0;
-	f.farg = nil;
-	f.nfmt = 0;
-	VA_COPY(f.args,args);
-	fmtlocaleinit(&f, nil, nil, nil);
-	dofmt(&f, fmt);
-	VA_END(f.args);
-	*(char*)f.to = '\0';
-	return (char*)f.to;
-}
-
diff --git a/src/lib9/fmt/vsmprint.c b/src/lib9/fmt/vsmprint.c
deleted file mode 100644
index 46086f9e280cbd42448b6ffb8bf16eeb5d6afe10..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/vsmprint.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-static int
-fmtStrFlush(Fmt *f)
-{
-	char *s;
-	int n;
-
-	if(f->start == nil)
-		return 0;
-	n = (int)(uintptr)f->farg;
-	n *= 2;
-	s = (char*)f->start;
-	f->start = realloc(s, (size_t)n);
-	if(f->start == nil){
-		f->farg = nil;
-		f->to = nil;
-		f->stop = nil;
-		free(s);
-		return 0;
-	}
-	f->farg = (void*)(uintptr)n;
-	f->to = (char*)f->start + ((char*)f->to - s);
-	f->stop = (char*)f->start + n - 1;
-	return 1;
-}
-
-int
-fmtstrinit(Fmt *f)
-{
-	int n;
-
-	memset(f, 0, sizeof *f);
-	f->runes = 0;
-	n = 32;
-	f->start = malloc((size_t)n);
-	if(f->start == nil)
-		return -1;
-	f->to = f->start;
-	f->stop = (char*)f->start + n - 1;
-	f->flush = fmtStrFlush;
-	f->farg = (void*)(uintptr)n;
-	f->nfmt = 0;
-	fmtlocaleinit(f, nil, nil, nil);
-	return 0;
-}
-
-/*
- * print into an allocated string buffer
- */
-char*
-vsmprint(char *fmt, va_list args)
-{
-	Fmt f;
-	int n;
-
-	if(fmtstrinit(&f) < 0)
-		return nil;
-	VA_COPY(f.args,args);
-	n = dofmt(&f, fmt);
-	VA_END(f.args);
-	if(n < 0){
-		free(f.start);
-		return nil;
-	}
-	return fmtstrflush(&f);
-}
diff --git a/src/lib9/fmt/vsnprint.c b/src/lib9/fmt/vsnprint.c
deleted file mode 100644
index 6b3877205e86fe36b32552e8b092b3ec2fa4131c..0000000000000000000000000000000000000000
--- a/src/lib9/fmt/vsnprint.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson,
- * with contributions from Mike Burrows and Sean Dorward.
- *
- *     Copyright (c) 2002-2006 by Lucent Technologies.
- *     Portions Copyright (c) 2004 Google Inc.
- * 
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 
- * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 
- * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "fmtdef.h"
-
-int
-vsnprint(char *buf, int len, char *fmt, va_list args)
-{
-	Fmt f;
-
-	if(len <= 0)
-		return -1;
-	f.runes = 0;
-	f.start = buf;
-	f.to = buf;
-	f.stop = buf + len - 1;
-	f.flush = 0;
-	f.farg = nil;
-	f.nfmt = 0;
-	VA_COPY(f.args,args);
-	fmtlocaleinit(&f, nil, nil, nil);
-	dofmt(&f, fmt);
-	VA_END(f.args);
-	*(char*)f.to = '\0';
-	return (int)((char*)f.to - buf);
-}
diff --git a/src/lib9/fmtlock2.c b/src/lib9/fmtlock2.c
deleted file mode 100644
index a0e2636ec83c94c13680b0557091ec38fc824585..0000000000000000000000000000000000000000
--- a/src/lib9/fmtlock2.c
+++ /dev/null
@@ -1,40 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/fmtlock2.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/fmtlock2.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-Portions Copyright 2009 The Go Authors.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-__fmtlock(void)
-{
-}
-
-void
-__fmtunlock(void)
-{
-}
diff --git a/src/lib9/getenv.c b/src/lib9/getenv.c
deleted file mode 100644
index 2454b6b4167d0c95b840d7fe9aa424fb12249f6e..0000000000000000000000000000000000000000
--- a/src/lib9/getenv.c
+++ /dev/null
@@ -1,52 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/getenv.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/getenv.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-p9getenv(char *s)
-{
-	char *t;
-
-	t = getenv(s);
-	if(t == 0)
-		return 0;
-	return strdup(t);
-}
-
-int
-p9putenv(char *s, char *v)
-{
-	char *t;
-
-	t = smprint("%s=%s", s, v);
-	if(t == nil)
-		return -1;
-	putenv(t);
-	return 0;
-}
diff --git a/src/lib9/getfields.c b/src/lib9/getfields.c
deleted file mode 100644
index 0af8388da8dc6e3098bbecaf35e9b43a06b322f4..0000000000000000000000000000000000000000
--- a/src/lib9/getfields.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-Inferno libkern/getfields.c
-http://code.google.com/p/inferno-os/source/browse/libkern/getfields.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-int
-getfields(char *str, char **args, int max, int mflag, char *set)
-{
-	Rune r;
-	int nr, intok, narg;
-
-	if(max <= 0)
-		return 0;
-
-	narg = 0;
-	args[narg] = str;
-	if(!mflag)
-		narg++;
-	intok = 0;
-	for(;; str += nr) {
-		nr = chartorune(&r, str);
-		if(r == 0)
-			break;
-		if(utfrune(set, r)) {
-			if(narg >= max)
-				break;
-			*str = 0;
-			intok = 0;
-			args[narg] = str + nr;
-			if(!mflag)
-				narg++;
-		} else {
-			if(!intok && mflag)
-				narg++;
-			intok = 1;
-		}
-	}
-	return narg;
-}
diff --git a/src/lib9/getwd.c b/src/lib9/getwd.c
deleted file mode 100644
index 03a8ff1a2f500fed0b199e9a10247400fa28f66a..0000000000000000000000000000000000000000
--- a/src/lib9/getwd.c
+++ /dev/null
@@ -1,56 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/getwd.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/getwd.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-Portions Copyright 2011 The Go Authors.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <errno.h>
-#include <sys/stat.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-p9getwd(char *s, int ns)
-{
-	char *pwd;
-	struct stat st1, st2;
-
-	// Clumsy but widespread kludge:
-	// if $PWD is set and matches ".", use it.
-	// Matches glibc's get_current_dir_name and Go's os.Getwd.
-	pwd = getenv("PWD");  // note: getenv, not p9getenv, so no free
-	if(pwd != nil && pwd[0] &&
-			stat(pwd, &st1) >= 0 && stat(".", &st2) >= 0 &&
-			st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) {
-		if(strlen(pwd) >= ns) {
-			errno = ERANGE;
-			return nil;
-		}
-		strcpy(s, pwd);
-		return s;
-	}
-
-	return getcwd(s, (size_t)ns);
-}
diff --git a/src/lib9/goos.c b/src/lib9/goos.c
deleted file mode 100644
index 68b94d6114ed3eccd5c639b3cf0da65b1320e075..0000000000000000000000000000000000000000
--- a/src/lib9/goos.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-static char*
-defgetenv(char *name, char *def)
-{
-	char *p;
-	
-	p = getenv(name);
-	if(p == nil || p[0] == '\0')
-		p = def;
-	return p;
-}
-
-char*
-getgoos(void)
-{
-	return defgetenv("GOOS", GOOS);
-}
-
-char*
-getgoarch(void)
-{
-	return defgetenv("GOARCH", GOARCH);
-}
-
-char*
-getgoroot(void)
-{
-	return defgetenv("GOROOT", GOROOT);
-}
-
-char*
-getgoversion(void)
-{
-	return GOVERSION;
-}
-
-char*
-getgoarm(void)
-{
-	return defgetenv("GOARM", GOARM);
-}
-
-char*
-getgo386(void)
-{
-	return defgetenv("GO386", GO386);
-}
-
-char*
-getgoextlinkenabled(void)
-{
-	return GO_EXTLINK_ENABLED;
-}
-
-char*
-getgohostarch(void)
-{
-	return GOHOSTARCH;
-}
-
-char*
-getgohostos(void)
-{
-	return GOHOSTOS;
-}
diff --git a/src/lib9/jmp.c b/src/lib9/jmp.c
deleted file mode 100644
index 733ed70e96ad663b6a865b56a207049386ff77b4..0000000000000000000000000000000000000000
--- a/src/lib9/jmp.c
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/jmp.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/jmp.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-void
-p9longjmp(p9jmp_buf buf, int val)
-{
-	siglongjmp((void*)buf, val);
-}
-
-void
-p9notejmp(void *x, p9jmp_buf buf, int val)
-{
-	USED(x);
-	siglongjmp((void*)buf, val);
-}
-
diff --git a/src/lib9/main.c b/src/lib9/main.c
deleted file mode 100644
index 088b09523c24d19dd0939772e56060ce6071c3f8..0000000000000000000000000000000000000000
--- a/src/lib9/main.c
+++ /dev/null
@@ -1,60 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/main.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/main.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-#ifdef WIN32
-#include <windows.h>
-
-static void
-crashhandler(int sig)
-{
-	USED(sig);
-	fprint(2, "%s: internal fatal error.\n", argv0);
-	exit(1);
-}
-#endif
-
-extern void p9main(int, char**);
-
-int
-main(int argc, char **argv)
-{
-#ifdef WIN32
-	signal(SIGSEGV, crashhandler);
-	signal(SIGBUS, crashhandler);
-	// don't display the crash dialog
-	DWORD mode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
-	SetErrorMode(mode | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-#endif
-	argv0 = argv[0];
-	p9main(argc, argv);
-	exits("main");
-	return 99;
-}
diff --git a/src/lib9/math_darwin_arm.c b/src/lib9/math_darwin_arm.c
deleted file mode 100644
index ff5b0ce07a6429b53cb4f94c6673c7d94da84f04..0000000000000000000000000000000000000000
--- a/src/lib9/math_darwin_arm.c
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Some Darwin/ARM libc versions fail to provide a standard compliant version
-// of frexp and ldexp that could handle denormal floating point numbers.
-// The frexp and ldexp implementations are translated from their Go version.
-
-#include <stdint.h>
-
-// Assume double and uint64_t are using the same endian.
-union dint64 {
-	double d;
-	uint64_t u;
-};
-
-static const uint64_t mask = 0x7FF, bias = 1023;
-static const int shift = 64 - 11 - 1;
-static const uint64_t uvnan = 0x7FF8000000000001ULL, uvinf = 0x7FF0000000000000ULL,
-	  uvneginf = 0xFFF0000000000000ULL;
-static const double smallestnormal = 2.2250738585072014e-308; // 2**-1022
-
-static inline uint64_t float64bits(double x) {
-	union dint64 u;
-	u.d = x;
-	return u.u;
-}
-static inline double float64frombits(uint64_t x) {
-	union dint64 u;
-	u.u = x;
-	return u.d;
-}
-static inline int isinf(double x) {
-	return float64bits(x) == uvinf || float64bits(x) == uvneginf;
-}
-static inline int isnan(double x) {
-	return x != x;
-}
-extern double fabs(double);
-static double normalize(double x, int *exp) {
-	if (fabs(x) < smallestnormal) {
-		*exp = -52;
-		return x * (double)(1LL<<52);
-	}
-	*exp = 0;
-	return x;
-}
-
-double ldexp(double frac, int exp) {
-	// special cases
-	if (frac == 0.0) return frac;
-	if (isinf(frac) || isnan(frac)) return frac;
-
-	int e;
-	frac = normalize(frac, &e);
-	exp += e;
-	uint64_t x = float64bits(frac);
-	exp += (int)((x>>shift)&mask) - bias;
-	if (exp < -1074) { // underflow
-		if (frac < 0.0) return float64frombits(1ULL<<63); // -0.0
-		return 0.0;
-	}
-	if (exp > 1023) { // overflow
-		if (frac < 0.0) return float64frombits(uvneginf);
-		return float64frombits(uvinf);
-	}
-	double m = 1;
-	if (exp < -1022) { // denormal
-		exp += 52;
-		m = 1.0 / (double)(1ULL<<52);
-	}
-	x &= ~(mask << shift);
-	x |= (uint64_t)(exp+bias) << shift;
-	return m * float64frombits(x);
-}
-
-double frexp(double f, int *exp) {
-	*exp = 0;
-	// special cases
-	if (f == 0.0) return f;
-	if (isinf(f) || isnan(f)) return f;
-
-	f = normalize(f, exp);
-	uint64_t x = float64bits(f);
-	*exp += (int)((x>>shift)&mask) - bias + 1;
-	x &= ~(mask << shift);
-	x |= (-1 + bias) << shift;
-	return float64frombits(x);
-}
-
-// On Darwin/ARM, the kernel insists on running VFP in runfast mode, and it
-// cannot deal with denormal floating point numbers in that mode, so we have
-// to disable the runfast mode if the client uses ldexp/frexp (i.e. 5g).
-void disable_vfp_runfast(void) __attribute__((constructor));
-void disable_vfp_runfast(void) {
-    __asm__ volatile (
-		      "fmrx r0, fpscr\n"
-		      "bic r0, r0, $0x03000000\n"
-		      "fmxr fpscr, r0\n"
-		      : : : "r0"
-		     );
-}
diff --git a/src/lib9/nan.c b/src/lib9/nan.c
deleted file mode 100644
index f17b441aae6ab229ff8af3e67bb0c126586aa2d4..0000000000000000000000000000000000000000
--- a/src/lib9/nan.c
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/nan.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/nan.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-#include "fmt/fmtdef.h"
-
-double
-NaN(void)
-{
-	return __NaN();
-}
-
-double
-Inf(int sign)
-{
-	return __Inf(sign);
-}
-
-int
-isNaN(double x)
-{
-	return __isNaN(x);
-}
-
-int
-isInf(double x, int sign)
-{
-	return __isInf(x, sign);
-}
diff --git a/src/lib9/notify.c b/src/lib9/notify.c
deleted file mode 100644
index 7843d347135890e6688e733533927cd255323aba..0000000000000000000000000000000000000000
--- a/src/lib9/notify.c
+++ /dev/null
@@ -1,300 +0,0 @@
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/notify.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/notify.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
- * Signal handling for Plan 9 programs.
- * We stubbornly use the strings from Plan 9 instead
- * of the enumerated Unix constants.
- * There are some weird translations.  In particular,
- * a "kill" note is the same as SIGTERM in Unix.
- * There is no equivalent note to Unix's SIGKILL, since
- * it's not a deliverable signal anyway.
- *
- * We do not handle SIGABRT or SIGSEGV, mainly because
- * the thread library queues its notes for later, and we want
- * to dump core with the state at time of delivery.
- *
- * We have to add some extra entry points to provide the
- * ability to tweak which signals are deliverable and which
- * are acted upon.  Notifydisable and notifyenable play with
- * the process signal mask.  Notifyignore enables the signal
- * but will not call notifyf when it comes in.  This is occasionally
- * useful.
- */
-
-#include <u.h>
-#include <signal.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-extern char *_p9sigstr(int, char*);
-extern int _p9strsig(char*);
-
-typedef struct Sig Sig;
-struct Sig
-{
-	int sig;			/* signal number */
-	int flags;
-};
-
-enum
-{
-	Restart = 1<<0,
-	Ignore = 1<<1
-};
-
-static Sig sigs[] = {
-	SIGHUP,		0,
-	SIGINT,		0,
-	SIGQUIT,		0,
-	SIGILL,		0,
-	SIGTRAP,		0,
-/*	SIGABRT, 		0, 	*/
-#ifdef SIGEMT
-	SIGEMT,		0,
-#endif
-	SIGFPE,		0,
-	SIGBUS,		0,
-/*	SIGSEGV, 		0, 	*/
-	SIGCHLD,		Restart|Ignore,
-	SIGSYS,		0,
-	SIGPIPE,		Ignore,
-	SIGALRM,		0,
-	SIGTERM,		0,
-	SIGTSTP,		Restart|Ignore,
-/*	SIGTTIN,		Restart|Ignore, */
-/*	SIGTTOU,		Restart|Ignore, */
-	SIGXCPU,		0,
-	SIGXFSZ,		0,
-	SIGVTALRM,	0,
-	SIGUSR1,		0,
-	SIGUSR2,		0,
-#ifdef SIGWINCH
-	SIGWINCH,	Restart|Ignore,
-#endif
-#ifdef SIGINFO
-	SIGINFO,		Restart|Ignore,
-#endif
-};
-
-static Sig*
-findsig(int s)
-{
-	int i;
-
-	for(i=0; i<nelem(sigs); i++)
-		if(sigs[i].sig == s)
-			return &sigs[i];
-	return nil;
-}
-
-/*
- * The thread library initializes _notejmpbuf to its own
- * routine which provides a per-pthread jump buffer.
- * If we're not using the thread library, we assume we are
- * single-threaded.
- */
-typedef struct Jmp Jmp;
-struct Jmp
-{
-	p9jmp_buf b;
-};
-
-static Jmp onejmp;
-
-static Jmp*
-getonejmp(void)
-{
-	return &onejmp;
-}
-
-Jmp *(*_notejmpbuf)(void) = getonejmp;
-static void noteinit(void);
-
-/*
- * Actual signal handler.
- */
-
-static void (*notifyf)(void*, char*);	/* Plan 9 handler */
-
-static void
-signotify(int sig)
-{
-	char tmp[64];
-	Jmp *j;
-	Sig *s;
-
-	j = (*_notejmpbuf)();
-	switch(p9setjmp(j->b)){
-	case 0:
-		if(notifyf)
-			(*notifyf)(nil, _p9sigstr(sig, tmp));
-		/* fall through */
-	case 1:	/* noted(NDFLT) */
-		if(0)print("DEFAULT %d\n", sig);
-		s = findsig(sig);
-		if(s && (s->flags&Ignore))
-			return;
-		signal(sig, SIG_DFL);
-		raise(sig);
-		_exit(1);
-	case 2:	/* noted(NCONT) */
-		if(0)print("HANDLED %d\n", sig);
-		return;
-	}
-}
-
-static void
-signonotify(int sig)
-{
-	USED(sig);
-}
-
-int
-noted(int v)
-{
-	p9longjmp((*_notejmpbuf)()->b, v==NCONT ? 2 : 1);
-	abort();
-	return 0;
-}
-
-int
-notify(void (*f)(void*, char*))
-{
-	static int init;
-
-	notifyf = f;
-	if(!init){
-		init = 1;
-		noteinit();
-	}
-	return 0;
-}
-
-/*
- * Nonsense about enabling and disabling signals.
- */
-typedef void Sighandler(int);
-static Sighandler*
-handler(int s)
-{
-	struct sigaction sa;
-
-	sigaction(s, nil, &sa);
-	return sa.sa_handler;
-}
-
-static int
-notesetenable(int sig, int enabled)
-{
-	sigset_t mask, omask;
-
-	if(sig == 0)
-		return -1;
-
-	sigemptyset(&mask);
-	sigaddset(&mask, sig);
-	sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, &omask);
-	return !sigismember(&omask, sig);
-}
-
-int
-noteenable(char *msg)
-{
-	return notesetenable(_p9strsig(msg), 1);
-}
-
-int
-notedisable(char *msg)
-{
-	return notesetenable(_p9strsig(msg), 0);
-}
-
-static int
-notifyseton(int s, int on)
-{
-	Sig *sig;
-	struct sigaction sa, osa;
-
-	sig = findsig(s);
-	if(sig == nil)
-		return -1;
-	memset(&sa, 0, sizeof sa);
-	sa.sa_handler = on ? signotify : signonotify;
-	if(sig->flags&Restart)
-		sa.sa_flags |= SA_RESTART;
-
-	/*
-	 * We can't allow signals within signals because there's
-	 * only one jump buffer.
-	 */
-	sigfillset(&sa.sa_mask);
-
-	/*
-	 * Install handler.
-	 */
-	sigaction(sig->sig, &sa, &osa);
-	return osa.sa_handler == signotify;
-}
-
-int
-notifyon(char *msg)
-{
-	return notifyseton(_p9strsig(msg), 1);
-}
-
-int
-notifyoff(char *msg)
-{
-	return notifyseton(_p9strsig(msg), 0);
-}
-
-/*
- * Initialization follows sigs table.
- */
-static void
-noteinit(void)
-{
-	int i;
-	Sig *sig;
-
-	for(i=0; i<nelem(sigs); i++){
-		sig = &sigs[i];
-		/*
-		 * If someone has already installed a handler,
-		 * It's probably some ld preload nonsense,
-		 * like pct (a SIGVTALRM-based profiler).
-		 * Or maybe someone has already called notifyon/notifyoff.
-		 * Leave it alone.
-		 */
-		if(handler(sig->sig) != SIG_DFL)
-			continue;
-		notifyseton(sig->sig, 1);
-	}
-}
-
diff --git a/src/lib9/nulldir.c b/src/lib9/nulldir.c
deleted file mode 100644
index 2157ff313d8e72fd5907292f670ed3b49a316991..0000000000000000000000000000000000000000
--- a/src/lib9/nulldir.c
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build !plan9
-
-/*
-Inferno lib9/nulldir.c
-http://code.google.com/p/inferno-os/source/browse/lib9/nulldir.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void
-nulldir(Dir *d)
-{
-	memset(d, ~0, sizeof(Dir));
-	d->name = d->uid = d->gid = d->muid = "";
-}
diff --git a/src/lib9/open.c b/src/lib9/open.c
deleted file mode 100644
index 7f53c8ea645be353f732d3a28a86f64f8e41d578..0000000000000000000000000000000000000000
--- a/src/lib9/open.c
+++ /dev/null
@@ -1,70 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/open.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/open.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#define _GNU_SOURCE	/* for Linux O_DIRECT */
-#include <u.h>
-#define NOPLAN9DEFINES
-#include <sys/file.h>
-#include <libc.h>
-#ifndef O_DIRECT
-#define O_DIRECT 0
-#endif
-
-int
-p9open(char *name, int mode)
-{
-	int rclose;
-	int fd, umode, rdwr;
-
-	rdwr = mode&3;
-	umode = rdwr;
-	rclose = mode&ORCLOSE;
-	mode &= ~(3|ORCLOSE);
-	if(mode&OTRUNC){
-		umode |= O_TRUNC;
-		mode ^= OTRUNC;
-	}
-	if(mode&ODIRECT){
-		umode |= O_DIRECT;
-		mode ^= ODIRECT;
-	}
-	if(mode&OAPPEND){
-		umode |= O_APPEND;
-		mode ^= OAPPEND;
-	}
-	if(mode){
-		werrstr("mode 0x%x not supported", mode);
-		return -1;
-	}
-	umode |= O_BINARY;
-	fd = open(name, umode);
-	if(fd >= 0){
-		if(rclose)
-			remove(name);
-	}
-	return fd;
-}
diff --git a/src/lib9/readn.c b/src/lib9/readn.c
deleted file mode 100644
index 7dfe9e515d84004996c265cb422ab538bc5fb11c..0000000000000000000000000000000000000000
--- a/src/lib9/readn.c
+++ /dev/null
@@ -1,50 +0,0 @@
-// +build !plan9
-
-/*
-Inferno lib9/readn.c
-http://code.google.com/p/inferno-os/source/browse/lib9/readn.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-long
-readn(int f, void *av, long n)
-{
-	char *a;
-	long m, t;
-
-	a = av;
-	t = 0;
-	while(t < n){
-		m = read(f, a+t, (size_t)(n-t));
-		if(m <= 0){
-			if(t == 0)
-				return m;
-			break;
-		}
-		t += m;
-	}
-	return t;
-}
diff --git a/src/lib9/rfork.c b/src/lib9/rfork.c
deleted file mode 100644
index 23b3ee67196bac8b33887ce6797168fbfaecd2a6..0000000000000000000000000000000000000000
--- a/src/lib9/rfork.c
+++ /dev/null
@@ -1,156 +0,0 @@
-// +build !plan9
-// +build !windows
-
-/*
-Plan 9 from User Space src/lib9/rfork.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/rfork.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <libc.h>
-#undef rfork
-
-static void
-nop(int x)
-{
-	USED(x);
-}
-
-int
-p9rfork(int flags)
-{
-	int pid, status;
-	int p[2];
-	int n;
-	char buf[128], *q;
-	extern char **environ;
-
-	if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
-		/* check other flags before we commit */
-		flags &= ~(RFPROC|RFFDG|RFENVG);
-		n = (flags & ~(RFNOTEG|RFNAMEG|RFNOWAIT|RFCENVG));
-		if(n){
-			werrstr("unknown flags %08ux in rfork", n);
-			return -1;
-		}
-		if(flags&RFNOWAIT){
-			/*
-			 * BUG - should put the signal handler back after we
-			 * finish, but I just don't care.  If a program calls with
-			 * NOWAIT once, they're not likely to want child notes
-			 * after that.
-			 */
-			signal(SIGCHLD, nop);
-			if(pipe(p) < 0)
-				return -1;
-		}
-		pid = fork();
-		if(pid == -1)
-			return -1;
-		if(flags&RFNOWAIT){
-			flags &= ~RFNOWAIT;
-			if(pid){
-				/*
-				 * Parent - wait for child to fork wait-free child.
-				 * Then read pid from pipe.  Assume pipe buffer can absorb the write.
-				 */
-				close(p[1]);
-				status = 0;
-				if(wait4(pid, &status, 0, 0) < 0){
-					werrstr("pipe dance - wait4 - %r");
-					close(p[0]);
-					return -1;
-				}
-				n = (int)readn(p[0], buf, sizeof buf-1);
-				close(p[0]);
-				if(!WIFEXITED(status) || WEXITSTATUS(status)!=0 || n <= 0){
-					if(!WIFEXITED(status))
-						werrstr("pipe dance - !exited 0x%ux", status);
-					else if(WEXITSTATUS(status) != 0)
-						werrstr("pipe dance - non-zero status 0x%ux", status);
-					else if(n < 0)
-						werrstr("pipe dance - pipe read error - %r");
-					else if(n == 0)
-						werrstr("pipe dance - pipe read eof");
-					else
-						werrstr("pipe dance - unknown failure");
-					return -1;
-				}
-				buf[n] = 0;
-				if(buf[0] == 'x'){
-					werrstr("%s", buf+2);
-					return -1;
-				}
-				pid = (int)strtol(buf, &q, 0);
-			}else{
-				/*
-				 * Child - fork a new child whose wait message can't
-				 * get back to the parent because we're going to exit!
-				 */
-				signal(SIGCHLD, SIG_IGN);
-				close(p[0]);
-				pid = fork();
-				if(pid){
-					/* Child parent - send status over pipe and exit. */
-					if(pid > 0)
-						fprint(p[1], "%d", pid);
-					else
-						fprint(p[1], "x %r");
-					close(p[1]);
-					_exit(0);
-				}else{
-					/* Child child - close pipe. */
-					close(p[1]);
-				}
-			}
-		}
-		if(pid != 0)
-			return pid;
-		if(flags&RFCENVG)
-			if(environ)
-				*environ = nil;
-	}
-	if(flags&RFPROC){
-		werrstr("cannot use rfork for shared memory -- use libthread");
-		return -1;
-	}
-	if(flags&RFNAMEG){
-		/* XXX set $NAMESPACE to a new directory */
-		flags &= ~RFNAMEG;
-	}
-	if(flags&RFNOTEG){
-		setpgid(0, getpid());
-		flags &= ~RFNOTEG;
-	}
-	if(flags&RFNOWAIT){
-		werrstr("cannot use RFNOWAIT without RFPROC");
-		return -1;
-	}
-	if(flags){
-		werrstr("unknown flags %08ux in rfork", flags);
-		return -1;
-	}
-	return 0;
-}
diff --git a/src/lib9/run_plan9.c b/src/lib9/run_plan9.c
deleted file mode 100644
index 29932626dc976d389e44940ddd5301e7df29dd24..0000000000000000000000000000000000000000
--- a/src/lib9/run_plan9.c
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-#include <u.h>
-#include <libc.h>
-
-int
-runcmd(char **argv)
-{
-	int pid;
-	Waitmsg *w;
-	
-	switch(pid = fork()) {
-	case -1:
-		return -1;
-	case 0:
-		exec(argv[0], argv);
-		fprint(2, "exec %s: %r\n", argv[0]);
-		exits("exec");
-	}
-	
-	w = wait();
-	if(w == nil)
-		return -1;
-	if(w->pid != pid) {
-		werrstr("unexpected pid in wait");
-		free(w);
-		return -1;
-	}
-	if(w->msg[0]) {
-		werrstr("unsuccessful exit status: %s", w->msg);
-		free(w);
-		return -1;
-	}
-	free(w);
-	return 0;
-}
diff --git a/src/lib9/run_unix.c b/src/lib9/run_unix.c
deleted file mode 100644
index 1acaefed87535f16b807ae4b2e0f8abd225610e6..0000000000000000000000000000000000000000
--- a/src/lib9/run_unix.c
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <u.h>
-#include <errno.h>
-#include <sys/wait.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-int
-runcmd(char **argv)
-{
-	int pid, pid1, status;
-	
-	switch(pid = fork()) {
-	case -1:
-		return -1;
-	case 0:
-		execvp(argv[0], argv);
-		fprint(2, "exec %s: %r\n", argv[0]);
-		_exit(1);
-	}
-	
-	while((pid1 = wait(&status)) < 0) {
-		if(errno != EINTR) {
-			werrstr("waitpid: %r");
-			return -1;
-		}
-	}
-	if(pid1 != pid) {
-		werrstr("unexpected pid in wait");
-		return -1;
-	}
-	if(!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-		werrstr("unsuccessful exit status %#x", status);
-		return -1;
-	}
-	return 0;
-}
-
diff --git a/src/lib9/run_windows.c b/src/lib9/run_windows.c
deleted file mode 100644
index e3e1c25710d1beb624add3f7c85a6bab74a899ac..0000000000000000000000000000000000000000
--- a/src/lib9/run_windows.c
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <windows.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-#include "win.h"
-
-int
-runcmd(char **argv)
-{
-	// Mostly copied from ../cmd/dist/windows.c.
-	// If there's a bug here, fix the logic there too.
-	int i, j, nslash;
-	Fmt fmt;
-	char *q;
-	WinRune *r;
-	STARTUPINFOW si;
-	PROCESS_INFORMATION pi;
-	DWORD code, lasterr;
-
-	fmtstrinit(&fmt);
-	for(i=0; argv[i]; i++) {
-		if(i > 0)
-			fmtprint(&fmt, " ");
-		q = argv[i];
-		if(strstr(q, " ") || strstr(q, "\t") || strstr(q, "\"") || strstr(q, "\\\\") || (strlen(q) > 0 && q[strlen(q)-1] == '\\')) {
-			fmtprint(&fmt, "\"");
-			nslash = 0;
-			for(; *q; q++) {
-				if(*q == '\\') {
-					nslash++;
-					continue;
-				}
-				if(*q == '"') {
-					for(j=0; j<2*nslash+1; j++)
-						fmtprint(&fmt, "\\");
-					nslash = 0;
-				}
-				for(j=0; j<nslash; j++)
-					fmtprint(&fmt, "\\");
-				nslash = 0;
-				fmtprint(&fmt, "\"");
-			}
-			for(j=0; j<2*nslash; j++)
-				fmtprint(&fmt, "\\");
-			fmtprint(&fmt, "\"");
-		} else {
-			fmtprint(&fmt, "%s", q);
-		}
-	}
-	
-	q = fmtstrflush(&fmt);
-	r = torune(q);
-	free(q);
-
-	memset(&si, 0, sizeof si);
-	si.cb = sizeof si;
-	si.dwFlags = STARTF_USESTDHANDLES;
-	si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
-	si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
-
-	if(!CreateProcessW(nil, r, nil, nil, TRUE, 0, nil, nil, &si, &pi)) {
-		werrstr("CreateProcess failed: errno=%d", (int)GetLastError());
-		free(r);
-		return -1;
-	}
-
-	free(r);
-	if(WaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE) != 0) {
-		werrstr("WaitForMultipleObjects failed: errno=%d", (int)GetLastError());
-		return -1;
-	}
-	i = GetExitCodeProcess(pi.hProcess, &code);
-	lasterr = GetLastError();
-	CloseHandle(pi.hProcess);
-	CloseHandle(pi.hThread);
-	if(!i) {
-		werrstr("GetExitCodeProcess failed: errno=%d", (int)lasterr);
-		return -1;
-	}
-	if(code != 0) {
-		werrstr("unsuccessful exit status: %d", (int)code);
-		return -1;
-	}
-	return 0;
-}
diff --git a/src/lib9/seek.c b/src/lib9/seek.c
deleted file mode 100644
index 0a0706cbeec2ef5e8a8cc1236c0759fd3b470f52..0000000000000000000000000000000000000000
--- a/src/lib9/seek.c
+++ /dev/null
@@ -1,35 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/seek.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/seek.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-vlong
-seek(int fd, vlong offset, int whence)
-{
-	return lseek(fd, offset, whence);
-}
diff --git a/src/lib9/strecpy.c b/src/lib9/strecpy.c
deleted file mode 100644
index 4b2b92b43d95199e88cf2986e7c870c29e5a6559..0000000000000000000000000000000000000000
--- a/src/lib9/strecpy.c
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build !plan9
-
-/*
-Inferno lib9/strecpy.c
-http://code.google.com/p/inferno-os/source/browse/lib9/strecpy.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-char*
-strecpy(char *to, char *e, char *from)
-{
-	if(to >= e)
-		return to;
-	to = memccpy(to, from, '\0', (size_t)(e - to));
-	if(to == nil){
-		to = e - 1;
-		*to = '\0';
-	}else{
-		to--;
-	}
-	return to;
-}
diff --git a/src/lib9/sysfatal.c b/src/lib9/sysfatal.c
deleted file mode 100644
index 9789061a881d4441571dab2139e28f016d19468e..0000000000000000000000000000000000000000
--- a/src/lib9/sysfatal.c
+++ /dev/null
@@ -1,49 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/sysfatal.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/sysfatal.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-void (*_sysfatal)(char*, ...);
-
-void
-sysfatal(char *fmt, ...)
-{
-	char buf[256];
-	va_list arg;
-
-	va_start(arg, fmt);
-	if(_sysfatal)
-		(*_sysfatal)(fmt, arg);
-	vseprint(buf, buf+sizeof buf, fmt, arg);
-	va_end(arg);
-
-	__fixargv0();
-	fprint(2, "%s: %s\n", argv0 ? argv0 : "<prog>", buf);
-	exits("fatal");
-}
-
diff --git a/src/lib9/tempdir_plan9.c b/src/lib9/tempdir_plan9.c
deleted file mode 100644
index 80d7ddbe4bbe1b3afd127bead035a2c325cd22f5..0000000000000000000000000000000000000000
--- a/src/lib9/tempdir_plan9.c
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-#include <u.h>
-#include <libc.h>
-
-char*
-mktempdir(void)
-{
-	char *p;
-	int fd, i;
-	
-	p = smprint("/tmp/go-link-XXXXXX");
-	for(i=0; i<1000; i++) {
-		sprint(p, "/tmp/go-link-%06x", nrand((1<<24)-1));
-		fd = create(p, OREAD|OEXCL, 0700|DMDIR);
-		if(fd >= 0) {
-			close(fd);
-			return p;
-		}
-	}
-	free(p);
-	return nil;
-}
-
-void
-removeall(char *p)
-{
-	int fd, n, i;
-	Dir *d;
-	char *q;
-	
-	if(remove(p) >= 0)
-		return;
-	if((d = dirstat(p)) == nil)
-		return;
-	if(!(d->mode & DMDIR)) {
-		free(d);
-		return;
-	}
-	free(d);
-	
-	if((fd = open(p, OREAD)) < 0)
-		return;
-	n = dirreadall(fd, &d);
-	close(fd);
-	for(i=0; i<n; i++) {
-		q = smprint("%s/%s", p, d[i].name);
-		removeall(q);
-		free(q);
-	}
-	free(d);
-}
diff --git a/src/lib9/tempdir_unix.c b/src/lib9/tempdir_unix.c
deleted file mode 100644
index 269d53823320d20424ad9d2a4f4fc09f423100e9..0000000000000000000000000000000000000000
--- a/src/lib9/tempdir_unix.c
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <u.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-char*
-mktempdir(void)
-{
-	char *tmp, *p;
-	
-	tmp = getenv("TMPDIR");
-	if(tmp == nil || strlen(tmp) == 0)
-		tmp = "/var/tmp";
-	p = smprint("%s/go-link-XXXXXX", tmp);
-	if(mkdtemp(p) == nil)
-		return nil;
-	return p;
-}
-
-void
-removeall(char *p)
-{
-	DIR *d;
-	struct dirent *dp;
-	char *q;
-	struct stat st;
-
-	if(stat(p, &st) < 0)
-		return;
-	if(!S_ISDIR(st.st_mode)) {
-		unlink(p);
-		return;
-	}
-
-	d = opendir(p);
-	while((dp = readdir(d)) != nil) {
-		if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
-			continue;
-		q = smprint("%s/%s", p, dp->d_name);
-		removeall(q);
-		free(q);
-	}
-	closedir(d);
-	rmdir(p);
-}
diff --git a/src/lib9/tempdir_windows.c b/src/lib9/tempdir_windows.c
deleted file mode 100644
index 4c3df7cf11ac5d76d263771edab00a510eab39b7..0000000000000000000000000000000000000000
--- a/src/lib9/tempdir_windows.c
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <windows.h>
-#include <libc.h>
-#include "win.h"
-
-char*
-toutf(WinRune *r)
-{
-	Rune *r1;
-	int i, n;
-	char *p;
-	
-	n = 0;
-	while(r[n] != '\0')
-		n++;
-	n++;
-	r1 = malloc(n*sizeof r1[0]);
-	for(i=0; i<n; i++)
-		r1[i] = r[i];
-	p = smprint("%S", r1);
-	free(r1);
-	return p;
-}
-
-WinRune*
-torune(char *p)
-{
-	int i, n;
-	Rune rr;
-	WinRune *r;
-	
-	n = utflen(p);
-	r = malloc((n+1)*sizeof r[0]);
-	for(i=0; i<n; i++) {
-		p += chartorune(&rr, p);
-		r[i] = rr;
-	}
-	r[n] = '\0';
-	return r;
-}
-
-char*
-mktempdir(void)
-{
-	WinRune buf[1024];
-	WinRune tmp[MAX_PATH];
-	WinRune golink[] = {'g', 'o', 'l', 'i', 'n', 'k', '\0'};
-	int n;
-	
-	n = GetTempPathW(nelem(buf), buf);
-	if(n <= 0)
-		return nil;
-	buf[n] = '\0';
-	
-	if(GetTempFileNameW(buf, golink, 0, tmp) == 0)
-		return nil;
-	DeleteFileW(tmp);
-	if(!CreateDirectoryW(tmp, nil))
-		return nil;
-	
-	return toutf(tmp);
-}
-
-void
-removeall(char *p)
-{
-	WinRune *r, *r1;
-	DWORD attr;
-	char *q, *qt, *elem;
-	HANDLE h;
-	WIN32_FIND_DATAW data;
-	
-	r = torune(p);
-	attr = GetFileAttributesW(r);
-	if(attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
-		DeleteFileW(r);
-		free(r);
-		return;
-	}
-
-	q = smprint("%s\\*", p);
-	r1 = torune(q);
-	free(q);
-	h = FindFirstFileW(r1, &data);
-	if(h == INVALID_HANDLE_VALUE)
-		goto done;
-	do{
-		q = toutf(data.cFileName);
-		elem = strrchr(q, '\\');
-		if(elem != nil)
-			elem++;
-		else
-			elem = q;
-		if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
-			free(q);
-			continue;
-		}
-		qt = smprint("%s\\%s", p, q);
-		free(q);
-		removeall(qt);
-		free(qt);
-	}while(FindNextFileW(h, &data));
-	FindClose(h);
-
-done:
-	free(r1);
-	RemoveDirectoryW(r);
-	free(r);
-}
diff --git a/src/lib9/time.c b/src/lib9/time.c
deleted file mode 100644
index e1b87a774066e9487ca21b4c520cf69a06dc07ce..0000000000000000000000000000000000000000
--- a/src/lib9/time.c
+++ /dev/null
@@ -1,68 +0,0 @@
-// +build !plan9
-
-/*
-Plan 9 from User Space src/lib9/time.c
-http://code.swtch.com/plan9port/src/tip/src/lib9/time.c
-
-Copyright 2001-2007 Russ Cox.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-#include <u.h>
-#include <sys/time.h>
-#include <time.h>
-#ifndef _WIN32
-#include <sys/resource.h>
-#endif
-#define NOPLAN9DEFINES
-#include <libc.h>
-
-long
-p9times(long *t)
-{
-#ifdef _WIN32
-	memset(t, 0, 4*sizeof(long));
-#else
-	struct rusage ru, cru;
-
-	if(getrusage(0, &ru) < 0 || getrusage(-1, &cru) < 0)
-		return -1;
-
-	t[0] = ru.ru_utime.tv_sec*1000 + ru.ru_utime.tv_usec/1000;
-	t[1] = ru.ru_stime.tv_sec*1000 + ru.ru_stime.tv_usec/1000;
-	t[2] = cru.ru_utime.tv_sec*1000 + cru.ru_utime.tv_usec/1000;
-	t[3] = cru.ru_stime.tv_sec*1000 + cru.ru_stime.tv_usec/1000;
-#endif
-
-	/* BUG */
-	return t[0]+t[1]+t[2]+t[3];
-}
-
-double
-p9cputime(void)
-{
-	long t[4];
-	double d;
-
-	if(p9times(t) < 0)
-		return -1.0;
-
-	d = (double)t[0]+(double)t[1]+(double)t[2]+(double)t[3];
-	return d/1000.0;
-}
diff --git a/src/lib9/tokenize.c b/src/lib9/tokenize.c
deleted file mode 100644
index a9b5935670e830e21eba41e79ebfca039a3fe5fc..0000000000000000000000000000000000000000
--- a/src/lib9/tokenize.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-Inferno lib9/tokenize.c
-http://code.google.com/p/inferno-os/source/browse/lib9/tokenize.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <u.h>
-#include <libc.h>
-
-static char qsep[] = " \t\r\n";
-
-static char*
-qtoken(char *s, char *sep)
-{
-	int quoting;
-	char *t;
-
-	quoting = 0;
-	t = s;	/* s is output string, t is input string */
-	while(*t!='\0' && (quoting || utfrune(sep, (Rune)*t)==nil)){
-		if(*t != '\''){
-			*s++ = *t++;
-			continue;
-		}
-		/* *t is a quote */
-		if(!quoting){
-			quoting = 1;
-			t++;
-			continue;
-		}
-		/* quoting and we're on a quote */
-		if(t[1] != '\''){
-			/* end of quoted section; absorb closing quote */
-			t++;
-			quoting = 0;
-			continue;
-		}
-		/* doubled quote; fold one quote into two */
-		t++;
-		*s++ = *t++;
-	}
-	if(*s != '\0'){
-		*s = '\0';
-		if(t == s)
-			t++;
-	}
-	return t;
-}
-
-static char*
-etoken(char *t, char *sep)
-{
-	int quoting;
-
-	/* move to end of next token */
-	quoting = 0;
-	while(*t!='\0' && (quoting || utfrune(sep, (Rune)*t)==nil)){
-		if(*t != '\''){
-			t++;
-			continue;
-		}
-		/* *t is a quote */
-		if(!quoting){
-			quoting = 1;
-			t++;
-			continue;
-		}
-		/* quoting and we're on a quote */
-		if(t[1] != '\''){
-			/* end of quoted section; absorb closing quote */
-			t++;
-			quoting = 0;
-			continue;
-		}
-		/* doubled quote; fold one quote into two */
-		t += 2;
-	}
-	return t;
-}
-
-int
-gettokens(char *s, char **args, int maxargs, char *sep)
-{
-	int nargs;
-
-	for(nargs=0; nargs<maxargs; nargs++){
-		while(*s!='\0' && utfrune(sep, (Rune)*s)!=nil)
-			*s++ = '\0';
-		if(*s == '\0')
-			break;
-		args[nargs] = s;
-		s = etoken(s, sep);
-	}
-
-	return nargs;
-}
-
-int
-tokenize(char *s, char **args, int maxargs)
-{
-	int nargs;
-
-	for(nargs=0; nargs<maxargs; nargs++){
-		while(*s!='\0' && utfrune(qsep, (Rune)*s)!=nil)
-			s++;
-		if(*s == '\0')
-			break;
-		args[nargs] = s;
-		s = qtoken(s, qsep);
-	}
-
-	return nargs;
-}
diff --git a/src/lib9/utf/Makefile b/src/lib9/utf/Makefile
deleted file mode 100644
index fe6f6351a9c3ab6781b29b420f3b1b0793a980cd..0000000000000000000000000000000000000000
--- a/src/lib9/utf/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2010 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# The library is built by the Makefile in the parent directory.
-# This Makefile only builds mkrunetype.
-# GOROOT, GOOS, and GOARCH must be set explicitly.
-
-TARG=mkrunetype
-
-UnicodeData-%.txt:
-	curl http://www.unicode.org/Public/$*/ucd/UnicodeData.txt >_$@
-	mv _$@ $@
-
-mkrunetype: mkrunetype.c
-	cc -I../../../include -o mkrunetype -L$(GOROOT)/pkg/obj/$(GOOS)_$(GOARCH)/ mkrunetype.c -l9
-
-runetypebody-%.h: mkrunetype UnicodeData-%.txt
-	mkrunetype -p UnicodeData-$*.txt >_$@
-	mv _$@ $@
-
-CLEANFILES+=UnicodeData.txt
-
-UNICODE_VERSION=6.3.0
-
-test: mkrunetype UnicodeData-$(UNICODE_VERSION).txt
-	mkrunetype -c UnicodeData-$(UNICODE_VERSION).txt
-
-clean:
-	rm -f UnicodeData.txt mkrunetype
diff --git a/src/lib9/utf/mkrunetype.c b/src/lib9/utf/mkrunetype.c
deleted file mode 100644
index 01eb6b6ec54bbaf3fe7b3ec760ab1fe19adfaa2c..0000000000000000000000000000000000000000
--- a/src/lib9/utf/mkrunetype.c
+++ /dev/null
@@ -1,734 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-/*
- * make is(upper|lower|title|space|alpha)rune and
- * to(upper|lower|title)rune from a UnicodeData.txt file.
- * these can be found at unicode.org
- *
- * with -c, runs a check of the existing runetype functions vs.
- * those extracted from UnicodeData.
- *
- * with -p, generates tables for pairs of chars, as well as for ranges
- * and singletons.
- *
- * UnicodeData defines 4 fields of interest:
- * 1) a category
- * 2) an upper case mapping
- * 3) a lower case mapping
- * 4) a title case mapping
- *
- * toupper, tolower, and totitle are defined directly from the mapping.
- *
- * isalpharune(c) is true iff c is a "letter" category
- * isupperrune(c) is true iff c is the target of toupperrune,
- *	or is in the uppercase letter category
- * similarly for islowerrune and istitlerune.
- * isspacerune is true for space category chars, "C" locale white space chars,
- *	and two additions:
- *	0085	"next line" control char
- *	feff]	"zero-width non-break space"
- * isdigitrune is true iff c is a numeric-digit category.
- */
-
-#include <u.h>
-#include <libc.h>
-#include <stdio.h>
-#include "utf.h"
-#include "utfdef.h"
-
-enum {
-	/*
-	 * fields in the unicode data file
-	 */
-	FIELD_CODE,
-	FIELD_NAME,
-	FIELD_CATEGORY,
-	FIELD_COMBINING,
-	FIELD_BIDIR,
-	FIELD_DECOMP,
-	FIELD_DECIMAL_DIG,
-	FIELD_DIG,
-	FIELD_NUMERIC_VAL,
-	FIELD_MIRRORED,
-	FIELD_UNICODE_1_NAME,
-	FIELD_COMMENT,
-	FIELD_UPPER,
-	FIELD_LOWER,
-	FIELD_TITLE,
-	NFIELDS,
-
-	MAX_LINE	= 1024,
-
-	TO_OFFSET	= 1 << 20,
-
-	NRUNES		= 1 << 21,
-};
-
-#define TO_DELTA(xmapped,x)	(TO_OFFSET + (xmapped) - (x))
-
-static char	myisspace[NRUNES];
-static char	myisalpha[NRUNES];
-static char	myisdigit[NRUNES];
-static char	myisupper[NRUNES];
-static char	myislower[NRUNES];
-static char	myistitle[NRUNES];
-
-static int	mytoupper[NRUNES];
-static int	mytolower[NRUNES];
-static int	mytotitle[NRUNES];
-
-static void	check(void);
-static void	mktables(char *src, int usepairs);
-static void	fatal(const char *fmt, ...);
-static int	mygetfields(char **fields, int nfields, char *str, const char *delim);
-static int	getunicodeline(FILE *in, char **fields, char *buf);
-static int	getcode(char *s);
-
-static void
-usage(void)
-{
-	fprintf(stderr, "usage: mktables [-cp] <UnicodeData.txt>\n");
-	exit(1);
-}
-
-void
-main(int argc, char *argv[])
-{
-	FILE *in;
-	char buf[MAX_LINE], buf2[MAX_LINE];
-	char *fields[NFIELDS + 1], *fields2[NFIELDS + 1];
-	char *p;
-	int i, code, last, docheck, usepairs;
-
-	docheck = 0;
-	usepairs = 0;
-	ARGBEGIN{
-	case 'c':
-		docheck = 1;
-		break;
-	case 'p':
-		usepairs = 1;
-		break;
-	default:
-		usage();
-	}ARGEND
-
-	if(argc != 1){
-		usage();
-	}
-
-	in = fopen(argv[0], "r");
-	if(in == NULL){
-		fatal("can't open %s", argv[0]);
-	}
-
-	for(i = 0; i < NRUNES; i++){
-		mytoupper[i] = i;
-		mytolower[i] = i;
-		mytotitle[i] = i;
-	}
-
-	/*
-	 * make sure isspace has all of the "C" locale whitespace chars
-	 */
-	myisspace['\t'] = 1;
-	myisspace['\n'] = 1;
-	myisspace['\r'] = 1;
-	myisspace['\f'] = 1;
-	myisspace['\v'] = 1;
-
-	/*
-	 * a couple of other exceptions
-	 */
-	myisspace[0x85] = 1;	/* control char, "next line" */
-	myisspace[0xfeff] = 1;	/* zero-width non-break space */
-
-	last = -1;
-	while(getunicodeline(in, fields, buf)){
-		code = getcode(fields[FIELD_CODE]);
-		if (code >= NRUNES)
-			fatal("code-point value too big: %x", code);
-		if(code <= last)
-			fatal("bad code sequence: %x then %x", last, code);
-		last = code;
-
-		/*
-		 * check for ranges
-		 */
-		p = fields[FIELD_CATEGORY];
-		if(strstr(fields[FIELD_NAME], ", First>") != NULL){
-			if(!getunicodeline(in, fields2, buf2))
-				fatal("range start at eof");
-			if (strstr(fields2[FIELD_NAME], ", Last>") == NULL)
-				fatal("range start not followed by range end");
-			last = getcode(fields2[FIELD_CODE]);
-			if(last <= code)
-				fatal("range out of sequence: %x then %x", code, last);
-			if(strcmp(p, fields2[FIELD_CATEGORY]) != 0)
-				fatal("range with mismatched category");
-		}
-
-		/*
-		 * set properties and conversions
-		 */
-		for (; code <= last; code++){
-			if(p[0] == 'L')
-				myisalpha[code] = 1;
-			if(p[0] == 'Z')
-				myisspace[code] = 1;
-
-			if(strcmp(p, "Lu") == 0)
-				myisupper[code] = 1;
-			if(strcmp(p, "Ll") == 0)
-				myislower[code] = 1;
-
-			if(strcmp(p, "Lt") == 0)
-				myistitle[code] = 1;
-
-			if(strcmp(p, "Nd") == 0)
-				myisdigit[code] = 1;
-
-			/*
-			 * when finding conversions, also need to mark
-			 * upper/lower case, since some chars, like
-			 * "III" (0x2162), aren't defined as letters but have a
-			 * lower case mapping ("iii" (0x2172)).
-			 */
-			if(fields[FIELD_UPPER][0] != '\0'){
-				mytoupper[code] = getcode(fields[FIELD_UPPER]);
-			}
-			if(fields[FIELD_LOWER][0] != '\0'){
-				mytolower[code] = getcode(fields[FIELD_LOWER]);
-			}
-			if(fields[FIELD_TITLE][0] != '\0'){
-				mytotitle[code] = getcode(fields[FIELD_TITLE]);
-			}
-		}
-	}
-
-	fclose(in);
-
-	/*
-	 * check for codes with no totitle mapping but a toupper mapping.
-	 * these appear in UnicodeData-2.0.14.txt, but are almost certainly
-	 * erroneous.
-	 */
-	for(i = 0; i < NRUNES; i++){
-		if(mytotitle[i] == i
-		&& mytoupper[i] != i
-		&& !myistitle[i])
-			fprintf(stderr, "warning: code=%.4x not istitle, totitle is same, toupper=%.4x\n", i, mytoupper[i]);
-	}
-
-	/*
-	 * make sure isupper[c] is true if for some x toupper[x]  == c
-	 * ditto for islower and istitle
-	 */
-	for(i = 0; i < NRUNES; i++) {
-		if(mytoupper[i] != i)
-			myisupper[mytoupper[i]] = 1;
-		if(mytolower[i] != i)
-			myislower[mytolower[i]] = 1;
-		if(mytotitle[i] != i)
-			myistitle[mytotitle[i]] = 1;
-	}
-
-	if(docheck){
-		check();
-	}else{
-		mktables(argv[0], usepairs);
-	}
-	exit(0);
-}
-
-/*
- * generate a properties array for ranges, clearing those cases covered.
- * if force, generate one-entry ranges for singletons.
- */
-static int
-mkisrange(const char* label, char* prop, int force)
-{
-	int start, stop, some;
-
-	/*
-	 * first, the ranges
-	 */
-	some = 0;
-	for(start = 0; start < NRUNES; ) {
-		if(!prop[start]){
-			start++;
-			continue;
-		}
-
-		for(stop = start + 1; stop < NRUNES; stop++){
-			if(!prop[stop]){
-				break;
-			}
-			prop[stop] = 0;
-		}
-		if(force || stop != start + 1){
-			if(!some){
-				printf("static Rune __is%sr[] = {\n", label);
-				some = 1;
-			}
-			prop[start] = 0;
-			printf("\t0x%.4x, 0x%.4x,\n", start, stop - 1);
-		}
-
-		start = stop;
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate a mapping array for pairs with a skip between,
- * clearing those entries covered.
- */
-static int
-mkispair(const char *label, char *prop)
-{
-	int start, stop, some;
-
-	some = 0;
-	for(start = 0; start + 2 < NRUNES; ) {
-		if(!prop[start]){
-			start++;
-			continue;
-		}
-
-		for(stop = start + 2; stop < NRUNES; stop += 2){
-			if(!prop[stop]){
-				break;
-			}
-			prop[stop] = 0;
-		}
-		if(stop != start + 2){
-			if(!some){
-				printf("static Rune __is%sp[] = {\n", label);
-				some = 1;
-			}
-			prop[start] = 0;
-			printf("\t0x%.4x, 0x%.4x,\n", start, stop - 2);
-		}
-
-		start = stop;
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate a properties array for singletons, clearing those cases covered.
- */
-static int
-mkissingle(const char *label, char *prop)
-{
-	int start, some;
-
-	some = 0;
-	for(start = 0; start < NRUNES; start++) {
-		if(!prop[start]){
-			continue;
-		}
-
-		if(!some){
-			printf("static Rune __is%ss[] = {\n", label);
-			some = 1;
-		}
-		prop[start] = 0;
-		printf("\t0x%.4x,\n", start);
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate tables and a function for is<label>rune
- */
-static void
-mkis(const char* label, char* prop, int usepairs)
-{
-	int isr, isp, iss;
-
-	isr = mkisrange(label, prop, 0);
-	isp = 0;
-	if(usepairs)
-		isp = mkispair(label, prop);
-	iss = mkissingle(label, prop);
-
-	printf(
-		"int\n"
-		"is%srune(Rune c)\n"
-		"{\n"
-		"	Rune *p;\n"
-		"\n",
-		label);
-
-	if(isr)
-		printf(
-			"	p = rbsearch(c, __is%sr, nelem(__is%sr)/2, 2);\n"
-			"	if(p && c >= p[0] && c <= p[1])\n"
-			"		return 1;\n",
-			label, label);
-
-	if(isp)
-		printf(
-			"	p = rbsearch(c, __is%sp, nelem(__is%sp)/2, 2);\n"
-			"	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n"
-			"		return 1;\n",
-			label, label);
-
-	if(iss)
-		printf(
-			"	p = rbsearch(c, __is%ss, nelem(__is%ss), 1);\n"
-			"	if(p && c == p[0])\n"
-			"		return 1;\n",
-			label, label);
-
-
-	printf(
-		"	return 0;\n"
-		"}\n"
-		"\n"
-	);
-}
-
-/*
- * generate a mapping array for ranges, clearing those entries covered.
- * if force, generate one-entry ranges for singletons.
- */
-static int
-mktorange(const char* label, int* map, int force)
-{
-	int start, stop, delta, some;
-
-	some = 0;
-	for(start = 0; start < NRUNES; ) {
-		if(map[start] == start){
-			start++;
-			continue;
-		}
-
-		delta = TO_DELTA(map[start], start);
-		if(delta != (Rune)delta)
-			fatal("bad map delta %d", delta);
-		for(stop = start + 1; stop < NRUNES; stop++){
-			if(TO_DELTA(map[stop], stop) != delta){
-				break;
-			}
-			map[stop] = stop;
-		}
-		if(stop != start + 1){
-			if(!some){
-				printf("static Rune __to%sr[] = {\n", label);
-				some = 1;
-			}
-			map[start] = start;
-			printf("\t0x%.4x, 0x%.4x, %d,\n", start, stop - 1, delta);
-		}
-
-		start = stop;
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate a mapping array for pairs with a skip between,
- * clearing those entries covered.
- */
-static int
-mktopair(const char* label, int* map)
-{
-	int start, stop, delta, some;
-
-	some = 0;
-	for(start = 0; start + 2 < NRUNES; ) {
-		if(map[start] == start){
-			start++;
-			continue;
-		}
-
-		delta = TO_DELTA(map[start], start);
-		if(delta != (Rune)delta)
-			fatal("bad map delta %d", delta);
-		for(stop = start + 2; stop < NRUNES; stop += 2){
-			if(TO_DELTA(map[stop], stop) != delta){
-				break;
-			}
-			map[stop] = stop;
-		}
-		if(stop != start + 2){
-			if(!some){
-				printf("static Rune __to%sp[] = {\n", label);
-				some = 1;
-			}
-			map[start] = start;
-			printf("\t0x%.4x, 0x%.4x, %d,\n", start, stop - 2, delta);
-		}
-
-		start = stop;
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate a mapping array for singletons, clearing those entries covered.
- */
-static int
-mktosingle(const char* label, int* map)
-{
-	int start, delta, some;
-
-	some = 0;
-	for(start = 0; start < NRUNES; start++) {
-		if(map[start] == start){
-			continue;
-		}
-
-		delta = TO_DELTA(map[start], start);
-		if(delta != (Rune)delta)
-			fatal("bad map delta %d", delta);
-		if(!some){
-			printf("static Rune __to%ss[] = {\n", label);
-			some = 1;
-		}
-		map[start] = start;
-		printf("\t0x%.4x, %d,\n", start, delta);
-	}
-	if(some)
-		printf("};\n\n");
-	return some;
-}
-
-/*
- * generate tables and a function for to<label>rune
- */
-static void
-mkto(const char* label, int* map, int usepairs)
-{
-	int tor, top, tos;
-
-	tor = mktorange(label, map, 0);
-	top = 0;
-	if(usepairs)
-		top = mktopair(label, map);
-	tos = mktosingle(label, map);
-
-	printf(
-		"Rune\n"
-		"to%srune(Rune c)\n"
-		"{\n"
-		"	Rune *p;\n"
-		"\n",
-		label);
-
-	if(tor)
-		printf(
-			"	p = rbsearch(c, __to%sr, nelem(__to%sr)/3, 3);\n"
-			"	if(p && c >= p[0] && c <= p[1])\n"
-			"		return c + p[2] - %d;\n",
-			label, label, TO_OFFSET);
-
-	if(top)
-		printf(
-			"	p = rbsearch(c, __to%sp, nelem(__to%sp)/3, 3);\n"
-			"	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))\n"
-			"		return c + p[2] - %d;\n",
-			label, label, TO_OFFSET);
-
-	if(tos)
-		printf(
-			"	p = rbsearch(c, __to%ss, nelem(__to%ss)/2, 2);\n"
-			"	if(p && c == p[0])\n"
-			"		return c + p[1] - %d;\n",
-			label, label, TO_OFFSET);
-
-
-	printf(
-		"	return c;\n"
-		"}\n"
-		"\n"
-	);
-}
-
-// Make only range tables and a function for is<label>rune.
-static void
-mkisronly(const char* label, char* prop)
-{
-	mkisrange(label, prop, 1);
-	printf(
-		"int\n"
-		"is%srune(Rune c)\n"
-		"{\n"
-		"	Rune *p;\n"
-		"\n"
-		"	p = rbsearch(c, __is%sr, nelem(__is%sr)/2, 2);\n"
-		"	if(p && c >= p[0] && c <= p[1])\n"
-		"		return 1;\n"
-		"	return 0;\n"
-		"}\n"
-		"\n",
-	        label, label, label);
-}
-
-/*
- * generate the body of runetype.
- * assumes there is a function Rune* rbsearch(Rune c, Rune *t, int n, int ne);
- */
-static void
-mktables(char *src, int usepairs)
-{
-	printf("/* generated automatically by mkrunetype.c from %s */\n\n", src);
-
-	/*
-	 * we special case the space and digit tables, since they are assumed
-	 * to be small with several ranges.
-	 */
-	mkisronly("space", myisspace);
-	mkisronly("digit", myisdigit);
-
-	mkis("alpha", myisalpha, 0);
-	mkis("upper", myisupper, usepairs);
-	mkis("lower", myislower, usepairs);
-	mkis("title", myistitle, usepairs);
-
-	mkto("upper", mytoupper, usepairs);
-	mkto("lower", mytolower, usepairs);
-	mkto("title", mytotitle, usepairs);
-}
-
-/*
- * find differences between the newly generated tables and current runetypes.
- */
-static void
-check(void)
-{
-	int i;
-
-	for(i = 0; i < NRUNES; i++){
-		if(isdigitrune(i) != myisdigit[i])
-			fprintf(stderr, "isdigit diff at %x: runetype=%x, unicode=%x\n",
-				i, isdigitrune(i), myisdigit[i]);
-
-		if(isspacerune(i) != myisspace[i])
-			fprintf(stderr, "isspace diff at %x: runetype=%x, unicode=%x\n",
-				i, isspacerune(i), myisspace[i]);
-
-		if(isupperrune(i) != myisupper[i])
-			fprintf(stderr, "isupper diff at %x: runetype=%x, unicode=%x\n",
-				i, isupperrune(i), myisupper[i]);
-
-		if(islowerrune(i) != myislower[i])
-			fprintf(stderr, "islower diff at %x: runetype=%x, unicode=%x\n",
-				i, islowerrune(i), myislower[i]);
-
-		if(isalpharune(i) != myisalpha[i])
-			fprintf(stderr, "isalpha diff at %x: runetype=%x, unicode=%x\n",
-				i, isalpharune(i), myisalpha[i]);
-
-		if(toupperrune(i) != mytoupper[i])
-			fprintf(stderr, "toupper diff at %x: runetype=%x, unicode=%x\n",
-				i, toupperrune(i), mytoupper[i]);
-
-		if(tolowerrune(i) != mytolower[i])
-			fprintf(stderr, "tolower diff at %x: runetype=%x, unicode=%x\n",
-				i, tolowerrune(i), mytolower[i]);
-
-		if(istitlerune(i) != myistitle[i])
-			fprintf(stderr, "istitle diff at %x: runetype=%x, unicode=%x\n",
-				i, istitlerune(i), myistitle[i]);
-
-		if(totitlerune(i) != mytotitle[i])
-			fprintf(stderr, "totitle diff at %x: runetype=%x, unicode=%x\n",
-				i, totitlerune(i), mytotitle[i]);
-
-
-	}
-}
-
-static int
-mygetfields(char **fields, int nfields, char *str, const char *delim)
-{
-	int nf;
-
-	fields[0] = str;
-	nf = 1;
-	if(nf >= nfields)
-		return nf;
-
-	for(; *str; str++){
-		if(strchr(delim, *str) != NULL){
-			*str = '\0';
-			fields[nf++] = str + 1;
-			if(nf >= nfields)
-				break;
-		}
-	}
-	return nf;
-}
-
-static int
-getunicodeline(FILE *in, char **fields, char *buf)
-{
-	char *p;
-
-	if(fgets(buf, MAX_LINE, in) == NULL)
-		return 0;
-
-	p = strchr(buf, '\n');
-	if (p == NULL)
-		fatal("line too long");
-	*p = '\0';
-
-	if (mygetfields(fields, NFIELDS + 1, buf, ";") != NFIELDS)
-		fatal("bad number of fields");
-
-	return 1;
-}
-
-static int
-getcode(char *s)
-{
-	int i, code;
-
-	code = 0;
-	i = 0;
-	/* Parse a hex number */
-	while(s[i]) {
-		code <<= 4;
-		if(s[i] >= '0' && s[i] <= '9')
-			code += s[i] - '0';
-		else if(s[i] >= 'A' && s[i] <= 'F')
-			code += s[i] - 'A' + 10;
-		else
-			fatal("bad code char '%c'", s[i]);
-		i++;
-	}
-	return code;
-}
-
-static void
-fatal(const char *fmt, ...)
-{
-	va_list arg;
-
-	fprintf(stderr, "%s: fatal error: ", argv0);
-	va_start(arg, fmt);
-	vfprintf(stderr, fmt, arg);
-	va_end(arg);
-	fprintf(stderr, "\n");
-
-	exit(1);
-}
diff --git a/src/lib9/utf/rune.c b/src/lib9/utf/rune.c
deleted file mode 100644
index 99f03eaa3f88f5edc4255cbadf549bb13986f4e7..0000000000000000000000000000000000000000
--- a/src/lib9/utf/rune.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- *              Portions Copyright (c) 2009 The Go Authors.  All rights reserved.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-enum
-{
-	Bit1	= 7,
-	Bitx	= 6,
-	Bit2	= 5,
-	Bit3	= 4,
-	Bit4	= 3,
-	Bit5	= 2,
-
-	T1	= ((1<<(Bit1+1))-1) ^ 0xFF,	/* 0000 0000 */
-	Tx	= ((1<<(Bitx+1))-1) ^ 0xFF,	/* 1000 0000 */
-	T2	= ((1<<(Bit2+1))-1) ^ 0xFF,	/* 1100 0000 */
-	T3	= ((1<<(Bit3+1))-1) ^ 0xFF,	/* 1110 0000 */
-	T4	= ((1<<(Bit4+1))-1) ^ 0xFF,	/* 1111 0000 */
-	T5	= ((1<<(Bit5+1))-1) ^ 0xFF,	/* 1111 1000 */
-
-	Rune1	= (1<<(Bit1+0*Bitx))-1,		/* 0000 0000 0111 1111 */
-	Rune2	= (1<<(Bit2+1*Bitx))-1,		/* 0000 0111 1111 1111 */
-	Rune3	= (1<<(Bit3+2*Bitx))-1,		/* 1111 1111 1111 1111 */
-	Rune4	= (1<<(Bit4+3*Bitx))-1,		/* 0001 1111 1111 1111 1111 1111 */
-
-	Maskx	= (1<<Bitx)-1,			/* 0011 1111 */
-	Testx	= Maskx ^ 0xFF,			/* 1100 0000 */
-
-	SurrogateMin	= 0xD800,
-	SurrogateMax	= 0xDFFF,
-
-	Bad	= Runeerror,
-};
-
-/*
- * Modified by Wei-Hwa Huang, Google Inc., on 2004-09-24
- * This is a slower but "safe" version of the old chartorune
- * that works on strings that are not necessarily null-terminated.
- *
- * If you know for sure that your string is null-terminated,
- * chartorune will be a bit faster.
- *
- * It is guaranteed not to attempt to access "length"
- * past the incoming pointer.  This is to avoid
- * possible access violations.  If the string appears to be
- * well-formed but incomplete (i.e., to get the whole Rune
- * we'd need to read past str+length) then we'll set the Rune
- * to Bad and return 0.
- *
- * Note that if we have decoding problems for other
- * reasons, we return 1 instead of 0.
- */
-int
-charntorune(Rune *rune, const char *str, int length)
-{
-	int c, c1, c2, c3;
-	long l;
-
-	/* When we're not allowed to read anything */
-	if(length <= 0) {
-		goto badlen;
-	}
-
-	/*
-	 * one character sequence (7-bit value)
-	 *	00000-0007F => T1
-	 */
-	c = *(uchar*)str;
-	if(c < Tx) {
-		*rune = (Rune)c;
-		return 1;
-	}
-
-	// If we can't read more than one character we must stop
-	if(length <= 1) {
-		goto badlen;
-	}
-
-	/*
-	 * two character sequence (11-bit value)
-	 *	0080-07FF => T2 Tx
-	 */
-	c1 = *(uchar*)(str+1) ^ Tx;
-	if(c1 & Testx)
-		goto bad;
-	if(c < T3) {
-		if(c < T2)
-			goto bad;
-		l = ((c << Bitx) | c1) & Rune2;
-		if(l <= Rune1)
-			goto bad;
-		*rune = (Rune)l;
-		return 2;
-	}
-
-	// If we can't read more than two characters we must stop
-	if(length <= 2) {
-		goto badlen;
-	}
-
-	/*
-	 * three character sequence (16-bit value)
-	 *	0800-FFFF => T3 Tx Tx
-	 */
-	c2 = *(uchar*)(str+2) ^ Tx;
-	if(c2 & Testx)
-		goto bad;
-	if(c < T4) {
-		l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
-		if(l <= Rune2)
-			goto bad;
-		if (SurrogateMin <= l && l <= SurrogateMax)
-			goto bad;
-		*rune = (Rune)l;
-		return 3;
-	}
-
-	if (length <= 3)
-		goto badlen;
-
-	/*
-	 * four character sequence (21-bit value)
-	 *	10000-1FFFFF => T4 Tx Tx Tx
-	 */
-	c3 = *(uchar*)(str+3) ^ Tx;
-	if (c3 & Testx)
-		goto bad;
-	if (c < T5) {
-		l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
-		if (l <= Rune3 || l > Runemax)
-			goto bad;
-		*rune = (Rune)l;
-		return 4;
-	}
-
-	// Support for 5-byte or longer UTF-8 would go here, but
-	// since we don't have that, we'll just fall through to bad.
-
-	/*
-	 * bad decoding
-	 */
-bad:
-	*rune = Bad;
-	return 1;
-badlen:
-	*rune = Bad;
-	return 0;
-
-}
-
-
-/*
- * This is the older "unsafe" version, which works fine on
- * null-terminated strings.
- */
-int
-chartorune(Rune *rune, const char *str)
-{
-	int c, c1, c2, c3;
-	long l;
-
-	/*
-	 * one character sequence
-	 *	00000-0007F => T1
-	 */
-	c = *(uchar*)str;
-	if(c < Tx) {
-		*rune = (Rune)c;
-		return 1;
-	}
-
-	/*
-	 * two character sequence
-	 *	0080-07FF => T2 Tx
-	 */
-	c1 = *(uchar*)(str+1) ^ Tx;
-	if(c1 & Testx)
-		goto bad;
-	if(c < T3) {
-		if(c < T2)
-			goto bad;
-		l = ((c << Bitx) | c1) & Rune2;
-		if(l <= Rune1)
-			goto bad;
-		*rune = (Rune)l;
-		return 2;
-	}
-
-	/*
-	 * three character sequence
-	 *	0800-FFFF => T3 Tx Tx
-	 */
-	c2 = *(uchar*)(str+2) ^ Tx;
-	if(c2 & Testx)
-		goto bad;
-	if(c < T4) {
-		l = ((((c << Bitx) | c1) << Bitx) | c2) & Rune3;
-		if(l <= Rune2)
-			goto bad;
-		if (SurrogateMin <= l && l <= SurrogateMax)
-			goto bad;
-		*rune = (Rune)l;
-		return 3;
-	}
-
-	/*
-	 * four character sequence (21-bit value)
-	 *	10000-1FFFFF => T4 Tx Tx Tx
-	 */
-	c3 = *(uchar*)(str+3) ^ Tx;
-	if (c3 & Testx)
-		goto bad;
-	if (c < T5) {
-		l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c3) & Rune4;
-		if (l <= Rune3 || l > Runemax)
-			goto bad;
-		*rune = (Rune)l;
-		return 4;
-	}
-
-	/*
-	 * Support for 5-byte or longer UTF-8 would go here, but
-	 * since we don't have that, we'll just fall through to bad.
-	 */
-
-	/*
-	 * bad decoding
-	 */
-bad:
-	*rune = Bad;
-	return 1;
-}
-
-int
-isvalidcharntorune(const char* str, int length, Rune* rune, int* consumed)
-{
-	*consumed = charntorune(rune, str, length);
-	return *rune != Runeerror || *consumed == 3;
-}
-
-int
-runetochar(char *str, const Rune *rune)
-{
-	/* Runes are signed, so convert to unsigned for range check. */
-	unsigned long c;
-
-	/*
-	 * one character sequence
-	 *	00000-0007F => 00-7F
-	 */
-	c = *rune;
-	if(c <= Rune1) {
-		str[0] = (char)c;
-		return 1;
-	}
-
-	/*
-	 * two character sequence
-	 *	0080-07FF => T2 Tx
-	 */
-	if(c <= Rune2) {
-		str[0] = (char)(T2 | (c >> 1*Bitx));
-		str[1] = (char)(Tx | (c & Maskx));
-		return 2;
-	}
-
-	/*
-	 * If the Rune is out of range or a surrogate half, convert it to the error rune.
-	 * Do this test here because the error rune encodes to three bytes.
-	 * Doing it earlier would duplicate work, since an out of range
-	 * Rune wouldn't have fit in one or two bytes.
-	 */
-	if (c > Runemax)
-		c = Runeerror;
-	if (SurrogateMin <= c && c <= SurrogateMax)
-		c = Runeerror;
-
-	/*
-	 * three character sequence
-	 *	0800-FFFF => T3 Tx Tx
-	 */
-	if (c <= Rune3) {
-		str[0] = (char)(T3 |  (c >> 2*Bitx));
-		str[1] = (char)(Tx | ((c >> 1*Bitx) & Maskx));
-		str[2] = (char)(Tx |  (c & Maskx));
-		return 3;
-	}
-
-	/*
-	 * four character sequence (21-bit value)
-	 *     10000-1FFFFF => T4 Tx Tx Tx
-	 */
-	str[0] = (char)(T4 | (c >> 3*Bitx));
-	str[1] = (char)(Tx | ((c >> 2*Bitx) & Maskx));
-	str[2] = (char)(Tx | ((c >> 1*Bitx) & Maskx));
-	str[3] = (char)(Tx | (c & Maskx));
-	return 4;
-}
-
-int
-runelen(Rune rune)
-{
-	char str[10];
-
-	return runetochar(str, &rune);
-}
-
-int
-runenlen(const Rune *r, int nrune)
-{
-	int nb, c;
-
-	nb = 0;
-	while(nrune--) {
-		c = (int)*r++;
-		if (c <= Rune1)
-			nb++;
-		else if (c <= Rune2)
-			nb += 2;
-		else if (c <= Rune3)
-			nb += 3;
-		else /* assert(c <= Rune4) */
-			nb += 4;
-	}
-	return nb;
-}
-
-int
-fullrune(const char *str, int n)
-{
-	if (n > 0) {
-		int c = *(uchar*)str;
-		if (c < Tx)
-			return 1;
-		if (n > 1) {
-			if (c < T3)
-				return 1;
-			if (n > 2) {
-				if (c < T4 || n > 3)
-					return 1;
-			}
-		}
-	}
-	return 0;
-}
diff --git a/src/lib9/utf/runetype.c b/src/lib9/utf/runetype.c
deleted file mode 100644
index ed775af08f54c9e54ce6e30918982a7e6009da28..0000000000000000000000000000000000000000
--- a/src/lib9/utf/runetype.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-static
-Rune*
-rbsearch(Rune c, Rune *t, int n, int ne)
-{
-	Rune *p;
-	int m;
-
-	while(n > 1) {
-		m = n >> 1;
-		p = t + m*ne;
-		if(c >= p[0]) {
-			t = p;
-			n = n-m;
-		} else
-			n = m;
-	}
-	if(n && c >= t[0])
-		return t;
-	return 0;
-}
-
-#include "runetypebody-6.3.0.h"
diff --git a/src/lib9/utf/runetypebody-6.3.0.h b/src/lib9/utf/runetypebody-6.3.0.h
deleted file mode 100644
index 5554dca36d8c8c281c9d75418cf9fe5bddc5074b..0000000000000000000000000000000000000000
--- a/src/lib9/utf/runetypebody-6.3.0.h
+++ /dev/null
@@ -1,1638 +0,0 @@
-/* generated automatically by mkrunetype.c from UnicodeData-6.3.0.txt */
-
-static Rune __isspacer[] = {
-	0x0009, 0x000d,
-	0x0020, 0x0020,
-	0x0085, 0x0085,
-	0x00a0, 0x00a0,
-	0x1680, 0x1680,
-	0x2000, 0x200a,
-	0x2028, 0x2029,
-	0x202f, 0x202f,
-	0x205f, 0x205f,
-	0x3000, 0x3000,
-	0xfeff, 0xfeff,
-};
-
-int
-isspacerune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __isspacer, nelem(__isspacer)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	return 0;
-}
-
-static Rune __isdigitr[] = {
-	0x0030, 0x0039,
-	0x0660, 0x0669,
-	0x06f0, 0x06f9,
-	0x07c0, 0x07c9,
-	0x0966, 0x096f,
-	0x09e6, 0x09ef,
-	0x0a66, 0x0a6f,
-	0x0ae6, 0x0aef,
-	0x0b66, 0x0b6f,
-	0x0be6, 0x0bef,
-	0x0c66, 0x0c6f,
-	0x0ce6, 0x0cef,
-	0x0d66, 0x0d6f,
-	0x0e50, 0x0e59,
-	0x0ed0, 0x0ed9,
-	0x0f20, 0x0f29,
-	0x1040, 0x1049,
-	0x1090, 0x1099,
-	0x17e0, 0x17e9,
-	0x1810, 0x1819,
-	0x1946, 0x194f,
-	0x19d0, 0x19d9,
-	0x1a80, 0x1a89,
-	0x1a90, 0x1a99,
-	0x1b50, 0x1b59,
-	0x1bb0, 0x1bb9,
-	0x1c40, 0x1c49,
-	0x1c50, 0x1c59,
-	0xa620, 0xa629,
-	0xa8d0, 0xa8d9,
-	0xa900, 0xa909,
-	0xa9d0, 0xa9d9,
-	0xaa50, 0xaa59,
-	0xabf0, 0xabf9,
-	0xff10, 0xff19,
-	0x104a0, 0x104a9,
-	0x11066, 0x1106f,
-	0x110f0, 0x110f9,
-	0x11136, 0x1113f,
-	0x111d0, 0x111d9,
-	0x116c0, 0x116c9,
-	0x1d7ce, 0x1d7ff,
-};
-
-int
-isdigitrune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __isdigitr, nelem(__isdigitr)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	return 0;
-}
-
-static Rune __isalphar[] = {
-	0x0041, 0x005a,
-	0x0061, 0x007a,
-	0x00c0, 0x00d6,
-	0x00d8, 0x00f6,
-	0x00f8, 0x02c1,
-	0x02c6, 0x02d1,
-	0x02e0, 0x02e4,
-	0x0370, 0x0374,
-	0x0376, 0x0377,
-	0x037a, 0x037d,
-	0x0388, 0x038a,
-	0x038e, 0x03a1,
-	0x03a3, 0x03f5,
-	0x03f7, 0x0481,
-	0x048a, 0x0527,
-	0x0531, 0x0556,
-	0x0561, 0x0587,
-	0x05d0, 0x05ea,
-	0x05f0, 0x05f2,
-	0x0620, 0x064a,
-	0x066e, 0x066f,
-	0x0671, 0x06d3,
-	0x06e5, 0x06e6,
-	0x06ee, 0x06ef,
-	0x06fa, 0x06fc,
-	0x0712, 0x072f,
-	0x074d, 0x07a5,
-	0x07ca, 0x07ea,
-	0x07f4, 0x07f5,
-	0x0800, 0x0815,
-	0x0840, 0x0858,
-	0x08a2, 0x08ac,
-	0x0904, 0x0939,
-	0x0958, 0x0961,
-	0x0971, 0x0977,
-	0x0979, 0x097f,
-	0x0985, 0x098c,
-	0x098f, 0x0990,
-	0x0993, 0x09a8,
-	0x09aa, 0x09b0,
-	0x09b6, 0x09b9,
-	0x09dc, 0x09dd,
-	0x09df, 0x09e1,
-	0x09f0, 0x09f1,
-	0x0a05, 0x0a0a,
-	0x0a0f, 0x0a10,
-	0x0a13, 0x0a28,
-	0x0a2a, 0x0a30,
-	0x0a32, 0x0a33,
-	0x0a35, 0x0a36,
-	0x0a38, 0x0a39,
-	0x0a59, 0x0a5c,
-	0x0a72, 0x0a74,
-	0x0a85, 0x0a8d,
-	0x0a8f, 0x0a91,
-	0x0a93, 0x0aa8,
-	0x0aaa, 0x0ab0,
-	0x0ab2, 0x0ab3,
-	0x0ab5, 0x0ab9,
-	0x0ae0, 0x0ae1,
-	0x0b05, 0x0b0c,
-	0x0b0f, 0x0b10,
-	0x0b13, 0x0b28,
-	0x0b2a, 0x0b30,
-	0x0b32, 0x0b33,
-	0x0b35, 0x0b39,
-	0x0b5c, 0x0b5d,
-	0x0b5f, 0x0b61,
-	0x0b85, 0x0b8a,
-	0x0b8e, 0x0b90,
-	0x0b92, 0x0b95,
-	0x0b99, 0x0b9a,
-	0x0b9e, 0x0b9f,
-	0x0ba3, 0x0ba4,
-	0x0ba8, 0x0baa,
-	0x0bae, 0x0bb9,
-	0x0c05, 0x0c0c,
-	0x0c0e, 0x0c10,
-	0x0c12, 0x0c28,
-	0x0c2a, 0x0c33,
-	0x0c35, 0x0c39,
-	0x0c58, 0x0c59,
-	0x0c60, 0x0c61,
-	0x0c85, 0x0c8c,
-	0x0c8e, 0x0c90,
-	0x0c92, 0x0ca8,
-	0x0caa, 0x0cb3,
-	0x0cb5, 0x0cb9,
-	0x0ce0, 0x0ce1,
-	0x0cf1, 0x0cf2,
-	0x0d05, 0x0d0c,
-	0x0d0e, 0x0d10,
-	0x0d12, 0x0d3a,
-	0x0d60, 0x0d61,
-	0x0d7a, 0x0d7f,
-	0x0d85, 0x0d96,
-	0x0d9a, 0x0db1,
-	0x0db3, 0x0dbb,
-	0x0dc0, 0x0dc6,
-	0x0e01, 0x0e30,
-	0x0e32, 0x0e33,
-	0x0e40, 0x0e46,
-	0x0e81, 0x0e82,
-	0x0e87, 0x0e88,
-	0x0e94, 0x0e97,
-	0x0e99, 0x0e9f,
-	0x0ea1, 0x0ea3,
-	0x0eaa, 0x0eab,
-	0x0ead, 0x0eb0,
-	0x0eb2, 0x0eb3,
-	0x0ec0, 0x0ec4,
-	0x0edc, 0x0edf,
-	0x0f40, 0x0f47,
-	0x0f49, 0x0f6c,
-	0x0f88, 0x0f8c,
-	0x1000, 0x102a,
-	0x1050, 0x1055,
-	0x105a, 0x105d,
-	0x1065, 0x1066,
-	0x106e, 0x1070,
-	0x1075, 0x1081,
-	0x10a0, 0x10c5,
-	0x10d0, 0x10fa,
-	0x10fc, 0x1248,
-	0x124a, 0x124d,
-	0x1250, 0x1256,
-	0x125a, 0x125d,
-	0x1260, 0x1288,
-	0x128a, 0x128d,
-	0x1290, 0x12b0,
-	0x12b2, 0x12b5,
-	0x12b8, 0x12be,
-	0x12c2, 0x12c5,
-	0x12c8, 0x12d6,
-	0x12d8, 0x1310,
-	0x1312, 0x1315,
-	0x1318, 0x135a,
-	0x1380, 0x138f,
-	0x13a0, 0x13f4,
-	0x1401, 0x166c,
-	0x166f, 0x167f,
-	0x1681, 0x169a,
-	0x16a0, 0x16ea,
-	0x1700, 0x170c,
-	0x170e, 0x1711,
-	0x1720, 0x1731,
-	0x1740, 0x1751,
-	0x1760, 0x176c,
-	0x176e, 0x1770,
-	0x1780, 0x17b3,
-	0x1820, 0x1877,
-	0x1880, 0x18a8,
-	0x18b0, 0x18f5,
-	0x1900, 0x191c,
-	0x1950, 0x196d,
-	0x1970, 0x1974,
-	0x1980, 0x19ab,
-	0x19c1, 0x19c7,
-	0x1a00, 0x1a16,
-	0x1a20, 0x1a54,
-	0x1b05, 0x1b33,
-	0x1b45, 0x1b4b,
-	0x1b83, 0x1ba0,
-	0x1bae, 0x1baf,
-	0x1bba, 0x1be5,
-	0x1c00, 0x1c23,
-	0x1c4d, 0x1c4f,
-	0x1c5a, 0x1c7d,
-	0x1ce9, 0x1cec,
-	0x1cee, 0x1cf1,
-	0x1cf5, 0x1cf6,
-	0x1d00, 0x1dbf,
-	0x1e00, 0x1f15,
-	0x1f18, 0x1f1d,
-	0x1f20, 0x1f45,
-	0x1f48, 0x1f4d,
-	0x1f50, 0x1f57,
-	0x1f5f, 0x1f7d,
-	0x1f80, 0x1fb4,
-	0x1fb6, 0x1fbc,
-	0x1fc2, 0x1fc4,
-	0x1fc6, 0x1fcc,
-	0x1fd0, 0x1fd3,
-	0x1fd6, 0x1fdb,
-	0x1fe0, 0x1fec,
-	0x1ff2, 0x1ff4,
-	0x1ff6, 0x1ffc,
-	0x2090, 0x209c,
-	0x210a, 0x2113,
-	0x2119, 0x211d,
-	0x212a, 0x212d,
-	0x212f, 0x2139,
-	0x213c, 0x213f,
-	0x2145, 0x2149,
-	0x2183, 0x2184,
-	0x2c00, 0x2c2e,
-	0x2c30, 0x2c5e,
-	0x2c60, 0x2ce4,
-	0x2ceb, 0x2cee,
-	0x2cf2, 0x2cf3,
-	0x2d00, 0x2d25,
-	0x2d30, 0x2d67,
-	0x2d80, 0x2d96,
-	0x2da0, 0x2da6,
-	0x2da8, 0x2dae,
-	0x2db0, 0x2db6,
-	0x2db8, 0x2dbe,
-	0x2dc0, 0x2dc6,
-	0x2dc8, 0x2dce,
-	0x2dd0, 0x2dd6,
-	0x2dd8, 0x2dde,
-	0x3005, 0x3006,
-	0x3031, 0x3035,
-	0x303b, 0x303c,
-	0x3041, 0x3096,
-	0x309d, 0x309f,
-	0x30a1, 0x30fa,
-	0x30fc, 0x30ff,
-	0x3105, 0x312d,
-	0x3131, 0x318e,
-	0x31a0, 0x31ba,
-	0x31f0, 0x31ff,
-	0x3400, 0x4db5,
-	0x4e00, 0x9fcc,
-	0xa000, 0xa48c,
-	0xa4d0, 0xa4fd,
-	0xa500, 0xa60c,
-	0xa610, 0xa61f,
-	0xa62a, 0xa62b,
-	0xa640, 0xa66e,
-	0xa67f, 0xa697,
-	0xa6a0, 0xa6e5,
-	0xa717, 0xa71f,
-	0xa722, 0xa788,
-	0xa78b, 0xa78e,
-	0xa790, 0xa793,
-	0xa7a0, 0xa7aa,
-	0xa7f8, 0xa801,
-	0xa803, 0xa805,
-	0xa807, 0xa80a,
-	0xa80c, 0xa822,
-	0xa840, 0xa873,
-	0xa882, 0xa8b3,
-	0xa8f2, 0xa8f7,
-	0xa90a, 0xa925,
-	0xa930, 0xa946,
-	0xa960, 0xa97c,
-	0xa984, 0xa9b2,
-	0xaa00, 0xaa28,
-	0xaa40, 0xaa42,
-	0xaa44, 0xaa4b,
-	0xaa60, 0xaa76,
-	0xaa80, 0xaaaf,
-	0xaab5, 0xaab6,
-	0xaab9, 0xaabd,
-	0xaadb, 0xaadd,
-	0xaae0, 0xaaea,
-	0xaaf2, 0xaaf4,
-	0xab01, 0xab06,
-	0xab09, 0xab0e,
-	0xab11, 0xab16,
-	0xab20, 0xab26,
-	0xab28, 0xab2e,
-	0xabc0, 0xabe2,
-	0xac00, 0xd7a3,
-	0xd7b0, 0xd7c6,
-	0xd7cb, 0xd7fb,
-	0xf900, 0xfa6d,
-	0xfa70, 0xfad9,
-	0xfb00, 0xfb06,
-	0xfb13, 0xfb17,
-	0xfb1f, 0xfb28,
-	0xfb2a, 0xfb36,
-	0xfb38, 0xfb3c,
-	0xfb40, 0xfb41,
-	0xfb43, 0xfb44,
-	0xfb46, 0xfbb1,
-	0xfbd3, 0xfd3d,
-	0xfd50, 0xfd8f,
-	0xfd92, 0xfdc7,
-	0xfdf0, 0xfdfb,
-	0xfe70, 0xfe74,
-	0xfe76, 0xfefc,
-	0xff21, 0xff3a,
-	0xff41, 0xff5a,
-	0xff66, 0xffbe,
-	0xffc2, 0xffc7,
-	0xffca, 0xffcf,
-	0xffd2, 0xffd7,
-	0xffda, 0xffdc,
-	0x10000, 0x1000b,
-	0x1000d, 0x10026,
-	0x10028, 0x1003a,
-	0x1003c, 0x1003d,
-	0x1003f, 0x1004d,
-	0x10050, 0x1005d,
-	0x10080, 0x100fa,
-	0x10280, 0x1029c,
-	0x102a0, 0x102d0,
-	0x10300, 0x1031e,
-	0x10330, 0x10340,
-	0x10342, 0x10349,
-	0x10380, 0x1039d,
-	0x103a0, 0x103c3,
-	0x103c8, 0x103cf,
-	0x10400, 0x1049d,
-	0x10800, 0x10805,
-	0x1080a, 0x10835,
-	0x10837, 0x10838,
-	0x1083f, 0x10855,
-	0x10900, 0x10915,
-	0x10920, 0x10939,
-	0x10980, 0x109b7,
-	0x109be, 0x109bf,
-	0x10a10, 0x10a13,
-	0x10a15, 0x10a17,
-	0x10a19, 0x10a33,
-	0x10a60, 0x10a7c,
-	0x10b00, 0x10b35,
-	0x10b40, 0x10b55,
-	0x10b60, 0x10b72,
-	0x10c00, 0x10c48,
-	0x11003, 0x11037,
-	0x11083, 0x110af,
-	0x110d0, 0x110e8,
-	0x11103, 0x11126,
-	0x11183, 0x111b2,
-	0x111c1, 0x111c4,
-	0x11680, 0x116aa,
-	0x12000, 0x1236e,
-	0x13000, 0x1342e,
-	0x16800, 0x16a38,
-	0x16f00, 0x16f44,
-	0x16f93, 0x16f9f,
-	0x1b000, 0x1b001,
-	0x1d400, 0x1d454,
-	0x1d456, 0x1d49c,
-	0x1d49e, 0x1d49f,
-	0x1d4a5, 0x1d4a6,
-	0x1d4a9, 0x1d4ac,
-	0x1d4ae, 0x1d4b9,
-	0x1d4bd, 0x1d4c3,
-	0x1d4c5, 0x1d505,
-	0x1d507, 0x1d50a,
-	0x1d50d, 0x1d514,
-	0x1d516, 0x1d51c,
-	0x1d51e, 0x1d539,
-	0x1d53b, 0x1d53e,
-	0x1d540, 0x1d544,
-	0x1d54a, 0x1d550,
-	0x1d552, 0x1d6a5,
-	0x1d6a8, 0x1d6c0,
-	0x1d6c2, 0x1d6da,
-	0x1d6dc, 0x1d6fa,
-	0x1d6fc, 0x1d714,
-	0x1d716, 0x1d734,
-	0x1d736, 0x1d74e,
-	0x1d750, 0x1d76e,
-	0x1d770, 0x1d788,
-	0x1d78a, 0x1d7a8,
-	0x1d7aa, 0x1d7c2,
-	0x1d7c4, 0x1d7cb,
-	0x1ee00, 0x1ee03,
-	0x1ee05, 0x1ee1f,
-	0x1ee21, 0x1ee22,
-	0x1ee29, 0x1ee32,
-	0x1ee34, 0x1ee37,
-	0x1ee4d, 0x1ee4f,
-	0x1ee51, 0x1ee52,
-	0x1ee61, 0x1ee62,
-	0x1ee67, 0x1ee6a,
-	0x1ee6c, 0x1ee72,
-	0x1ee74, 0x1ee77,
-	0x1ee79, 0x1ee7c,
-	0x1ee80, 0x1ee89,
-	0x1ee8b, 0x1ee9b,
-	0x1eea1, 0x1eea3,
-	0x1eea5, 0x1eea9,
-	0x1eeab, 0x1eebb,
-	0x20000, 0x2a6d6,
-	0x2a700, 0x2b734,
-	0x2b740, 0x2b81d,
-	0x2f800, 0x2fa1d,
-};
-
-static Rune __isalphas[] = {
-	0x00aa,
-	0x00b5,
-	0x00ba,
-	0x02ec,
-	0x02ee,
-	0x0386,
-	0x038c,
-	0x0559,
-	0x06d5,
-	0x06ff,
-	0x0710,
-	0x07b1,
-	0x07fa,
-	0x081a,
-	0x0824,
-	0x0828,
-	0x08a0,
-	0x093d,
-	0x0950,
-	0x09b2,
-	0x09bd,
-	0x09ce,
-	0x0a5e,
-	0x0abd,
-	0x0ad0,
-	0x0b3d,
-	0x0b71,
-	0x0b83,
-	0x0b9c,
-	0x0bd0,
-	0x0c3d,
-	0x0cbd,
-	0x0cde,
-	0x0d3d,
-	0x0d4e,
-	0x0dbd,
-	0x0e84,
-	0x0e8a,
-	0x0e8d,
-	0x0ea5,
-	0x0ea7,
-	0x0ebd,
-	0x0ec6,
-	0x0f00,
-	0x103f,
-	0x1061,
-	0x108e,
-	0x10c7,
-	0x10cd,
-	0x1258,
-	0x12c0,
-	0x17d7,
-	0x17dc,
-	0x18aa,
-	0x1aa7,
-	0x1f59,
-	0x1f5b,
-	0x1f5d,
-	0x1fbe,
-	0x2071,
-	0x207f,
-	0x2102,
-	0x2107,
-	0x2115,
-	0x2124,
-	0x2126,
-	0x2128,
-	0x214e,
-	0x2d27,
-	0x2d2d,
-	0x2d6f,
-	0x2e2f,
-	0xa8fb,
-	0xa9cf,
-	0xaa7a,
-	0xaab1,
-	0xaac0,
-	0xaac2,
-	0xfb1d,
-	0xfb3e,
-	0x10808,
-	0x1083c,
-	0x10a00,
-	0x16f50,
-	0x1d4a2,
-	0x1d4bb,
-	0x1d546,
-	0x1ee24,
-	0x1ee27,
-	0x1ee39,
-	0x1ee3b,
-	0x1ee42,
-	0x1ee47,
-	0x1ee49,
-	0x1ee4b,
-	0x1ee54,
-	0x1ee57,
-	0x1ee59,
-	0x1ee5b,
-	0x1ee5d,
-	0x1ee5f,
-	0x1ee64,
-	0x1ee7e,
-};
-
-int
-isalpharune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __isalphar, nelem(__isalphar)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = rbsearch(c, __isalphas, nelem(__isalphas), 1);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-static Rune __isupperr[] = {
-	0x0041, 0x005a,
-	0x00c0, 0x00d6,
-	0x00d8, 0x00de,
-	0x0178, 0x0179,
-	0x0181, 0x0182,
-	0x0186, 0x0187,
-	0x0189, 0x018b,
-	0x018e, 0x0191,
-	0x0193, 0x0194,
-	0x0196, 0x0198,
-	0x019c, 0x019d,
-	0x019f, 0x01a0,
-	0x01a6, 0x01a7,
-	0x01ae, 0x01af,
-	0x01b1, 0x01b3,
-	0x01b7, 0x01b8,
-	0x01f6, 0x01f8,
-	0x023a, 0x023b,
-	0x023d, 0x023e,
-	0x0243, 0x0246,
-	0x0388, 0x038a,
-	0x038e, 0x038f,
-	0x0391, 0x03a1,
-	0x03a3, 0x03ab,
-	0x03d2, 0x03d4,
-	0x03f9, 0x03fa,
-	0x03fd, 0x042f,
-	0x04c0, 0x04c1,
-	0x0531, 0x0556,
-	0x10a0, 0x10c5,
-	0x1f08, 0x1f0f,
-	0x1f18, 0x1f1d,
-	0x1f28, 0x1f2f,
-	0x1f38, 0x1f3f,
-	0x1f48, 0x1f4d,
-	0x1f68, 0x1f6f,
-	0x1f88, 0x1f8f,
-	0x1f98, 0x1f9f,
-	0x1fa8, 0x1faf,
-	0x1fb8, 0x1fbc,
-	0x1fc8, 0x1fcc,
-	0x1fd8, 0x1fdb,
-	0x1fe8, 0x1fec,
-	0x1ff8, 0x1ffc,
-	0x210b, 0x210d,
-	0x2110, 0x2112,
-	0x2119, 0x211d,
-	0x212a, 0x212d,
-	0x2130, 0x2133,
-	0x213e, 0x213f,
-	0x2160, 0x216f,
-	0x24b6, 0x24cf,
-	0x2c00, 0x2c2e,
-	0x2c62, 0x2c64,
-	0x2c6d, 0x2c70,
-	0x2c7e, 0x2c80,
-	0xa77d, 0xa77e,
-	0xff21, 0xff3a,
-	0x10400, 0x10427,
-	0x1d400, 0x1d419,
-	0x1d434, 0x1d44d,
-	0x1d468, 0x1d481,
-	0x1d49e, 0x1d49f,
-	0x1d4a5, 0x1d4a6,
-	0x1d4a9, 0x1d4ac,
-	0x1d4ae, 0x1d4b5,
-	0x1d4d0, 0x1d4e9,
-	0x1d504, 0x1d505,
-	0x1d507, 0x1d50a,
-	0x1d50d, 0x1d514,
-	0x1d516, 0x1d51c,
-	0x1d538, 0x1d539,
-	0x1d53b, 0x1d53e,
-	0x1d540, 0x1d544,
-	0x1d54a, 0x1d550,
-	0x1d56c, 0x1d585,
-	0x1d5a0, 0x1d5b9,
-	0x1d5d4, 0x1d5ed,
-	0x1d608, 0x1d621,
-	0x1d63c, 0x1d655,
-	0x1d670, 0x1d689,
-	0x1d6a8, 0x1d6c0,
-	0x1d6e2, 0x1d6fa,
-	0x1d71c, 0x1d734,
-	0x1d756, 0x1d76e,
-	0x1d790, 0x1d7a8,
-};
-
-static Rune __isupperp[] = {
-	0x0100, 0x0136,
-	0x0139, 0x0147,
-	0x014a, 0x0176,
-	0x017b, 0x017d,
-	0x01a2, 0x01a4,
-	0x01cd, 0x01db,
-	0x01de, 0x01ee,
-	0x01fa, 0x0232,
-	0x0248, 0x024e,
-	0x0370, 0x0372,
-	0x03d8, 0x03ee,
-	0x0460, 0x0480,
-	0x048a, 0x04be,
-	0x04c3, 0x04cd,
-	0x04d0, 0x0526,
-	0x1e00, 0x1e94,
-	0x1e9e, 0x1efe,
-	0x1f59, 0x1f5f,
-	0x2124, 0x2128,
-	0x2c67, 0x2c6b,
-	0x2c82, 0x2ce2,
-	0x2ceb, 0x2ced,
-	0xa640, 0xa66c,
-	0xa680, 0xa696,
-	0xa722, 0xa72e,
-	0xa732, 0xa76e,
-	0xa779, 0xa77b,
-	0xa780, 0xa786,
-	0xa78b, 0xa78d,
-	0xa790, 0xa792,
-	0xa7a0, 0xa7aa,
-};
-
-static Rune __isuppers[] = {
-	0x0184,
-	0x01a9,
-	0x01ac,
-	0x01b5,
-	0x01bc,
-	0x01c4,
-	0x01c7,
-	0x01ca,
-	0x01f1,
-	0x01f4,
-	0x0241,
-	0x0376,
-	0x0386,
-	0x038c,
-	0x03cf,
-	0x03f4,
-	0x03f7,
-	0x10c7,
-	0x10cd,
-	0x2102,
-	0x2107,
-	0x2115,
-	0x2145,
-	0x2183,
-	0x2c60,
-	0x2c72,
-	0x2c75,
-	0x2cf2,
-	0x1d49c,
-	0x1d4a2,
-	0x1d546,
-	0x1d7ca,
-};
-
-int
-isupperrune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __isupperr, nelem(__isupperr)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = rbsearch(c, __isupperp, nelem(__isupperp)/2, 2);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return 1;
-	p = rbsearch(c, __isuppers, nelem(__isuppers), 1);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-static Rune __islowerr[] = {
-	0x0061, 0x007a,
-	0x00df, 0x00f6,
-	0x00f8, 0x00ff,
-	0x0137, 0x0138,
-	0x0148, 0x0149,
-	0x017e, 0x0180,
-	0x018c, 0x018d,
-	0x0199, 0x019b,
-	0x01aa, 0x01ab,
-	0x01b9, 0x01ba,
-	0x01bd, 0x01bf,
-	0x01dc, 0x01dd,
-	0x01ef, 0x01f0,
-	0x0233, 0x0239,
-	0x023f, 0x0240,
-	0x024f, 0x0293,
-	0x0295, 0x02af,
-	0x037b, 0x037d,
-	0x03ac, 0x03ce,
-	0x03d0, 0x03d1,
-	0x03d5, 0x03d7,
-	0x03ef, 0x03f3,
-	0x03fb, 0x03fc,
-	0x0430, 0x045f,
-	0x04ce, 0x04cf,
-	0x0561, 0x0587,
-	0x1d00, 0x1d2b,
-	0x1d6b, 0x1d77,
-	0x1d79, 0x1d9a,
-	0x1e95, 0x1e9d,
-	0x1eff, 0x1f07,
-	0x1f10, 0x1f15,
-	0x1f20, 0x1f27,
-	0x1f30, 0x1f37,
-	0x1f40, 0x1f45,
-	0x1f50, 0x1f57,
-	0x1f60, 0x1f67,
-	0x1f70, 0x1f7d,
-	0x1f80, 0x1f87,
-	0x1f90, 0x1f97,
-	0x1fa0, 0x1fa7,
-	0x1fb0, 0x1fb4,
-	0x1fb6, 0x1fb7,
-	0x1fc2, 0x1fc4,
-	0x1fc6, 0x1fc7,
-	0x1fd0, 0x1fd3,
-	0x1fd6, 0x1fd7,
-	0x1fe0, 0x1fe7,
-	0x1ff2, 0x1ff4,
-	0x1ff6, 0x1ff7,
-	0x210e, 0x210f,
-	0x213c, 0x213d,
-	0x2146, 0x2149,
-	0x2170, 0x217f,
-	0x24d0, 0x24e9,
-	0x2c30, 0x2c5e,
-	0x2c65, 0x2c66,
-	0x2c73, 0x2c74,
-	0x2c76, 0x2c7b,
-	0x2ce3, 0x2ce4,
-	0x2d00, 0x2d25,
-	0xa72f, 0xa731,
-	0xa771, 0xa778,
-	0xfb00, 0xfb06,
-	0xfb13, 0xfb17,
-	0xff41, 0xff5a,
-	0x10428, 0x1044f,
-	0x1d41a, 0x1d433,
-	0x1d44e, 0x1d454,
-	0x1d456, 0x1d467,
-	0x1d482, 0x1d49b,
-	0x1d4b6, 0x1d4b9,
-	0x1d4bd, 0x1d4c3,
-	0x1d4c5, 0x1d4cf,
-	0x1d4ea, 0x1d503,
-	0x1d51e, 0x1d537,
-	0x1d552, 0x1d56b,
-	0x1d586, 0x1d59f,
-	0x1d5ba, 0x1d5d3,
-	0x1d5ee, 0x1d607,
-	0x1d622, 0x1d63b,
-	0x1d656, 0x1d66f,
-	0x1d68a, 0x1d6a5,
-	0x1d6c2, 0x1d6da,
-	0x1d6dc, 0x1d6e1,
-	0x1d6fc, 0x1d714,
-	0x1d716, 0x1d71b,
-	0x1d736, 0x1d74e,
-	0x1d750, 0x1d755,
-	0x1d770, 0x1d788,
-	0x1d78a, 0x1d78f,
-	0x1d7aa, 0x1d7c2,
-	0x1d7c4, 0x1d7c9,
-};
-
-static Rune __islowerp[] = {
-	0x0101, 0x0135,
-	0x013a, 0x0146,
-	0x014b, 0x0177,
-	0x017a, 0x017c,
-	0x0183, 0x0185,
-	0x01a1, 0x01a5,
-	0x01b4, 0x01b6,
-	0x01cc, 0x01da,
-	0x01df, 0x01ed,
-	0x01f3, 0x01f5,
-	0x01f9, 0x0231,
-	0x0247, 0x024d,
-	0x0371, 0x0373,
-	0x03d9, 0x03ed,
-	0x0461, 0x0481,
-	0x048b, 0x04bf,
-	0x04c2, 0x04cc,
-	0x04d1, 0x0527,
-	0x1e01, 0x1e93,
-	0x1e9f, 0x1efd,
-	0x2c68, 0x2c6c,
-	0x2c81, 0x2ce1,
-	0x2cec, 0x2cee,
-	0xa641, 0xa66d,
-	0xa681, 0xa697,
-	0xa723, 0xa72d,
-	0xa733, 0xa76f,
-	0xa77a, 0xa77c,
-	0xa77f, 0xa787,
-	0xa78c, 0xa78e,
-	0xa791, 0xa793,
-	0xa7a1, 0xa7a9,
-};
-
-static Rune __islowers[] = {
-	0x00b5,
-	0x0188,
-	0x0192,
-	0x0195,
-	0x019e,
-	0x01a8,
-	0x01ad,
-	0x01b0,
-	0x01c6,
-	0x01c9,
-	0x023c,
-	0x0242,
-	0x0377,
-	0x0390,
-	0x03f5,
-	0x03f8,
-	0x1fbe,
-	0x210a,
-	0x2113,
-	0x212f,
-	0x2134,
-	0x2139,
-	0x214e,
-	0x2184,
-	0x2c61,
-	0x2c71,
-	0x2cf3,
-	0x2d27,
-	0x2d2d,
-	0xa7fa,
-	0x1d4bb,
-	0x1d7cb,
-};
-
-int
-islowerrune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __islowerr, nelem(__islowerr)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = rbsearch(c, __islowerp, nelem(__islowerp)/2, 2);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return 1;
-	p = rbsearch(c, __islowers, nelem(__islowers), 1);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-static Rune __istitler[] = {
-	0x0041, 0x005a,
-	0x00c0, 0x00d6,
-	0x00d8, 0x00de,
-	0x0178, 0x0179,
-	0x0181, 0x0182,
-	0x0186, 0x0187,
-	0x0189, 0x018b,
-	0x018e, 0x0191,
-	0x0193, 0x0194,
-	0x0196, 0x0198,
-	0x019c, 0x019d,
-	0x019f, 0x01a0,
-	0x01a6, 0x01a7,
-	0x01ae, 0x01af,
-	0x01b1, 0x01b3,
-	0x01b7, 0x01b8,
-	0x01f6, 0x01f8,
-	0x023a, 0x023b,
-	0x023d, 0x023e,
-	0x0243, 0x0246,
-	0x0388, 0x038a,
-	0x038e, 0x038f,
-	0x0391, 0x03a1,
-	0x03a3, 0x03ab,
-	0x03f9, 0x03fa,
-	0x03fd, 0x042f,
-	0x04c0, 0x04c1,
-	0x0531, 0x0556,
-	0x10a0, 0x10c5,
-	0x1f08, 0x1f0f,
-	0x1f18, 0x1f1d,
-	0x1f28, 0x1f2f,
-	0x1f38, 0x1f3f,
-	0x1f48, 0x1f4d,
-	0x1f68, 0x1f6f,
-	0x1f88, 0x1f8f,
-	0x1f98, 0x1f9f,
-	0x1fa8, 0x1faf,
-	0x1fb8, 0x1fbc,
-	0x1fc8, 0x1fcc,
-	0x1fd8, 0x1fdb,
-	0x1fe8, 0x1fec,
-	0x1ff8, 0x1ffc,
-	0x2160, 0x216f,
-	0x24b6, 0x24cf,
-	0x2c00, 0x2c2e,
-	0x2c62, 0x2c64,
-	0x2c6d, 0x2c70,
-	0x2c7e, 0x2c80,
-	0xa77d, 0xa77e,
-	0xff21, 0xff3a,
-	0x10400, 0x10427,
-};
-
-static Rune __istitlep[] = {
-	0x0100, 0x012e,
-	0x0132, 0x0136,
-	0x0139, 0x0147,
-	0x014a, 0x0176,
-	0x017b, 0x017d,
-	0x01a2, 0x01a4,
-	0x01cb, 0x01db,
-	0x01de, 0x01ee,
-	0x01f2, 0x01f4,
-	0x01fa, 0x0232,
-	0x0248, 0x024e,
-	0x0370, 0x0372,
-	0x03d8, 0x03ee,
-	0x0460, 0x0480,
-	0x048a, 0x04be,
-	0x04c3, 0x04cd,
-	0x04d0, 0x0526,
-	0x1e00, 0x1e94,
-	0x1ea0, 0x1efe,
-	0x1f59, 0x1f5f,
-	0x2c67, 0x2c6b,
-	0x2c82, 0x2ce2,
-	0x2ceb, 0x2ced,
-	0xa640, 0xa66c,
-	0xa680, 0xa696,
-	0xa722, 0xa72e,
-	0xa732, 0xa76e,
-	0xa779, 0xa77b,
-	0xa780, 0xa786,
-	0xa78b, 0xa78d,
-	0xa790, 0xa792,
-	0xa7a0, 0xa7aa,
-};
-
-static Rune __istitles[] = {
-	0x0184,
-	0x01a9,
-	0x01ac,
-	0x01b5,
-	0x01bc,
-	0x01c5,
-	0x01c8,
-	0x0241,
-	0x0376,
-	0x0386,
-	0x038c,
-	0x03cf,
-	0x03f7,
-	0x10c7,
-	0x10cd,
-	0x2132,
-	0x2183,
-	0x2c60,
-	0x2c72,
-	0x2c75,
-	0x2cf2,
-};
-
-int
-istitlerune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __istitler, nelem(__istitler)/2, 2);
-	if(p && c >= p[0] && c <= p[1])
-		return 1;
-	p = rbsearch(c, __istitlep, nelem(__istitlep)/2, 2);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return 1;
-	p = rbsearch(c, __istitles, nelem(__istitles), 1);
-	if(p && c == p[0])
-		return 1;
-	return 0;
-}
-
-static Rune __toupperr[] = {
-	0x0061, 0x007a, 1048544,
-	0x00e0, 0x00f6, 1048544,
-	0x00f8, 0x00fe, 1048544,
-	0x023f, 0x0240, 1059391,
-	0x0256, 0x0257, 1048371,
-	0x028a, 0x028b, 1048359,
-	0x037b, 0x037d, 1048706,
-	0x03ad, 0x03af, 1048539,
-	0x03b1, 0x03c1, 1048544,
-	0x03c3, 0x03cb, 1048544,
-	0x03cd, 0x03ce, 1048513,
-	0x0430, 0x044f, 1048544,
-	0x0450, 0x045f, 1048496,
-	0x0561, 0x0586, 1048528,
-	0x1f00, 0x1f07, 1048584,
-	0x1f10, 0x1f15, 1048584,
-	0x1f20, 0x1f27, 1048584,
-	0x1f30, 0x1f37, 1048584,
-	0x1f40, 0x1f45, 1048584,
-	0x1f60, 0x1f67, 1048584,
-	0x1f70, 0x1f71, 1048650,
-	0x1f72, 0x1f75, 1048662,
-	0x1f76, 0x1f77, 1048676,
-	0x1f78, 0x1f79, 1048704,
-	0x1f7a, 0x1f7b, 1048688,
-	0x1f7c, 0x1f7d, 1048702,
-	0x1f80, 0x1f87, 1048584,
-	0x1f90, 0x1f97, 1048584,
-	0x1fa0, 0x1fa7, 1048584,
-	0x1fb0, 0x1fb1, 1048584,
-	0x1fd0, 0x1fd1, 1048584,
-	0x1fe0, 0x1fe1, 1048584,
-	0x2170, 0x217f, 1048560,
-	0x24d0, 0x24e9, 1048550,
-	0x2c30, 0x2c5e, 1048528,
-	0x2d00, 0x2d25, 1041312,
-	0xff41, 0xff5a, 1048544,
-	0x10428, 0x1044f, 1048536,
-};
-
-static Rune __toupperp[] = {
-	0x0101, 0x012f, 1048575,
-	0x0133, 0x0137, 1048575,
-	0x013a, 0x0148, 1048575,
-	0x014b, 0x0177, 1048575,
-	0x017a, 0x017e, 1048575,
-	0x0183, 0x0185, 1048575,
-	0x01a1, 0x01a5, 1048575,
-	0x01b4, 0x01b6, 1048575,
-	0x01ce, 0x01dc, 1048575,
-	0x01df, 0x01ef, 1048575,
-	0x01f9, 0x021f, 1048575,
-	0x0223, 0x0233, 1048575,
-	0x0247, 0x024f, 1048575,
-	0x0371, 0x0373, 1048575,
-	0x03d9, 0x03ef, 1048575,
-	0x0461, 0x0481, 1048575,
-	0x048b, 0x04bf, 1048575,
-	0x04c2, 0x04ce, 1048575,
-	0x04d1, 0x0527, 1048575,
-	0x1e01, 0x1e95, 1048575,
-	0x1ea1, 0x1eff, 1048575,
-	0x1f51, 0x1f57, 1048584,
-	0x2c68, 0x2c6c, 1048575,
-	0x2c81, 0x2ce3, 1048575,
-	0x2cec, 0x2cee, 1048575,
-	0xa641, 0xa66d, 1048575,
-	0xa681, 0xa697, 1048575,
-	0xa723, 0xa72f, 1048575,
-	0xa733, 0xa76f, 1048575,
-	0xa77a, 0xa77c, 1048575,
-	0xa77f, 0xa787, 1048575,
-	0xa791, 0xa793, 1048575,
-	0xa7a1, 0xa7a9, 1048575,
-};
-
-static Rune __touppers[] = {
-	0x00b5, 1049319,
-	0x00ff, 1048697,
-	0x0131, 1048344,
-	0x017f, 1048276,
-	0x0180, 1048771,
-	0x0188, 1048575,
-	0x018c, 1048575,
-	0x0192, 1048575,
-	0x0195, 1048673,
-	0x0199, 1048575,
-	0x019a, 1048739,
-	0x019e, 1048706,
-	0x01a8, 1048575,
-	0x01ad, 1048575,
-	0x01b0, 1048575,
-	0x01b9, 1048575,
-	0x01bd, 1048575,
-	0x01bf, 1048632,
-	0x01c5, 1048575,
-	0x01c6, 1048574,
-	0x01c8, 1048575,
-	0x01c9, 1048574,
-	0x01cb, 1048575,
-	0x01cc, 1048574,
-	0x01dd, 1048497,
-	0x01f2, 1048575,
-	0x01f3, 1048574,
-	0x01f5, 1048575,
-	0x023c, 1048575,
-	0x0242, 1048575,
-	0x0250, 1059359,
-	0x0251, 1059356,
-	0x0252, 1059358,
-	0x0253, 1048366,
-	0x0254, 1048370,
-	0x0259, 1048374,
-	0x025b, 1048373,
-	0x0260, 1048371,
-	0x0263, 1048369,
-	0x0265, 1090856,
-	0x0266, 1090884,
-	0x0268, 1048367,
-	0x0269, 1048365,
-	0x026b, 1059319,
-	0x026f, 1048365,
-	0x0271, 1059325,
-	0x0272, 1048363,
-	0x0275, 1048362,
-	0x027d, 1059303,
-	0x0280, 1048358,
-	0x0283, 1048358,
-	0x0288, 1048358,
-	0x0289, 1048507,
-	0x028c, 1048505,
-	0x0292, 1048357,
-	0x0345, 1048660,
-	0x0377, 1048575,
-	0x03ac, 1048538,
-	0x03c2, 1048545,
-	0x03cc, 1048512,
-	0x03d0, 1048514,
-	0x03d1, 1048519,
-	0x03d5, 1048529,
-	0x03d6, 1048522,
-	0x03d7, 1048568,
-	0x03f0, 1048490,
-	0x03f1, 1048496,
-	0x03f2, 1048583,
-	0x03f5, 1048480,
-	0x03f8, 1048575,
-	0x03fb, 1048575,
-	0x04cf, 1048561,
-	0x1d79, 1083908,
-	0x1d7d, 1052390,
-	0x1e9b, 1048517,
-	0x1fb3, 1048585,
-	0x1fbe, 1041371,
-	0x1fc3, 1048585,
-	0x1fe5, 1048583,
-	0x1ff3, 1048585,
-	0x214e, 1048548,
-	0x2184, 1048575,
-	0x2c61, 1048575,
-	0x2c65, 1037781,
-	0x2c66, 1037784,
-	0x2c73, 1048575,
-	0x2c76, 1048575,
-	0x2cf3, 1048575,
-	0x2d27, 1041312,
-	0x2d2d, 1041312,
-	0xa78c, 1048575,
-};
-
-Rune
-toupperrune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __toupperr, nelem(__toupperr)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __toupperp, nelem(__toupperp)/3, 3);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __touppers, nelem(__touppers)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 1048576;
-	return c;
-}
-
-static Rune __tolowerr[] = {
-	0x0041, 0x005a, 1048608,
-	0x00c0, 0x00d6, 1048608,
-	0x00d8, 0x00de, 1048608,
-	0x0189, 0x018a, 1048781,
-	0x01b1, 0x01b2, 1048793,
-	0x0388, 0x038a, 1048613,
-	0x038e, 0x038f, 1048639,
-	0x0391, 0x03a1, 1048608,
-	0x03a3, 0x03ab, 1048608,
-	0x03fd, 0x03ff, 1048446,
-	0x0400, 0x040f, 1048656,
-	0x0410, 0x042f, 1048608,
-	0x0531, 0x0556, 1048624,
-	0x10a0, 0x10c5, 1055840,
-	0x1f08, 0x1f0f, 1048568,
-	0x1f18, 0x1f1d, 1048568,
-	0x1f28, 0x1f2f, 1048568,
-	0x1f38, 0x1f3f, 1048568,
-	0x1f48, 0x1f4d, 1048568,
-	0x1f68, 0x1f6f, 1048568,
-	0x1f88, 0x1f8f, 1048568,
-	0x1f98, 0x1f9f, 1048568,
-	0x1fa8, 0x1faf, 1048568,
-	0x1fb8, 0x1fb9, 1048568,
-	0x1fba, 0x1fbb, 1048502,
-	0x1fc8, 0x1fcb, 1048490,
-	0x1fd8, 0x1fd9, 1048568,
-	0x1fda, 0x1fdb, 1048476,
-	0x1fe8, 0x1fe9, 1048568,
-	0x1fea, 0x1feb, 1048464,
-	0x1ff8, 0x1ff9, 1048448,
-	0x1ffa, 0x1ffb, 1048450,
-	0x2160, 0x216f, 1048592,
-	0x24b6, 0x24cf, 1048602,
-	0x2c00, 0x2c2e, 1048624,
-	0x2c7e, 0x2c7f, 1037761,
-	0xff21, 0xff3a, 1048608,
-	0x10400, 0x10427, 1048616,
-};
-
-static Rune __tolowerp[] = {
-	0x0100, 0x012e, 1048577,
-	0x0132, 0x0136, 1048577,
-	0x0139, 0x0147, 1048577,
-	0x014a, 0x0176, 1048577,
-	0x017b, 0x017d, 1048577,
-	0x01a2, 0x01a4, 1048577,
-	0x01b3, 0x01b5, 1048577,
-	0x01cd, 0x01db, 1048577,
-	0x01de, 0x01ee, 1048577,
-	0x01f8, 0x021e, 1048577,
-	0x0222, 0x0232, 1048577,
-	0x0248, 0x024e, 1048577,
-	0x0370, 0x0372, 1048577,
-	0x03d8, 0x03ee, 1048577,
-	0x0460, 0x0480, 1048577,
-	0x048a, 0x04be, 1048577,
-	0x04c3, 0x04cd, 1048577,
-	0x04d0, 0x0526, 1048577,
-	0x1e00, 0x1e94, 1048577,
-	0x1ea0, 0x1efe, 1048577,
-	0x1f59, 0x1f5f, 1048568,
-	0x2c67, 0x2c6b, 1048577,
-	0x2c80, 0x2ce2, 1048577,
-	0x2ceb, 0x2ced, 1048577,
-	0xa640, 0xa66c, 1048577,
-	0xa680, 0xa696, 1048577,
-	0xa722, 0xa72e, 1048577,
-	0xa732, 0xa76e, 1048577,
-	0xa779, 0xa77b, 1048577,
-	0xa780, 0xa786, 1048577,
-	0xa790, 0xa792, 1048577,
-	0xa7a0, 0xa7a8, 1048577,
-};
-
-static Rune __tolowers[] = {
-	0x0130, 1048377,
-	0x0178, 1048455,
-	0x0179, 1048577,
-	0x0181, 1048786,
-	0x0182, 1048577,
-	0x0184, 1048577,
-	0x0186, 1048782,
-	0x0187, 1048577,
-	0x018b, 1048577,
-	0x018e, 1048655,
-	0x018f, 1048778,
-	0x0190, 1048779,
-	0x0191, 1048577,
-	0x0193, 1048781,
-	0x0194, 1048783,
-	0x0196, 1048787,
-	0x0197, 1048785,
-	0x0198, 1048577,
-	0x019c, 1048787,
-	0x019d, 1048789,
-	0x019f, 1048790,
-	0x01a0, 1048577,
-	0x01a6, 1048794,
-	0x01a7, 1048577,
-	0x01a9, 1048794,
-	0x01ac, 1048577,
-	0x01ae, 1048794,
-	0x01af, 1048577,
-	0x01b7, 1048795,
-	0x01b8, 1048577,
-	0x01bc, 1048577,
-	0x01c4, 1048578,
-	0x01c5, 1048577,
-	0x01c7, 1048578,
-	0x01c8, 1048577,
-	0x01ca, 1048578,
-	0x01cb, 1048577,
-	0x01f1, 1048578,
-	0x01f2, 1048577,
-	0x01f4, 1048577,
-	0x01f6, 1048479,
-	0x01f7, 1048520,
-	0x0220, 1048446,
-	0x023a, 1059371,
-	0x023b, 1048577,
-	0x023d, 1048413,
-	0x023e, 1059368,
-	0x0241, 1048577,
-	0x0243, 1048381,
-	0x0244, 1048645,
-	0x0245, 1048647,
-	0x0246, 1048577,
-	0x0376, 1048577,
-	0x0386, 1048614,
-	0x038c, 1048640,
-	0x03cf, 1048584,
-	0x03f4, 1048516,
-	0x03f7, 1048577,
-	0x03f9, 1048569,
-	0x03fa, 1048577,
-	0x04c0, 1048591,
-	0x04c1, 1048577,
-	0x10c7, 1055840,
-	0x10cd, 1055840,
-	0x1e9e, 1040961,
-	0x1fbc, 1048567,
-	0x1fcc, 1048567,
-	0x1fec, 1048569,
-	0x1ffc, 1048567,
-	0x2126, 1041059,
-	0x212a, 1040193,
-	0x212b, 1040314,
-	0x2132, 1048604,
-	0x2183, 1048577,
-	0x2c60, 1048577,
-	0x2c62, 1037833,
-	0x2c63, 1044762,
-	0x2c64, 1037849,
-	0x2c6d, 1037796,
-	0x2c6e, 1037827,
-	0x2c6f, 1037793,
-	0x2c70, 1037794,
-	0x2c72, 1048577,
-	0x2c75, 1048577,
-	0x2cf2, 1048577,
-	0xa77d, 1013244,
-	0xa77e, 1048577,
-	0xa78b, 1048577,
-	0xa78d, 1006296,
-	0xa7aa, 1006268,
-};
-
-Rune
-tolowerrune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __tolowerr, nelem(__tolowerr)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __tolowerp, nelem(__tolowerp)/3, 3);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __tolowers, nelem(__tolowers)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 1048576;
-	return c;
-}
-
-static Rune __totitler[] = {
-	0x0061, 0x007a, 1048544,
-	0x00e0, 0x00f6, 1048544,
-	0x00f8, 0x00fe, 1048544,
-	0x023f, 0x0240, 1059391,
-	0x0256, 0x0257, 1048371,
-	0x028a, 0x028b, 1048359,
-	0x037b, 0x037d, 1048706,
-	0x03ad, 0x03af, 1048539,
-	0x03b1, 0x03c1, 1048544,
-	0x03c3, 0x03cb, 1048544,
-	0x03cd, 0x03ce, 1048513,
-	0x0430, 0x044f, 1048544,
-	0x0450, 0x045f, 1048496,
-	0x0561, 0x0586, 1048528,
-	0x1f00, 0x1f07, 1048584,
-	0x1f10, 0x1f15, 1048584,
-	0x1f20, 0x1f27, 1048584,
-	0x1f30, 0x1f37, 1048584,
-	0x1f40, 0x1f45, 1048584,
-	0x1f60, 0x1f67, 1048584,
-	0x1f70, 0x1f71, 1048650,
-	0x1f72, 0x1f75, 1048662,
-	0x1f76, 0x1f77, 1048676,
-	0x1f78, 0x1f79, 1048704,
-	0x1f7a, 0x1f7b, 1048688,
-	0x1f7c, 0x1f7d, 1048702,
-	0x1f80, 0x1f87, 1048584,
-	0x1f90, 0x1f97, 1048584,
-	0x1fa0, 0x1fa7, 1048584,
-	0x1fb0, 0x1fb1, 1048584,
-	0x1fd0, 0x1fd1, 1048584,
-	0x1fe0, 0x1fe1, 1048584,
-	0x2170, 0x217f, 1048560,
-	0x24d0, 0x24e9, 1048550,
-	0x2c30, 0x2c5e, 1048528,
-	0x2d00, 0x2d25, 1041312,
-	0xff41, 0xff5a, 1048544,
-	0x10428, 0x1044f, 1048536,
-};
-
-static Rune __totitlep[] = {
-	0x0101, 0x012f, 1048575,
-	0x0133, 0x0137, 1048575,
-	0x013a, 0x0148, 1048575,
-	0x014b, 0x0177, 1048575,
-	0x017a, 0x017e, 1048575,
-	0x0183, 0x0185, 1048575,
-	0x01a1, 0x01a5, 1048575,
-	0x01b4, 0x01b6, 1048575,
-	0x01cc, 0x01dc, 1048575,
-	0x01df, 0x01ef, 1048575,
-	0x01f3, 0x01f5, 1048575,
-	0x01f9, 0x021f, 1048575,
-	0x0223, 0x0233, 1048575,
-	0x0247, 0x024f, 1048575,
-	0x0371, 0x0373, 1048575,
-	0x03d9, 0x03ef, 1048575,
-	0x0461, 0x0481, 1048575,
-	0x048b, 0x04bf, 1048575,
-	0x04c2, 0x04ce, 1048575,
-	0x04d1, 0x0527, 1048575,
-	0x1e01, 0x1e95, 1048575,
-	0x1ea1, 0x1eff, 1048575,
-	0x1f51, 0x1f57, 1048584,
-	0x2c68, 0x2c6c, 1048575,
-	0x2c81, 0x2ce3, 1048575,
-	0x2cec, 0x2cee, 1048575,
-	0xa641, 0xa66d, 1048575,
-	0xa681, 0xa697, 1048575,
-	0xa723, 0xa72f, 1048575,
-	0xa733, 0xa76f, 1048575,
-	0xa77a, 0xa77c, 1048575,
-	0xa77f, 0xa787, 1048575,
-	0xa791, 0xa793, 1048575,
-	0xa7a1, 0xa7a9, 1048575,
-};
-
-static Rune __totitles[] = {
-	0x00b5, 1049319,
-	0x00ff, 1048697,
-	0x0131, 1048344,
-	0x017f, 1048276,
-	0x0180, 1048771,
-	0x0188, 1048575,
-	0x018c, 1048575,
-	0x0192, 1048575,
-	0x0195, 1048673,
-	0x0199, 1048575,
-	0x019a, 1048739,
-	0x019e, 1048706,
-	0x01a8, 1048575,
-	0x01ad, 1048575,
-	0x01b0, 1048575,
-	0x01b9, 1048575,
-	0x01bd, 1048575,
-	0x01bf, 1048632,
-	0x01c4, 1048577,
-	0x01c6, 1048575,
-	0x01c7, 1048577,
-	0x01c9, 1048575,
-	0x01ca, 1048577,
-	0x01dd, 1048497,
-	0x01f1, 1048577,
-	0x023c, 1048575,
-	0x0242, 1048575,
-	0x0250, 1059359,
-	0x0251, 1059356,
-	0x0252, 1059358,
-	0x0253, 1048366,
-	0x0254, 1048370,
-	0x0259, 1048374,
-	0x025b, 1048373,
-	0x0260, 1048371,
-	0x0263, 1048369,
-	0x0265, 1090856,
-	0x0266, 1090884,
-	0x0268, 1048367,
-	0x0269, 1048365,
-	0x026b, 1059319,
-	0x026f, 1048365,
-	0x0271, 1059325,
-	0x0272, 1048363,
-	0x0275, 1048362,
-	0x027d, 1059303,
-	0x0280, 1048358,
-	0x0283, 1048358,
-	0x0288, 1048358,
-	0x0289, 1048507,
-	0x028c, 1048505,
-	0x0292, 1048357,
-	0x0345, 1048660,
-	0x0377, 1048575,
-	0x03ac, 1048538,
-	0x03c2, 1048545,
-	0x03cc, 1048512,
-	0x03d0, 1048514,
-	0x03d1, 1048519,
-	0x03d5, 1048529,
-	0x03d6, 1048522,
-	0x03d7, 1048568,
-	0x03f0, 1048490,
-	0x03f1, 1048496,
-	0x03f2, 1048583,
-	0x03f5, 1048480,
-	0x03f8, 1048575,
-	0x03fb, 1048575,
-	0x04cf, 1048561,
-	0x1d79, 1083908,
-	0x1d7d, 1052390,
-	0x1e9b, 1048517,
-	0x1fb3, 1048585,
-	0x1fbe, 1041371,
-	0x1fc3, 1048585,
-	0x1fe5, 1048583,
-	0x1ff3, 1048585,
-	0x214e, 1048548,
-	0x2184, 1048575,
-	0x2c61, 1048575,
-	0x2c65, 1037781,
-	0x2c66, 1037784,
-	0x2c73, 1048575,
-	0x2c76, 1048575,
-	0x2cf3, 1048575,
-	0x2d27, 1041312,
-	0x2d2d, 1041312,
-	0xa78c, 1048575,
-};
-
-Rune
-totitlerune(Rune c)
-{
-	Rune *p;
-
-	p = rbsearch(c, __totitler, nelem(__totitler)/3, 3);
-	if(p && c >= p[0] && c <= p[1])
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __totitlep, nelem(__totitlep)/3, 3);
-	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
-		return c + p[2] - 1048576;
-	p = rbsearch(c, __totitles, nelem(__totitles)/2, 2);
-	if(p && c == p[0])
-		return c + p[1] - 1048576;
-	return c;
-}
-
diff --git a/src/lib9/utf/utf.h b/src/lib9/utf/utf.h
deleted file mode 100644
index 72d01ed636a339e05d8a12954062cd2c7e752d3d..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utf.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 1998-2002 by Lucent Technologies.
- *              Portions Copyright (c) 2009 The Go Authors.  All rights reserved.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#ifndef _UTFH_
-#define _UTFH_ 1
-
-typedef unsigned int Rune;	/* Code-point values in Unicode 4.0 are 21 bits wide.*/
-
-enum
-{
-  UTFmax	= 4,		/* maximum bytes per rune */
-  Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
-  Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
-  Runeerror	= 0xFFFD,	/* decoding error in UTF */
-  Runemax	= 0x10FFFF,	/* maximum rune value */
-};
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/*
- * rune routines
- */
-
-/*
- * These routines were written by Rob Pike and Ken Thompson
- * and first appeared in Plan 9.
- * SEE ALSO
- * utf (7)
- * tcs (1)
-*/
-
-// runetochar copies (encodes) one rune, pointed to by r, to at most
-// UTFmax bytes starting at s and returns the number of bytes generated.
-
-int runetochar(char* s, const Rune* r);
-
-
-// chartorune copies (decodes) at most UTFmax bytes starting at s to
-// one rune, pointed to by r, and returns the number of bytes consumed.
-// If the input is not exactly in UTF format, chartorune will set *r
-// to Runeerror and return 1.
-//
-// Note: There is no special case for a "null-terminated" string. A
-// string whose first byte has the value 0 is the UTF8 encoding of the
-// Unicode value 0 (i.e., ASCII NULL). A byte value of 0 is illegal
-// anywhere else in a UTF sequence.
-
-int chartorune(Rune* r, const char* s);
-
-
-// charntorune is like chartorune, except that it will access at most
-// n bytes of s.  If the UTF sequence is incomplete within n bytes,
-// charntorune will set *r to Runeerror and return 0. If it is complete
-// but not in UTF format, it will set *r to Runeerror and return 1.
-//
-// Added 2004-09-24 by Wei-Hwa Huang
-
-int charntorune(Rune* r, const char* s, int n);
-
-// isvalidcharntorune(str, n, r, consumed)
-// is a convenience function that calls "*consumed = charntorune(r, str, n)"
-// and returns an int (logically boolean) indicating whether the first
-// n bytes of str was a valid and complete UTF sequence.
-
-int isvalidcharntorune(const char* str, int n, Rune* r, int* consumed);
-
-// runelen returns the number of bytes required to convert r into UTF.
-
-int runelen(Rune r);
-
-
-// runenlen returns the number of bytes required to convert the n
-// runes pointed to by r into UTF.
-
-int runenlen(const Rune* r, int n);
-
-
-// fullrune returns 1 if the string s of length n is long enough to be
-// decoded by chartorune, and 0 otherwise. This does not guarantee
-// that the string contains a legal UTF encoding. This routine is used
-// by programs that obtain input one byte at a time and need to know
-// when a full rune has arrived.
-
-int fullrune(const char* s, int n);
-
-// The following routines are analogous to the corresponding string
-// routines with "utf" substituted for "str", and "rune" substituted
-// for "chr".
-
-// utflen returns the number of runes that are represented by the UTF
-// string s. (cf. strlen)
-
-int utflen(const char* s);
-
-
-// utfnlen returns the number of complete runes that are represented
-// by the first n bytes of the UTF string s. If the last few bytes of
-// the string contain an incompletely coded rune, utfnlen will not
-// count them; in this way, it differs from utflen, which includes
-// every byte of the string. (cf. strnlen)
-
-int utfnlen(const char* s, long n);
-
-
-// utfrune returns a pointer to the first occurrence of rune r in the
-// UTF string s, or 0 if r does not occur in the string.  The NULL
-// byte terminating a string is considered to be part of the string s.
-// (cf. strchr)
-
-/*const*/ char* utfrune(const char* s, Rune r);
-
-
-// utfrrune returns a pointer to the last occurrence of rune r in the
-// UTF string s, or 0 if r does not occur in the string.  The NULL
-// byte terminating a string is considered to be part of the string s.
-// (cf. strrchr)
-
-/*const*/ char* utfrrune(const char* s, Rune r);
-
-
-// utfutf returns a pointer to the first occurrence of the UTF string
-// s2 as a UTF substring of s1, or 0 if there is none. If s2 is the
-// null string, utfutf returns s1. (cf. strstr)
-
-const char* utfutf(const char* s1, const char* s2);
-
-
-// utfecpy copies UTF sequences until a null sequence has been copied,
-// but writes no sequences beyond es1.  If any sequences are copied,
-// s1 is terminated by a null sequence, and a pointer to that sequence
-// is returned.  Otherwise, the original s1 is returned. (cf. strecpy)
-
-char* utfecpy(char *s1, char *es1, const char *s2);
-
-
-
-// These functions are rune-string analogues of the corresponding
-// functions in strcat (3).
-//
-// These routines first appeared in Plan 9.
-// SEE ALSO
-// memmove (3)
-// rune (3)
-// strcat (2)
-//
-// BUGS: The outcome of overlapping moves varies among implementations.
-
-Rune* runestrcat(Rune* s1, const Rune* s2);
-Rune* runestrncat(Rune* s1, const Rune* s2, long n);
-
-const Rune* runestrchr(const Rune* s, Rune c);
-
-int runestrcmp(const Rune* s1, const Rune* s2);
-int runestrncmp(const Rune* s1, const Rune* s2, long n);
-
-Rune* runestrcpy(Rune* s1, const Rune* s2);
-Rune* runestrncpy(Rune* s1, const Rune* s2, long n);
-Rune* runestrecpy(Rune* s1, Rune* es1, const Rune* s2);
-
-Rune* runestrdup(const Rune* s);
-
-const Rune* runestrrchr(const Rune* s, Rune c);
-long runestrlen(const Rune* s);
-const Rune* runestrstr(const Rune* s1, const Rune* s2);
-
-
-
-// The following routines test types and modify cases for Unicode
-// characters.  Unicode defines some characters as letters and
-// specifies three cases: upper, lower, and title.  Mappings among the
-// cases are also defined, although they are not exhaustive: some
-// upper case letters have no lower case mapping, and so on.  Unicode
-// also defines several character properties, a subset of which are
-// checked by these routines.  These routines are based on Unicode
-// version 3.0.0.
-//
-// NOTE: The routines are implemented in C, so the boolean functions
-// (e.g., isupperrune) return 0 for false and 1 for true.
-//
-//
-// toupperrune, tolowerrune, and totitlerune are the Unicode case
-// mappings. These routines return the character unchanged if it has
-// no defined mapping.
-
-Rune toupperrune(Rune r);
-Rune tolowerrune(Rune r);
-Rune totitlerune(Rune r);
-
-
-// isupperrune tests for upper case characters, including Unicode
-// upper case letters and targets of the toupper mapping. islowerrune
-// and istitlerune are defined analogously.
-
-int isupperrune(Rune r);
-int islowerrune(Rune r);
-int istitlerune(Rune r);
-
-
-// isalpharune tests for Unicode letters; this includes ideographs in
-// addition to alphabetic characters.
-
-int isalpharune(Rune r);
-
-
-// isdigitrune tests for digits. Non-digit numbers, such as Roman
-// numerals, are not included.
-
-int isdigitrune(Rune r);
-
-
-// isspacerune tests for whitespace characters, including "C" locale
-// whitespace, Unicode defined whitespace, and the "zero-width
-// non-break space" character.
-
-int isspacerune(Rune r);
-
-
-// (The comments in this file were copied from the manpage files rune.3,
-// isalpharune.3, and runestrcat.3. Some formatting changes were also made
-// to conform to Google style. /JRM 11/11/05)
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif
diff --git a/src/lib9/utf/utfdef.h b/src/lib9/utf/utfdef.h
deleted file mode 100644
index 4bbdfc643c859580707de60d0e93579a15bc25cb..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfdef.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 1998-2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-
-#define uchar _utfuchar
-#define ushort _utfushort
-#define uint _utfuint
-#define ulong _utfulong
-#define vlong _utfvlong
-#define uvlong _utfuvlong
-
-typedef unsigned char		uchar;
-typedef unsigned short		ushort;
-typedef unsigned int		uint;
-typedef unsigned long		ulong;
-
-#define nelem(x) (sizeof(x)/sizeof((x)[0]))
diff --git a/src/lib9/utf/utfecpy.c b/src/lib9/utf/utfecpy.c
deleted file mode 100644
index 85406646080944e15188a2f025f35903539c1266..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfecpy.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-char*
-utfecpy(char *to, char *e, const char *from)
-{
-	char *end;
-
-	if(to >= e)
-		return to;
-	end = memccpy(to, from, '\0', (size_t)(e - to));
-	if(end == nil){
-		end = e-1;
-		while(end>to && (*--end&0xC0)==0x80)
-			;
-		*end = '\0';
-	}else{
-		end--;
-	}
-	return end;
-}
diff --git a/src/lib9/utf/utflen.c b/src/lib9/utf/utflen.c
deleted file mode 100644
index 9b961856a5832f5c2f307c21fc52a8c13058d38c..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utflen.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-int
-utflen(const char *s)
-{
-	int c;
-	int n;
-	Rune rune;
-
-	n = 0;
-	for(;;) {
-		c = *(uchar*)s;
-		if(c < Runeself) {
-			if(c == 0)
-				return n;
-			s++;
-		} else
-			s += chartorune(&rune, s);
-		n++;
-	}
-}
diff --git a/src/lib9/utf/utfnlen.c b/src/lib9/utf/utfnlen.c
deleted file mode 100644
index d6ef5fa06f4763ad625f8c19a541dac0d8cf4418..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfnlen.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include "utf.h"
-#include "utfdef.h"
-
-int
-utfnlen(const char *s, long m)
-{
-	int c;
-	int n;
-	Rune rune;
-	const char *es;
-
-	es = s + m;
-	for(n = 0; s < es; n++) {
-		c = *(uchar*)s;
-		if(c < Runeself){
-			if(c == '\0')
-				break;
-			s++;
-			continue;
-		}
-		if(!fullrune(s, (int)(es-s)))
-			break;
-		s += chartorune(&rune, s);
-	}
-	return n;
-}
diff --git a/src/lib9/utf/utfrrune.c b/src/lib9/utf/utfrrune.c
deleted file mode 100644
index b1ea93b423234bfb79a35749102f23b0d5306c5c..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfrrune.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-/* const - removed for go code */
-char*
-utfrrune(const char *s, Rune c)
-{
-	long c1;
-	Rune r;
-	const char *s1;
-
-	if(c < Runesync)		/* not part of utf sequence */
-		return strrchr(s, (char)c);
-
-	s1 = 0;
-	for(;;) {
-		c1 = *(uchar*)s;
-		if(c1 < Runeself) {	/* one byte rune */
-			if(c1 == 0)
-				return (char*)s1;
-			if(c1 == c)
-				s1 = s;
-			s++;
-			continue;
-		}
-		c1 = chartorune(&r, s);
-		if(r == c)
-			s1 = s;
-		s += c1;
-	}
-}
diff --git a/src/lib9/utf/utfrune.c b/src/lib9/utf/utfrune.c
deleted file mode 100644
index 44675c98920495f7586ce83a65e1bee7707f1046..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfrune.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-/* const - removed for go code */
-char*
-utfrune(const char *s, Rune c)
-{
-	long c1;
-	Rune r;
-	int n;
-
-	if(c < Runesync)		/* not part of utf sequence */
-		return strchr(s, (char)c);
-
-	for(;;) {
-		c1 = *(uchar*)s;
-		if(c1 < Runeself) {	/* one byte rune */
-			if(c1 == 0)
-				return 0;
-			if(c1 == c)
-				return (char*)s;
-			s++;
-			continue;
-		}
-		n = chartorune(&r, s);
-		if(r == c)
-			return (char*)s;
-		s += n;
-	}
-}
diff --git a/src/lib9/utf/utfutf.c b/src/lib9/utf/utfutf.c
deleted file mode 100644
index 05335b23e8b2e224c3793c7cc573e52581467301..0000000000000000000000000000000000000000
--- a/src/lib9/utf/utfutf.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * The authors of this software are Rob Pike and Ken Thompson.
- *              Copyright (c) 2002 by Lucent Technologies.
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- */
-#include <u.h>
-#include <libc.h>
-#include "utf.h"
-#include "utfdef.h"
-
-
-/*
- * Return pointer to first occurrence of s2 in s1,
- * 0 if none
- */
-const
-char*
-utfutf(const char *s1, const char *s2)
-{
-	const char *p;
-	long f, n1;
-	size_t n2;
-	Rune r;
-
-	n1 = chartorune(&r, s2);
-	f = r;
-	if(f <= Runesync)		/* represents self */
-		return strstr(s1, s2);
-
-	n2 = strlen(s2);
-	for(p=s1; (p=utfrune(p, r)) != 0; p+=n1)
-		if(strncmp(p, s2, n2) == 0)
-			return p;
-	return 0;
-}
diff --git a/src/lib9/win.h b/src/lib9/win.h
deleted file mode 100644
index d9df319afbc09c93760215341c6d679e85577501..0000000000000000000000000000000000000000
--- a/src/lib9/win.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-typedef unsigned short WinRune;
-
-WinRune* torune(char*);
-char *toutf(WinRune*);
diff --git a/src/lib9/windows.c b/src/lib9/windows.c
deleted file mode 100644
index 082f33997a7d09b617c6826cc749e69e4dec4c8c..0000000000000000000000000000000000000000
--- a/src/lib9/windows.c
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-
-int
-fork(void)
-{
-	return -1;
-}
-
-int
-p9rfork(int flags)
-{
-	USED(flags);
-	return -1;
-}
-
-Waitmsg*
-p9wait(void)
-{
-	return 0;
-}
-
-int
-p9waitpid(void)
-{
-	return -1;
-}
diff --git a/src/libbio/Makefile b/src/libbio/Makefile
deleted file mode 100644
index 62aba5dca70f55d17e405cabf30766131503571a..0000000000000000000000000000000000000000
--- a/src/libbio/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2012 The Go Authors.  All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
diff --git a/src/libbio/bbuffered.c b/src/libbio/bbuffered.c
deleted file mode 100644
index 2ddb29b770d82a191798693376967fa1c68cdf8b..0000000000000000000000000000000000000000
--- a/src/libbio/bbuffered.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bbuffered.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bbuffered(Biobuf *bp)
-{
-	switch(bp->state) {
-	case Bracteof:
-	case Bractive:
-		return -bp->icount;
-
-	case Bwactive:
-		return bp->bsize + bp->ocount;
-
-	case Binactive:
-		return 0;
-	}
-	fprint(2, "Bbuffered: unknown state %d\n", bp->state);
-	return 0;
-}
diff --git a/src/libbio/bfildes.c b/src/libbio/bfildes.c
deleted file mode 100644
index aef1f70bb84c7cbbb1afd68292d27692c89d1d4c..0000000000000000000000000000000000000000
--- a/src/libbio/bfildes.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bfildes.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bfildes(Biobuf *bp)
-{
-
-	return bp->fid;
-}
diff --git a/src/libbio/bflush.c b/src/libbio/bflush.c
deleted file mode 100644
index ea7ae2c62b15e28223e36ff783789f8c4e0b6773..0000000000000000000000000000000000000000
--- a/src/libbio/bflush.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bflush.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bflush(Biobuf *bp)
-{
-	int n, c;
-
-	switch(bp->state) {
-	case Bwactive:
-		n = bp->bsize+bp->ocount;
-		if(n == 0)
-			return 0;
-		c = (int)write(bp->fid, bp->bbuf, (size_t)n);
-		if(n == c) {
-			bp->offset += n;
-			bp->ocount = -bp->bsize;
-			return 0;
-		}
-		bp->state = Binactive;
-		bp->ocount = 0;
-		break;
-
-	case Bracteof:
-		bp->state = Bractive;
-
-	case Bractive:
-		bp->icount = 0;
-		bp->gbuf = bp->ebuf;
-		return 0;
-	}
-	return Beof;
-}
diff --git a/src/libbio/bgetc.c b/src/libbio/bgetc.c
deleted file mode 100644
index ceb5cb13f8c75eabf111f325c7fe0e1e25c91945..0000000000000000000000000000000000000000
--- a/src/libbio/bgetc.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetc.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bgetc(Biobuf *bp)
-{
-	int i;
-
-loop:
-	i = bp->icount;
-	if(i != 0) {
-		bp->icount = i+1;
-		return bp->ebuf[i];
-	}
-	if(bp->state != Bractive) {
-		if(bp->state == Bracteof)
-			bp->state = Bractive;
-		return Beof;
-	}
-	/*
-	 * get next buffer, try to keep Bungetsize
-	 * characters pre-catenated from the previous
-	 * buffer to allow that many ungets.
-	 */
-	memmove(bp->bbuf-Bungetsize, bp->ebuf-Bungetsize, Bungetsize);
-	i = (int)read(bp->fid, bp->bbuf, (size_t)bp->bsize);
-	bp->gbuf = bp->bbuf;
-	if(i <= 0) {
-		bp->state = Bracteof;
-		if(i < 0)
-			bp->state = Binactive;
-		return Beof;
-	}
-	if(i < bp->bsize) {
-		memmove(bp->ebuf-i-Bungetsize, bp->bbuf-Bungetsize, (size_t)(i+Bungetsize));
-		bp->gbuf = bp->ebuf-i;
-	}
-	bp->icount = -i;
-	bp->offset += i;
-	goto loop;
-}
-
-int
-Bgetle2(Biobuf *bp)
-{
-	int l, h;
-
-	l = Bgetc(bp);
-	h = Bgetc(bp);
-	return l|(h<<8);
-}
-
-int
-Bgetle4(Biobuf *bp)
-{
-	int l, h;
-
-	l = Bgetle2(bp);
-	h = Bgetle2(bp);
-	return (int)((uint32)l|((uint32)h<<16));
-}
-
-int
-Bungetc(Biobuf *bp)
-{
-
-	if(bp->state == Bracteof)
-		bp->state = Bractive;
-	if(bp->state != Bractive)
-		return Beof;
-	bp->icount--;
-	return 1;
-}
diff --git a/src/libbio/bgetd.c b/src/libbio/bgetd.c
deleted file mode 100644
index 12d2c5b37298a559fd5438becb4fc67ae45d2587..0000000000000000000000000000000000000000
--- a/src/libbio/bgetd.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetd.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include <bio.h>
-
-struct	bgetd
-{
-	Biobuf*	b;
-	int		eof;
-};
-
-static int
-Bgetdf(void *vp)
-{
-	int c;
-	struct bgetd *bg = vp;
-
-	c = BGETC(bg->b);
-	if(c == Beof)
-		bg->eof = 1;
-	return c;
-}
-
-int
-Bgetd(Biobuf *bp, double *dp)
-{
-	double d;
-	struct bgetd b;
-
-	b.b = bp;
-	b.eof = 0;
-	d = fmtcharstod(Bgetdf, &b);
-	if(b.eof)
-		return -1;
-	Bungetc(bp);
-	*dp = d;
-	return 1;
-}
diff --git a/src/libbio/bgetrune.c b/src/libbio/bgetrune.c
deleted file mode 100644
index b5db3910617c45a8d3654e5e82857fb9c08fdc8c..0000000000000000000000000000000000000000
--- a/src/libbio/bgetrune.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bgetrune.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-long
-Bgetrune(Biobuf *bp)
-{
-	int c, i;
-	Rune rune;
-	char str[UTFmax];
-
-	c = BGETC(bp);
-	if(c < Runeself) {		/* one char */
-		bp->runesize = 1;
-		return c;
-	}
-	str[0] = (char)c;
-
-	for(i=1;;) {
-		c = BGETC(bp);
-		if(c < 0)
-			return c;
-		str[i++] = (char)c;
-
-		if(fullrune(str, i)) {
-			bp->runesize = chartorune(&rune, str);
-			while(i > bp->runesize) {
-				Bungetc(bp);
-				i--;
-			}
-			return rune;
-		}
-	}
-}
-
-int
-Bungetrune(Biobuf *bp)
-{
-
-	if(bp->state == Bracteof)
-		bp->state = Bractive;
-	if(bp->state != Bractive)
-		return Beof;
-	bp->icount -= bp->runesize;
-	bp->runesize = 0;
-	return 1;
-}
diff --git a/src/libbio/binit.c b/src/libbio/binit.c
deleted file mode 100644
index a7ade5081fe76e9abab24d00fa1963a84ab2a456..0000000000000000000000000000000000000000
--- a/src/libbio/binit.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/binit.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-enum
-{
-	MAXBUFS	= 20
-};
-
-static	Biobuf*	wbufs[MAXBUFS];
-static	int		atexitflag;
-
-static
-void
-batexit(void)
-{
-	Biobuf *bp;
-	int i;
-
-	for(i=0; i<MAXBUFS; i++) {
-		bp = wbufs[i];
-		if(bp != 0) {
-			wbufs[i] = 0;
-			Bflush(bp);
-		}
-	}
-}
-
-static
-void
-deinstall(Biobuf *bp)
-{
-	int i;
-
-	for(i=0; i<MAXBUFS; i++)
-		if(wbufs[i] == bp)
-			wbufs[i] = 0;
-}
-
-static
-void
-install(Biobuf *bp)
-{
-	int i;
-
-	deinstall(bp);
-	for(i=0; i<MAXBUFS; i++)
-		if(wbufs[i] == 0) {
-			wbufs[i] = bp;
-			break;
-		}
-	if(atexitflag == 0) {
-		atexitflag = 1;
-		atexit(batexit);
-	}
-}
-
-int
-Binits(Biobuf *bp, int f, int mode, unsigned char *p, int size)
-{
-
-	p += Bungetsize;	/* make room for Bungets */
-	size -= Bungetsize;
-
-	switch(mode&~(ORCLOSE|OTRUNC)) {
-	default:
-		fprint(2, "Bopen: unknown mode %d\n", mode);
-		return Beof;
-
-	case OREAD:
-		bp->state = Bractive;
-		bp->ocount = 0;
-		break;
-
-	case OWRITE:
-		install(bp);
-		bp->state = Bwactive;
-		bp->ocount = -size;
-		break;
-	}
-	bp->bbuf = p;
-	bp->ebuf = p+size;
-	bp->bsize = size;
-	bp->icount = 0;
-	bp->gbuf = bp->ebuf;
-	bp->fid = f;
-	bp->flag = 0;
-	bp->rdline = 0;
-	bp->offset = 0;
-	bp->runesize = 0;
-	return 0;
-}
-
-
-int
-Binit(Biobuf *bp, int f, int mode)
-{
-	return Binits(bp, f, mode, bp->b, sizeof(bp->b));
-}
-
-Biobuf*
-Bfdopen(int f, int mode)
-{
-	Biobuf *bp;
-
-	bp = malloc(sizeof(Biobuf));
-	if(bp == 0)
-		return 0;
-	Binits(bp, f, mode, bp->b, sizeof(bp->b));
-	bp->flag = Bmagic;
-	return bp;
-}
-
-Biobuf*
-Bopen(char *name, int mode)
-{
-	Biobuf *bp;
-	int f;
-
-	switch(mode&~(ORCLOSE|OTRUNC)) {
-	default:
-		fprint(2, "Bopen: unknown mode %d\n", mode);
-		return 0;
-
-	case OREAD:
-		f = open(name, OREAD);
-		if(f < 0)
-			return 0;
-		break;
-
-	case OWRITE:
-		f = create(name, OWRITE|OTRUNC, 0666);
-		if(f < 0)
-			return 0;
-	}
-	bp = Bfdopen(f, mode);
-	if(bp == 0)
-		close(f);
-	return bp;
-}
-
-int
-Bterm(Biobuf *bp)
-{
-
-	deinstall(bp);
-	Bflush(bp);
-	if(bp->flag == Bmagic) {
-		bp->flag = 0;
-		close(bp->fid);
-		free(bp);
-	}
-	return 0;
-}
diff --git a/src/libbio/boffset.c b/src/libbio/boffset.c
deleted file mode 100644
index 15dd609e10e43ca5d522046dfa481752377b1ec9..0000000000000000000000000000000000000000
--- a/src/libbio/boffset.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/boffset.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-vlong
-Boffset(Biobuf *bp)
-{
-	vlong n;
-
-	switch(bp->state) {
-	default:
-		fprint(2, "Boffset: unknown state %d\n", bp->state);
-		n = Beof;
-		break;
-
-	case Bracteof:
-	case Bractive:
-		n = bp->offset + bp->icount;
-		break;
-
-	case Bwactive:
-		n = bp->offset + (bp->bsize + bp->ocount);
-		break;
-	}
-	return n;
-}
diff --git a/src/libbio/bprint.c b/src/libbio/bprint.c
deleted file mode 100644
index 301dc0c7f34c87a192db5cf9be2a9a8bdc23ec41..0000000000000000000000000000000000000000
--- a/src/libbio/bprint.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bprint.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-	Revisions Copyright © 2010 Google Inc.  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bprint(Biobuf *bp, char *fmt, ...)
-{
-	int n;
-	va_list arg;
-
-	va_start(arg, fmt);
-	n = Bvprint(bp, fmt, arg);
-	va_end(arg);
-	return n;
-}
-
-static int
-bflush(Fmt *f)
-{
-	Biobuf *bp;
-	
-	if(f->stop == nil)
-		return 0;
-
-	bp = f->farg;
-	bp->ocount = (int)((char*)f->to - (char*)f->stop);
-	if(Bflush(bp) < 0) {
-		f->stop = nil;
-		f->to = nil;
-		return 0;
-	}
-	f->to = (char*)f->stop + bp->ocount;
-	
-	return 1;
-}
-
-int
-Bvprint(Biobuf *bp, char *fmt, va_list arg)
-{
-	int n;
-	Fmt f;
-	
-	memset(&f, 0, sizeof f);
-	fmtlocaleinit(&f, nil, nil, nil);
-	f.stop = bp->ebuf;
-	f.to = (char*)f.stop + bp->ocount;
-	f.flush = bflush;
-	f.farg = bp;
-
-	n = fmtvprint(&f, fmt, arg);
-
-	if(f.stop != nil)
-		bp->ocount = (int)((char*)f.to - (char*)f.stop);
-
-	return n;
-}
diff --git a/src/libbio/bputc.c b/src/libbio/bputc.c
deleted file mode 100644
index 07b4789b707254d3bfe1830bef18657e4f9d8084..0000000000000000000000000000000000000000
--- a/src/libbio/bputc.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bputc.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bputc(Biobuf *bp, int c)
-{
-	int i;
-
-	for(;;) {
-		i = bp->ocount;
-		if(i) {
-			bp->ebuf[i++] = (unsigned char)c;
-			bp->ocount = i;
-			return 0;
-		}
-		if(Bflush(bp) == Beof)
-			break;
-	}
-	return Beof;
-}
-
-int
-Bputle2(Biobuf *bp, int c)
-{
-	Bputc(bp, c);
-	return Bputc(bp, c>>8);
-}
-
-int
-Bputle4(Biobuf *bp, int c)
-{
-	Bputle2(bp, c);
-	return Bputle2(bp, c>>16);
-}
diff --git a/src/libbio/bputrune.c b/src/libbio/bputrune.c
deleted file mode 100644
index f2077958bc8a925ae05c4e97e7710998914b7988..0000000000000000000000000000000000000000
--- a/src/libbio/bputrune.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bputrune.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-int
-Bputrune(Biobuf *bp, long c)
-{
-	Rune rune;
-	char str[UTFmax];
-	int n;
-
-	rune = (Rune)c;
-	if(rune < Runeself) {
-		n = BPUTC(bp, (int)rune);
-		USED(n);
-		return 1;
-	}
-	n = runetochar(str, &rune);
-	if(n == 0)
-		return Bbad;
-	if(Bwrite(bp, str, n) != n)
-		return Beof;
-	return n;
-}
diff --git a/src/libbio/brdline.c b/src/libbio/brdline.c
deleted file mode 100644
index 1c3093ecf3a69e0987e303d225a4a1190f2c4d31..0000000000000000000000000000000000000000
--- a/src/libbio/brdline.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/brdline.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-void*
-Brdline(Biobuf *bp, int delim)
-{
-	char *ip, *ep;
-	int i, j;
-
-	i = -bp->icount;
-	if(i == 0) {
-		/*
-		 * eof or other error
-		 */
-		if(bp->state != Bractive) {
-			if(bp->state == Bracteof)
-				bp->state = Bractive;
-			bp->rdline = 0;
-			bp->gbuf = bp->ebuf;
-			return 0;
-		}
-	}
-
-	/*
-	 * first try in remainder of buffer (gbuf doesn't change)
-	 */
-	ip = (char*)bp->ebuf - i;
-	ep = memchr(ip, delim, (size_t)i);
-	if(ep) {
-		j = (int)((ep - ip) + 1);
-		bp->rdline = j;
-		bp->icount += j;
-		return ip;
-	}
-
-	/*
-	 * copy data to beginning of buffer
-	 */
-	if(i < bp->bsize)
-		memmove(bp->bbuf, ip, (size_t)i);
-	bp->gbuf = bp->bbuf;
-
-	/*
-	 * append to buffer looking for the delim
-	 */
-	ip = (char*)bp->bbuf + i;
-	while(i < bp->bsize) {
-		j = (int)read(bp->fid, ip, (size_t)(bp->bsize-i));
-		if(j <= 0) {
-			/*
-			 * end of file with no delim
-			 */
-			memmove(bp->ebuf-i, bp->bbuf, (size_t)i);
-			bp->rdline = i;
-			bp->icount = -i;
-			bp->gbuf = bp->ebuf-i;
-			return 0;
-		}
-		bp->offset += j;
-		i += j;
-		ep = memchr(ip, delim, (size_t)j);
-		if(ep) {
-			/*
-			 * found in new piece
-			 * copy back up and reset everything
-			 */
-			ip = (char*)bp->ebuf - i;
-			if(i < bp->bsize){
-				memmove(ip, bp->bbuf, (size_t)i);
-				bp->gbuf = (unsigned char*)ip;
-			}
-			j = (int)((ep - (char*)bp->bbuf) + 1);
-			bp->rdline = j;
-			bp->icount = j - i;
-			return ip;
-		}
-		ip += j;
-	}
-
-	/*
-	 * full buffer without finding
-	 */
-	bp->rdline = bp->bsize;
-	bp->icount = -bp->bsize;
-	bp->gbuf = bp->bbuf;
-	return 0;
-}
-
-int
-Blinelen(Biobuf *bp)
-{
-
-	return bp->rdline;
-}
diff --git a/src/libbio/brdstr.c b/src/libbio/brdstr.c
deleted file mode 100644
index 6a90cf69b2a7adc76d92062697844a923e0bac5a..0000000000000000000000000000000000000000
--- a/src/libbio/brdstr.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-	Copyright © 2009 The Go Authors.  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-char*
-Brdstr(Biobuf *bp, int delim, int nulldelim)
-{
-	char *p, *q, *nq;
-	int n, linelen;
-
-	q = nil;
-	n = 0;
-	for(;;) {
-		p = Brdline(bp, delim);
-		linelen = Blinelen(bp);
-		if(n == 0 && linelen == 0)
-			return nil;
-		nq = realloc(q, (size_t)(n+linelen+1));
-		if(nq == nil) {
-			free(q);
-			return nil;
-		}
-		q = nq;
-		if(p != nil) {
-			memmove(q+n, p, (size_t)linelen);
-			n += linelen;
-			if(nulldelim)
-				q[n-1] = '\0';
-			break;
-		}
-		if(linelen == 0)
-			break;
-		Bread(bp, q+n, linelen);
-		n += linelen;
-	}
-	q[n] = '\0';
-	return q;
-}
diff --git a/src/libbio/bread.c b/src/libbio/bread.c
deleted file mode 100644
index 343a0bf29bee1e7497b4a6b68cb4ad8ac43830c9..0000000000000000000000000000000000000000
--- a/src/libbio/bread.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bread.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-long
-Bread(Biobuf *bp, void *ap, long count)
-{
-	long c;
-	unsigned char *p;
-	int i, n, ic;
-
-	p = ap;
-	c = count;
-	ic = bp->icount;
-
-	while(c > 0) {
-		n = -ic;
-		if(n > c)
-			n = (int)c;
-		if(n == 0) {
-			if(bp->state != Bractive)
-				break;
-			i = (int)read(bp->fid, bp->bbuf, (size_t)bp->bsize);
-			if(i <= 0) {
-				bp->state = Bracteof;
-				if(i < 0)
-					bp->state = Binactive;
-				break;
-			}
-			bp->gbuf = bp->bbuf;
-			bp->offset += i;
-			if(i < bp->bsize) {
-				memmove(bp->ebuf-i, bp->bbuf, (size_t)i);
-				bp->gbuf = bp->ebuf-i;
-			}
-			ic = -i;
-			continue;
-		}
-		memmove(p, bp->ebuf+ic, (size_t)n);
-		c -= n;
-		ic += n;
-		p += n;
-	}
-	bp->icount = ic;
-	return count-c;
-}
diff --git a/src/libbio/bseek.c b/src/libbio/bseek.c
deleted file mode 100644
index 528958510634fc7c6c82d69ce599c4e4ace39d4a..0000000000000000000000000000000000000000
--- a/src/libbio/bseek.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bseek.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-vlong
-Bseek(Biobuf *bp, vlong offset, int base)
-{
-	vlong n, d;
-	int bufsz;
-
-#if !defined(_WIN32) && !defined(PLAN9)
-	if(sizeof(offset) != sizeof(off_t)) {
-		fprint(2, "Bseek: libbio compiled with %d-byte offset\n", sizeof(off_t));
-		abort();
-	}
-#endif
-
-	switch(bp->state) {
-	default:
-		fprint(2, "Bseek: unknown state %d\n", bp->state);
-		return Beof;
-
-	case Bracteof:
-		bp->state = Bractive;
-		bp->icount = 0;
-		bp->gbuf = bp->ebuf;
-
-	case Bractive:
-		n = offset;
-		if(base == 1) {
-			n += Boffset(bp);
-			base = 0;
-		}
-
-		/*
-		 * try to seek within buffer
-		 */
-		if(base == 0) {
-			d = n - Boffset(bp);
-			bufsz = (int)(bp->ebuf - bp->gbuf);
-			if(-bufsz <= d && d <= bufsz){
-				bp->icount += (int)d;
-				if(d >= 0) {
-					if(bp->icount <= 0)
-						return n;
-				} else {
-					if(bp->ebuf - bp->gbuf >= -bp->icount)
-						return n;
-				}
-			}
-		}
-
-		/*
-		 * reset the buffer
-		 */
-		n = lseek(bp->fid, n, base);
-		bp->icount = 0;
-		bp->gbuf = bp->ebuf;
-		break;
-
-	case Bwactive:
-		Bflush(bp);
-		n = lseek(bp->fid, offset, base);
-		break;
-	}
-	bp->offset = n;
-	return n;
-}
diff --git a/src/libbio/bwrite.c b/src/libbio/bwrite.c
deleted file mode 100644
index 8b9943ab086f969fac4d3bcdc5b1f60f808ecf38..0000000000000000000000000000000000000000
--- a/src/libbio/bwrite.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-http://code.google.com/p/inferno-os/source/browse/libbio/bwrite.c
-
-	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-	Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include	<u.h>
-#include	<libc.h>
-#include	<bio.h>
-
-long
-Bwrite(Biobuf *bp, void *ap, long count)
-{
-	long c;
-	unsigned char *p;
-	int i, n, oc;
-
-	p = ap;
-	c = count;
-	oc = bp->ocount;
-
-	while(c > 0) {
-		n = -oc;
-		if(n > c)
-			n = (int)c;
-		if(n == 0) {
-			if(bp->state != Bwactive)
-				return Beof;
-			i = (int)write(bp->fid, bp->bbuf, (size_t)bp->bsize);
-			if(i != bp->bsize) {
-				bp->state = Binactive;
-				return Beof;
-			}
-			bp->offset += i;
-			oc = -bp->bsize;
-			continue;
-		}
-		memmove(bp->ebuf+oc, p, (size_t)n);
-		oc += n;
-		c -= n;
-		p += n;
-	}
-	bp->ocount = oc;
-	return count-c;
-}
diff --git a/src/liblink/Makefile b/src/liblink/Makefile
deleted file mode 100644
index 2a317462b3010cc6c10575d84793ecd85ccd25bc..0000000000000000000000000000000000000000
--- a/src/liblink/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2013 The Go Authors.  All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../Make.dist
diff --git a/src/liblink/arch.c b/src/liblink/arch.c
deleted file mode 100644
index 2e425a6117a6b8b6e30ebb3c82eff1d2478fe878..0000000000000000000000000000000000000000
--- a/src/liblink/arch.c
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-LinkArch linkarm = {
-	.name = "arm",
-	.thechar = '5',
-	.endian = LittleEndian,
-
-	.minlc = 4,
-	.ptrsize = 4,
-	.regsize = 4,
-};
-
-LinkArch linkamd64 = {
-	.name = "amd64",
-	.thechar = '6',
-	.endian = LittleEndian,
-
-	.minlc = 1,
-	.ptrsize = 8,
-	.regsize = 8,
-};
-
-LinkArch linkamd64p32 = {
-	.name = "amd64p32",
-	.thechar = '6',
-	.endian = LittleEndian,
-
-	.minlc = 1,
-	.ptrsize = 4,
-	.regsize = 8,
-};
-
-LinkArch link386 = {
-	.name = "386",
-	.thechar = '8',
-	.endian = LittleEndian,
-
-	.minlc = 1,
-	.ptrsize = 4,
-	.regsize = 4,
-};
-
-LinkArch linkppc64 = {
-	.name = "ppc64",
-	.thechar = '9',
-	.endian = BigEndian,
-
-	.minlc = 4,
-	.ptrsize = 8,
-	.regsize = 8,
-};
-
-LinkArch linkppc64le = {
-	.name = "ppc64le",
-	.thechar = '9',
-	.endian = LittleEndian,
-
-	.minlc = 4,
-	.ptrsize = 8,
-	.regsize = 8,
-};
diff --git a/src/liblink/data.c b/src/liblink/data.c
deleted file mode 100644
index 06fe7e047194e844a61e247f8ce4904007fde9fd..0000000000000000000000000000000000000000
--- a/src/liblink/data.c
+++ /dev/null
@@ -1,283 +0,0 @@
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-
-void
-symgrow(Link *ctxt, LSym *s, vlong lsiz)
-{
-	int32 siz;
-
-	USED(ctxt);
-
-	siz = (int32)lsiz;
-	if((vlong)siz != lsiz)
-		sysfatal("symgrow size %lld too long", lsiz);
-
-	if(s->np >= siz)
-		return;
-
-	if(s->np > s->maxp) {
-		ctxt->cursym = s;
-		sysfatal("corrupt symbol data: np=%lld > maxp=%lld", (vlong)s->np, (vlong)s->maxp);
-	}
-
-	if(s->maxp < siz) {
-		if(s->maxp == 0)
-			s->maxp = 8;
-		while(s->maxp < siz)
-			s->maxp <<= 1;
-		s->p = erealloc(s->p, s->maxp);
-		memset(s->p+s->np, 0, s->maxp-s->np);
-	}
-	s->np = siz;
-}
-
-
-Reloc*
-addrel(LSym *s)
-{
-	if(s->nr >= s->maxr) {
-		if(s->maxr == 0)
-			s->maxr = 4;
-		else
-			s->maxr <<= 1;
-		s->r = erealloc(s->r, s->maxr*sizeof s->r[0]);
-		memset(s->r+s->nr, 0, (s->maxr-s->nr)*sizeof s->r[0]);
-	}
-	return &s->r[s->nr++];
-}
-
-vlong
-setuintxx(Link *ctxt, LSym *s, vlong off, uint64 v, vlong wid)
-{
-	int32 i, fl;
-	vlong o;
-	uchar *cast;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	if(s->size < off+wid) {
-		s->size = off+wid;
-		symgrow(ctxt, s, s->size);
-	}
-	fl = v;
-	cast = (uchar*)&fl;
-	switch(wid) {
-	case 1:
-		s->p[off] = cast[inuxi1[0]];
-		break;
-	case 2:
-		for(i=0; i<2; i++)
-			s->p[off+i] = cast[inuxi2[i]];
-		break;
-	case 4:
-		for(i=0; i<4; i++)
-			s->p[off+i] = cast[inuxi4[i]];
-		break;
-	case 8:
-		o = v;
-		cast = (uchar*)&o;
-		for(i=0; i<8; i++)
-			s->p[off+i] = cast[inuxi8[i]];
-		break;
-	}
-	return off+wid;
-}
-
-vlong
-adduintxx(Link *ctxt, LSym *s, uint64 v, int wid)
-{
-	vlong off;
-
-	off = s->size;
-	setuintxx(ctxt, s, off, v, wid);
-	return off;
-}
-
-vlong
-adduint8(Link *ctxt, LSym *s, uint8 v)
-{
-	return adduintxx(ctxt, s, v, 1);
-}
-
-vlong
-adduint16(Link *ctxt, LSym *s, uint16 v)
-{
-	return adduintxx(ctxt, s, v, 2);
-}
-
-vlong
-adduint32(Link *ctxt, LSym *s, uint32 v)
-{
-	return adduintxx(ctxt, s, v, 4);
-}
-
-vlong
-adduint64(Link *ctxt, LSym *s, uint64 v)
-{
-	return adduintxx(ctxt, s, v, 8);
-}
-
-vlong
-setuint8(Link *ctxt, LSym *s, vlong r, uint8 v)
-{
-	return setuintxx(ctxt, s, r, v, 1);
-}
-
-
-vlong
-setuint32(Link *ctxt, LSym *s, vlong r, uint32 v)
-{
-	return setuintxx(ctxt, s, r, v, 4);
-}
-
-
-vlong
-addaddrplus(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
-	vlong i;
-	Reloc *r;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	i = s->size;
-	s->size += ctxt->arch->ptrsize;
-	symgrow(ctxt, s, s->size);
-	r = addrel(s);
-	r->sym = t;
-	r->off = i;
-	r->siz = ctxt->arch->ptrsize;
-	r->type = R_ADDR;
-	r->add = add;
-	return i + r->siz;
-}
-
-vlong
-addpcrelplus(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
-	vlong i;
-	Reloc *r;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	i = s->size;
-	s->size += 4;
-	symgrow(ctxt, s, s->size);
-	r = addrel(s);
-	r->sym = t;
-	r->off = i;
-	r->add = add;
-	r->type = R_PCREL;
-	r->siz = 4;
-	return i + r->siz;
-}
-
-vlong
-addaddr(Link *ctxt, LSym *s, LSym *t)
-{
-	return addaddrplus(ctxt, s, t, 0);
-}
-
-vlong
-setaddrplus(Link *ctxt, LSym *s, vlong off, LSym *t, vlong add)
-{
-	Reloc *r;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	if(off+ctxt->arch->ptrsize > s->size) {
-		s->size = off + ctxt->arch->ptrsize;
-		symgrow(ctxt, s, s->size);
-	}
-	r = addrel(s);
-	r->sym = t;
-	r->off = off;
-	r->siz = ctxt->arch->ptrsize;
-	r->type = R_ADDR;
-	r->add = add;
-	return off + r->siz;
-}
-
-vlong
-setaddr(Link *ctxt, LSym *s, vlong off, LSym *t)
-{
-	return setaddrplus(ctxt, s, off, t, 0);
-}
-
-vlong
-addsize(Link *ctxt, LSym *s, LSym *t)
-{
-	vlong i;
-	Reloc *r;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	i = s->size;
-	s->size += ctxt->arch->ptrsize;
-	symgrow(ctxt, s, s->size);
-	r = addrel(s);
-	r->sym = t;
-	r->off = i;
-	r->siz = ctxt->arch->ptrsize;
-	r->type = R_SIZE;
-	return i + r->siz;
-}
-
-vlong
-addaddrplus4(Link *ctxt, LSym *s, LSym *t, vlong add)
-{
-	vlong i;
-	Reloc *r;
-
-	if(s->type == 0)
-		s->type = SDATA;
-	s->reachable = 1;
-	i = s->size;
-	s->size += 4;
-	symgrow(ctxt, s, s->size);
-	r = addrel(s);
-	r->sym = t;
-	r->off = i;
-	r->siz = 4;
-	r->type = R_ADDR;
-	r->add = add;
-	return i + r->siz;
-}
diff --git a/src/liblink/go.c b/src/liblink/go.c
deleted file mode 100644
index 6dae3f438c20610854bc94edbddee33f7cdbaa44..0000000000000000000000000000000000000000
--- a/src/liblink/go.c
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// go-specific code shared across loaders (5l, 6l, 8l).
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-// replace all "". with pkg.
-char*
-expandpkg(char *t0, char *pkg)
-{
-	int n;
-	char *p;
-	char *w, *w0, *t;
-
-	n = 0;
-	for(p=t0; (p=strstr(p, "\"\".")) != nil; p+=3)
-		n++;
-
-	if(n == 0)
-		return estrdup(t0);
-
-	w0 = emallocz(strlen(t0) + strlen(pkg)*n);
-	w = w0;
-	for(p=t=t0; (p=strstr(p, "\"\".")) != nil; p=t) {
-		memmove(w, t, p - t);
-		w += p-t;
-		strcpy(w, pkg);
-		w += strlen(pkg);
-		t = p+2;
-	}
-	strcpy(w, t);
-	return w0;
-}
-
-void*
-emallocz(long n)
-{
-	void *p;
-
-	p = malloc(n);
-	if(p == nil)
-		sysfatal("out of memory");
-	memset(p, 0, n);
-	return p;
-}
-
-char*
-estrdup(char *p)
-{
-	p = strdup(p);
-	if(p == nil)
-		sysfatal("out of memory");
-	return p;
-}
-
-void*
-erealloc(void *p, long n)
-{
-	p = realloc(p, n);
-	if(p == nil)
-		sysfatal("out of memory");
-	return p;
-}
-
-
-
-
diff --git a/src/liblink/ld.c b/src/liblink/ld.c
deleted file mode 100644
index 5dfb4efc214a4df2458f528e4c4a8910f837eda4..0000000000000000000000000000000000000000
--- a/src/liblink/ld.c
+++ /dev/null
@@ -1,220 +0,0 @@
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-void
-addlib(Link *ctxt, char *src, char *obj, char *pathname)
-{
-	char name[1024], pname[1024], *p;
-	int i;
-
-	if(strlen(pathname) >= sizeof name)
-		sysfatal("addlib pathname too long");
-	strcpy(name, pathname);
-	cleanname(name);
-	
-	// runtime.a -> runtime
-	p = nil;
-	if(strlen(name) > 2 && name[strlen(name)-2] == '.') {
-		p = name+strlen(name)-2;
-		*p = '\0';
-	}
-	
-	// already loaded?
-	for(i=0; i<ctxt->libraryp; i++)
-		if(strcmp(ctxt->library[i].pkg, name) == 0)
-			return;
-	
-	// runtime -> runtime.a for search
-	if(p != nil)
-		*p = '.';
-
-	if((!ctxt->windows && name[0] == '/') || (ctxt->windows && name[1] == ':'))
-		snprint(pname, sizeof pname, "%s", name);
-	else {
-		// try dot, -L "libdir", and then goroot.
-		for(i=0; i<ctxt->nlibdir; i++) {
-			snprint(pname, sizeof pname, "%s/%s", ctxt->libdir[i], name);
-			if(access(pname, AEXIST) >= 0)
-				break;
-		}
-	}
-	cleanname(pname);
-
-	/* runtime.a -> runtime */
-	if(p != nil)
-		*p = '\0';
-
-	if(ctxt->debugvlog > 1 && ctxt->bso)
-		Bprint(ctxt->bso, "%5.2f addlib: %s %s pulls in %s\n", cputime(), obj, src, pname);
-
-	addlibpath(ctxt, src, obj, pname, name);
-}
-
-/*
- * add library to library list.
- *	srcref: src file referring to package
- *	objref: object file referring to package
- *	file: object file, e.g., /home/rsc/go/pkg/container/vector.a
- *	pkg: package import path, e.g. container/vector
- */
-void
-addlibpath(Link *ctxt, char *srcref, char *objref, char *file, char *pkg)
-{
-	int i;
-	Library *l;
-
-	for(i=0; i<ctxt->libraryp; i++)
-		if(strcmp(file, ctxt->library[i].file) == 0)
-			return;
-
-	if(ctxt->debugvlog > 1 && ctxt->bso)
-		Bprint(ctxt->bso, "%5.2f addlibpath: srcref: %s objref: %s file: %s pkg: %s\n",
-			cputime(), srcref, objref, file, pkg);
-
-	if(ctxt->libraryp == ctxt->nlibrary){
-		ctxt->nlibrary = 50 + 2*ctxt->libraryp;
-		ctxt->library = erealloc(ctxt->library, sizeof ctxt->library[0] * ctxt->nlibrary);
-	}
-
-	l = &ctxt->library[ctxt->libraryp++];
-	l->objref = estrdup(objref);
-	l->srcref = estrdup(srcref);
-	l->file = estrdup(file);
-	l->pkg = estrdup(pkg);
-}
-
-int
-find1(int32 l, int c)
-{
-	char *p;
-	int i;
-
-	p = (char*)&l;
-	for(i=0; i<4; i++)
-		if(*p++ == c)
-			return i;
-	return 0;
-}
-
-void
-nuxiinit(LinkArch *arch)
-{
-	int i, c;
-
-	if(arch->endian != BigEndian && arch->endian != LittleEndian)
-		sysfatal("unknown endian (%#x) for arch %s", arch->endian, arch->name);
-
-	for(i=0; i<4; i++) {
-		c = find1(arch->endian, i+1);
-		if(arch->endian == LittleEndian) {
-			if(i < 2)
-				inuxi2[i] = c;
-			if(i < 1)
-				inuxi1[i] = c;
-		} else {
-			if(i >= 2)
-				inuxi2[i-2] = c;
-			if(i >= 3)
-				inuxi1[i-3] = c;
-		}
-		inuxi4[i] = c;
-		if(c == i) {
-			inuxi8[i] = c;
-			inuxi8[i+4] = c+4;
-		} else {
-			inuxi8[i] = c+4;
-			inuxi8[i+4] = c;
-		}
-		fnuxi4[i] = c;
-		if(c == i) {
-			fnuxi8[i] = c;
-			fnuxi8[i+4] = c+4;
-		} else {
-			fnuxi8[i] = c+4;
-			fnuxi8[i+4] = c;
-		}
-	}
-}
-
-uchar	fnuxi8[8];
-uchar	fnuxi4[4];
-uchar	inuxi1[1];
-uchar	inuxi2[2];
-uchar	inuxi4[4];
-uchar	inuxi8[8];
-
-
-
-
-vlong
-atolwhex(char *s)
-{
-	vlong n;
-	int f;
-
-	n = 0;
-	f = 0;
-	while(*s == ' ' || *s == '\t')
-		s++;
-	if(*s == '-' || *s == '+') {
-		if(*s++ == '-')
-			f = 1;
-		while(*s == ' ' || *s == '\t')
-			s++;
-	}
-	if(s[0]=='0' && s[1]){
-		if(s[1]=='x' || s[1]=='X'){
-			s += 2;
-			for(;;){
-				if(*s >= '0' && *s <= '9')
-					n = n*16 + *s++ - '0';
-				else if(*s >= 'a' && *s <= 'f')
-					n = n*16 + *s++ - 'a' + 10;
-				else if(*s >= 'A' && *s <= 'F')
-					n = n*16 + *s++ - 'A' + 10;
-				else
-					break;
-			}
-		} else
-			while(*s >= '0' && *s <= '7')
-				n = n*8 + *s++ - '0';
-	} else
-		while(*s >= '0' && *s <= '9')
-			n = n*10 + *s++ - '0';
-	if(f)
-		n = -n;
-	return n;
-}
diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c
deleted file mode 100644
index 3531c69df4f04f54e3728dc49f5a223f70a859ba..0000000000000000000000000000000000000000
--- a/src/liblink/objfile.c
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Writing and reading of Go object files.
-//
-// Originally, Go object files were Plan 9 object files, but no longer.
-// Now they are more like standard object files, in that each symbol is defined
-// by an associated memory image (bytes) and a list of relocations to apply
-// during linking. We do not (yet?) use a standard file format, however.
-// For now, the format is chosen to be as simple as possible to read and write.
-// It may change for reasons of efficiency, or we may even switch to a
-// standard file format if there are compelling benefits to doing so.
-// See golang.org/s/go13linker for more background.
-//
-// The file format is:
-//
-//	- magic header: "\x00\x00go13ld"
-//	- byte 1 - version number
-//	- sequence of strings giving dependencies (imported packages)
-//	- empty string (marks end of sequence)
-//	- sequence of defined symbols
-//	- byte 0xff (marks end of sequence)
-//	- magic footer: "\xff\xffgo13ld"
-//
-// All integers are stored in a zigzag varint format.
-// See golang.org/s/go12symtab for a definition.
-//
-// Data blocks and strings are both stored as an integer
-// followed by that many bytes.
-//
-// A symbol reference is a string name followed by a version.
-// An empty name corresponds to a nil LSym* pointer.
-//
-// Each symbol is laid out as the following fields (taken from LSym*):
-//
-//	- byte 0xfe (sanity check for synchronization)
-//	- type [int]
-//	- name [string]
-//	- version [int]
-//	- flags [int]
-//		1 dupok
-//	- size [int]
-//	- gotype [symbol reference]
-//	- p [data block]
-//	- nr [int]
-//	- r [nr relocations, sorted by off]
-//
-// If type == STEXT, there are a few more fields:
-//
-//	- args [int]
-//	- locals [int]
-//	- nosplit [int]
-//	- flags [int]
-//		1 leaf
-//		2 C function
-//	- nlocal [int]
-//	- local [nlocal automatics]
-//	- pcln [pcln table]
-//
-// Each relocation has the encoding:
-//
-//	- off [int]
-//	- siz [int]
-//	- type [int]
-//	- add [int]
-//	- xadd [int]
-//	- sym [symbol reference]
-//	- xsym [symbol reference]
-//
-// Each local has the encoding:
-//
-//	- asym [symbol reference]
-//	- offset [int]
-//	- type [int]
-//	- gotype [symbol reference]
-//
-// The pcln table has the encoding:
-//
-//	- pcsp [data block]
-//	- pcfile [data block]
-//	- pcline [data block]
-//	- npcdata [int]
-//	- pcdata [npcdata data blocks]
-//	- nfuncdata [int]
-//	- funcdata [nfuncdata symbol references]
-//	- funcdatasym [nfuncdata ints]
-//	- nfile [int]
-//	- file [nfile symbol references]
-//
-// The file layout and meaning of type integers are architecture-independent.
-//
-// TODO(rsc): The file format is good for a first pass but needs work.
-//	- There are SymID in the object file that should really just be strings.
-//	- The actual symbol memory images are interlaced with the symbol
-//	  metadata. They should be separated, to reduce the I/O required to
-//	  load just the metadata.
-//	- The symbol references should be shortened, either with a symbol
-//	  table or by using a simple backward index to an earlier mentioned symbol.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-#include "../cmd/ld/textflag.h"
-#include "../runtime/funcdata.h"
-
-static void readsym(Link*, Biobuf*, char*, char*);
-static int64 rdint(Biobuf*);
-static char *rdstring(Biobuf*);
-static void rddata(Biobuf*, uchar**, int*);
-static LSym *rdsym(Link*, Biobuf*, char*);
-
-static char startmagic[] = "\x00\x00go13ld";
-static char endmagic[] = "\xff\xffgo13ld";
-
-void
-ldobjfile(Link *ctxt, Biobuf *f, char *pkg, int64 length, char *pn)
-{
-	int c;
-	uchar buf[8];
-	int64 start;
-	char *lib;
-
-	start = Boffset(f);
-	ctxt->version++;
-	memset(buf, 0, sizeof buf);
-	Bread(f, buf, sizeof buf);
-	if(memcmp(buf, startmagic, sizeof buf) != 0)
-		sysfatal("%s: invalid file start %x %x %x %x %x %x %x %x", pn, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
-	if((c = Bgetc(f)) != 1)
-		sysfatal("%s: invalid file version number %d", pn, c);
-
-	for(;;) {
-		lib = rdstring(f);
-		if(lib[0] == 0)
-			break;
-		addlib(ctxt, pkg, pn, lib);
-	}
-	
-	for(;;) {
-		c = Bgetc(f);
-		Bungetc(f);
-		if(c == 0xff)
-			break;
-		readsym(ctxt, f, pkg, pn);
-	}
-	
-	memset(buf, 0, sizeof buf);
-	Bread(f, buf, sizeof buf);
-	if(memcmp(buf, endmagic, sizeof buf) != 0)
-		sysfatal("%s: invalid file end", pn);
-	
-	if(Boffset(f) != start+length)
-		sysfatal("%s: unexpected end at %lld, want %lld", pn, (vlong)Boffset(f), (vlong)(start+length));
-}
-
-static void
-readsym(Link *ctxt, Biobuf *f, char *pkg, char *pn)
-{
-	int i, j, c, t, v, n, ndata, nreloc, size, dupok;
-	static int ndup;
-	char *name;
-	uchar *data;
-	Reloc *r;
-	LSym *s, *dup, *typ;
-	Pcln *pc;
-	Auto *a;
-	
-	if(Bgetc(f) != 0xfe)
-		sysfatal("readsym out of sync");
-	t = rdint(f);
-	name = expandpkg(rdstring(f), pkg);
-	v = rdint(f);
-	if(v != 0 && v != 1)
-		sysfatal("invalid symbol version %d", v);
-	dupok = rdint(f);
-	dupok &= 1;
-	size = rdint(f);
-	typ = rdsym(ctxt, f, pkg);
-	rddata(f, &data, &ndata);
-	nreloc = rdint(f);
-	
-	if(v != 0)
-		v = ctxt->version;
-	s = linklookup(ctxt, name, v);
-	dup = nil;
-	if(s->type != 0 && s->type != SXREF) {
-		if((t == SDATA || t == SBSS || t == SNOPTRBSS) && ndata == 0 && nreloc == 0) {
-			if(s->size < size)
-				s->size = size;
-			if(typ != nil && s->gotype == nil)
-				s->gotype = typ;
-			return;
-		}
-		if((s->type == SDATA || s->type == SBSS || s->type == SNOPTRBSS) && s->np == 0 && s->nr == 0)
-			goto overwrite;
-		if(s->type != SBSS && s->type != SNOPTRBSS && !dupok && !s->dupok)
-			sysfatal("duplicate symbol %s (types %d and %d) in %s and %s", s->name, s->type, t, s->file, pn);
-		if(s->np > 0) {
-			dup = s;
-			s = linknewsym(ctxt, ".dup", ndup++); // scratch
-		}
-	}
-overwrite:
-	s->file = pkg;
-	s->dupok = dupok;
-	if(t == SXREF)
-		sysfatal("bad sxref");
-	if(t == 0)
-		sysfatal("missing type for %s in %s", name, pn);
-	if(t == SBSS && (s->type == SRODATA || s->type == SNOPTRBSS))
-		t = s->type;
-	s->type = t;
-	if(s->size < size)
-		s->size = size;
-	if(typ != nil) // if bss sym defined multiple times, take type from any one def
-		s->gotype = typ;
-	if(dup != nil && typ != nil)
-		dup->gotype = typ;
-	s->p = data;
-	s->np = ndata;
-	s->maxp = s->np;
-	if(nreloc > 0) {
-		s->r = emallocz(nreloc * sizeof s->r[0]);
-		s->nr = nreloc;
-		s->maxr = nreloc;
-		for(i=0; i<nreloc; i++) {
-			r = &s->r[i];
-			r->off = rdint(f);
-			r->siz = rdint(f);
-			r->type = rdint(f);
-			r->add = rdint(f);
-			r->xadd = rdint(f);
-			r->sym = rdsym(ctxt, f, pkg);
-			r->xsym = rdsym(ctxt, f, pkg);
-		}
-	}
-	
-	if(s->np > 0 && dup != nil && dup->np > 0 && strncmp(s->name, "gclocals·", 10) == 0) {
-		// content-addressed garbage collection liveness bitmap symbol.
-		// double check for hash collisions.
-		if(s->np != dup->np || memcmp(s->p, dup->p, s->np) != 0)
-			sysfatal("dupok hash collision for %s in %s and %s", s->name, s->file, pn);
-	}
-	
-	if(s->type == STEXT) {
-		s->args = rdint(f);
-		s->locals = rdint(f);
-		s->nosplit = rdint(f);
-		v = rdint(f);
-		s->leaf = v&1;
-		s->cfunc = v&2;
-		n = rdint(f);
-		for(i=0; i<n; i++) {
-			a = emallocz(sizeof *a);
-			a->asym = rdsym(ctxt, f, pkg);
-			a->aoffset = rdint(f);
-			a->name = rdint(f);
-			a->gotype = rdsym(ctxt, f, pkg);
-			a->link = s->autom;
-			s->autom = a;
-		}
-
-		s->pcln = emallocz(sizeof *s->pcln);
-		pc = s->pcln;
-		rddata(f, &pc->pcsp.p, &pc->pcsp.n);
-		rddata(f, &pc->pcfile.p, &pc->pcfile.n);
-		rddata(f, &pc->pcline.p, &pc->pcline.n);
-		n = rdint(f);
-		pc->pcdata = emallocz(n * sizeof pc->pcdata[0]);
-		pc->npcdata = n;
-		for(i=0; i<n; i++)
-			rddata(f, &pc->pcdata[i].p, &pc->pcdata[i].n);
-		n = rdint(f);
-		pc->funcdata = emallocz(n * sizeof pc->funcdata[0]);
-		pc->funcdataoff = emallocz(n * sizeof pc->funcdataoff[0]);
-		pc->nfuncdata = n;
-		for(i=0; i<n; i++)
-			pc->funcdata[i] = rdsym(ctxt, f, pkg);
-		for(i=0; i<n; i++)
-			pc->funcdataoff[i] = rdint(f);
-		n = rdint(f);
-		pc->file = emallocz(n * sizeof pc->file[0]);
-		pc->nfile = n;
-		for(i=0; i<n; i++)
-			pc->file[i] = rdsym(ctxt, f, pkg);
-
-		if(dup == nil) {
-			if(s->onlist)
-				sysfatal("symbol %s listed multiple times", s->name);
-			s->onlist = 1;
-			if(ctxt->etextp)
-				ctxt->etextp->next = s;
-			else
-				ctxt->textp = s;
-			ctxt->etextp = s;
-		}
-	}
-
-	if(ctxt->debugasm) {
-		Bprint(ctxt->bso, "%s ", s->name);
-		if(s->version)
-			Bprint(ctxt->bso, "v=%d ", s->version);
-		if(s->type)
-			Bprint(ctxt->bso, "t=%d ", s->type);
-		if(s->dupok)
-			Bprint(ctxt->bso, "dupok ");
-		if(s->cfunc)
-			Bprint(ctxt->bso, "cfunc ");
-		if(s->nosplit)
-			Bprint(ctxt->bso, "nosplit ");
-		Bprint(ctxt->bso, "size=%lld value=%lld", (vlong)s->size, (vlong)s->value);
-		if(s->type == STEXT)
-			Bprint(ctxt->bso, " args=%#llux locals=%#llux", (uvlong)s->args, (uvlong)s->locals);
-		Bprint(ctxt->bso, "\n");
-		for(i=0; i<s->np; ) {
-			Bprint(ctxt->bso, "\t%#06ux", i);
-			for(j=i; j<i+16 && j<s->np; j++)
-				Bprint(ctxt->bso, " %02ux", s->p[j]);
-			for(; j<i+16; j++)
-				Bprint(ctxt->bso, "   ");
-			Bprint(ctxt->bso, "  ");
-			for(j=i; j<i+16 && j<s->np; j++) {
-				c = s->p[j];
-				if(' ' <= c && c <= 0x7e)
-					Bprint(ctxt->bso, "%c", c);
-				else
-					Bprint(ctxt->bso, ".");
-			}
-			Bprint(ctxt->bso, "\n");
-			i += 16;
-		}
-		for(i=0; i<s->nr; i++) {
-			r = &s->r[i];
-			Bprint(ctxt->bso, "\trel %d+%d t=%d %s+%lld\n", (int)r->off, r->siz, r->type, r->sym->name, (vlong)r->add);
-		}
-	}
-}
-
-static int64
-rdint(Biobuf *f)
-{
-	int c;
-	uint64 uv;
-	int shift;
-	
-	uv = 0;
-	for(shift = 0;; shift += 7) {
-		if(shift >= 64)
-			sysfatal("corrupt input");
-		c = Bgetc(f);
-		uv |= (uint64)(c & 0x7F) << shift;
-		if(!(c & 0x80))
-			break;
-	}
-
-	return (int64)(uv>>1) ^ ((int64)((uint64)uv<<63)>>63);
-}
-
-static char*
-rdstring(Biobuf *f)
-{
-	int n;
-	char *p;
-	
-	n = rdint(f);
-	p = emallocz(n+1);
-	Bread(f, p, n);
-	return p;
-}
-
-static void
-rddata(Biobuf *f, uchar **pp, int *np)
-{
-	*np = rdint(f);
-	*pp = emallocz(*np);
-	Bread(f, *pp, *np);
-}
-
-static LSym*
-rdsym(Link *ctxt, Biobuf *f, char *pkg)
-{
-	int n, v;
-	char *p;
-	LSym *s;
-	
-	n = rdint(f);
-	if(n == 0) {
-		rdint(f);
-		return nil;
-	}
-	p = emallocz(n+1);
-	Bread(f, p, n);
-	v = rdint(f);
-	if(v != 0)
-		v = ctxt->version;
-	s = linklookup(ctxt, expandpkg(p, pkg), v);
-	
-	if(v == 0 && s->name[0] == '$' && s->type == 0) {
-		if(strncmp(s->name, "$f32.", 5) == 0) {
-			int32 i32;
-			i32 = strtoul(s->name+5, nil, 16);
-			s->type = SRODATA;
-			adduint32(ctxt, s, i32);
-			s->reachable = 0;
-		} else if(strncmp(s->name, "$f64.", 5) == 0 || strncmp(s->name, "$i64.", 5) == 0) {
-			int64 i64;
-			i64 = strtoull(s->name+5, nil, 16);
-			s->type = SRODATA;
-			adduint64(ctxt, s, i64);
-			s->reachable = 0;
-		}
-	}
-
-	return s;
-}
diff --git a/src/liblink/pcln.c b/src/liblink/pcln.c
deleted file mode 100644
index cdc11b85db7119cc51cb92da780a7375aa3ae595..0000000000000000000000000000000000000000
--- a/src/liblink/pcln.c
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-
-// funcpctab writes to dst a pc-value table mapping the code in func to the values
-// returned by valfunc parameterized by arg. The invocation of valfunc to update the
-// current value is, for each p,
-//
-//	val = valfunc(func, val, p, 0, arg);
-//	record val as value at p->pc;
-//	val = valfunc(func, val, p, 1, arg);
-//
-// where func is the function, val is the current value, p is the instruction being
-// considered, and arg can be used to further parameterize valfunc.
-
-// pctofileline computes either the file number (arg == 0)
-// or the line number (arg == 1) to use at p.
-// Because p->lineno applies to p, phase == 0 (before p)
-// takes care of the update.
-
-// pctospadj computes the sp adjustment in effect.
-// It is oldval plus any adjustment made by p itself.
-// The adjustment by p takes effect only after p, so we
-// apply the change during phase == 1.
-
-// pctopcdata computes the pcdata value in effect at p.
-// A PCDATA instruction sets the value in effect at future
-// non-PCDATA instructions.
-// Since PCDATA instructions have no width in the final code,
-// it does not matter which phase we use for the update.
-
-
-// iteration over encoded pcdata tables.
-
-static uint32
-getvarint(uchar **pp)
-{
-	uchar *p;
-	int shift;
-	uint32 v;
-
-	v = 0;
-	p = *pp;
-	for(shift = 0;; shift += 7) {
-		v |= (uint32)(*p & 0x7F) << shift;
-		if(!(*p++ & 0x80))
-			break;
-	}
-	*pp = p;
-	return v;
-}
-
-void
-pciternext(Pciter *it)
-{
-	uint32 v;
-	int32 dv;
-
-	it->pc = it->nextpc;
-	if(it->done)
-		return;
-	if(it->p >= it->d.p + it->d.n) {
-		it->done = 1;
-		return;
-	}
-
-	// value delta
-	v = getvarint(&it->p);
-	if(v == 0 && !it->start) {
-		it->done = 1;
-		return;
-	}
-	it->start = 0;
-	dv = (int32)(v>>1) ^ ((int32)(v<<31)>>31);
-	it->value += dv;
-	
-	// pc delta
-	v = getvarint(&it->p);
-	it->nextpc = it->pc + v*it->pcscale;
-}
-
-void
-pciterinit(Link *ctxt, Pciter *it, Pcdata *d)
-{
-	it->d = *d;
-	it->p = it->d.p;
-	it->pc = 0;
-	it->nextpc = 0;
-	it->value = -1;
-	it->start = 1;
-	it->done = 0;
-	it->pcscale = ctxt->arch->minlc;
-	pciternext(it);
-}
diff --git a/src/liblink/sym.c b/src/liblink/sym.c
deleted file mode 100644
index 9ee179717a781c64ba0cd6f03b14afa26c3d1d5f..0000000000000000000000000000000000000000
--- a/src/liblink/sym.c
+++ /dev/null
@@ -1,255 +0,0 @@
-// Derived from Inferno utils/6l/obj.c and utils/6l/span.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/obj.c
-// http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <link.h>
-
-static int
-yy_isalpha(int c)
-{
-	return c >= 0 && c <= 0xFF && isalpha(c);
-}
-
-static struct {
-	char *name;
-	int val;
-} headers[] = {
-	{"darwin",	Hdarwin},
-	{"dragonfly",	Hdragonfly},
-	{"elf",		Helf},
-	{"freebsd",	Hfreebsd},
-	{"linux",	Hlinux},
-	{"android",	Hlinux}, // must be after "linux" entry or else headstr(Hlinux) == "android"
-	{"nacl",		Hnacl},
-	{"netbsd",	Hnetbsd},
-	{"openbsd",	Hopenbsd},
-	{"plan9",	Hplan9},
-	{"solaris",	Hsolaris},
-	{"windows",	Hwindows},
-	{"windowsgui",	Hwindows},
-};
-
-int
-headtype(char *name)
-{
-	int i;
-
-	for(i=0; i < nelem(headers); i++)
-		if(strcmp(name, headers[i].name) == 0)
-			return headers[i].val;
-	return -1;
-}
-
-char*
-headstr(int v)
-{
-	static char buf[20];
-	int i;
-
-	for(i=0; i < nelem(headers); i++)
-		if(v == headers[i].val)
-			return headers[i].name;
-	snprint(buf, sizeof buf, "%d", v);
-	return buf;
-}
-
-Link*
-linknew(LinkArch *arch)
-{
-	Link *ctxt;
-	char *p;
-	char buf[1024];
-
-	nuxiinit(arch);
-	
-	ctxt = emallocz(sizeof *ctxt);
-	ctxt->arch = arch;
-	ctxt->version = HistVersion;
-	ctxt->goroot = getgoroot();
-
-	p = getgoarch();
-	if(strcmp(p, arch->name) != 0)
-		sysfatal("invalid goarch %s (want %s)", p, arch->name);
-	
-	if(getwd(buf, sizeof buf) == 0)
-		strcpy(buf, "/???");
-	if(yy_isalpha(buf[0]) && buf[1] == ':') {
-		// On Windows.
-		ctxt->windows = 1;
-
-		// Canonicalize path by converting \ to / (Windows accepts both).
-		for(p=buf; *p; p++)
-			if(*p == '\\')
-				*p = '/';
-	}
-	
-	ctxt->headtype = headtype(getgoos());
-	if(ctxt->headtype < 0)
-		sysfatal("unknown goos %s", getgoos());
-	
-	// Record thread-local storage offset.
-	// TODO(rsc): Move tlsoffset back into the linker.
-	switch(ctxt->headtype) {
-	default:
-		sysfatal("unknown thread-local storage offset for %s", headstr(ctxt->headtype));
-	case Hplan9:
-	case Hwindows:
-		break;
-	case Hlinux:
-	case Hfreebsd:
-	case Hnetbsd:
-	case Hopenbsd:
-	case Hdragonfly:
-	case Hsolaris:
-		/*
-		 * ELF uses TLS offset negative from FS.
-		 * Translate 0(FS) and 8(FS) into -16(FS) and -8(FS).
-		 * Known to low-level assembly in package runtime and runtime/cgo.
-		 */
-		ctxt->tlsoffset = -2*ctxt->arch->ptrsize;
-		break;
-
-	case Hnacl:
-		switch(ctxt->arch->thechar) {
-		default:
-			sysfatal("unknown thread-local storage offset for nacl/%s", ctxt->arch->name);
-		case '5':
-			ctxt->tlsoffset = 0;
-			break;
-		case '6':
-			ctxt->tlsoffset = 0;
-			break;
-		case '8':
-			ctxt->tlsoffset = -8;
-			break;
-		}
-		break;
-
-	case Hdarwin:
-		/*
-		 * OS X system constants - offset from 0(GS) to our TLS.
-		 * Explained in ../../runtime/cgo/gcc_darwin_*.c.
-		 */
-		switch(ctxt->arch->thechar) {
-		default:
-			sysfatal("unknown thread-local storage offset for darwin/%s", ctxt->arch->name);
-		case '6':
-			ctxt->tlsoffset = 0x8a0;
-			break;
-		case '8':
-			ctxt->tlsoffset = 0x468;
-			break;
-		case '5':
-			ctxt->tlsoffset = 0; // dummy value, not needed
-			break;
-		}
-		break;
-	}
-	
-	// On arm, record goarm.
-	if(ctxt->arch->thechar == '5') {
-		p = getgoarm();
-		if(p != nil)
-			ctxt->goarm = atoi(p);
-		else
-			ctxt->goarm = 6;
-	}
-
-	return ctxt;
-}
-
-LSym*
-linknewsym(Link *ctxt, char *symb, int v)
-{
-	LSym *s;
-
-	s = malloc(sizeof(*s));
-	memset(s, 0, sizeof(*s));
-
-	s->dynid = -1;
-	s->plt = -1;
-	s->got = -1;
-	s->name = estrdup(symb);
-	s->type = 0;
-	s->version = v;
-	s->value = 0;
-	s->sig = 0;
-	s->size = 0;
-	ctxt->nsymbol++;
-
-	s->allsym = ctxt->allsym;
-	ctxt->allsym = s;
-
-	return s;
-}
-
-static LSym*
-_lookup(Link *ctxt, char *symb, int v, int creat)
-{
-	LSym *s;
-	char *p;
-	uint32 h;
-	int c;
-
-	h = v;
-	for(p=symb; c = *p; p++)
-		h = h+h+h + c;
-	h &= 0xffffff;
-	h %= LINKHASH;
-	for(s = ctxt->hash[h]; s != nil; s = s->hash)
-		if(s->version == v && strcmp(s->name, symb) == 0)
-			return s;
-	if(!creat)
-		return nil;
-
-	s = linknewsym(ctxt, symb, v);
-	s->extname = s->name;
-	s->hash = ctxt->hash[h];
-	ctxt->hash[h] = s;
-
-	return s;
-}
-
-LSym*
-linklookup(Link *ctxt, char *name, int v)
-{
-	return _lookup(ctxt, name, v, 1);
-}
-
-// read-only lookup
-LSym*
-linkrlookup(Link *ctxt, char *name, int v)
-{
-	return _lookup(ctxt, name, v, 0);
-}
-
diff --git a/src/make.rc b/src/make.rc
index 46ab35bcbc2db7a2033dc3fcbdb0e0889f8b700f..1d51f2842ecccadfe5fbd848b5e681c604b9d455 100755
--- a/src/make.rc
+++ b/src/make.rc
@@ -35,9 +35,6 @@ if(! test -f run.rc){
 	exit wrongdir
 }
 
-# Generate libc_plan9.h.
-../include/plan9/mklibc.rc > ../include/plan9/libc_plan9.h
-
 # Clean old generated file that will cause problems in the build.
 rm -f ./runtime/runtime_defs.go