19a747e4fSDavid du Colombier 29a747e4fSDavid du Colombier // UTILS 39a747e4fSDavid du Colombier typedef struct List List; 49a747e4fSDavid du Colombier typedef struct Strlist Strlist; 59a747e4fSDavid du Colombier 69a747e4fSDavid du Colombier // List of integers (and also generic list with next pointer at beginning) 79a747e4fSDavid du Colombier struct List 89a747e4fSDavid du Colombier { 99a747e4fSDavid du Colombier List* next; 109a747e4fSDavid du Colombier int val; 119a747e4fSDavid du Colombier }; 129a747e4fSDavid du Colombier 139a747e4fSDavid du Colombier struct Strlist 149a747e4fSDavid du Colombier { 159a747e4fSDavid du Colombier Strlist* next; 169a747e4fSDavid du Colombier Rune* val; 179a747e4fSDavid du Colombier }; 189a747e4fSDavid du Colombier 199a747e4fSDavid du Colombier extern int _inclass(Rune c, Rune* cl); 209a747e4fSDavid du Colombier extern int _listlen(List* l); 219a747e4fSDavid du Colombier extern List* _newlist(int val, List* rest); 229a747e4fSDavid du Colombier extern Rune* _newstr(int n); 239a747e4fSDavid du Colombier extern int _prefix(Rune* pre, Rune* s); 249a747e4fSDavid du Colombier extern List* _revlist(List* l); 259a747e4fSDavid du Colombier extern void _splitl(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2); 269a747e4fSDavid du Colombier extern void _splitr(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2); 279a747e4fSDavid du Colombier extern int _splitall(Rune* s, int n, Rune* cl, Rune** strarr, int* lenarr, int alen); 289a747e4fSDavid du Colombier extern Rune* _Stradd(Rune*s1, Rune* s2, int n); 299a747e4fSDavid du Colombier extern Rune* _Strclass(Rune* s, Rune* cl); 30*5d459b5aSDavid du Colombier extern int _Strcmp(Rune* s1, Rune* s2); 319a747e4fSDavid du Colombier extern Rune* _Strdup(Rune* s); 329a747e4fSDavid du Colombier extern Rune* _Strdup2(Rune* s, Rune* t); 339a747e4fSDavid du Colombier extern int _Streqn(Rune* s1, int n1, Rune* s2); 34*5d459b5aSDavid du Colombier extern int _Strlen(Rune* s); 359a747e4fSDavid du Colombier extern Rune* _Strnclass(Rune* s, Rune* cl, int n); 369a747e4fSDavid du Colombier extern int _Strncmpci(Rune* s1, int n1, Rune* s2); 379a747e4fSDavid du Colombier extern Rune* _Strndup(Rune* s, int n); 389a747e4fSDavid du Colombier extern Rune* _Strnrclass(Rune* s, Rune* cl, int n); 399a747e4fSDavid du Colombier extern Rune* _Strrclass(Rune* s, Rune* cl); 409a747e4fSDavid du Colombier extern Rune* _Strsubstr(Rune* s, int start, int stop); 419a747e4fSDavid du Colombier extern long _Strtol(Rune* s, Rune** eptr, int base); 429a747e4fSDavid du Colombier extern void _trimwhite(Rune* s, int n, Rune** pans, int* panslen); 439a747e4fSDavid du Colombier 449a747e4fSDavid du Colombier extern Rune* notwhitespace; 459a747e4fSDavid du Colombier extern Rune* whitespace; 469a747e4fSDavid du Colombier 479a747e4fSDavid du Colombier // STRINTTAB 489a747e4fSDavid du Colombier typedef struct StringInt StringInt; 499a747e4fSDavid du Colombier 509a747e4fSDavid du Colombier // Element of String-Int table (used for keyword lookup) 519a747e4fSDavid du Colombier struct StringInt 529a747e4fSDavid du Colombier { 539a747e4fSDavid du Colombier Rune* key; 549a747e4fSDavid du Colombier int val; 559a747e4fSDavid du Colombier }; 569a747e4fSDavid du Colombier 579a747e4fSDavid du Colombier extern int _lookup(StringInt* t, int n, Rune* key, int keylen, int* pans); 589a747e4fSDavid du Colombier extern StringInt* _makestrinttab(Rune** a, int n); 599a747e4fSDavid du Colombier extern Rune* _revlookup(StringInt* t, int n, int val); 609a747e4fSDavid du Colombier 619a747e4fSDavid du Colombier // Colors, in html format, not Plan 9 format. (RGB values in bottom 3 bytes) 629a747e4fSDavid du Colombier enum { 639a747e4fSDavid du Colombier White = 0xFFFFFF, 649a747e4fSDavid du Colombier Black = 0x000000, 659a747e4fSDavid du Colombier Blue = 0x0000CC, 669a747e4fSDavid du Colombier }; 679a747e4fSDavid du Colombier 689a747e4fSDavid du Colombier // LEX 699a747e4fSDavid du Colombier 709a747e4fSDavid du Colombier // HTML 4.0 tags (plus blink, nobr) 719a747e4fSDavid du Colombier // sorted in lexical order; used as array indices 729a747e4fSDavid du Colombier enum { 739a747e4fSDavid du Colombier Notfound, 749a747e4fSDavid du Colombier Comment, 759a747e4fSDavid du Colombier Ta, Tabbr, Tacronym, Taddress, Tapplet, Tarea, 769a747e4fSDavid du Colombier Tb, Tbase, Tbasefont, Tbdo, Tbig, Tblink, 779a747e4fSDavid du Colombier Tblockquote, Tbody, Tbq, Tbr, Tbutton, 789a747e4fSDavid du Colombier Tcaption, Tcenter, Tcite, Tcode, Tcol, Tcolgroup, 799a747e4fSDavid du Colombier Tdd, Tdel, Tdfn, Tdir, Tdiv, Tdl, Tdt, 809a747e4fSDavid du Colombier Tem, 819a747e4fSDavid du Colombier Tfieldset, Tfont, Tform, Tframe, Tframeset, 829a747e4fSDavid du Colombier Th1, Th2, Th3, Th4, Th5, Th6, 839a747e4fSDavid du Colombier Thead, Thr, Thtml, 849a747e4fSDavid du Colombier Ti, Tiframe, Timg, Tinput, Tins, Tisindex, 859a747e4fSDavid du Colombier Tkbd, 869a747e4fSDavid du Colombier Tlabel, Tlegend, Tli, Tlink, 879a747e4fSDavid du Colombier Tmap, Tmenu, Tmeta, 889a747e4fSDavid du Colombier Tnobr, Tnoframes, Tnoscript, 899a747e4fSDavid du Colombier Tobject, Tol, Toptgroup, Toption, 909a747e4fSDavid du Colombier Tp, Tparam, Tpre, 919a747e4fSDavid du Colombier Tq, 929a747e4fSDavid du Colombier Ts, Tsamp, Tscript, Tselect, Tsmall, 939a747e4fSDavid du Colombier Tspan, Tstrike, Tstrong, Tstyle, Tsub, Tsup, 949a747e4fSDavid du Colombier Ttable, Ttbody, Ttd, Ttextarea, Ttfoot, 959a747e4fSDavid du Colombier Tth, Tthead, Ttitle, Ttr, Ttt, 969a747e4fSDavid du Colombier Tu, Tul, 979a747e4fSDavid du Colombier Tvar, 989a747e4fSDavid du Colombier Numtags, 999a747e4fSDavid du Colombier RBRA = Numtags, 1009a747e4fSDavid du Colombier Data = Numtags+RBRA 1019a747e4fSDavid du Colombier }; 1029a747e4fSDavid du Colombier 1039a747e4fSDavid du Colombier // HTML 4.0 tag attributes 1049a747e4fSDavid du Colombier // Keep sorted in lexical order 1059a747e4fSDavid du Colombier enum { 1069a747e4fSDavid du Colombier Aabbr, Aaccept_charset, Aaccess_key, Aaction, 1079a747e4fSDavid du Colombier Aalign, Aalink, Aalt, Aarchive, Aaxis, 1089a747e4fSDavid du Colombier Abackground, Abgcolor, Aborder, 1099a747e4fSDavid du Colombier Acellpadding, Acellspacing, Achar, Acharoff, 1109a747e4fSDavid du Colombier Acharset, Achecked, Acite, Aclass, Aclassid, 1119a747e4fSDavid du Colombier Aclear, Acode, Acodebase, Acodetype, Acolor, 1129a747e4fSDavid du Colombier Acols, Acolspan, Acompact, Acontent, Acoords, 1139a747e4fSDavid du Colombier Adata, Adatetime, Adeclare, Adefer, Adir, Adisabled, 1149a747e4fSDavid du Colombier Aenctype, 1159a747e4fSDavid du Colombier Aface, Afor, Aframe, Aframeborder, 1169a747e4fSDavid du Colombier Aheaders, Aheight, Ahref, Ahreflang, Ahspace, Ahttp_equiv, 1179a747e4fSDavid du Colombier Aid, Aismap, 1189a747e4fSDavid du Colombier Alabel, Alang, Alink, Alongdesc, 1199a747e4fSDavid du Colombier Amarginheight, Amarginwidth, Amaxlength, 1209a747e4fSDavid du Colombier Amedia, Amethod, Amultiple, 1219a747e4fSDavid du Colombier Aname, Anohref, Anoresize, Anoshade, Anowrap, 1229a747e4fSDavid du Colombier Aobject, Aonblur, Aonchange, Aonclick, Aondblclick, 1239a747e4fSDavid du Colombier Aonfocus, Aonkeypress, Aonkeyup, Aonload, 1249a747e4fSDavid du Colombier Aonmousedown, Aonmousemove, Aonmouseout, 1259a747e4fSDavid du Colombier Aonmouseover, Aonmouseup, Aonreset, Aonselect, 1269a747e4fSDavid du Colombier Aonsubmit, Aonunload, 1279a747e4fSDavid du Colombier Aprofile, Aprompt, 1289a747e4fSDavid du Colombier Areadonly, Arel, Arev, Arows, Arowspan, Arules, 1299a747e4fSDavid du Colombier Ascheme, Ascope, Ascrolling, Aselected, Ashape, 1309a747e4fSDavid du Colombier Asize, Aspan, Asrc, Astandby, Astart, Astyle, Asummary, 1319a747e4fSDavid du Colombier Atabindex, Atarget, Atext, Atitle, Atype, 1329a747e4fSDavid du Colombier Ausemap, 1339a747e4fSDavid du Colombier Avalign, Avalue, Avaluetype, Aversion, Avlink, Avspace, 1349a747e4fSDavid du Colombier Awidth, 1359a747e4fSDavid du Colombier Numattrs 1369a747e4fSDavid du Colombier }; 1379a747e4fSDavid du Colombier 1389a747e4fSDavid du Colombier struct Attr 1399a747e4fSDavid du Colombier { 1409a747e4fSDavid du Colombier Attr* next; // in list of attrs for a token 1419a747e4fSDavid du Colombier int attid; // Aabbr, etc. 1429a747e4fSDavid du Colombier Rune* value; 1439a747e4fSDavid du Colombier }; 1449a747e4fSDavid du Colombier 1459a747e4fSDavid du Colombier struct Token 1469a747e4fSDavid du Colombier { 1479a747e4fSDavid du Colombier int tag; // Ta, etc 1489a747e4fSDavid du Colombier Rune* text; // text in Data, attribute text in tag 1499a747e4fSDavid du Colombier Attr* attr; // list of Attrs 1509a747e4fSDavid du Colombier int starti; // index into source buffer of token start 1519a747e4fSDavid du Colombier }; 1529a747e4fSDavid du Colombier 1539a747e4fSDavid du Colombier extern Rune* tagnames[]; 1549a747e4fSDavid du Colombier extern Rune* attrnames[]; 1559a747e4fSDavid du Colombier 1569a747e4fSDavid du Colombier extern void _freetokens(Token* tarray, int n); 1579a747e4fSDavid du Colombier extern Token* _gettoks(uchar* data, int datalen, int chset, int mtype, int* plen); 1589a747e4fSDavid du Colombier extern int _tokaval(Token* t, int attid, Rune** pans, int xfer); 1599a747e4fSDavid du Colombier 1609a747e4fSDavid du Colombier #pragma varargck type "T" Token* 161