7 typedef struct Hchar Hchar;
15 * Names beginning with _ are names we recognize
16 * (without the underscore) but will not generate,
17 * because they are nonstandard.
19 static Hchar byname[] =
31 {"ApplyFunction", 8289},
49 {"CapitalDifferentialD", 8517},
61 {"CircleMinus", 8854},
63 {"CircleTimes", 8855},
64 {"ClockwiseContourIntegral", 8754},
65 {"CloseCurlyDoubleQuote", 8221},
66 {"CloseCurlyQuote", 8217},
71 {"ContourIntegral", 8750},
74 {"CounterClockwiseContourIntegral", 8755},
90 {"DiacriticalAcute", 180},
91 {"DiacriticalDot", 729},
92 {"DiacriticalDoubleAcute", 733},
93 {"DiacriticalGrave", 96},
94 {"DiacriticalTilde", 732},
96 {"DifferentialD", 8518},
100 {"DoubleContourIntegral", 8751},
102 {"DoubleDownArrow", 8659},
103 {"DoubleLeftArrow", 8656},
104 {"DoubleLeftRightArrow", 8660},
105 {"DoubleLeftTee", 10980},
106 {"DoubleLongLeftArrow", 10232},
107 {"DoubleLongLeftRightArrow", 10234},
108 {"DoubleLongRightArrow", 10233},
109 {"DoubleRightArrow", 8658},
110 {"DoubleRightTee", 8872},
111 {"DoubleUpArrow", 8657},
112 {"DoubleUpDownArrow", 8661},
113 {"DoubleVerticalBar", 8741},
115 {"DownArrowBar", 10515},
116 {"DownArrowUpArrow", 8693},
118 {"DownLeftRightVector", 10576},
119 {"DownLeftTeeVector", 10590},
120 {"DownLeftVector", 8637},
121 {"DownLeftVectorBar", 10582},
122 {"DownRightTeeVector", 10591},
123 {"DownRightVector", 8641},
124 {"DownRightVectorBar", 10583},
126 {"DownTeeArrow", 8615},
139 {"EmptySmallSquare", 9723},
140 {"EmptyVerySmallSquare", 9643},
144 {"EqualTilde", 8770},
145 {"Equilibrium", 8652},
151 {"ExponentialE", 8519},
153 {"FilledSmallSquare", 9724},
154 {"FilledVerySmallSquare", 9642},
156 {"Fouriertrf", 8497},
167 {"GreaterEqual", 8805},
168 {"GreaterEqualLess", 8923},
169 {"GreaterFullEqual", 8807},
170 {"GreaterGreater", 10914},
171 {"GreaterLess", 8823},
172 {"GreaterSlantEqual", 10878},
173 {"GreaterTilde", 8819},
180 {"HilbertSpace", 8459},
182 {"HorizontalLine", 9472},
185 {"HumpDownHump", 8782},
198 {"ImaginaryI", 8520},
202 {"Intersection", 8898},
203 {"InvisibleComma", 8291},
204 {"InvisibleTimes", 8290},
224 {"Laplacetrf", 8466},
229 {"LeftAngleBracket", 10216},
231 {"LeftArrowBar", 8676},
232 {"LeftArrowRightArrow", 8646},
233 {"LeftCeiling", 8968},
234 {"LeftDoubleBracket", 10214},
235 {"LeftDownTeeVector", 10593},
236 {"LeftDownVector", 8643},
237 {"LeftDownVectorBar", 10585},
239 {"LeftRightArrow", 8596},
240 {"LeftRightVector", 10574},
242 {"LeftTeeArrow", 8612},
243 {"LeftTeeVector", 10586},
244 {"LeftTriangle", 8882},
245 {"LeftTriangleBar", 10703},
246 {"LeftTriangleEqual", 8884},
247 {"LeftUpDownVector", 10577},
248 {"LeftUpTeeVector", 10592},
249 {"LeftUpVector", 8639},
250 {"LeftUpVectorBar", 10584},
251 {"LeftVector", 8636},
252 {"LeftVectorBar", 10578},
254 {"Leftrightarrow", 8660},
255 {"LessEqualGreater", 8922},
256 {"LessFullEqual", 8806},
257 {"LessGreater", 8822},
259 {"LessSlantEqual", 10877},
262 {"Lleftarrow", 8666},
264 {"LongLeftArrow", 10229},
265 {"LongLeftRightArrow", 10231},
266 {"LongRightArrow", 10230},
267 {"Longleftarrow", 10232},
268 {"Longleftrightarrow", 10234},
269 {"Longrightarrow", 10233},
270 {"LowerLeftArrow", 8601},
271 {"LowerRightArrow", 8600},
278 {"MediumSpace", 8287},
288 {"NegativeMediumSpace", 8203},
289 {"NegativeThickSpace", 8203},
290 {"NegativeThinSpace", 8203},
291 {"NegativeVeryThinSpace", 8203},
292 {"NestedGreaterGreater", 8811},
293 {"NestedLessLess", 8810},
296 {"NonBreakingSpace", 160},
299 {"NotCongruent", 8802},
301 {"NotDoubleVerticalBar", 8742},
302 {"NotElement", 8713},
304 {"NotEqualTilde", 8770},
306 {"NotGreater", 8815},
307 {"NotGreaterEqual", 8817},
308 {"NotGreaterFullEqual", 8807},
309 {"NotGreaterGreater", 8811},
310 {"NotGreaterLess", 8825},
311 {"NotGreaterSlantEqual", 10878},
312 {"NotGreaterTilde", 8821},
313 {"NotHumpDownHump", 8782},
314 {"NotHumpEqual", 8783},
315 {"NotLeftTriangle", 8938},
316 {"NotLeftTriangleBar", 10703},
317 {"NotLeftTriangleEqual", 8940},
319 {"NotLessEqual", 8816},
320 {"NotLessGreater", 8824},
321 {"NotLessLess", 8810},
322 {"NotLessSlantEqual", 10877},
323 {"NotLessTilde", 8820},
324 {"NotNestedGreaterGreater", 10914},
325 {"NotNestedLessLess", 10913},
326 {"NotPrecedes", 8832},
327 {"NotPrecedesEqual", 10927},
328 {"NotPrecedesSlantEqual", 8928},
329 {"NotReverseElement", 8716},
330 {"NotRightTriangle", 8939},
331 {"NotRightTriangleBar", 10704},
332 {"NotRightTriangleEqual", 8941},
333 {"NotSquareSubset", 8847},
334 {"NotSquareSubsetEqual", 8930},
335 {"NotSquareSuperset", 8848},
336 {"NotSquareSupersetEqual", 8931},
338 {"NotSubsetEqual", 8840},
339 {"NotSucceeds", 8833},
340 {"NotSucceedsEqual", 10928},
341 {"NotSucceedsSlantEqual", 8929},
342 {"NotSucceedsTilde", 8831},
343 {"NotSuperset", 8835},
344 {"NotSupersetEqual", 8841},
346 {"NotTildeEqual", 8772},
347 {"NotTildeFullEqual", 8775},
348 {"NotTildeTilde", 8777},
349 {"NotVerticalBar", 8740},
361 {"OpenCurlyDoubleQuote", 8220},
362 {"OpenCurlyQuote", 8216},
370 {"OverBracket", 9140},
371 {"OverParenthesis", 9180},
377 {"Poincareplane", 8460},
381 {"PrecedesEqual", 10927},
382 {"PrecedesSlantEqual", 8828},
383 {"PrecedesTilde", 8830},
386 {"Proportion", 8759},
387 {"Proportional", 8733},
399 {"ReverseElement", 8715},
400 {"ReverseEquilibrium", 8651},
401 {"ReverseUpEquilibrium", 10607},
404 {"RightAngleBracket", 10217},
405 {"RightArrow", 8594},
406 {"RightArrowBar", 8677},
407 {"RightArrowLeftArrow", 8644},
408 {"RightCeiling", 8969},
409 {"RightDoubleBracket", 10215},
410 {"RightDownTeeVector", 10589},
411 {"RightDownVector", 8642},
412 {"RightDownVectorBar", 10581},
413 {"RightFloor", 8971},
415 {"RightTeeArrow", 8614},
416 {"RightTeeVector", 10587},
417 {"RightTriangle", 8883},
418 {"RightTriangleBar", 10704},
419 {"RightTriangleEqual", 8885},
420 {"RightUpDownVector", 10575},
421 {"RightUpTeeVector", 10588},
422 {"RightUpVector", 8638},
423 {"RightUpVectorBar", 10580},
424 {"RightVector", 8640},
425 {"RightVectorBar", 10579},
426 {"Rightarrow", 8658},
428 {"RoundImplies", 10608},
429 {"Rrightarrow", 8667},
432 {"RuleDelayed", 10740},
442 {"ShortDownArrow", 8595},
443 {"ShortLeftArrow", 8592},
444 {"ShortRightArrow", 8594},
445 {"ShortUpArrow", 8593},
447 {"SmallCircle", 8728},
450 {"SquareIntersection", 8851},
451 {"SquareSubset", 8847},
452 {"SquareSubsetEqual", 8849},
453 {"SquareSuperset", 8848},
454 {"SquareSupersetEqual", 8850},
455 {"SquareUnion", 8852},
459 {"SubsetEqual", 8838},
461 {"SucceedsEqual", 10928},
462 {"SucceedsSlantEqual", 8829},
463 {"SucceedsTilde", 8831},
468 {"SupersetEqual", 8839},
480 {"ThickSpace", 8287},
483 {"TildeEqual", 8771},
484 {"TildeFullEqual", 8773},
485 {"TildeTilde", 8776},
499 {"UnderBrace", 9183},
500 {"UnderBracket", 9141},
501 {"UnderParenthesis", 9181},
506 {"UpArrowBar", 10514},
507 {"UpArrowDownArrow", 8645},
508 {"UpDownArrow", 8597},
509 {"UpEquilibrium", 10606},
511 {"UpTeeArrow", 8613},
513 {"Updownarrow", 8661},
514 {"UpperLeftArrow", 8598},
515 {"UpperRightArrow", 8599},
529 {"VerticalBar", 8739},
530 {"VerticalLine", 124},
531 {"VerticalSeparator", 10072},
532 {"VerticalTilde", 8768},
533 {"VeryThinSpace", 8202},
550 {"ZeroWidthSpace", 8203},
561 {"_emdash", 8212}, /* non-standard but commonly used */
562 {"_endash", 8211}, /* non-standard but commonly used */
565 {"_varepsilon", 1013},
628 {"backepsilon", 1014},
653 {"bigotimes", 10754},
656 {"bigtriangledown", 9661},
657 {"bigtriangleup", 9651},
662 {"blacklozenge", 10731},
663 {"blacksquare", 9642},
664 {"blacktriangle", 9652},
665 {"blacktriangledown", 9662},
666 {"blacktriangleleft", 9666},
667 {"blacktriangleright", 9656},
762 {"checkmark", 10003},
768 {"circlearrowleft", 8634},
769 {"circlearrowright", 8635},
772 {"circledast", 8859},
773 {"circledcirc", 8858},
774 {"circleddash", 8861},
788 {"complement", 8705},
818 {"curlyeqprec", 8926},
819 {"curlyeqsucc", 8927},
821 {"curlywedge", 8911},
823 {"curvearrowleft", 8630},
824 {"curvearrowright", 8631},
854 {"diamondsuit", 9830},
861 {"divideontimes", 8903},
873 {"doublebarwedge", 8966},
875 {"downdownarrows", 8650},
876 {"downharpoonleft", 8643},
877 {"downharpoonright", 8642},
932 {"eqslantgtr", 10902},
933 {"eqslantless", 10901},
950 {"expectation", 8496},
951 {"exponentiale", 8519},
952 {"fallingdotseq", 8786},
1004 {"gesdotol", 10884},
1017 {"gnapprox", 10890},
1033 {"gtrapprox", 10886},
1036 {"gtreqless", 8923},
1037 {"gtreqqless", 10892},
1040 {"gvertneqq", 8809},
1053 {"heartsuit", 9829},
1056 {"hksearow", 10533},
1057 {"hkswarow", 10534},
1060 {"hookleftarrow", 8617},
1061 {"hookrightarrow", 8618},
1091 {"infintie", 10717},
1097 {"intlarhk", 10775},
1134 {"laemptyv", 10676},
1172 {"ldrushar", 10571},
1175 {"leftarrow", 8592},
1176 {"leftarrowtail", 8610},
1177 {"leftharpoondown", 8637},
1178 {"leftharpoonup", 8636},
1179 {"leftleftarrows", 8647},
1180 {"leftrightarrow", 8596},
1181 {"leftrightarrows", 8646},
1182 {"leftrightharpoons", 8651},
1183 {"leftrightsquigarrow", 8621},
1184 {"leftthreetimes", 8907},
1188 {"leqslant", 10877},
1193 {"lesdotor", 10883},
1196 {"lessapprox", 10885},
1198 {"lesseqgtr", 8922},
1199 {"lesseqqgtr", 10891},
1218 {"lmoustache", 9136},
1221 {"lnapprox", 10889},
1229 {"longleftarrow", 10229},
1230 {"longleftrightarrow", 10231},
1231 {"longmapsto", 10236},
1232 {"longrightarrow", 10230},
1233 {"looparrowleft", 8619},
1234 {"looparrowright", 8620},
1272 {"lurdshar", 10570},
1274 {"lvertneqq", 8808},
1283 {"mapstodown", 8615},
1284 {"mapstoleft", 8612},
1290 {"measuredangle", 8737},
1313 {"nLeftarrow", 8653},
1314 {"nLeftrightarrow", 8654},
1318 {"nRightarrow", 8655},
1339 {"ncongdot", 10861},
1358 {"ngeqslant", 10878},
1376 {"nleftarrow", 8602},
1377 {"nleftrightarrow", 8622},
1380 {"nleqslant", 10877},
1400 {"nparallel", 8742},
1413 {"nrightarrow", 8603},
1419 {"nshortmid", 8740},
1420 {"nshortparallel", 8742},
1432 {"nsubseteq", 8840},
1433 {"nsubseteqq", 10949},
1440 {"nsupseteq", 8841},
1441 {"nsupseteqq", 10950},
1445 {"ntriangleleft", 8938},
1446 {"ntrianglelefteq", 8940},
1447 {"ntriangleright", 8939},
1448 {"ntrianglerighteq", 8941},
1520 {"otimesas", 10806},
1540 {"pitchfork", 8916},
1546 {"plusacir", 10787},
1556 {"pointint", 10773},
1564 {"precapprox", 10935},
1565 {"preccurlyeq", 8828},
1567 {"precnapprox", 10937},
1568 {"precneqq", 10933},
1589 {"quaternions", 8461},
1602 {"raemptyv", 10675},
1623 {"rationals", 8474},
1654 {"rightarrow", 8594},
1655 {"rightarrowtail", 8611},
1656 {"rightharpoondown", 8641},
1657 {"rightharpoonup", 8640},
1658 {"rightleftarrows", 8644},
1659 {"rightleftharpoons", 8652},
1660 {"rightrightarrows", 8649},
1661 {"rightsquigarrow", 8605},
1662 {"rightthreetimes", 8908},
1664 {"risingdotseq", 8787},
1669 {"rmoustache", 9137},
1679 {"rppolint", 10770},
1691 {"rtriltri", 10702},
1707 {"scpolint", 10771},
1728 {"shortparallel", 8741},
1745 {"smallsetminus", 8726},
1747 {"smeparsl", 10724},
1758 {"spadesuit", 9824},
1767 {"sqsubseteq", 8849},
1771 {"sqsupseteq", 8850},
1782 {"straightepsilon", 1013},
1783 {"straightphi", 981},
1797 {"subseteqq", 10949},
1798 {"subsetneq", 8842},
1799 {"subsetneqq", 10955},
1804 {"succapprox", 10936},
1805 {"succcurlyeq", 8829},
1807 {"succnapprox", 10938},
1808 {"succneqq", 10934},
1831 {"supseteqq", 10950},
1832 {"supsetneq", 8843},
1833 {"supsetneqq", 10956},
1852 {"therefore", 8756},
1856 {"thickapprox", 8776},
1865 {"timesbar", 10801},
1877 {"triangledown", 9663},
1878 {"triangleleft", 9667},
1879 {"trianglelefteq", 8884},
1880 {"triangleq", 8796},
1881 {"triangleright", 9657},
1882 {"trianglerighteq", 8885},
1885 {"triminus", 10810},
1894 {"twoheadleftarrow", 8606},
1895 {"twoheadrightarrow", 8608},
1920 {"updownarrow", 8597},
1921 {"upharpoonleft", 8639},
1922 {"upharpoonright", 8638},
1927 {"upuparrows", 8648},
1946 {"varnothing", 8709},
1948 {"varpropto", 8733},
1952 {"varsubsetneq", 8842},
1953 {"varsubsetneqq", 10955},
1954 {"varsupsetneq", 8843},
1955 {"varsupsetneqq", 10956},
1957 {"vartriangleleft", 8882},
1958 {"vartriangleright", 8883},
2027 static Hchar byrune[nelem(byname)];
2030 hnamecmp(const void *va, const void *vb)
2036 return strcmp(a->s, b->s);
2040 hrunecmp(const void *va, const void *vb)
2050 hlencmp(const void *va, const void *vb)
2056 return strlen(a->s) - strlen(b->s);
2068 memmove(byrune, byname, sizeof byrune);
2070 /* Eliminate names we aren't allowed to generate. */
2071 for(i=0; i<nelem(byrune); i++){
2072 if(byrune[i].s[0] == '_'){
2073 byrune[i].r = Runeerror;
2078 qsort(byname, nelem(byname), sizeof byname[0], hnamecmp);
2079 qsort(byrune, nelem(byrune), sizeof byrune[0], hrunecmp);
2081 /* Eliminate ambigious runes. use shotest name */
2082 for(j=0, i=1; i<nelem(byrune); i++){
2083 if(byrune[i].r == byrune[j].r)
2086 qsort(byrune+j, i-j, sizeof byrune[0], hlencmp);
2087 while(++j<i) byrune[j].r = Runeerror;
2092 qsort(byrune+j, i-j, sizeof byrune[0], hlencmp);
2093 while(++j<i) byrune[j].r = Runeerror;
2095 qsort(byrune, nelem(byrune), sizeof byrune[0], hrunecmp);
2108 x = strcmp(h[m].s, s);
2144 html_in(int fd, long *, struct convert *out)
2155 Binit(&b, fd, OREAD);
2156 while((c = Bgetrune(&b)) != Beof){
2158 OUT(out, runes, r-runes);
2164 for(i=1; i<nelem(buf)-1;){
2168 if(strchr(";&</> \t\r\n", c)){
2179 if((c = findbyname(buf+1)) != Runeerror)
2181 if(i > 2 && buf[1] == '#'){
2182 if(i > 3 && strchr("xX", buf[2]))
2183 c = strtol(buf+3, &p, 16);
2185 c = strtol(buf+2, &p, 10);
2194 for(p=buf; p<buf+i; ){
2195 p += chartorune(r++, p);
2197 OUT(out, runes, r-runes);
2204 if((c & 0x7f) == c && strchr("<>&\"'", c)){
2206 i = sprint(buf, "&%s", findbyrune(c));
2211 if(fixsurrogate(r, r2)){
2219 OUT(out, runes, r-runes);
2224 * use biobuf because can use more than UTFmax bytes per rune
2227 html_out(Rune *r, int n, long *)
2234 Binit(&b, 1, OWRITE);
2239 else if((s = findbyrune(*r)) != nil)
2240 Bprint(&b, "&%s;", s);
2242 Bprint(&b, "&#%d;", *r);