1 2 // UTILS 3 typedef struct List List; 4 typedef struct Strlist Strlist; 5 6 // List of integers (and also generic list with next pointer at beginning) 7 struct List 8 { 9 List* next; 10 int val; 11 }; 12 13 struct Strlist 14 { 15 Strlist* next; 16 Rune* val; 17 }; 18 19 extern int _inclass(Rune c, Rune* cl); 20 extern int _listlen(List* l); 21 extern Rune* _ltoStr(int n); 22 extern List* _newlist(int val, List* rest); 23 extern Rune* _newstr(int n); 24 extern int _prefix(Rune* pre, Rune* s); 25 extern List* _revlist(List* l); 26 extern void _splitl(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2); 27 extern void _splitr(Rune* s, int n, Rune* cl, Rune** p1, int* n1, Rune** p2, int* n2); 28 extern int _splitall(Rune* s, int n, Rune* cl, Rune** strarr, int* lenarr, int alen); 29 extern Rune* _Stradd(Rune*s1, Rune* s2, int n); 30 extern Rune* _Strclass(Rune* s, Rune* cl); 31 extern Rune* _Strdup(Rune* s); 32 extern Rune* _Strdup2(Rune* s, Rune* t); 33 extern int _Streqn(Rune* s1, int n1, Rune* s2); 34 extern Rune* _Strnclass(Rune* s, Rune* cl, int n); 35 extern int _Strncmpci(Rune* s1, int n1, Rune* s2); 36 extern Rune* _Strndup(Rune* s, int n); 37 extern Rune* _Strnrclass(Rune* s, Rune* cl, int n); 38 extern Rune* _Strrclass(Rune* s, Rune* cl); 39 extern Rune* _Strsubstr(Rune* s, int start, int stop); 40 extern long _Strtol(Rune* s, Rune** eptr, int base); 41 extern void _trimwhite(Rune* s, int n, Rune** pans, int* panslen); 42 43 extern Rune* notwhitespace; 44 extern Rune* whitespace; 45 46 // STRINTTAB 47 typedef struct StringInt StringInt; 48 49 // Element of String-Int table (used for keyword lookup) 50 struct StringInt 51 { 52 Rune* key; 53 int val; 54 }; 55 56 extern int _lookup(StringInt* t, int n, Rune* key, int keylen, int* pans); 57 extern StringInt* _makestrinttab(Rune** a, int n); 58 extern Rune* _revlookup(StringInt* t, int n, int val); 59 60 // Colors, in html format, not Plan 9 format. (RGB values in bottom 3 bytes) 61 enum { 62 White = 0xFFFFFF, 63 Black = 0x000000, 64 Blue = 0x0000CC, 65 }; 66 67 // LEX 68 69 // HTML 4.0 tags (plus blink, nobr) 70 // sorted in lexical order; used as array indices 71 enum { 72 Notfound, 73 Comment, 74 Ta, Tabbr, Tacronym, Taddress, Tapplet, Tarea, 75 Tb, Tbase, Tbasefont, Tbdo, Tbig, Tblink, 76 Tblockquote, Tbody, Tbq, Tbr, Tbutton, 77 Tcaption, Tcenter, Tcite, Tcode, Tcol, Tcolgroup, 78 Tdd, Tdel, Tdfn, Tdir, Tdiv, Tdl, Tdt, 79 Tem, 80 Tfieldset, Tfont, Tform, Tframe, Tframeset, 81 Th1, Th2, Th3, Th4, Th5, Th6, 82 Thead, Thr, Thtml, 83 Ti, Tiframe, Timg, Tinput, Tins, Tisindex, 84 Tkbd, 85 Tlabel, Tlegend, Tli, Tlink, 86 Tmap, Tmenu, Tmeta, 87 Tnobr, Tnoframes, Tnoscript, 88 Tobject, Tol, Toptgroup, Toption, 89 Tp, Tparam, Tpre, 90 Tq, 91 Ts, Tsamp, Tscript, Tselect, Tsmall, 92 Tspan, Tstrike, Tstrong, Tstyle, Tsub, Tsup, 93 Ttable, Ttbody, Ttd, Ttextarea, Ttfoot, 94 Tth, Tthead, Ttitle, Ttr, Ttt, 95 Tu, Tul, 96 Tvar, 97 Numtags, 98 RBRA = Numtags, 99 Data = Numtags+RBRA 100 }; 101 102 // HTML 4.0 tag attributes 103 // Keep sorted in lexical order 104 enum { 105 Aabbr, Aaccept_charset, Aaccess_key, Aaction, 106 Aalign, Aalink, Aalt, Aarchive, Aaxis, 107 Abackground, Abgcolor, Aborder, 108 Acellpadding, Acellspacing, Achar, Acharoff, 109 Acharset, Achecked, Acite, Aclass, Aclassid, 110 Aclear, Acode, Acodebase, Acodetype, Acolor, 111 Acols, Acolspan, Acompact, Acontent, Acoords, 112 Adata, Adatetime, Adeclare, Adefer, Adir, Adisabled, 113 Aenctype, 114 Aface, Afor, Aframe, Aframeborder, 115 Aheaders, Aheight, Ahref, Ahreflang, Ahspace, Ahttp_equiv, 116 Aid, Aismap, 117 Alabel, Alang, Alink, Alongdesc, 118 Amarginheight, Amarginwidth, Amaxlength, 119 Amedia, Amethod, Amultiple, 120 Aname, Anohref, Anoresize, Anoshade, Anowrap, 121 Aobject, Aonblur, Aonchange, Aonclick, Aondblclick, 122 Aonfocus, Aonkeypress, Aonkeyup, Aonload, 123 Aonmousedown, Aonmousemove, Aonmouseout, 124 Aonmouseover, Aonmouseup, Aonreset, Aonselect, 125 Aonsubmit, Aonunload, 126 Aprofile, Aprompt, 127 Areadonly, Arel, Arev, Arows, Arowspan, Arules, 128 Ascheme, Ascope, Ascrolling, Aselected, Ashape, 129 Asize, Aspan, Asrc, Astandby, Astart, Astyle, Asummary, 130 Atabindex, Atarget, Atext, Atitle, Atype, 131 Ausemap, 132 Avalign, Avalue, Avaluetype, Aversion, Avlink, Avspace, 133 Awidth, 134 Numattrs 135 }; 136 137 struct Attr 138 { 139 Attr* next; // in list of attrs for a token 140 int attid; // Aabbr, etc. 141 Rune* value; 142 }; 143 144 struct Token 145 { 146 int tag; // Ta, etc 147 Rune* text; // text in Data, attribute text in tag 148 Attr* attr; // list of Attrs 149 int starti; // index into source buffer of token start 150 }; 151 152 extern Rune* tagnames[]; 153 extern Rune* attrnames[]; 154 155 extern void _freetokens(Token* tarray, int n); 156 extern Token* _gettoks(uchar* data, int datalen, int chset, int mtype, int* plen); 157 extern int _tokaval(Token* t, int attid, Rune** pans, int xfer); 158 159 #pragma varargck type "T" Token* 160