
// UTILS
typedef struct List List;
typedef struct Strlist Strlist;

// List of integers (and also generic list with next pointer at beginning)
struct List
{
	List*	next;
	int	val;
};

struct Strlist
{
	Strlist*	next;
	Rune*	val;
};

extern int		_inclass(Rune c, Rune* cl);
extern int		_listlen(List* l);
extern Rune*	_ltoStr(int n);
extern List*	_newlist(int val, List* rest);
extern Rune*	_newstr(int n);
extern int		_prefix(Rune* pre, Rune* s);
extern List*	_revlist(List* l);
extern void	_splitl(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2);
extern void	_splitr(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2);
extern int		_splitall(Rune* s, int n, Rune* cl, Rune** strarr, int* lenarr, int alen);
extern Rune*	_Stradd(Rune*s1, Rune* s2, int n);
extern Rune*	_Strclass(Rune* s, Rune* cl);
extern int		_Strcmp(Rune* s1, Rune* s2);
extern Rune*	_Strdup(Rune* s);
extern Rune*	_Strdup2(Rune* s, Rune* t);
extern int		_Streqn(Rune* s1, int n1, Rune* s2);
extern int		_Strlen(Rune* s);
extern Rune*	_Strnclass(Rune* s, Rune* cl, int n);
extern int		_Strncmpci(Rune* s1, int n1, Rune* s2);
extern Rune*	_Strndup(Rune* s, int n);
extern Rune*	_Strnrclass(Rune* s, Rune* cl, int n);
extern Rune*	_Strrclass(Rune* s, Rune* cl);
extern Rune*	_Strsubstr(Rune* s, int start, int stop);
extern long	_Strtol(Rune* s, Rune** eptr, int base);
extern void	_trimwhite(Rune* s, int n, Rune** pans, int* panslen);

extern Rune	notwhitespace[];
extern Rune	whitespace[];

// STRINTTAB
typedef struct StringInt StringInt;

// Element of String-Int table (used for keyword lookup)
struct StringInt
{
	Rune*	key;
	int	val;
};

extern int			_lookup(StringInt* t, int n, Rune* key, int keylen, int* pans);
extern StringInt*	_makestrinttab(Rune** a, int n);
extern Rune*		_revlookup(StringInt* t, int n, int val);

// Colors, in html format, not Plan 9 format.  (RGB values in bottom 3 bytes)
enum {
	White = 0xFFFFFF,
	Black = 0x000000,
	Blue = 0x0000CC,
};

// LEX

// HTML 4.0 tags (plus blink, nobr)
// sorted in lexical order; used as array indices
enum {
	Notfound,
	Comment,
	Ta, Tabbr, Tacronym, Taddress, Tapplet, Tarea,
	Tb, Tbase, Tbasefont, Tbdo, Tbig, Tblink,
	Tblockquote, Tbody, Tbq, Tbr, Tbutton,
	Tcaption, Tcenter, Tcite, Tcode, Tcol, Tcolgroup,
	Tdd, Tdel, Tdfn, Tdir, Tdiv, Tdl, Tdt,
	Tem,
	Tfieldset, Tfont, Tform, Tframe, Tframeset,
	Th1, Th2, Th3, Th4, Th5, Th6,
	Thead, Thr, Thtml,
	Ti, Tiframe, Timg, Tinput, Tins, Tisindex,
	Tkbd,
	Tlabel, Tlegend, Tli, Tlink,
	Tmap, Tmenu, Tmeta,
	Tnobr, Tnoframes, Tnoscript,
	Tobject, Tol, Toptgroup, Toption,
	Tp, Tparam, Tpre,
	Tq,
	Ts, Tsamp, Tscript, Tselect, Tsmall,
	Tspan, Tstrike, Tstrong, Tstyle, Tsub, Tsup,
	Ttable, Ttbody, Ttd, Ttextarea, Ttfoot,
	Tth, Tthead, Ttitle, Ttr, Ttt,
	Tu, Tul,
	Tvar,
	Numtags,
	RBRA = Numtags,
	Data = Numtags+RBRA
};

// HTML 4.0 tag attributes
// Keep sorted in lexical order
enum {
	Aabbr, Aaccept_charset, Aaccess_key, Aaction,
	Aalign, Aalink, Aalt, Aarchive, Aaxis,
	Abackground, Abgcolor, Aborder,
	Acellpadding, Acellspacing, Achar, Acharoff,
	Acharset, Achecked, Acite, Aclass, Aclassid,
	Aclear, Acode, Acodebase, Acodetype, Acolor,
	Acols, Acolspan, Acompact, Acontent, Acoords,
	Adata, Adatetime, Adeclare, Adefer, Adir, Adisabled,
	Aenctype,
	Aface, Afor, Aframe, Aframeborder,
	Aheaders, Aheight, Ahref, Ahreflang, Ahspace, Ahttp_equiv,
	Aid, Aismap,
	Alabel, Alang, Alink, Alongdesc,
	Amarginheight, Amarginwidth, Amaxlength,
	Amedia, Amethod, Amultiple,
	Aname, Anohref, Anoresize, Anoshade, Anowrap,
	Aobject, Aonblur, Aonchange, Aonclick, Aondblclick,
	Aonfocus, Aonkeypress, Aonkeyup, Aonload,
	Aonmousedown, Aonmousemove, Aonmouseout,
	Aonmouseover, Aonmouseup, Aonreset, Aonselect,
	Aonsubmit, Aonunload,
	Aprofile, Aprompt,
	Areadonly, Arel, Arev, Arows, Arowspan, Arules,
	Ascheme, Ascope, Ascrolling, Aselected, Ashape,
	Asize, Aspan, Asrc, Astandby, Astart, Astyle, Asummary,
	Atabindex, Atarget, Atext, Atitle, Atype,
	Ausemap,
	Avalign, Avalue, Avaluetype, Aversion, Avlink, Avspace,
	Awidth,
	Numattrs
};

struct Attr
{
	Attr*		next;		// in list of attrs for a token
	int		attid;		// Aabbr, etc.
	Rune*	value;
};

struct Token
{
	int		tag;		// Ta, etc
	Rune*	text;		// text in Data, attribute text in tag
	Attr*		attr;		// list of Attrs
	int		starti;	// index into source buffer of token start
};

extern Rune**	tagnames;
extern Rune**	attrnames;

extern void	_freetokens(Token* tarray, int n);
extern Token*	_gettoks(uchar* data, int datalen, int chset, int mtype, int* plen);
extern int		_tokaval(Token* t, int attid, Rune** pans, int xfer);

/* #pragma varargck	type "T"	Token* */

#include "runetab.h"
