Fix for UBSan build
[platform/upstream/doxygen.git] / src / bib2xhtml.h
1 "#\n"
2 "# Below is a stripped down version of bib2xhtml used by doxygen.\n"
3 "# For the full version see http://www.spinellis.gr/sw/textproc/bib2xhtml/\n"
4 "#\n"
5 "# Convert from bibtex to XHTML.\n"
6 "#\n"
7 "# (C) Copyright 1995, 1996 David Hull.\n"
8 "# (David Hull / hull@cs.uiuc.edu / http://www.uiuc.edu/ph/www/dlhull)\n"
9 "#\n"
10 "# (C) Copyright 2002-2010 Diomidis Spinellis\n"
11 "# http://www.spinellis.gr\n"
12 "#\n"
13 "# This program is free software.  You can redistribute it and/or modify\n"
14 "# it under the terms of the GNU General Public License.  See the\n"
15 "# files README and COPYING for details.\n"
16 "#\n"
17 "# This source code contains UTF-8 characters.  You might want to use\n"
18 "# an appropriate editor, if you want to view/modify the LaTeX to Unicode\n"
19 "# substitution commands.\n"
20 "#\n"
21 "\n"
22 "use Getopt::Std;\n"
23 "use open IO => ':crlf';\n"
24 "$label_styles{'numbered'} =    $LABEL_NUMBERED =       2;\n"
25 "$list_start[$LABEL_NUMBERED] = 'dl class=\"citelist\"';\n"
26 "$list_end[$LABEL_NUMBERED] = \"/dl\";\n"
27 "@tmpfiles = ();\n"
28 "sub html_ent {\n"
29 "       s/\\\\i\\b/i/g;\n"
30 "       s/\\\\\\'(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2acute;/gs;\n"
31 "       s/\\\\\\'([AEIOUaeiou])/&$1acute;/g;\n"
32 "       s/\\\\\\`(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2grave;/gs;\n"
33 "       s/\\\\\\`([AEIOUaeiou])/&$1grave;/g;\n"
34 "       s/\\\\\\\"(\\001\\d+)\\{([AEIOUaeiouy])\\1\\}/&$2uml;/gs;\n"
35 "       s/\\\\\\\"([AEIOUaeiouy])/&$1uml;/g;\n"
36 "       s/\\\\\\~(\\001\\d+)\\{([ANOano])\\1\\}/&$2tilde;/gs;\n"
37 "       s/\\\\\\~([ANOano])/&$1tilde;/g;\n"
38 "       s/\\\\\\^(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2circ;/gs;\n"
39 "       s/\\\\\\^([AEIOUaeiou])/&$1circ;/g;\n"
40 "       s/\\\\c(\\001\\d+)\\{([Cc])\\1\\}/&$2cedil;/gs;\n"
41 "       s/\\\\u(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n"
42 "       s/\\\\v(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n"
43 "       s/\\\\([lL])\\b/$1/g;\n"
44 "       s/\\\\\\=(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n"
45 "       s/\\\\\\=(.)/$1/g;\n"
46 "       s/\\\\\\.(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n"
47 "       s/\\\\\\.(.)/$1/g;\n"
48 "       s/\\\\([Oo])\\b\\s*/&$1slash;/g;\n"
49 "       s/\\\\AA\\b\\s*/Å/g;\n"
50 "       s/\\\\aa\\b\\s*/å/g;\n"
51 "       s/\\\\AE\\b\\s*/Æ/g;\n"
52 "       s/\\\\ae\\b\\s*/æ/g;\n"
53 "       s/\\\\ss\\b\\s*/ß/g;\n"
54 "       s/\\\\S\\b\\s*/§/g;\n"
55 "       s/\\\\P\\b\\s*/¶/g;\n"
56 "       s/\\\\pounds\\b\\s*/£/g;\n"
57 "       s/\\?\\`/¿/g;\n"
58 "       s/\\!\\`/¡/g;\n"
59 "       s/\\-\\-\\-/—/g;\n"
60 "       s/([^\\!])\\-\\-([^\\>])/$1–$2/g;\n"
61 "       s/\\\\([aA]lpha)\\b/&$1;/g;\n"
62 "       s/\\\\([bB]eta)\\b/&$1;/g;\n"
63 "       s/\\\\([gG]amma)\\b/&$1;/g;\n"
64 "       s/\\\\([dD]elta)\\b/&$1;/g;\n"
65 "       s/\\\\varepsilon\\b/ε/g;\n"
66 "       s/\\\\([eE]psilon)\\b/&$1;/g;\n"
67 "       s/\\\\([zZ]eta)\\b/&$1;/g;\n"
68 "       s/\\\\([eE]ta)\\b/&$1;/g;\n"
69 "       s/\\\\([tT]heta)\\b/&$1;/g;\n"
70 "       s/\\\\vartheta\\b/θ/g;\n"
71 "       s/\\\\([iI]ota)\\b/&$1;/g;\n"
72 "       s/\\\\([kK]appa)\\b/&$1;/g;\n"
73 "       s/\\\\([lL]ambda)\\b/&$1;/g;\n"
74 "       s/\\\\([mM]u)\\b/&$1;/g;\n"
75 "       s/\\\\([nN]u)\\b/&$1;/g;\n"
76 "       s/\\\\([xX]i)\\b/&$1;/g;\n"
77 "       s/\\\\([oO]micron)\\b/&$1;/g;\n"
78 "       s/\\\\([pP]i)\\b/&$1;/g;\n"
79 "       s/\\\\varpi\\b/π/g;\n"
80 "       s/\\\\([rR]ho)\\b/&$1;/g;\n"
81 "       s/\\\\varrho\\b/ρ/g;\n"
82 "       s/\\\\([sS]igma)\\b/&$1;/g;\n"
83 "       s/\\\\varsigma\\b/ς/g;\n"
84 "       s/\\\\([tT]au)\\b/&$1;/g;\n"
85 "       s/\\\\([uU]psilon)\\b/&$1;/g;\n"
86 "       s/\\\\([pP]hi)\\b/&$1;/g;\n"
87 "       s/\\\\varphi\\b/φ/g;\n"
88 "       s/\\\\([cC]hi)\\b/&$1;/g;\n"
89 "       s/\\\\([pP]si)\\b/&$1;/g;\n"
90 "       s/\\\\([oO]mega)\\b/&$1;/g;\n"
91 "       s/\\\\S\\b/§/g;\n"
92 "       s/^\\\\circ\\b/°/g;\n"
93 "       s/\\\\infty\\b/∞/g;\n"
94 "       s/\\\\emptyset\\b/∅/g;\n"
95 "       s/\\\\pm\\b/±/g;\n"
96 "       s/\\\\times\\b/×/g;\n"
97 "       s/\\\\cdot\\b/⋅/g;\n"
98 "       s/\\\\partial\\b/∂/g;\n"
99 "       s/\\\\nabla\\b/∇/g;\n"
100 "       s/\\\\surd\\b/√/g;\n"
101 "       s/\\\\perp\\b/⊥/g;\n"
102 "       s/\\\\sum\\b/∑/g;\n"
103 "       s/\\\\int\\b/∫/g;\n"
104 "       s/\\\\prod\\b/∏/g;\n"
105 "       s/\\\\sim\\b/∼/g;\n"
106 "       s/\\\\approx\\b/≈/g;\n"
107 "       s/\\\\ne\\b/≠/g;\n"
108 "       s/\\\\equiv\\b/≡/g;\n"
109 "       s/\\\\propto\\b/∝/g;\n"
110 "       s/\\\\le\\b/≤/g;\n"
111 "       s/\\\\ge\\b/≥/g;\n"
112 "       s/\\\\leftarrow\\b/←/g;\n"
113 "       s/\\\\rightarrow\\b/→/g;\n"
114 "       s/\\\\in\\b/∈/g;\n"
115 "       s/\\\\notin\\b/∉/g;\n"
116 "       s/\\\\lceil\\b/⌈/g;\n"
117 "       s/\\\\rceil\\b/⌉/g;\n"
118 "       s/\\\\lfloor\\b/⌊/g;\n"
119 "       s/\\\\rfloor\\b/⌋/g;\n"
120 "}\n"
121 "foreach (@ARGV) {\n"
122 "  if (/\\.bib$/) {\n"
123 "    $bibfile = $_;\n"
124 "    $bibfile =~ s/\\.bib$//;\n"
125 "    push(@bibfiles,$bibfile);\n"
126 "  } else {\n"
127 "    $htmlfile = $_;\n"
128 "  }\n"
129 "}\n"
130 "exit(1) unless defined($htmlfile);\n"
131 "$bibdatacmd=\"\\\\bibdata{\".join(',',@bibfiles).\"}\";\n"
132 "$label_style = $LABEL_NUMBERED;\n"
133 "$bstfile = \"doxygen\";\n"
134 "umask(077);\n"
135 "open(HTMLFILE,\">$htmlfile$$\");\n"
136 "if (open(OHTMLFILE, \"$htmlfile\")) {\n"
137 "    $mode = (stat OHTMLFILE)[2] & 0xfff;\n"
138 "} else {\n"
139 "  print \"Error opening $htmlfile\\n\";\n"
140 "  exit(1);\n"
141 "}\n"
142 "$beginstring = \"<!-- BEGIN CITATIONS -->\";\n"
143 "$endstring = \"<!-- END CITATIONS -->\";\n"
144 "@citations = ();\n"
145 "loop:\n"
146 "while (<OHTMLFILE>) {\n"
147 "  print HTMLFILE;\n"
148 "  last loop if m/^$beginstring$/;\n"
149 "}\n"
150 "loop:\n"
151 "while (<OHTMLFILE>) {\n"
152 "  print HTMLFILE;\n"
153 "  last loop if m/^$endstring$/;\n"
154 "  push(@citations, $2) if m/^([^\\\\]*)?(.+\\})(.*)?$/;\n"
155 "}\n"
156 "push(@citations, $bibdatacmd);\n"
157 "$auxfile = \"bib$$\";\n"
158 "push(@tmpfiles, \"$auxfile.aux\");\n"
159 "open(AUXFILE, \">$auxfile\" . \".aux\");\n"
160 "print AUXFILE \"\\\\relax\\n\\\\bibstyle{$bstfile}\\n\";\n"
161 "foreach $citation (@citations) {\n"
162 "  print AUXFILE \"$citation\\n\";\n"
163 "}\n"
164 "close(AUXFILE);\n"
165 "push(@tmpfiles, \"$auxfile.blg\");\n"
166 "push(@tmpfiles, \"$auxfile.bbl\");\n"
167 "`bibtex $auxfile 2>&1`;\n"
168 "if ($?==-1)\n"
169 "{\n"
170 "  print \"bibtex command failed: $!\\n\";\n"
171 "}\n"
172 "$beginstring = \"<!-- BEGIN BIBLIOGRAPHY -->\";\n"
173 "$endstring = \"<!-- END BIBLIOGRAPHY -->\";\n"
174 "loop:\n"
175 "while (<OHTMLFILE>) {\n"
176 "  last loop if m/^$beginstring$/;\n"
177 "  print HTMLFILE;\n"
178 "}\n"
179 "loop:\n"
180 "while (<OHTMLFILE>) {\n"
181 "  last loop if m/^$endstring$/;\n"
182 "}\n"
183 "print HTMLFILE \"$beginstring\\n\";\n"
184 "$t = $auxfile . \".bbl\";\n"
185 "$/ = \"\";\n"
186 "open(BBLFILE, \"<$t\") || die \"error opening $t: $!\\n\";\n"
187 "$nentry = 0;\n"
188 "loop:\n"
189 "while (<BBLFILE>) {\n"
190 "    if (($nentry == 0) && (m/^#/)) {\n"
191 "       if ((m/#\\s*label-style:\\s*(\\S+)/) && (! defined $label_style)) {\n"
192 "           $label_style = $label_styles{$1};\n"
193 "           if (! defined $label_style) {\n"
194 "               print STDERR \"label style unknown: \\n\";\n"
195 "               next loop;\n"
196 "           }\n"
197 "       }\n"
198 "       next loop;\n"
199 "    }\n"
200 "    $nentry++;\n"
201 "    ($bcite, $blabel) = m+<dt><a name=\\\"([^\\\"]*)\\\">\\[([^\\]]*)\\]</a></dt><dd>+;\n"
202 "    $blabel = \"$nentry\";\n"
203 "    $bibcite{$bcite} = $blabel;\n"
204 "}\n"
205 "close(BBLFILE);\n"
206 "$label_style = $LABEL_DEFAULT if (! defined $label_style);\n"
207 "$list_start = $list_start[$label_style];\n"
208 "$list_end = $list_end[$label_style];\n"
209 "print HTMLFILE \"<$list_start>\\n\\n\";\n"
210 "open(BBLFILE, \"<$t\") || die \"error opening $t: $!\\n\";\n"
211 "$nentry = 0;\n"
212 "loop:\n"
213 "while (<BBLFILE>) {\n"
214 "    next loop if (($nentry == 0) && (m/^#/));\n"
215 "    $nentry++;\n"
216 "    s/\\\\\\{/\\002/g;\n"
217 "    s/\\\\\\}/\\003/g;\n"
218 "    s/\\\\\\$/\\004/g;\n"
219 "    {\n"
220 "       local ($c, $l, $z) = (0, 0, ());\n"
221 "       s/([\\{\\}])/join(\"\",\"\\001\",($1 eq \"\\{\" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;\n"
222 "    }\n"
223 "    s/\\%\\n//g;\n"
224 "    s/(\\.(<\\/cite>|<\\/a>|\\')+)\\./$1/g;\n"
225 "    s:(<dt><a name=\\\"[^\\\"]*\\\">\\[)[^\\]]*(\\]</a></dt><dd>):$1$nentry$2:;\n"
226 "    while (m/(\\\\(cite(label)?)(\\001\\d+)\\{([^\\001]+)\\4\\})/) {\n"
227 "       $old = $1;\n"
228 "       $cmd = $2;\n"
229 "       $doxref = defined($3);\n"
230 "       $bcite = $5;\n"
231 "       if (! defined $bibcite{$bcite}) {\n"
232 "           $blabel = \" [\" . $bcite . \"]\";\n"
233 "       } elsif ($doxref) {\n"
234 "           $blabel = \" <a href=\\\"#$bcite\\\">[\" . $bibcite{$bcite} . \"]<\\/a>\";\n"
235 "       } else {\n"
236 "           $blabel = \" [\" . $bibcite{$bcite} . \"]\";\n"
237 "       }\n"
238 "       $old =~ s/(\\W)/\\\\$1/g;\n"
239 "       s/\\s*$old/$blabel/g;\n"
240 "    }\n"
241 "    s/In (<a href=\\\"[^\\\"]*\\\">)([^\\[]+) \\[(\\2)/In $1\\[$2/;\n"
242 "    s/\\\\htmladdnormallink(foot)?(\\001\\d+)\\{([^\\001]+)\\2\\}(\\001\\d+)\\{([^\\001]+)\\4\\}/<a href=\"$5\">$3<\\/a>/gs;\n"
243 "    s/\\&amp;/\\005/g;\n"
244 "    s/\\\\?&/&amp;/g;\n"
245 "    s/\\005/&amp;/g;\n"
246 "    html_ent();\n"
247 "    while (m/\\\\char([\\'\\\"]?[0-9a-fA-F]+)/) {\n"
248 "       $o = $r = $1;\n"
249 "       if ($r =~ s/^\\'//) {\n"
250 "           $r = oct($r);\n"
251 "       } elsif ($r =~ s/^\\\"//) {\n"
252 "           $r = hex($r);\n"
253 "       }\n"
254 "       s/\\\\char$o\\s*/&#$r;/g;\n"
255 "    }\n"
256 "    s/{\\\\etalchar\\001(\\d+)\\{(.)}\\001\\1\\}/$2/g;\n"
257 "    s/\\\\par\\b/<p \\/>/g;\n"
258 "    s/\\\\url(\\001\\d+)\\{(.*)\\1\\}/<a href=\"$2\">$2<\\/a>/gs;\n"
259 "    s/\\\\href(\\001\\d+)\\{(.*)\\1\\}(\\001\\d+)\\{([^\\001]*)\\3\\}/<a href=\"$2\">$4<\\/a>/gs;\n"
260 "    s/\\\\href(\\001\\d+)\\{(.*)\\1\\}/<a href=\"$2\">$2<\\/a>/gs;\n"
261 "    s/(\\001\\d+)\\{\\\\rm\\s+(.*)\\1\\}/$2/gs;\n"
262 "    s/\\\\textrm(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n"
263 "    s/(\\001\\d+)\\{\\\\em\\s+(.*)\\1\\}/<em>$2<\\/em>/gs;\n"
264 "    s/(\\001\\d+)\\{\\\\it\\s+(.*)\\1\\}/<i>$2<\\/i>/gs;\n"
265 "    s/(\\001\\d+)\\{\\\\bf\\s+(.*)\\1\\}/<b>$2<\\/b>/gs;\n"
266 "    s/(\\001\\d+)\\{\\\\tt\\s+(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n"
267 "    s/\\\\emph(\\001\\d+)\\{(.*)\\1\\}/<em>$2<\\/em>/gs;\n"
268 "    s/\\\\textit(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n"
269 "    s/\\\\textbf(\\001\\d+)\\{(.*)\\1\\}/<b>$2<\\/b>/gs;\n"
270 "    s/\\\\texttt(\\001\\d+)\\{(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n"
271 "    s/\\\\mathrm(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n"
272 "    s/\\\\mathnormal(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n"
273 "    s/\\\\mathsf(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n"
274 "    s/\\\\mathbf(\\001\\d+)\\{(.*)\\1\\}/<b>$2<\\/b>/gs;\n"
275 "    s/\\\\mathcal(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n"
276 "    s/\\\\mathit(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n"
277 "    s/\\\\mathtt(\\001\\d+)\\{(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n"
278 "    s/\\\\bibxhtmlname(\\001\\d+)\\{(.*)\\1\\}/$2/ges;\n"
279 "    sub domath {\n"
280 "      local($t) = @_;\n"
281 "      $t =~ s/\\^(\\001\\d+)\\{\\\\circ\\1\\}/\\&\\#176;/gs;\n"
282 "      $t =~ s/\\^\\\\circ/\\&\\#176;/g;\n"
283 "      $t =~ s/\\^(\\001\\d+)\\{(.*)\\1\\}/<sup>$2<\\/sup>/gs;\n"
284 "      $t =~ s/\\^(\\w)/<sup>$1<\\/sup>/g;\n"
285 "      $t =~ s/\\_(\\001\\d+)\\{(.*)\\1\\}/<sub>$2<\\/sub>/gs;\n"
286 "      $t =~ s/\\_(\\w)/<sub>$1<\\/sub>/g;\n"
287 "      $t;\n"
288 "    }\n"
289 "    s/(\\$([^\\$]+)\\$)/&domath($2)/ge;\n"
290 "    s/(\\\\\\((([^\\\\]|\\\\[^\\(\\)])+)\\\\\\))/&domath($2)/ge;\n"
291 "    s/\\\\mbox(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n"
292 "    while (s/(\\<a href\\=\\\"[^\"]*?)\\~/$1\\005/g) { ; }\n"
293 "    s/([^\\\\])~/$1&nbsp;/g;\n"
294 "    s/\\\\\\,/&thinsp;/g;\n"
295 "    s/\\\\ldots\\b/&hellip;/g;\n"
296 "    s/\\\\dots\\b/&hellip;/g;\n"
297 "    s/\\005/\\~/g;\n"
298 "    s/\\\\ / /g;\n"
299 "    s/\\\\textasciitilde\\b\\s*/~/g;\n"
300 "    s/\\\\([\\#\\&\\%\\~\\_\\^\\|])/$1/g;\n"
301 "    s/\\\\\\W//g;\n"
302 "    s/\\001(\\d+)\\{\\\\[A-Za-z]+\\001(\\d+)\\{([^\\001]*)\\001\\2\\}\\001\\1\\}/$3/g;\n"
303 "    s/\\\\([A-Za-z]+)/ $1 /g;\n"
304 "    s+In <a href=\\\"[^\\\"]*\\\"></a>++;\n"
305 "    s/\\001\\d+[\\{\\}]//gs;\n"
306 "    tr/\\002\\003\\004/{}$/;\n"
307 "    print HTMLFILE $_;\n"
308 "}\n"
309 "close(BBLFILE);\n"
310 "print HTMLFILE \"<$list_end>\\n\\n$endstring\\n\";\n"
311 "while (<OHTMLFILE>) {\n"
312 "  print HTMLFILE;\n"
313 "}\n"
314 "close (OHTMLFILE);\n"
315 "close(HTMLFILE);\n"
316 "chmod($mode, \"$htmlfile$$\");\n"
317 "rename(\"$htmlfile$$\", $htmlfile);\n"
318 "unlink(@tmpfiles);\n"
319 "exit(0);\n"