Blame


1 30d57c74 2005-12-27 devnull #include <u.h>
2 30d57c74 2005-12-27 devnull #include <libc.h>
3 30d57c74 2005-12-27 devnull #include <bio.h>
4 30d57c74 2005-12-27 devnull #include "hdr.h"
5 30d57c74 2005-12-27 devnull #include "conv.h"
6 30d57c74 2005-12-27 devnull
7 30d57c74 2005-12-27 devnull typedef struct Hchar Hchar;
8 30d57c74 2005-12-27 devnull struct Hchar
9 30d57c74 2005-12-27 devnull {
10 30d57c74 2005-12-27 devnull char *s;
11 30d57c74 2005-12-27 devnull Rune r;
12 30d57c74 2005-12-27 devnull };
13 30d57c74 2005-12-27 devnull
14 30d57c74 2005-12-27 devnull /* &lt;, &gt;, &quot;, &amp; intentionally omitted */
15 30d57c74 2005-12-27 devnull
16 a727811a 2006-10-12 devnull /*
17 a727811a 2006-10-12 devnull * Names beginning with _ are names we recognize
18 a727811a 2006-10-12 devnull * (without the underscore) but will not generate,
19 a727811a 2006-10-12 devnull * because they are nonstandard.
20 a727811a 2006-10-12 devnull */
21 30d57c74 2005-12-27 devnull static Hchar byname[] =
22 30d57c74 2005-12-27 devnull {
23 30d57c74 2005-12-27 devnull {"AElig", 198},
24 30d57c74 2005-12-27 devnull {"Aacute", 193},
25 30d57c74 2005-12-27 devnull {"Acirc", 194},
26 30d57c74 2005-12-27 devnull {"Agrave", 192},
27 536f9b83 2006-05-21 devnull {"Alpha", 913},
28 30d57c74 2005-12-27 devnull {"Aring", 197},
29 30d57c74 2005-12-27 devnull {"Atilde", 195},
30 30d57c74 2005-12-27 devnull {"Auml", 196},
31 536f9b83 2006-05-21 devnull {"Beta", 914},
32 30d57c74 2005-12-27 devnull {"Ccedil", 199},
33 536f9b83 2006-05-21 devnull {"Chi", 935},
34 536f9b83 2006-05-21 devnull {"Dagger", 8225},
35 536f9b83 2006-05-21 devnull {"Delta", 916},
36 30d57c74 2005-12-27 devnull {"ETH", 208},
37 30d57c74 2005-12-27 devnull {"Eacute", 201},
38 30d57c74 2005-12-27 devnull {"Ecirc", 202},
39 30d57c74 2005-12-27 devnull {"Egrave", 200},
40 536f9b83 2006-05-21 devnull {"Epsilon", 917},
41 536f9b83 2006-05-21 devnull {"Eta", 919},
42 30d57c74 2005-12-27 devnull {"Euml", 203},
43 536f9b83 2006-05-21 devnull {"Gamma", 915},
44 30d57c74 2005-12-27 devnull {"Iacute", 205},
45 30d57c74 2005-12-27 devnull {"Icirc", 206},
46 30d57c74 2005-12-27 devnull {"Igrave", 204},
47 536f9b83 2006-05-21 devnull {"Iota", 921},
48 30d57c74 2005-12-27 devnull {"Iuml", 207},
49 536f9b83 2006-05-21 devnull {"Kappa", 922},
50 536f9b83 2006-05-21 devnull {"Lambda", 923},
51 536f9b83 2006-05-21 devnull {"Mu", 924},
52 30d57c74 2005-12-27 devnull {"Ntilde", 209},
53 536f9b83 2006-05-21 devnull {"Nu", 925},
54 536f9b83 2006-05-21 devnull {"OElig", 338},
55 30d57c74 2005-12-27 devnull {"Oacute", 211},
56 30d57c74 2005-12-27 devnull {"Ocirc", 212},
57 30d57c74 2005-12-27 devnull {"Ograve", 210},
58 536f9b83 2006-05-21 devnull {"Omega", 937},
59 536f9b83 2006-05-21 devnull {"Omicron", 927},
60 30d57c74 2005-12-27 devnull {"Oslash", 216},
61 30d57c74 2005-12-27 devnull {"Otilde", 213},
62 30d57c74 2005-12-27 devnull {"Ouml", 214},
63 536f9b83 2006-05-21 devnull {"Phi", 934},
64 536f9b83 2006-05-21 devnull {"Pi", 928},
65 536f9b83 2006-05-21 devnull {"Prime", 8243},
66 536f9b83 2006-05-21 devnull {"Psi", 936},
67 536f9b83 2006-05-21 devnull {"Rho", 929},
68 536f9b83 2006-05-21 devnull {"Scaron", 352},
69 536f9b83 2006-05-21 devnull {"Sigma", 931},
70 30d57c74 2005-12-27 devnull {"THORN", 222},
71 536f9b83 2006-05-21 devnull {"Tau", 932},
72 536f9b83 2006-05-21 devnull {"Theta", 920},
73 30d57c74 2005-12-27 devnull {"Uacute", 218},
74 30d57c74 2005-12-27 devnull {"Ucirc", 219},
75 30d57c74 2005-12-27 devnull {"Ugrave", 217},
76 536f9b83 2006-05-21 devnull {"Upsilon", 933},
77 30d57c74 2005-12-27 devnull {"Uuml", 220},
78 536f9b83 2006-05-21 devnull {"Xi", 926},
79 30d57c74 2005-12-27 devnull {"Yacute", 221},
80 536f9b83 2006-05-21 devnull {"Yuml", 376},
81 536f9b83 2006-05-21 devnull {"Zeta", 918},
82 30d57c74 2005-12-27 devnull {"aacute", 225},
83 30d57c74 2005-12-27 devnull {"acirc", 226},
84 30d57c74 2005-12-27 devnull {"acute", 180},
85 30d57c74 2005-12-27 devnull {"aelig", 230},
86 30d57c74 2005-12-27 devnull {"agrave", 224},
87 536f9b83 2006-05-21 devnull {"alefsym", 8501},
88 30d57c74 2005-12-27 devnull {"alpha", 945},
89 536f9b83 2006-05-21 devnull {"amp", 38},
90 536f9b83 2006-05-21 devnull {"and", 8743},
91 536f9b83 2006-05-21 devnull {"ang", 8736},
92 30d57c74 2005-12-27 devnull {"aring", 229},
93 536f9b83 2006-05-21 devnull {"asymp", 8776},
94 30d57c74 2005-12-27 devnull {"atilde", 227},
95 30d57c74 2005-12-27 devnull {"auml", 228},
96 536f9b83 2006-05-21 devnull {"bdquo", 8222},
97 30d57c74 2005-12-27 devnull {"beta", 946},
98 30d57c74 2005-12-27 devnull {"brvbar", 166},
99 536f9b83 2006-05-21 devnull {"bull", 8226},
100 536f9b83 2006-05-21 devnull {"cap", 8745},
101 30d57c74 2005-12-27 devnull {"ccedil", 231},
102 30d57c74 2005-12-27 devnull {"cdots", 8943},
103 30d57c74 2005-12-27 devnull {"cedil", 184},
104 30d57c74 2005-12-27 devnull {"cent", 162},
105 30d57c74 2005-12-27 devnull {"chi", 967},
106 536f9b83 2006-05-21 devnull {"circ", 710},
107 536f9b83 2006-05-21 devnull {"clubs", 9827},
108 536f9b83 2006-05-21 devnull {"cong", 8773},
109 30d57c74 2005-12-27 devnull {"copy", 169},
110 536f9b83 2006-05-21 devnull {"crarr", 8629},
111 536f9b83 2006-05-21 devnull {"cup", 8746},
112 30d57c74 2005-12-27 devnull {"curren", 164},
113 536f9b83 2006-05-21 devnull {"dArr", 8659},
114 536f9b83 2006-05-21 devnull {"dagger", 8224},
115 536f9b83 2006-05-21 devnull {"darr", 8595},
116 30d57c74 2005-12-27 devnull {"ddots", 8945},
117 30d57c74 2005-12-27 devnull {"deg", 176},
118 30d57c74 2005-12-27 devnull {"delta", 948},
119 536f9b83 2006-05-21 devnull {"diams", 9830},
120 30d57c74 2005-12-27 devnull {"divide", 247},
121 30d57c74 2005-12-27 devnull {"eacute", 233},
122 30d57c74 2005-12-27 devnull {"ecirc", 234},
123 30d57c74 2005-12-27 devnull {"egrave", 232},
124 a727811a 2006-10-12 devnull {"_emdash", 8212}, /* non-standard but commonly used */
125 536f9b83 2006-05-21 devnull {"empty", 8709},
126 30d57c74 2005-12-27 devnull {"emsp", 8195},
127 a727811a 2006-10-12 devnull {"_endash", 8211}, /* non-standard but commonly used */
128 30d57c74 2005-12-27 devnull {"ensp", 8194},
129 30d57c74 2005-12-27 devnull {"epsilon", 949},
130 536f9b83 2006-05-21 devnull {"equiv", 8801},
131 30d57c74 2005-12-27 devnull {"eta", 951},
132 30d57c74 2005-12-27 devnull {"eth", 240},
133 30d57c74 2005-12-27 devnull {"euml", 235},
134 536f9b83 2006-05-21 devnull {"euro", 8364},
135 536f9b83 2006-05-21 devnull {"exist", 8707},
136 536f9b83 2006-05-21 devnull {"fnof", 402},
137 536f9b83 2006-05-21 devnull {"forall", 8704},
138 30d57c74 2005-12-27 devnull {"frac12", 189},
139 30d57c74 2005-12-27 devnull {"frac14", 188},
140 30d57c74 2005-12-27 devnull {"frac34", 190},
141 536f9b83 2006-05-21 devnull {"frasl", 8260},
142 30d57c74 2005-12-27 devnull {"gamma", 947},
143 536f9b83 2006-05-21 devnull {"ge", 8805},
144 536f9b83 2006-05-21 devnull {"gt", 62},
145 536f9b83 2006-05-21 devnull {"hArr", 8660},
146 536f9b83 2006-05-21 devnull {"harr", 8596},
147 536f9b83 2006-05-21 devnull {"hearts", 9829},
148 536f9b83 2006-05-21 devnull {"hellip", 8230},
149 30d57c74 2005-12-27 devnull {"iacute", 237},
150 30d57c74 2005-12-27 devnull {"icirc", 238},
151 30d57c74 2005-12-27 devnull {"iexcl", 161},
152 30d57c74 2005-12-27 devnull {"igrave", 236},
153 536f9b83 2006-05-21 devnull {"image", 8465},
154 536f9b83 2006-05-21 devnull {"infin", 8734},
155 536f9b83 2006-05-21 devnull {"int", 8747},
156 30d57c74 2005-12-27 devnull {"iota", 953},
157 30d57c74 2005-12-27 devnull {"iquest", 191},
158 536f9b83 2006-05-21 devnull {"isin", 8712},
159 30d57c74 2005-12-27 devnull {"iuml", 239},
160 30d57c74 2005-12-27 devnull {"kappa", 954},
161 536f9b83 2006-05-21 devnull {"lArr", 8656},
162 30d57c74 2005-12-27 devnull {"lambda", 955},
163 536f9b83 2006-05-21 devnull {"lang", 9001},
164 30d57c74 2005-12-27 devnull {"laquo", 171},
165 536f9b83 2006-05-21 devnull {"larr", 8592},
166 536f9b83 2006-05-21 devnull {"lceil", 8968},
167 a727811a 2006-10-12 devnull {"_ldots", 8230},
168 536f9b83 2006-05-21 devnull {"ldquo", 8220},
169 536f9b83 2006-05-21 devnull {"le", 8804},
170 536f9b83 2006-05-21 devnull {"lfloor", 8970},
171 536f9b83 2006-05-21 devnull {"lowast", 8727},
172 536f9b83 2006-05-21 devnull {"loz", 9674},
173 536f9b83 2006-05-21 devnull {"lrm", 8206},
174 536f9b83 2006-05-21 devnull {"lsaquo", 8249},
175 30d57c74 2005-12-27 devnull {"lsquo", 8216},
176 536f9b83 2006-05-21 devnull {"lt", 60},
177 30d57c74 2005-12-27 devnull {"macr", 175},
178 30d57c74 2005-12-27 devnull {"mdash", 8212},
179 30d57c74 2005-12-27 devnull {"micro", 181},
180 30d57c74 2005-12-27 devnull {"middot", 183},
181 536f9b83 2006-05-21 devnull {"minus", 8722},
182 30d57c74 2005-12-27 devnull {"mu", 956},
183 536f9b83 2006-05-21 devnull {"nabla", 8711},
184 30d57c74 2005-12-27 devnull {"nbsp", 160},
185 30d57c74 2005-12-27 devnull {"ndash", 8211},
186 536f9b83 2006-05-21 devnull {"ne", 8800},
187 536f9b83 2006-05-21 devnull {"ni", 8715},
188 30d57c74 2005-12-27 devnull {"not", 172},
189 536f9b83 2006-05-21 devnull {"notin", 8713},
190 536f9b83 2006-05-21 devnull {"nsub", 8836},
191 30d57c74 2005-12-27 devnull {"ntilde", 241},
192 30d57c74 2005-12-27 devnull {"nu", 957},
193 30d57c74 2005-12-27 devnull {"oacute", 243},
194 30d57c74 2005-12-27 devnull {"ocirc", 244},
195 536f9b83 2006-05-21 devnull {"oelig", 339},
196 30d57c74 2005-12-27 devnull {"ograve", 242},
197 536f9b83 2006-05-21 devnull {"oline", 8254},
198 30d57c74 2005-12-27 devnull {"omega", 969},
199 30d57c74 2005-12-27 devnull {"omicron", 959},
200 536f9b83 2006-05-21 devnull {"oplus", 8853},
201 536f9b83 2006-05-21 devnull {"or", 8744},
202 30d57c74 2005-12-27 devnull {"ordf", 170},
203 30d57c74 2005-12-27 devnull {"ordm", 186},
204 30d57c74 2005-12-27 devnull {"oslash", 248},
205 30d57c74 2005-12-27 devnull {"otilde", 245},
206 536f9b83 2006-05-21 devnull {"otimes", 8855},
207 30d57c74 2005-12-27 devnull {"ouml", 246},
208 30d57c74 2005-12-27 devnull {"para", 182},
209 536f9b83 2006-05-21 devnull {"part", 8706},
210 536f9b83 2006-05-21 devnull {"permil", 8240},
211 536f9b83 2006-05-21 devnull {"perp", 8869},
212 30d57c74 2005-12-27 devnull {"phi", 966},
213 30d57c74 2005-12-27 devnull {"pi", 960},
214 536f9b83 2006-05-21 devnull {"piv", 982},
215 30d57c74 2005-12-27 devnull {"plusmn", 177},
216 30d57c74 2005-12-27 devnull {"pound", 163},
217 536f9b83 2006-05-21 devnull {"prime", 8242},
218 536f9b83 2006-05-21 devnull {"prod", 8719},
219 536f9b83 2006-05-21 devnull {"prop", 8733},
220 30d57c74 2005-12-27 devnull {"psi", 968},
221 30d57c74 2005-12-27 devnull {"quad", 8193},
222 536f9b83 2006-05-21 devnull {"quot", 34},
223 536f9b83 2006-05-21 devnull {"rArr", 8658},
224 536f9b83 2006-05-21 devnull {"radic", 8730},
225 536f9b83 2006-05-21 devnull {"rang", 9002},
226 30d57c74 2005-12-27 devnull {"raquo", 187},
227 536f9b83 2006-05-21 devnull {"rarr", 8594},
228 536f9b83 2006-05-21 devnull {"rceil", 8969},
229 30d57c74 2005-12-27 devnull {"rdquo", 8221},
230 536f9b83 2006-05-21 devnull {"real", 8476},
231 30d57c74 2005-12-27 devnull {"reg", 174},
232 536f9b83 2006-05-21 devnull {"rfloor", 8971},
233 30d57c74 2005-12-27 devnull {"rho", 961},
234 536f9b83 2006-05-21 devnull {"rlm", 8207},
235 536f9b83 2006-05-21 devnull {"rsaquo", 8250},
236 30d57c74 2005-12-27 devnull {"rsquo", 8217},
237 536f9b83 2006-05-21 devnull {"sbquo", 8218},
238 536f9b83 2006-05-21 devnull {"scaron", 353},
239 536f9b83 2006-05-21 devnull {"sdot", 8901},
240 30d57c74 2005-12-27 devnull {"sect", 167},
241 30d57c74 2005-12-27 devnull {"shy", 173},
242 30d57c74 2005-12-27 devnull {"sigma", 963},
243 536f9b83 2006-05-21 devnull {"sigmaf", 962},
244 536f9b83 2006-05-21 devnull {"sim", 8764},
245 a727811a 2006-10-12 devnull {"_sp", 8194},
246 536f9b83 2006-05-21 devnull {"spades", 9824},
247 536f9b83 2006-05-21 devnull {"sub", 8834},
248 536f9b83 2006-05-21 devnull {"sube", 8838},
249 536f9b83 2006-05-21 devnull {"sum", 8721},
250 536f9b83 2006-05-21 devnull {"sup", 8835},
251 30d57c74 2005-12-27 devnull {"sup1", 185},
252 30d57c74 2005-12-27 devnull {"sup2", 178},
253 30d57c74 2005-12-27 devnull {"sup3", 179},
254 536f9b83 2006-05-21 devnull {"supe", 8839},
255 30d57c74 2005-12-27 devnull {"szlig", 223},
256 30d57c74 2005-12-27 devnull {"tau", 964},
257 536f9b83 2006-05-21 devnull {"there4", 8756},
258 30d57c74 2005-12-27 devnull {"theta", 952},
259 536f9b83 2006-05-21 devnull {"thetasym", 977},
260 30d57c74 2005-12-27 devnull {"thinsp", 8201},
261 30d57c74 2005-12-27 devnull {"thorn", 254},
262 536f9b83 2006-05-21 devnull {"tilde", 732},
263 30d57c74 2005-12-27 devnull {"times", 215},
264 30d57c74 2005-12-27 devnull {"trade", 8482},
265 536f9b83 2006-05-21 devnull {"uArr", 8657},
266 30d57c74 2005-12-27 devnull {"uacute", 250},
267 536f9b83 2006-05-21 devnull {"uarr", 8593},
268 30d57c74 2005-12-27 devnull {"ucirc", 251},
269 30d57c74 2005-12-27 devnull {"ugrave", 249},
270 30d57c74 2005-12-27 devnull {"uml", 168},
271 536f9b83 2006-05-21 devnull {"upsih", 978},
272 30d57c74 2005-12-27 devnull {"upsilon", 965},
273 30d57c74 2005-12-27 devnull {"uuml", 252},
274 a727811a 2006-10-12 devnull {"_varepsilon", 8712},
275 30d57c74 2005-12-27 devnull {"varphi", 981},
276 a727811a 2006-10-12 devnull {"_varpi", 982},
277 30d57c74 2005-12-27 devnull {"varrho", 1009},
278 30d57c74 2005-12-27 devnull {"vdots", 8942},
279 a727811a 2006-10-12 devnull {"_vsigma", 962},
280 a727811a 2006-10-12 devnull {"_vtheta", 977},
281 536f9b83 2006-05-21 devnull {"weierp", 8472},
282 30d57c74 2005-12-27 devnull {"xi", 958},
283 30d57c74 2005-12-27 devnull {"yacute", 253},
284 30d57c74 2005-12-27 devnull {"yen", 165},
285 30d57c74 2005-12-27 devnull {"yuml", 255},
286 536f9b83 2006-05-21 devnull {"zeta", 950},
287 536f9b83 2006-05-21 devnull {"zwj", 8205},
288 536f9b83 2006-05-21 devnull {"zwnj", 8204}
289 30d57c74 2005-12-27 devnull };
290 30d57c74 2005-12-27 devnull
291 30d57c74 2005-12-27 devnull static Hchar byrune[nelem(byname)];
292 30d57c74 2005-12-27 devnull
293 30d57c74 2005-12-27 devnull static int
294 30d57c74 2005-12-27 devnull hnamecmp(const void *va, const void *vb)
295 30d57c74 2005-12-27 devnull {
296 30d57c74 2005-12-27 devnull Hchar *a, *b;
297 fa325e9b 2020-01-10 cross
298 30d57c74 2005-12-27 devnull a = (Hchar*)va;
299 30d57c74 2005-12-27 devnull b = (Hchar*)vb;
300 30d57c74 2005-12-27 devnull return strcmp(a->s, b->s);
301 30d57c74 2005-12-27 devnull }
302 30d57c74 2005-12-27 devnull
303 30d57c74 2005-12-27 devnull static int
304 30d57c74 2005-12-27 devnull hrunecmp(const void *va, const void *vb)
305 30d57c74 2005-12-27 devnull {
306 30d57c74 2005-12-27 devnull Hchar *a, *b;
307 fa325e9b 2020-01-10 cross
308 30d57c74 2005-12-27 devnull a = (Hchar*)va;
309 30d57c74 2005-12-27 devnull b = (Hchar*)vb;
310 30d57c74 2005-12-27 devnull return a->r - b->r;
311 30d57c74 2005-12-27 devnull }
312 30d57c74 2005-12-27 devnull
313 30d57c74 2005-12-27 devnull static void
314 30d57c74 2005-12-27 devnull html_init(void)
315 30d57c74 2005-12-27 devnull {
316 30d57c74 2005-12-27 devnull static int init;
317 a727811a 2006-10-12 devnull int i;
318 fa325e9b 2020-01-10 cross
319 30d57c74 2005-12-27 devnull if(init)
320 30d57c74 2005-12-27 devnull return;
321 30d57c74 2005-12-27 devnull init = 1;
322 30d57c74 2005-12-27 devnull memmove(byrune, byname, sizeof byrune);
323 fa325e9b 2020-01-10 cross
324 a727811a 2006-10-12 devnull /* Eliminate names we aren't allowed to generate. */
325 a727811a 2006-10-12 devnull for(i=0; i<nelem(byrune); i++){
326 a727811a 2006-10-12 devnull if(byrune[i].s[0] == '_'){
327 a727811a 2006-10-12 devnull byrune[i].r = Runeerror;
328 a727811a 2006-10-12 devnull byname[i].s++;
329 a727811a 2006-10-12 devnull }
330 a727811a 2006-10-12 devnull }
331 fa325e9b 2020-01-10 cross
332 30d57c74 2005-12-27 devnull qsort(byname, nelem(byname), sizeof byname[0], hnamecmp);
333 30d57c74 2005-12-27 devnull qsort(byrune, nelem(byrune), sizeof byrune[0], hrunecmp);
334 30d57c74 2005-12-27 devnull }
335 30d57c74 2005-12-27 devnull
336 30d57c74 2005-12-27 devnull static Rune
337 30d57c74 2005-12-27 devnull findbyname(char *s)
338 30d57c74 2005-12-27 devnull {
339 30d57c74 2005-12-27 devnull Hchar *h;
340 30d57c74 2005-12-27 devnull int n, m, x;
341 fa325e9b 2020-01-10 cross
342 30d57c74 2005-12-27 devnull h = byname;
343 30d57c74 2005-12-27 devnull n = nelem(byname);
344 30d57c74 2005-12-27 devnull while(n > 0){
345 30d57c74 2005-12-27 devnull m = n/2;
346 30d57c74 2005-12-27 devnull x = strcmp(h[m].s, s);
347 30d57c74 2005-12-27 devnull if(x == 0)
348 30d57c74 2005-12-27 devnull return h[m].r;
349 30d57c74 2005-12-27 devnull if(x < 0){
350 30d57c74 2005-12-27 devnull h += m+1;
351 30d57c74 2005-12-27 devnull n -= m+1;
352 30d57c74 2005-12-27 devnull }else
353 30d57c74 2005-12-27 devnull n = m;
354 30d57c74 2005-12-27 devnull }
355 30d57c74 2005-12-27 devnull return Runeerror;
356 30d57c74 2005-12-27 devnull }
357 30d57c74 2005-12-27 devnull
358 30d57c74 2005-12-27 devnull static char*
359 30d57c74 2005-12-27 devnull findbyrune(Rune r)
360 30d57c74 2005-12-27 devnull {
361 30d57c74 2005-12-27 devnull Hchar *h;
362 30d57c74 2005-12-27 devnull int n, m;
363 30d57c74 2005-12-27 devnull
364 a727811a 2006-10-12 devnull if(r == Runeerror)
365 a727811a 2006-10-12 devnull return nil;
366 30d57c74 2005-12-27 devnull h = byrune;
367 30d57c74 2005-12-27 devnull n = nelem(byrune);
368 30d57c74 2005-12-27 devnull while(n > 0){
369 30d57c74 2005-12-27 devnull m = n/2;
370 30d57c74 2005-12-27 devnull if(h[m].r == r)
371 30d57c74 2005-12-27 devnull return h[m].s;
372 30d57c74 2005-12-27 devnull if(h[m].r < r){
373 30d57c74 2005-12-27 devnull h += m+1;
374 30d57c74 2005-12-27 devnull n -= m+1;
375 30d57c74 2005-12-27 devnull }else
376 30d57c74 2005-12-27 devnull n = m;
377 30d57c74 2005-12-27 devnull }
378 30d57c74 2005-12-27 devnull return nil;
379 30d57c74 2005-12-27 devnull }
380 30d57c74 2005-12-27 devnull
381 30d57c74 2005-12-27 devnull void
382 30d57c74 2005-12-27 devnull html_in(int fd, long *x, struct convert *out)
383 30d57c74 2005-12-27 devnull {
384 30d57c74 2005-12-27 devnull char buf[100], *p;
385 30d57c74 2005-12-27 devnull Biobuf b;
386 30d57c74 2005-12-27 devnull Rune rbuf[N];
387 30d57c74 2005-12-27 devnull Rune *r, *er;
388 30d57c74 2005-12-27 devnull int c, i;
389 fa325e9b 2020-01-10 cross
390 30d57c74 2005-12-27 devnull USED(x);
391 fa325e9b 2020-01-10 cross
392 30d57c74 2005-12-27 devnull html_init();
393 30d57c74 2005-12-27 devnull r = rbuf;
394 30d57c74 2005-12-27 devnull er = rbuf+N;
395 30d57c74 2005-12-27 devnull Binit(&b, fd, OREAD);
396 30d57c74 2005-12-27 devnull while((c = Bgetrune(&b)) != Beof){
397 30d57c74 2005-12-27 devnull if(r >= er){
398 30d57c74 2005-12-27 devnull OUT(out, rbuf, r-rbuf);
399 30d57c74 2005-12-27 devnull r = rbuf;
400 30d57c74 2005-12-27 devnull }
401 30d57c74 2005-12-27 devnull if(c == '&'){
402 30d57c74 2005-12-27 devnull buf[0] = c;
403 30d57c74 2005-12-27 devnull for(i=1; i<nelem(buf)-1;){
404 30d57c74 2005-12-27 devnull c = Bgetc(&b);
405 30d57c74 2005-12-27 devnull if(c == Beof)
406 30d57c74 2005-12-27 devnull break;
407 30d57c74 2005-12-27 devnull buf[i++] = c;
408 30d57c74 2005-12-27 devnull if(strchr("; \t\r\n", c))
409 30d57c74 2005-12-27 devnull break;
410 30d57c74 2005-12-27 devnull }
411 30d57c74 2005-12-27 devnull buf[i] = 0;
412 30d57c74 2005-12-27 devnull if(buf[i-1] == ';'){
413 30d57c74 2005-12-27 devnull buf[i-1] = 0;
414 30d57c74 2005-12-27 devnull if((c = findbyname(buf+1)) != Runeerror){
415 30d57c74 2005-12-27 devnull *r++ = c;
416 30d57c74 2005-12-27 devnull continue;
417 30d57c74 2005-12-27 devnull }
418 30d57c74 2005-12-27 devnull buf[i-1] = ';';
419 30d57c74 2005-12-27 devnull if(buf[1] == '#'){
420 30d57c74 2005-12-27 devnull if(buf[2] == 'x')
421 30d57c74 2005-12-27 devnull c = strtol(buf+3, &p, 16);
422 30d57c74 2005-12-27 devnull else
423 30d57c74 2005-12-27 devnull c = strtol(buf+2, &p, 10);
424 30d57c74 2005-12-27 devnull if(*p != ';' || c >= NRUNE || c < 0)
425 30d57c74 2005-12-27 devnull goto bad;
426 30d57c74 2005-12-27 devnull *r++ = c;
427 30d57c74 2005-12-27 devnull continue;
428 30d57c74 2005-12-27 devnull }
429 30d57c74 2005-12-27 devnull }
430 30d57c74 2005-12-27 devnull bad:
431 30d57c74 2005-12-27 devnull for(p=buf; p<buf+i; ){
432 30d57c74 2005-12-27 devnull p += chartorune(r++, p);
433 30d57c74 2005-12-27 devnull if(r >= er){
434 30d57c74 2005-12-27 devnull OUT(out, rbuf, r-rbuf);
435 30d57c74 2005-12-27 devnull r = rbuf;
436 30d57c74 2005-12-27 devnull }
437 30d57c74 2005-12-27 devnull }
438 30d57c74 2005-12-27 devnull continue;
439 30d57c74 2005-12-27 devnull }
440 30d57c74 2005-12-27 devnull *r++ = c;
441 30d57c74 2005-12-27 devnull }
442 30d57c74 2005-12-27 devnull if(r > rbuf)
443 30d57c74 2005-12-27 devnull OUT(out, rbuf, r-rbuf);
444 536f9b83 2006-05-21 devnull OUT(out, rbuf, 0);
445 30d57c74 2005-12-27 devnull }
446 30d57c74 2005-12-27 devnull
447 30d57c74 2005-12-27 devnull /*
448 30d57c74 2005-12-27 devnull * use biobuf because can use more than UTFmax bytes per rune
449 30d57c74 2005-12-27 devnull */
450 30d57c74 2005-12-27 devnull void
451 30d57c74 2005-12-27 devnull html_out(Rune *r, int n, long *x)
452 30d57c74 2005-12-27 devnull {
453 30d57c74 2005-12-27 devnull char *s;
454 30d57c74 2005-12-27 devnull Biobuf b;
455 30d57c74 2005-12-27 devnull Rune *er;
456 fa325e9b 2020-01-10 cross
457 536f9b83 2006-05-21 devnull USED(x);
458 30d57c74 2005-12-27 devnull html_init();
459 30d57c74 2005-12-27 devnull Binit(&b, 1, OWRITE);
460 30d57c74 2005-12-27 devnull er = r+n;
461 30d57c74 2005-12-27 devnull for(; r<er; r++){
462 30d57c74 2005-12-27 devnull if(*r < Runeself)
463 30d57c74 2005-12-27 devnull Bputrune(&b, *r);
464 30d57c74 2005-12-27 devnull else if((s = findbyrune(*r)) != nil)
465 30d57c74 2005-12-27 devnull Bprint(&b, "&%s;", s);
466 30d57c74 2005-12-27 devnull else
467 1a8bd157 2006-02-14 devnull Bprint(&b, "&#%d;", *r);
468 30d57c74 2005-12-27 devnull }
469 30d57c74 2005-12-27 devnull Bflush(&b);
470 30d57c74 2005-12-27 devnull }