shithub: st

Download patch

ref: dcb88c71fb2132c1007a2ad0971ac475a54f02b5
parent: e6665c534f2efee4ae14b5b90395d2835bba9207
author: Roberto E. Vargas Caballero <[email protected]>
date: Sun Aug 14 07:23:31 EDT 2022

Make st compilable in 9front

--- a/config.h
+++ b/config.h
@@ -11,15 +11,9 @@
 /*
  * What program is execed by st depends of these precedence rules:
  * 1: program passed with -e
- * 2: scroll and/or utmp
- * 3: SHELL environment variable
- * 4: value of shell in /etc/passwd
- * 5: value of shell in config.h
+ * 3: shell environment variable
+ * 4: /bin/rc
  */
-static char *shell = "/bin/sh";
-char *utmp = NULL;
-/* scroll program: to enable use a string like "scroll" */
-char *scroll = NULL;
 char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
 
 /* identification sequence returned in DA and DECID */
@@ -34,7 +28,7 @@
  *
  * More advanced example: L" `'\"()[]{}"
  */
-wchar_t *worddelimiters = L" ";
+Rune *worddelimiters = L" ";
 
 /* selection timeouts (in milliseconds) */
 static unsigned int doubleclicktimeout = 300;
@@ -151,25 +145,13 @@
 static unsigned int rows = 24;
 
 /*
- * Default colour and shape of the mouse cursor
- */
-static unsigned int mouseshape = XC_xterm;
-static unsigned int mousefg = 7;
-static unsigned int mousebg = 0;
-
-/*
  * Color used to display font attributes when fontconfig selected a font which
  * doesn't match the ones requested.
  */
 static unsigned int defaultattr = 11;
 
-/*
- * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set).
- * Note that if you want to use ShiftMask with selmasks, set this to an other
- * modifier, set to 0 to not use it.
- */
-static uint forcemousemod = ShiftMask;
 
+#ifdef NO
 /*
  * Internal mouse shortcuts.
  * Beware that overloading Button1 will disable the selection.
@@ -182,11 +164,13 @@
 	{ ShiftMask,            Button5, ttysend,        {.s = "\033[6;2~"} },
 	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} },
 };
+#endif
 
 /* Internal keyboard shortcuts. */
 #define MODKEY Mod1Mask
 #define TERMMOD (ControlMask|ShiftMask)
 
+#ifdef NO
 static Shortcut shortcuts[] = {
 	/* mask                 keysym          function        argument */
 	{ XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} },
@@ -202,6 +186,7 @@
 	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
 	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
 };
+#endif
 
 /*
  * Special keys (change & recompile st.info accordingly)
@@ -224,6 +209,7 @@
  * position for a key.
  */
 
+#ifdef NO
 /*
  * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
  * to be mapped below, add them to this array.
@@ -452,17 +438,7 @@
 	{ XK_F34,           XK_NO_MOD,      "\033[21;5~",    0,    0},
 	{ XK_F35,           XK_NO_MOD,      "\033[23;5~",    0,    0},
 };
-
-/*
- * Selection types' masks.
- * Use the same masks as usual.
- * Button1Mask is always unset, to make masks match between ButtonPress.
- * ButtonRelease and MotionNotify.
- * If no match is found, regular selection is used.
- */
-static uint selmasks[] = {
-	[SEL_RECTANGULAR] = Mod1Mask,
-};
+#endif
 
 /*
  * Printable characters in ASCII, used to estimate the advance width
--- a/main.c
+++ b/main.c
@@ -1146,6 +1146,8 @@
 	chording = mc->buttons;
 }
 
+#ifdef NO
+TODO
 int
 selected(int x, int y)
 {
@@ -1164,6 +1166,7 @@
 	}
 	return s;
 }
+#endif
 
 void
 readmenu(void)
--- a/mkfile
+++ b/mkfile
@@ -4,10 +4,12 @@
 
 OFILES=\
 	main.$O\
+	st.$O\
 	vt.$O\
+	x.$O\
 	fs.$O\
 
-HFILES=cons.h
+HFILES=cons.h st.h win.h
 
 BIN=/$objtype/bin
 </sys/src/cmd/mkone
--- a/st.c
+++ b/st.c
@@ -1,33 +1,15 @@
 /* See LICENSE for license details. */
+#include <u.h>
+#include <libc.h>
 #include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <termios.h>
-#include <unistd.h>
-#include <wchar.h>
 
+#include <ape/limits.h>
+#include <ape/stdint.h>
+
 #include "st.h"
 #include "win.h"
+#include "config.h"
 
-#if   defined(__linux)
- #include <pty.h>
-#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
- #include <util.h>
-#elif defined(__FreeBSD__) || defined(__DragonFly__)
- #include <libutil.h>
-#endif
-
 /* Arbitrary sizes */
 #define UTF_INVALID   0xFFFD
 #define UTF_SIZ       4
@@ -41,8 +23,10 @@
 #define ISCONTROLC0(c)		(BETWEEN(c, 0, 0x1f) || (c) == 0x7f)
 #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f))
 #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c))
-#define ISDELIM(u)		(u && wcschr(worddelimiters, u))
+#define ISDELIM(u)		    (u && runestrchr(worddelimiters, u))
 
+#define BUFSIZ 512
+
 enum term_mode {
 	MODE_WRAP        = 1 << 0,
 	MODE_INSERT      = 1 << 1,
@@ -134,7 +118,7 @@
 /* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */
 typedef struct {
 	char buf[ESC_BUF_SIZ]; /* raw string */
-	size_t len;            /* raw string length */
+	usize len;            /* raw string length */
 	char priv;
 	int arg[ESC_ARG_SIZ];
 	int narg;              /* nb of args */
@@ -146,8 +130,8 @@
 typedef struct {
 	char type;             /* ESC type ... */
 	char *buf;             /* allocated raw string */
-	size_t siz;            /* allocation size */
-	size_t len;            /* raw string length */
+	usize siz;            /* allocation size */
+	usize len;            /* raw string length */
 	char *args[STR_ARG_SIZ];
 	int narg;              /* nb of args */
 } STREscape;
@@ -155,7 +139,7 @@
 static void execsh(char *, char **);
 static void stty(char **);
 static void sigchld(int);
-static void ttywriteraw(const char *, size_t);
+static void ttywriteraw(const char *, usize);
 
 static void csidump(void);
 static void csihandle(void);
@@ -168,7 +152,7 @@
 static void strparse(void);
 static void strreset(void);
 
-static void tprinter(char *, size_t);
+static void tprinter(char *, usize);
 static void tdumpsel(void);
 static void tdumpline(int);
 static void tdump(void);
@@ -198,7 +182,7 @@
 static void tcontrolcode(uchar );
 static void tdectest(char );
 static void tdefutf8(char);
-static int32_t tdefcolor(const int *, int *, int);
+static long tdefcolor(const int *, int *, int);
 static void tdeftran(char);
 static void tstrsequence(uchar);
 
@@ -208,15 +192,14 @@
 static void selscroll(int, int);
 static void selsnap(int *, int *, int);
 
-static size_t utf8decode(const char *, Rune *, size_t);
-static Rune utf8decodebyte(char, size_t *);
-static char utf8encodebyte(Rune, size_t);
-static size_t utf8validate(Rune *, size_t);
+static usize utf8decode(const char *, Rune *, usize);
+static Rune utf8decodebyte(char, usize *);
+static char utf8encodebyte(Rune, usize);
+static usize utf8validate(Rune *, usize);
 
 static char *base64dec(const char *);
 static char base64dec_getc(const char **);
 
-static ssize_t xwrite(int, const char *, size_t);
 
 /* Globals */
 static Term term;
@@ -225,7 +208,7 @@
 static STREscape strescseq;
 static int iofd = 1;
 static int cmdfd;
-static pid_t pid;
+static int pid;
 
 static const uchar utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
 static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
@@ -232,39 +215,24 @@
 static const Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
 static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
 
-ssize_t
-xwrite(int fd, const char *s, size_t len)
-{
-	size_t aux = len;
-	ssize_t r;
+int errno; /* TODO: remove it!!! */
 
-	while (len > 0) {
-		r = write(fd, s, len);
-		if (r < 0)
-			return r;
-		len -= r;
-		s += r;
-	}
-
-	return aux;
-}
-
 void *
-xmalloc(size_t len)
+xmalloc(usize len)
 {
 	void *p;
 
 	if (!(p = malloc(len)))
-		die("malloc: %s\n", strerror(errno));
+		sysfatal("malloc: %r\n");
 
 	return p;
 }
 
 void *
-xrealloc(void *p, size_t len)
+xrealloc(void *p, usize len)
 {
-	if ((p = realloc(p, len)) == NULL)
-		die("realloc: %s\n", strerror(errno));
+	if ((p = realloc(p, len)) == nil)
+		sysfatal("realloc: %r\n");
 
 	return p;
 }
@@ -274,16 +242,16 @@
 {
 	char *p;
 
-	if ((p = strdup(s)) == NULL)
-		die("strdup: %s\n", strerror(errno));
+	if ((p = strdup(s)) == nil)
+		sysfatal("strdup: %r\n");
 
 	return p;
 }
 
-size_t
-utf8decode(const char *c, Rune *u, size_t clen)
+static usize
+utf8decode(const char *c, Rune *u, usize clen)
 {
-	size_t i, j, len, type;
+	usize i, j, len, type;
 	Rune udecoded;
 
 	*u = UTF_INVALID;
@@ -305,8 +273,8 @@
 	return len;
 }
 
-Rune
-utf8decodebyte(char c, size_t *i)
+static Rune
+utf8decodebyte(char c, usize *i)
 {
 	for (*i = 0; *i < LEN(utfmask); ++(*i))
 		if (((uchar)c & utfmask[*i]) == utfbyte[*i])
@@ -315,10 +283,10 @@
 	return 0;
 }
 
-size_t
+usize
 utf8encode(Rune u, char *c)
 {
-	size_t len, i;
+	usize len, i;
 
 	len = utf8validate(&u, 0);
 	if (len > UTF_SIZ)
@@ -333,14 +301,14 @@
 	return len;
 }
 
-char
-utf8encodebyte(Rune u, size_t i)
+static char
+utf8encodebyte(Rune u, usize i)
 {
 	return utfbyte[i] | (u & ~utfmask[i]);
 }
 
-size_t
-utf8validate(Rune *u, size_t i)
+static usize
+utf8validate(Rune *u, usize i)
 {
 	if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
 		*u = UTF_INVALID;
@@ -350,7 +318,7 @@
 	return i;
 }
 
-char
+static char
 base64dec_getc(const char **src)
 {
 	while (**src && !isprint((unsigned char)**src))
@@ -358,10 +326,10 @@
 	return **src ? *((*src)++) : '=';  /* emulate padding if string ends */
 }
 
-char *
+static char *
 base64dec(const char *src)
 {
-	size_t in_len = strlen(src);
+	usize in_len = strlen(src);
 	char *result, *dst;
 	static const char base64_digits[256] = {
 		[43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
@@ -404,7 +372,7 @@
 	sel.ob.x = -1;
 }
 
-int
+static int
 tlinelen(int y)
 {
 	int i = term.col;
@@ -464,7 +432,7 @@
 	sel.mode = done ? SEL_IDLE : SEL_READY;
 }
 
-void
+static void
 selnormalize(void)
 {
 	int i;
@@ -508,7 +476,7 @@
 	    && (y != sel.ne.y || x <= sel.ne.x);
 }
 
-void
+static void
 selsnap(int *x, int *y, int direction)
 {
 	int newx, newy, xt, yt;
@@ -589,7 +557,7 @@
 	const Glyph *gp, *last;
 
 	if (sel.ob.x == -1)
-		return NULL;
+		return nil;
 
 	bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ;
 	ptr = str = xmalloc(bufsize);
@@ -646,102 +614,56 @@
 	tsetdirt(sel.nb.y, sel.ne.y);
 }
 
-void
-die(const char *errstr, ...)
-{
-	va_list ap;
-
-	va_start(ap, errstr);
-	vfprintf(stderr, errstr, ap);
-	va_end(ap);
-	exit(1);
-}
-
-void
+static void
 execsh(char *cmd, char **args)
 {
 	char *sh, *prog, *arg;
-	const struct passwd *pw;
+	char *targs[3];
 
-	errno = 0;
-	if ((pw = getpwuid(getuid())) == NULL) {
-		if (errno)
-			die("getpwuid: %s\n", strerror(errno));
-		else
-			die("who are you?\n");
-	}
+	sh = cmd ? cmd : "/bin/rc";
 
-	if ((sh = getenv("SHELL")) == NULL)
-		sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd;
-
 	if (args) {
 		prog = args[0];
-		arg = NULL;
-	} else if (scroll) {
-		prog = scroll;
-		arg = utmp ? utmp : sh;
-	} else if (utmp) {
-		prog = utmp;
-		arg = NULL;
+		arg = nil;
 	} else {
 		prog = sh;
-		arg = NULL;
+		arg = nil;
 	}
-	DEFAULT(args, ((char *[]) {prog, arg, NULL}));
 
-	unsetenv("COLUMNS");
-	unsetenv("LINES");
-	unsetenv("TERMCAP");
-	setenv("LOGNAME", pw->pw_name, 1);
-	setenv("USER", pw->pw_name, 1);
-	setenv("SHELL", sh, 1);
-	setenv("HOME", pw->pw_dir, 1);
-	setenv("TERM", termname, 1);
+	targs[0] = prog;
+	targs[1] = arg;
+	targs[2] = nil;
+	DEFAULT(args, targs);
 
-	signal(SIGCHLD, SIG_DFL);
-	signal(SIGHUP, SIG_DFL);
-	signal(SIGINT, SIG_DFL);
-	signal(SIGQUIT, SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-	signal(SIGALRM, SIG_DFL);
+	remove("/env/COLUMNS");
+	remove("/env/LINES");
+	remove("/env/TERMCAP");
+	putenv("LOGNAME", getenv("user"));
+	putenv("USER", getenv("user"));
+	putenv("SHELL", sh);
+	putenv("HOME", getenv("home"));
+	putenv("TERM", termname);
 
-	execvp(prog, args);
-	_exit(1);
+	exec(prog, args);
+	sysfatal("%r");
 }
 
-void
-sigchld(int a)
-{
-	int stat;
-	pid_t p;
-
-	if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
-		die("waiting for pid %hd failed: %s\n", pid, strerror(errno));
-
-	if (pid != p)
-		return;
-
-	if (WIFEXITED(stat) && WEXITSTATUS(stat))
-		die("child exited with status %d\n", WEXITSTATUS(stat));
-	else if (WIFSIGNALED(stat))
-		die("child terminated due to signal %d\n", WTERMSIG(stat));
-	_exit(0);
-}
-
-void
+static void
 stty(char **args)
 {
+	USED(args);
+/*
 	char cmd[_POSIX_ARG_MAX], **p, *q, *s;
-	size_t n, siz;
+	usize n, siz;
 
 	if ((n = strlen(stty_args)) > sizeof(cmd)-1)
-		die("incorrect stty parameters\n");
+		sysfatal("incorrect stty parameters\n");
 	memcpy(cmd, stty_args, n);
 	q = cmd + n;
 	siz = sizeof(cmd) - n;
 	for (p = args; p && (s = *p); ++p) {
 		if ((n = strlen(s)) > siz-1)
-			die("stty parameter length too long\n");
+			sysfatal("stty parameter length too long\n");
 		*q++ = ' ';
 		memcpy(q, s, n);
 		q += n;
@@ -750,71 +672,22 @@
 	*q = '\0';
 	if (system(cmd) != 0)
 		perror("Couldn't call stty");
+*/
 }
 
 int
 ttynew(const char *line, char *cmd, const char *out, char **args)
 {
-	int m, s;
+	USED(line);
+	USED(cmd);
+	USED(out);
+	USED(args);
 
-	if (out) {
-		term.mode |= MODE_PRINT;
-		iofd = (!strcmp(out, "-")) ?
-			  1 : open(out, O_WRONLY | O_CREAT, 0666);
-		if (iofd < 0) {
-			fprintf(stderr, "Error opening %s:%s\n",
-				out, strerror(errno));
-		}
-	}
-
-	if (line) {
-		if ((cmdfd = open(line, O_RDWR)) < 0)
-			die("open line '%s' failed: %s\n",
-			    line, strerror(errno));
-		dup2(cmdfd, 0);
-		stty(args);
-		return cmdfd;
-	}
-
-	/* seems to work fine on linux, openbsd and freebsd */
-	if (openpty(&m, &s, NULL, NULL, NULL) < 0)
-		die("openpty failed: %s\n", strerror(errno));
-
-	switch (pid = fork()) {
-	case -1:
-		die("fork failed: %s\n", strerror(errno));
-		break;
-	case 0:
-		close(iofd);
-		close(m);
-		setsid(); /* create a new process group */
-		dup2(s, 0);
-		dup2(s, 1);
-		dup2(s, 2);
-		if (ioctl(s, TIOCSCTTY, NULL) < 0)
-			die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
-		if (s > 2)
-			close(s);
-#ifdef __OpenBSD__
-		if (pledge("stdio getpw proc exec", NULL) == -1)
-			die("pledge\n");
-#endif
-		execsh(cmd, args);
-		break;
-	default:
-#ifdef __OpenBSD__
-		if (pledge("stdio rpath tty proc", NULL) == -1)
-			die("pledge\n");
-#endif
-		close(s);
-		cmdfd = m;
-		signal(SIGCHLD, sigchld);
-		break;
-	}
-	return cmdfd;
+	/* TODO: implement this */
+	return 0;
 }
 
-size_t
+usize
 ttyread(void)
 {
 	static char buf[BUFSIZ];
@@ -826,9 +699,9 @@
 
 	switch (ret) {
 	case 0:
-		exit(0);
+		exits(nil);
 	case -1:
-		die("couldn't read from shell: %s\n", strerror(errno));
+		sysfatal("couldn't read from shell: %r\n");
 	default:
 		buflen += ret;
 		written = twrite(buf, buflen, 0);
@@ -841,7 +714,7 @@
 }
 
 void
-ttywrite(const char *s, size_t n, int may_echo)
+ttywrite(const char *s, usize n, int may_echo)
 {
 	const char *next;
 
@@ -868,12 +741,15 @@
 	}
 }
 
-void
-ttywriteraw(const char *s, size_t n)
+static void
+ttywriteraw(const char *s, usize n)
 {
+	USED(s);
+	USED(n);
+#ifdef NO
 	fd_set wfd, rfd;
-	ssize_t r;
-	size_t lim = 256;
+	susize r;
+	usize lim = 256;
 
 	/*
 	 * Remember that we are using a pty, which might be a modem line.
@@ -888,10 +764,10 @@
 		FD_SET(cmdfd, &rfd);
 
 		/* Check if we can write. */
-		if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) {
+		if (pselect(cmdfd+1, &rfd, &wfd, nil, nil, nil) < 0) {
 			if (errno == EINTR)
 				continue;
-			die("select failed: %s\n", strerror(errno));
+			sysfatal("select failed: %r\n");
 		}
 		if (FD_ISSET(cmdfd, &wfd)) {
 			/*
@@ -922,27 +798,24 @@
 	return;
 
 write_error:
-	die("write error on tty: %s\n", strerror(errno));
+	sysfatal("write error on tty: %r\n");
+#endif
 }
 
 void
 ttyresize(int tw, int th)
 {
-	struct winsize w;
-
-	w.ws_row = term.row;
-	w.ws_col = term.col;
-	w.ws_xpixel = tw;
-	w.ws_ypixel = th;
-	if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0)
-		fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno));
+	USED(tw);
+	USED(th);
+	abort();
 }
 
 void
 ttyhangup()
 {
+	/* TODO */
 	/* Send SIGHUP to shell */
-	kill(pid, SIGHUP);
+	abort();
 }
 
 int
@@ -960,13 +833,13 @@
 	return 0;
 }
 
-void
+static void
 tsetdirt(int top, int bot)
 {
 	int i;
 
-	LIMIT(top, 0, term.row-1);
-	LIMIT(bot, 0, term.row-1);
+	top = CLAMP(top, 0, term.row-1);
+	bot = CLAMP(bot, 0, term.row-1);
 
 	for (i = top; i <= bot; i++)
 		term.dirty[i] = 1;
@@ -987,13 +860,13 @@
 	}
 }
 
-void
+static void
 tfulldirt(void)
 {
 	tsetdirt(0, term.row-1);
 }
 
-void
+static void
 tcursor(int mode)
 {
 	static TCursor c[2];
@@ -1007,16 +880,18 @@
 	}
 }
 
-void
+static void
 treset(void)
 {
 	uint i;
 
-	term.c = (TCursor){{
-		.mode = ATTR_NULL,
-		.fg = defaultfg,
-		.bg = defaultbg
-	}, .x = 0, .y = 0, .state = CURSOR_DEFAULT};
+	memset(&term.c, 0, sizeof(term.c));
+	term.c.attr.mode = ATTR_NULL;
+	term.c.attr.fg = defaultfg;
+	term.c.attr.bg = defaultbg;
+	term.c.x = 0;
+	term.c.y = 0;
+	term.c.state = CURSOR_DEFAULT;
 
 	memset(term.tabs, 0, term.col * sizeof(*term.tabs));
 	for (i = tabspaces; i < term.col; i += tabspaces)
@@ -1038,12 +913,14 @@
 void
 tnew(int col, int row)
 {
-	term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } };
+	memset(&term, 0, sizeof(term));
+	term.c.attr.fg = defaultfg;
+	term.c.attr.bg = defaultbg;
 	tresize(col, row);
 	treset();
 }
 
-void
+static void
 tswapscreen(void)
 {
 	Line *tmp = term.line;
@@ -1054,13 +931,13 @@
 	tfulldirt();
 }
 
-void
+static void
 tscrolldown(int orig, int n)
 {
 	int i;
 	Line temp;
 
-	LIMIT(n, 0, term.bot-orig+1);
+	n = CLAMP(n, 0, term.bot-orig+1);
 
 	tsetdirt(orig, term.bot-n);
 	tclearregion(0, term.bot-n+1, term.col-1, term.bot);
@@ -1074,13 +951,13 @@
 	selscroll(orig, n);
 }
 
-void
+static void
 tscrollup(int orig, int n)
 {
 	int i;
 	Line temp;
 
-	LIMIT(n, 0, term.bot-orig+1);
+	n = CLAMP(n, 0, term.bot-orig+1);
 
 	tclearregion(0, orig, term.col-1, orig+n-1);
 	tsetdirt(orig+n, term.bot);
@@ -1094,7 +971,7 @@
 	selscroll(orig, -n);
 }
 
-void
+static void
 selscroll(int orig, int n)
 {
 	if (sel.ob.x == -1)
@@ -1114,7 +991,7 @@
 	}
 }
 
-void
+static void
 tnewline(int first_col)
 {
 	int y = term.c.y;
@@ -1127,7 +1004,7 @@
 	tmoveto(first_col ? 0 : term.c.x, y);
 }
 
-void
+static void
 csiparse(void)
 {
 	char *p = csiescseq.buf, *np;
@@ -1141,7 +1018,7 @@
 
 	csiescseq.buf[csiescseq.len] = '\0';
 	while (p < csiescseq.buf+csiescseq.len) {
-		np = NULL;
+		np = nil;
 		v = strtol(p, &np, 10);
 		if (np == p)
 			v = 0;
@@ -1158,13 +1035,13 @@
 }
 
 /* for absolute user moves, when decom is set */
-void
+static void
 tmoveato(int x, int y)
 {
 	tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0));
 }
 
-void
+static void
 tmoveto(int x, int y)
 {
 	int miny, maxy;
@@ -1177,11 +1054,11 @@
 		maxy = term.row - 1;
 	}
 	term.c.state &= ~CURSOR_WRAPNEXT;
-	term.c.x = LIMIT(x, 0, term.col-1);
-	term.c.y = LIMIT(y, miny, maxy);
+	term.c.x = CLAMP(x, 0, term.col-1);
+	term.c.y = CLAMP(y, miny, maxy);
 }
 
-void
+static void
 tsetchar(Rune u, const Glyph *attr, int x, int y)
 {
 	static const char *vt100_0[62] = { /* 0x41 - 0x7e */
@@ -1217,7 +1094,7 @@
 	term.line[y][x].u = u;
 }
 
-void
+static void
 tclearregion(int x1, int y1, int x2, int y2)
 {
 	int x, y, temp;
@@ -1228,10 +1105,10 @@
 	if (y1 > y2)
 		temp = y1, y1 = y2, y2 = temp;
 
-	LIMIT(x1, 0, term.col-1);
-	LIMIT(x2, 0, term.col-1);
-	LIMIT(y1, 0, term.row-1);
-	LIMIT(y2, 0, term.row-1);
+	x1 = CLAMP(x1, 0, term.col-1);
+	x2 = CLAMP(x2, 0, term.col-1);
+	y1 = CLAMP(y1, 0, term.row-1);
+	y2 = CLAMP(y2, 0, term.row-1);
 
 	for (y = y1; y <= y2; y++) {
 		term.dirty[y] = 1;
@@ -1247,13 +1124,13 @@
 	}
 }
 
-void
+static void
 tdeletechar(int n)
 {
 	int dst, src, size;
 	Glyph *line;
 
-	LIMIT(n, 0, term.col - term.c.x);
+	n = CLAMP(n, 0, term.col - term.c.x);
 
 	dst = term.c.x;
 	src = term.c.x + n;
@@ -1264,13 +1141,13 @@
 	tclearregion(term.col-n, term.c.y, term.col-1, term.c.y);
 }
 
-void
+static void
 tinsertblank(int n)
 {
 	int dst, src, size;
 	Glyph *line;
 
-	LIMIT(n, 0, term.col - term.c.x);
+	n = CLAMP(n, 0, term.col - term.c.x);
 
 	dst = term.c.x + n;
 	src = term.c.x;
@@ -1281,7 +1158,7 @@
 	tclearregion(src, term.c.y, dst - 1, term.c.y);
 }
 
-void
+static void
 tinsertblankline(int n)
 {
 	if (BETWEEN(term.c.y, term.top, term.bot))
@@ -1288,7 +1165,7 @@
 		tscrolldown(term.c.y, n);
 }
 
-void
+static void
 tdeleteline(int n)
 {
 	if (BETWEEN(term.c.y, term.top, term.bot))
@@ -1295,16 +1172,16 @@
 		tscrollup(term.c.y, n);
 }
 
-int32_t
+static long
 tdefcolor(const int *attr, int *npar, int l)
 {
-	int32_t idx = -1;
+	long idx = -1;
 	uint r, g, b;
 
 	switch (attr[*npar + 1]) {
 	case 2: /* direct color in RGB space */
 		if (*npar + 4 >= l) {
-			fprintf(stderr,
+			fprint(2,
 				"erresc(38): Incorrect number of parameters (%d)\n",
 				*npar);
 			break;
@@ -1314,7 +1191,7 @@
 		b = attr[*npar + 4];
 		*npar += 4;
 		if (!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255))
-			fprintf(stderr, "erresc: bad rgb color (%u,%u,%u)\n",
+			fprint(2, "erresc: bad rgb color (%ud,%ud,%ud)\n",
 				r, g, b);
 		else
 			idx = TRUECOLOR(r, g, b);
@@ -1321,7 +1198,7 @@
 		break;
 	case 5: /* indexed color */
 		if (*npar + 2 >= l) {
-			fprintf(stderr,
+			fprint(2,
 				"erresc(38): Incorrect number of parameters (%d)\n",
 				*npar);
 			break;
@@ -1328,7 +1205,7 @@
 		}
 		*npar += 2;
 		if (!BETWEEN(attr[*npar], 0, 255))
-			fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]);
+			fprint(2, "erresc: bad fgcolor %d\n", attr[*npar]);
 		else
 			idx = attr[*npar];
 		break;
@@ -1337,7 +1214,7 @@
 	case 3: /* direct color in CMY space */
 	case 4: /* direct color in CMYK space */
 	default:
-		fprintf(stderr,
+		fprint(2,
 		        "erresc(38): gfx attr %d unknown\n", attr[*npar]);
 		break;
 	}
@@ -1345,11 +1222,11 @@
 	return idx;
 }
 
-void
+static void
 tsetattr(const int *attr, int l)
 {
 	int i;
-	int32_t idx;
+	long idx;
 
 	for (i = 0; i < l; i++) {
 		switch (attr[i]) {
@@ -1437,7 +1314,7 @@
 			} else if (BETWEEN(attr[i], 100, 107)) {
 				term.c.attr.bg = attr[i] - 100 + 8;
 			} else {
-				fprintf(stderr,
+				fprint(2,
 					"erresc(default): gfx attr %d unknown\n",
 					attr[i]);
 				csidump();
@@ -1447,13 +1324,13 @@
 	}
 }
 
-void
+static void
 tsetscroll(int t, int b)
 {
 	int temp;
 
-	LIMIT(t, 0, term.row-1);
-	LIMIT(b, 0, term.row-1);
+	t = CLAMP(t, 0, term.row-1);
+	b = CLAMP(b, 0, term.row-1);
 	if (t > b) {
 		temp = t;
 		t = b;
@@ -1463,7 +1340,7 @@
 	term.bot = b;
 }
 
-void
+static void
 tsetmode(int priv, int set, const int *args, int narg)
 {
 	int alt; const int *lim;
@@ -1562,7 +1439,7 @@
 				      codes. */
 				break;
 			default:
-				fprintf(stderr,
+				fprint(2,
 					"erresc: unknown private set/reset mode %d\n",
 					*args);
 				break;
@@ -1584,7 +1461,7 @@
 				MODBIT(term.mode, set, MODE_CRLF);
 				break;
 			default:
-				fprintf(stderr,
+				fprint(2,
 					"erresc: unknown set/reset mode %d\n",
 					*args);
 				break;
@@ -1593,7 +1470,7 @@
 	}
 }
 
-void
+static void
 csihandle(void)
 {
 	char buf[40];
@@ -1602,9 +1479,9 @@
 	switch (csiescseq.mode[0]) {
 	default:
 	unknown:
-		fprintf(stderr, "erresc: unknown csi ");
+		fprint(2, "erresc: unknown csi ");
 		csidump();
-		/* die(""); */
+		/* sysfatal(""); */
 		break;
 	case '@': /* ICH -- Insert <n> blank char */
 		DEFAULT(csiescseq.arg[0], 1);
@@ -1771,7 +1648,7 @@
 		break;
 	case 'n': /* DSR – Device Status Report (cursor position) */
 		if (csiescseq.arg[0] == 6) {
-			len = snprintf(buf, sizeof(buf), "\033[%i;%iR",
+			len = snprint(buf, sizeof(buf), "\033[%d;%dR",
 					term.c.y+1, term.c.x+1);
 			ttywrite(buf, len, 0);
 		}
@@ -1805,37 +1682,37 @@
 	}
 }
 
-void
+static void
 csidump(void)
 {
-	size_t i;
+	usize i;
 	uint c;
 
-	fprintf(stderr, "ESC[");
+	fprint(2, "ESC[");
 	for (i = 0; i < csiescseq.len; i++) {
 		c = csiescseq.buf[i] & 0xff;
 		if (isprint(c)) {
-			putc(c, stderr);
+			fprint(2, "%c",c);
 		} else if (c == '\n') {
-			fprintf(stderr, "(\\n)");
+			fprint(2, "(\\n)");
 		} else if (c == '\r') {
-			fprintf(stderr, "(\\r)");
+			fprint(2, "(\\r)");
 		} else if (c == 0x1b) {
-			fprintf(stderr, "(\\e)");
+			fprint(2, "(\\e)");
 		} else {
-			fprintf(stderr, "(%02x)", c);
+			fprint(2, "(%02x)", c);
 		}
 	}
-	putc('\n', stderr);
+	fprint(2, "\n");
 }
 
-void
+static void
 csireset(void)
 {
 	memset(&csiescseq, 0, sizeof(csiescseq));
 }
 
-void
+static void
 osc_color_response(int num, int index, int is_osc4)
 {
 	int n;
@@ -1843,16 +1720,16 @@
 	unsigned char r, g, b;
 
 	if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) {
-		fprintf(stderr, "erresc: failed to fetch %s color %d\n",
+		fprint(2, "erresc: failed to fetch %s color %d\n",
 		        is_osc4 ? "osc4" : "osc",
 		        is_osc4 ? num : index);
 		return;
 	}
 
-	n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
+	n = snprint(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
 	             is_osc4 ? "4;" : "", num, r, r, g, g, b, b);
 	if (n < 0 || n >= sizeof(buf)) {
-		fprintf(stderr, "error: %s while printing %s response\n",
+		fprint(2, "error: %s while printing %s response\n",
 		        n < 0 ? "snprintf failed" : "truncation occurred",
 		        is_osc4 ? "osc4" : "osc");
 	} else {
@@ -1860,10 +1737,10 @@
 	}
 }
 
-void
+static void
 strhandle(void)
 {
-	char *p = NULL, *dec;
+	char *p = nil, *dec;
 	int j, narg, par;
 	const struct { int idx; char *str; } osc_table[] = {
 		{ defaultfg, "foreground" },
@@ -1899,7 +1776,7 @@
 					xsetsel(dec);
 					xclipcopy();
 				} else {
-					fprintf(stderr, "erresc: invalid base64\n");
+					fprint(2, "erresc: invalid base64\n");
 				}
 			}
 			return;
@@ -1915,7 +1792,7 @@
 			if (!strcmp(p, "?")) {
 				osc_color_response(par, osc_table[j].idx, 0);
 			} else if (xsetcolorname(osc_table[j].idx, p)) {
-				fprintf(stderr, "erresc: invalid %s color: %s\n",
+				fprint(2, "erresc: invalid %s color: %s\n",
 				        osc_table[j].str, p);
 			} else {
 				tfulldirt();
@@ -1934,7 +1811,7 @@
 			} else if (xsetcolorname(j, p)) {
 				if (par == 104 && narg <= 1)
 					return; /* color reset without parameter */
-				fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
+				fprint(2, "erresc: invalid color j=%d, p=%s\n",
 				        j, p ? p : "(null)");
 			} else {
 				/*
@@ -1955,11 +1832,11 @@
 		return;
 	}
 
-	fprintf(stderr, "erresc: unknown str ");
+	fprint(2, "erresc: unknown str ");
 	strdump();
 }
 
-void
+static void
 strparse(void)
 {
 	int c;
@@ -1981,53 +1858,54 @@
 	}
 }
 
-void
+static void
 strdump(void)
 {
-	size_t i;
+	usize i;
 	uint c;
 
-	fprintf(stderr, "ESC%c", strescseq.type);
+	fprint(2, "ESC%c", strescseq.type);
 	for (i = 0; i < strescseq.len; i++) {
 		c = strescseq.buf[i] & 0xff;
 		if (c == '\0') {
-			putc('\n', stderr);
+			fprint(2, "\n");
 			return;
 		} else if (isprint(c)) {
-			putc(c, stderr);
+			fprint(2, "%c", c);
 		} else if (c == '\n') {
-			fprintf(stderr, "(\\n)");
+			fprint(2, "(\\n)");
 		} else if (c == '\r') {
-			fprintf(stderr, "(\\r)");
+			fprint(2, "(\\r)");
 		} else if (c == 0x1b) {
-			fprintf(stderr, "(\\e)");
+			fprint(2, "(\\e)");
 		} else {
-			fprintf(stderr, "(%02x)", c);
+			fprint(2, "(%02x)", c);
 		}
 	}
-	fprintf(stderr, "ESC\\\n");
+	fprint(2, "ESC\\\n");
 }
 
-void
+static void
 strreset(void)
 {
-	strescseq = (STREscape){
-		.buf = xrealloc(strescseq.buf, STR_BUF_SIZ),
-		.siz = STR_BUF_SIZ,
-	};
+	memset(&strescseq, 0, sizeof(strescseq));
+	strescseq.buf = xrealloc(strescseq.buf, STR_BUF_SIZ);
+	strescseq.siz = STR_BUF_SIZ;
 }
 
 void
 sendbreak(const Arg *arg)
 {
-	if (tcsendbreak(cmdfd, 0))
-		perror("Error sending break");
+	USED(arg);
+
+	/* TODO */
+	abort();
 }
 
-void
-tprinter(char *s, size_t len)
+static void
+tprinter(char *s, usize len)
 {
-	if (iofd != -1 && xwrite(iofd, s, len) < 0) {
+	if (iofd != -1 && write(iofd, s, len) < 0) {
 		perror("Error writing to output file");
 		close(iofd);
 		iofd = -1;
@@ -2037,6 +1915,7 @@
 void
 toggleprinter(const Arg *arg)
 {
+	USED(arg);
 	term.mode ^= MODE_PRINT;
 }
 
@@ -2043,6 +1922,7 @@
 void
 printscreen(const Arg *arg)
 {
+	USED(arg);
 	tdump();
 }
 
@@ -2049,10 +1929,11 @@
 void
 printsel(const Arg *arg)
 {
+	USED(arg);
 	tdumpsel();
 }
 
-void
+static void
 tdumpsel(void)
 {
 	char *ptr;
@@ -2063,7 +1944,7 @@
 	}
 }
 
-void
+static void
 tdumpline(int n)
 {
 	char buf[UTF_SIZ];
@@ -2078,7 +1959,7 @@
 	tprinter("\n", 1);
 }
 
-void
+static void
 tdump(void)
 {
 	int i;
@@ -2087,7 +1968,7 @@
 		tdumpline(i);
 }
 
-void
+static void
 tputtab(int n)
 {
 	uint x = term.c.x;
@@ -2101,10 +1982,10 @@
 			for (--x; x > 0 && !term.tabs[x]; --x)
 				/* nothing */ ;
 	}
-	term.c.x = LIMIT(x, 0, term.col-1);
+	term.c.x = CLAMP(x, 0, term.col-1);
 }
 
-void
+static void
 tdefutf8(char ascii)
 {
 	if (ascii == 'G')
@@ -2113,7 +1994,7 @@
 		term.mode &= ~MODE_UTF8;
 }
 
-void
+static void
 tdeftran(char ascii)
 {
 	static char cs[] = "0B";
@@ -2120,14 +2001,14 @@
 	static int vcs[] = {CS_GRAPHIC0, CS_USA};
 	char *p;
 
-	if ((p = strchr(cs, ascii)) == NULL) {
-		fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii);
+	if ((p = strchr(cs, ascii)) == nil) {
+		fprint(2, "esc unhandled charset: ESC ( %c\n", ascii);
 	} else {
 		term.trantbl[term.icharset] = vcs[p - cs];
 	}
 }
 
-void
+static void
 tdectest(char c)
 {
 	int x, y;
@@ -2140,7 +2021,7 @@
 	}
 }
 
-void
+static void
 tstrsequence(uchar c)
 {
 	switch (c) {
@@ -2162,7 +2043,7 @@
 	term.esc |= ESC_STR;
 }
 
-void
+static void
 tcontrolcode(uchar ascii)
 {
 	switch (ascii) {
@@ -2263,7 +2144,7 @@
  * returns 1 when the sequence is finished and it hasn't to read
  * more characters for this sequence, otherwise 0
  */
-int
+static int
 eschandle(uchar ascii)
 {
 	switch (ascii) {
@@ -2339,7 +2220,7 @@
 			strhandle();
 		break;
 	default:
-		fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n",
+		fprint(2, "erresc: unknown sequence ESC 0x%02X '%c'\n",
 			(uchar) ascii, isprint(ascii)? ascii:'.');
 		break;
 	}
@@ -2346,7 +2227,17 @@
 	return 1;
 }
 
-void
+static int
+wcwidth(Rune u)
+{
+	USED(u);
+
+	/* TODO */
+
+	return 1;
+}
+
+static void
 tputc(Rune u)
 {
 	char c[UTF_SIZ];
@@ -2354,6 +2245,7 @@
 	int width, len;
 	Glyph *gp;
 
+	width = 0;
 	control = ISCONTROL(u);
 	if (u < 127 || !IS_SET(MODE_UTF8)) {
 		c[0] = u;
@@ -2424,7 +2316,7 @@
 		if (term.esc & ESC_CSI) {
 			csiescseq.buf[csiescseq.len++] = u;
 			if (BETWEEN(u, 0x40, 0x7E)
-					|| csiescseq.len >= \
+					|| csiescseq.len >=
 					sizeof(csiescseq.buf)-1) {
 				term.esc = 0;
 				csiparse();
@@ -2488,7 +2380,7 @@
 	}
 }
 
-int
+static int
 twrite(const char *buf, int buflen, int show_ctrl)
 {
 	int charsize;
@@ -2530,8 +2422,8 @@
 	TCursor c;
 
 	if (col < 1 || row < 1) {
-		fprintf(stderr,
-		        "tresize: error resizing to %dx%d\n", col, row);
+		fprint(2,
+		       "tresize: error resizing to %dx%d\n", col, row);
 		return;
 	}
 
@@ -2544,7 +2436,7 @@
 		free(term.line[i]);
 		free(term.alt[i]);
 	}
-	/* ensure that both src and dst are not NULL */
+	/* ensure that both src and dst are not nil */
 	if (i > 0) {
 		memmove(term.line, term.line + i, row * sizeof(Line));
 		memmove(term.alt, term.alt + i, row * sizeof(Line));
@@ -2605,10 +2497,10 @@
 void
 resettitle(void)
 {
-	xsettitle(NULL);
+	xsettitle(nil);
 }
 
-void
+static void
 drawregion(int x1, int y1, int x2, int y2)
 {
 	int y;
@@ -2623,7 +2515,7 @@
 }
 
 void
-draw(void)
+tdraw(void)
 {
 	int cx = term.c.x, ocx = term.ocx, ocy = term.ocy;
 
@@ -2631,8 +2523,8 @@
 		return;
 
 	/* adjust cursor position */
-	LIMIT(term.ocx, 0, term.col-1);
-	LIMIT(term.ocy, 0, term.row-1);
+	term.ocx = CLAMP(term.ocx, 0, term.col-1);
+	term.ocy = CLAMP(term.ocy, 0, term.row-1);
 	if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY)
 		term.ocx--;
 	if (term.line[term.c.y][cx].mode & ATTR_WDUMMY)
@@ -2652,5 +2544,5 @@
 redraw(void)
 {
 	tfulldirt();
-	draw();
+	tdraw();
 }
--- a/st.h
+++ b/st.h
@@ -1,8 +1,5 @@
 /* See LICENSE for license details. */
 
-#include <stdint.h>
-#include <sys/types.h>
-
 /* macros */
 #define MIN(a, b)		((a) < (b) ? (a) : (b))
 #define MAX(a, b)		((a) < (b) ? (b) : (a))
@@ -10,7 +7,7 @@
 #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b))
 #define DIVCEIL(n, d)		(((n) + ((d) - 1)) / (d))
 #define DEFAULT(a, b)		(a) = (a) ? (a) : (b)
-#define LIMIT(x, a, b)		(x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
+#define CLAMP(x, a,b)       (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
 #define ATTRCMP(a, b)		((a).mode != (b).mode || (a).fg != (b).fg || \
 				(a).bg != (b).bg)
 #define TIMEDIFF(t1, t2)	((t1.tv_sec-t2.tv_sec)*1000 + \
@@ -57,14 +54,12 @@
 typedef unsigned long ulong;
 typedef unsigned short ushort;
 
-typedef uint_least32_t Rune;
-
 #define Glyph Glyph_
 typedef struct {
 	Rune u;           /* character code */
 	ushort mode;      /* attribute flags */
-	uint32_t fg;      /* foreground  */
-	uint32_t bg;      /* background  */
+	ulong fg;         /* foreground  */
+	ulong bg;         /* background  */
 } Glyph;
 
 typedef Glyph *Line;
@@ -92,9 +87,9 @@
 void tsetdirtattr(int);
 void ttyhangup(void);
 int ttynew(const char *, char *, const char *, char **);
-size_t ttyread(void);
+usize ttyread(void);
 void ttyresize(int, int);
-void ttywrite(const char *, size_t, int);
+void ttywrite(const char *, usize, int);
 
 void resettitle(void);
 
@@ -105,10 +100,10 @@
 int selected(int, int);
 char *getsel(void);
 
-size_t utf8encode(Rune, char *);
+usize utf8encode(Rune, char *);
 
-void *xmalloc(size_t);
-void *xrealloc(void *, size_t);
+void *xmalloc(usize);
+void *xrealloc(void *, usize);
 char *xstrdup(const char *);
 
 /* config.h globals */
@@ -116,7 +111,7 @@
 extern char *scroll;
 extern char *stty_args;
 extern char *vtiden;
-extern wchar_t *worddelimiters;
+extern Rune *worddelimiters;
 extern int allowaltscreen;
 extern int allowwindowops;
 extern char *termname;
--- a/win.h
+++ b/win.h
@@ -19,8 +19,7 @@
 	MODE_MOUSEMANY   = 1 << 15,
 	MODE_BRCKTPASTE  = 1 << 16,
 	MODE_NUMLOCK     = 1 << 17,
-	MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
-	                  |MODE_MOUSEMANY,
+	MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10|MODE_MOUSEMANY,
 };
 
 void xbell(void);
--- /dev/null
+++ b/x.c
@@ -1,0 +1,89 @@
+#include <u.h>
+#include <libc.h>
+
+#include "st.h"
+#include "win.h"
+
+void
+xbell(void)
+{
+}
+
+void
+xclipcopy(void)
+{
+}
+
+void
+xdrawcursor(int, int, Glyph, int, int, Glyph)
+{
+}
+
+void
+xdrawline(Line, int, int, int)
+{
+}
+
+void
+xfinishdraw(void)
+{
+}
+
+void
+xloadcols(void)
+{
+}
+
+int
+xsetcolorname(int, const char *)
+{
+	return 0;
+}
+
+int
+xgetcolor(int, unsigned char *, unsigned char *, unsigned char *)
+{
+	return 0;
+}
+
+void
+xseticontitle(char *)
+{
+}
+
+void
+xsettitle(char *)
+{
+}
+
+int
+xsetcursor(int)
+{
+	return 0;
+}
+
+void
+xsetmode(int, unsigned int)
+{
+}
+
+void
+xsetpointermotion(int)
+{
+}
+
+void
+xsetsel(char *)
+{
+}
+
+int
+xstartdraw(void)
+{
+	return 0;
+}
+
+void
+xximspot(int, int)
+{
+}