#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ctype.h>

enum
{
	Unbsp = 0x00A0,
	Uprivate = 0xF000,
	Uempty,	/* \& */
	Uamp,	/* raw & */
	Ult,		/* raw < */
	Ugt,		/* raw > */
	Utick,	/* raw ' */
	Ubtick,	/* raw ` */
	Uminus,	/* raw - */
	Uspace,	/* raw space */
	Upl,		/* symbol + */
	Ueq,		/* symbol = */
	Umi,		/* symbol - */
	Uformatted,	/* start diverted output */
	Uunformatted,	/* end diverted output */

	UPI = 720,	/* units per inch */
	UPX = 10,	/* units per pixel */

	/* special input modes */
	CopyMode = 1<<1,
	ExpandMode = 1<<2,
	ArgMode = 1<<3,
	HtmlMode = 1<<4,

	MaxLine = 1024,

	MAXIF = 20
};

Rune*	L(char*);

void		addesc(Rune, int (*)(void), int);
void		addraw(Rune*, void(*)(Rune*));
void		addreq(Rune*, void(*)(int, Rune**), int);
void		af(Rune*, Rune*);
void		as(Rune*, Rune*);
void		br(void);
void		closehtml(void);
Rune*	copyarg(void);
void		delraw(Rune*);
void		delreq(Rune*);
void		ds(Rune*, Rune*);
int		dv(int);
int		e_nop(void);
int		e_warn(void);
void*	emalloc(uint);
void*	erealloc(void*, uint);
Rune*	erunesmprint(char*, ...);
Rune*	erunestrdup(Rune*);
char*	esmprint(char*, ...);
char*	estrdup(char*);
int		eval(Rune*);
int		evalscale(Rune*, int);
Rune*	getname(void);
int		getnext(void);
Rune*	getds(Rune*);
Rune*	_getnr(Rune*);
int		getnr(Rune*);
int		getnrr(Rune*);
int		getrune(void);
Rune*	getqarg(void);
Rune*	getline(void);
void		hideihtml(void);
void		html(Rune*, Rune*);
void		htmlinit(void);
void		ihtml(Rune*, Rune*);
void		inputnotify(void(*)(void));
void		itrap(void);
void		itrapset(void);
int		linefmt(Fmt*);
void		nr(Rune*, int);
void		_nr(Rune*, Rune*);
void		out(Rune*);
extern void		(*outcb)(Rune);
void		outhtml(Rune*);
void		outrune(Rune);
void		outtrap(void);
int		popinput(void);
void		printds(int);
int		pushinputfile(Rune*);
void		pushinputstring(Rune*);
int		pushstdin(void);
int		queueinputfile(Rune*);
int		queuestdin(void);
void		r_nop(int, Rune**);
void		r_warn(int, Rune**);
Rune	*readline(int);
void		reitag(void);
void		renraw(Rune*, Rune*);
void		renreq(Rune*, Rune*);
void		run(void);
void		runinput(void);
int		runmacro(int, int, Rune**);
void		runmacro1(Rune*);
Rune*	rune2html(Rune);
void		setlinenumber(Rune*, int);
void		showihtml(void);
void		sp(int);
void		t1init(void);
void		t2init(void);
void		t3init(void);
void		t4init(void);
void		t5init(void);
void		t6init(void);
void		t7init(void);
void		t8init(void);
void		t9init(void);
void		t10init(void);
void		t11init(void);
void		t12init(void);
void		t13init(void);
void		t14init(void);
void		t15init(void);
void		t16init(void);
void		t17init(void);
void		t18init(void);
void		t19init(void);
void		t20init(void);
Rune	troff2rune(Rune*);
void		unfont(void);
void		ungetnext(Rune);
void		ungetrune(Rune);
void		unitag(void);
void		warn(char*, ...);

extern	int		backslash;
extern	int		bol;
extern	Biobuf	bout;
extern	int		broke;
extern	int		dot;
extern	int		inputmode;
extern	int		inrequest;
extern	int		tick;
extern	int		utf8;
extern	int		verbose;
extern	int		linepos;

#define	runemalloc(n)	(Rune*)emalloc((n)*sizeof(Rune))
#define	runerealloc(r, n)	(Rune*)erealloc(r, (n)*sizeof(Rune))
#define	runemove(a, b, n)	memmove(a, b, (n)*sizeof(Rune))

#pragma varargck type "L" void
