1
0
Fork 0
mirror of https://github.com/deltachat/deltachat-core.git synced 2025-10-06 03:50:08 +02:00
deltachat-core/docs/user/html/mrsaxparser_8c_source.html
2017-11-14 02:47:49 +01:00

99 lines
106 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>Delta Chat Core C-Library: /home/bpetersen/projects/deltachat-core/src/mrsaxparser.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="user.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Delta Chat Core C-Library
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">mrsaxparser.c</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * Delta Chat Core</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Copyright (C) 2017 Björn Petersen</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Contact: r10s@b44t.com, http://b44t.com</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * This program is free software: you can redistribute it and/or modify it under</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * the terms of the GNU General Public License as published by the Free Software</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * Foundation, either version 3 of the License, or (at your option) any later</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * version.</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * This program is distributed in the hope that it will be useful, but WITHOUT</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * details.</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> * You should have received a copy of the GNU General Public License along with</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * this program. If not, see http://www.gnu.org/licenses/ .</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/* mrsaxparser_t parses XML and HTML files that may not be wellformed</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">and spits out all text and tags found.</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment">- Attributes are recognized with single, double or no quotes</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">- Whitespace ignored inside tags</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">- Self-closing tags are issued as open-tag plus close-tag</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">- CDATA is supoorted; DTA, comments, processing instruction are</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment"> skipped properly</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="comment">- The parser does not care about hierarchy, if needed this can be</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="comment"> done by the user.</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="comment">- Input and output strings must be UTF-8 encoded.</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="comment">- Tag and attribute names are converted to lower case.</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="comment">- Parsing does not stop on errors; instead errors are recovered. */</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &lt;string.h&gt;</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#include &lt;ctype.h&gt;</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="preprocessor">#include &quot;mrmailbox.h&quot;</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="preprocessor">#include &quot;mrtools.h&quot;</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#include &quot;mrsaxparser.h&quot;</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment"> * Decoding text</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* s_ent[] = {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">/* Convert entities as &amp;auml; to UTF-8 characters.</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment"> - The first strings MUST NOT start with `&amp;` and MUST end with `;`.</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment"> - take care not to miss a comma between the strings.</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment"> - It&#39;s also possible to specify the destination as a character reference as `&amp;#34;` (they are converted in a second pass without a table). */</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="comment">/* basic XML/HTML */</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="stringliteral">&quot;lt;&quot;</span>, <span class="stringliteral">&quot;&lt;&quot;</span>, <span class="stringliteral">&quot;gt;&quot;</span>, <span class="stringliteral">&quot;&gt;&quot;</span>, <span class="stringliteral">&quot;quot;&quot;</span>, <span class="stringliteral">&quot;\&quot;&quot;</span>, <span class="stringliteral">&quot;apos;&quot;</span>, <span class="stringliteral">&quot;&#39;&quot;</span>,</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="stringliteral">&quot;amp;&quot;</span>, <span class="stringliteral">&quot;&amp;&quot;</span>, <span class="stringliteral">&quot;nbsp;&quot;</span>, <span class="stringliteral">&quot; &quot;</span>,</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">/* advanced HTML */</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="stringliteral">&quot;iexcl;&quot;</span>, <span class="stringliteral">&quot;¡&quot;</span>, <span class="stringliteral">&quot;cent;&quot;</span>, <span class="stringliteral">&quot;¢&quot;</span>, <span class="stringliteral">&quot;pound;&quot;</span>, <span class="stringliteral">&quot;£&quot;</span>, <span class="stringliteral">&quot;curren;&quot;</span>, <span class="stringliteral">&quot;¤&quot;</span>,</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="stringliteral">&quot;yen;&quot;</span>, <span class="stringliteral">&quot;¥&quot;</span>, <span class="stringliteral">&quot;brvbar;&quot;</span>, <span class="stringliteral">&quot;¦&quot;</span>, <span class="stringliteral">&quot;sect;&quot;</span>, <span class="stringliteral">&quot;§&quot;</span>, <span class="stringliteral">&quot;uml;&quot;</span>, <span class="stringliteral">&quot;¨&quot;</span>,</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="stringliteral">&quot;copy;&quot;</span>, <span class="stringliteral">&quot;©&quot;</span>, <span class="stringliteral">&quot;ordf;&quot;</span>, <span class="stringliteral">&quot;ª&quot;</span>, <span class="stringliteral">&quot;laquo;&quot;</span>, <span class="stringliteral">&quot;«&quot;</span>, <span class="stringliteral">&quot;not;&quot;</span>, <span class="stringliteral">&quot;¬&quot;</span>,</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="stringliteral">&quot;shy;&quot;</span>, <span class="stringliteral">&quot;-&quot;</span>, <span class="stringliteral">&quot;reg;&quot;</span>, <span class="stringliteral">&quot;®&quot;</span>, <span class="stringliteral">&quot;macr;&quot;</span>, <span class="stringliteral">&quot;¯&quot;</span>, <span class="stringliteral">&quot;deg;&quot;</span>, <span class="stringliteral">&quot;°&quot;</span>,</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="stringliteral">&quot;plusmn;&quot;</span>, <span class="stringliteral">&quot;±&quot;</span>, <span class="stringliteral">&quot;sup2;&quot;</span>, <span class="stringliteral">&quot;²&quot;</span>, <span class="stringliteral">&quot;sup3;&quot;</span>, <span class="stringliteral">&quot;³&quot;</span>, <span class="stringliteral">&quot;acute;&quot;</span>, <span class="stringliteral">&quot;´&quot;</span>,</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="stringliteral">&quot;micro;&quot;</span>, <span class="stringliteral">&quot;µ&quot;</span>, <span class="stringliteral">&quot;para;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;middot;&quot;</span>, <span class="stringliteral">&quot;·&quot;</span>, <span class="stringliteral">&quot;cedil;&quot;</span>, <span class="stringliteral">&quot;¸&quot;</span>,</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="stringliteral">&quot;sup1;&quot;</span>, <span class="stringliteral">&quot;¹&quot;</span>, <span class="stringliteral">&quot;ordm;&quot;</span>, <span class="stringliteral">&quot;º&quot;</span>, <span class="stringliteral">&quot;raquo;&quot;</span>, <span class="stringliteral">&quot;»&quot;</span>, <span class="stringliteral">&quot;frac14;&quot;</span>, <span class="stringliteral">&quot;¼&quot;</span>,</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="stringliteral">&quot;frac12;&quot;</span>, <span class="stringliteral">&quot;½&quot;</span>, <span class="stringliteral">&quot;frac34;&quot;</span>, <span class="stringliteral">&quot;¾&quot;</span>, <span class="stringliteral">&quot;iquest;&quot;</span>, <span class="stringliteral">&quot;¿&quot;</span>, <span class="stringliteral">&quot;Agrave;&quot;</span>, <span class="stringliteral">&quot;À&quot;</span>,</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="stringliteral">&quot;Aacute;&quot;</span>, <span class="stringliteral">&quot;Á&quot;</span>, <span class="stringliteral">&quot;Acirc;&quot;</span>, <span class="stringliteral">&quot;Â&quot;</span>, <span class="stringliteral">&quot;Atilde;&quot;</span>, <span class="stringliteral">&quot;Ã&quot;</span>, <span class="stringliteral">&quot;Auml;&quot;</span>, <span class="stringliteral">&quot;Ä&quot;</span>,</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="stringliteral">&quot;Aring;&quot;</span>, <span class="stringliteral">&quot;Å&quot;</span>, <span class="stringliteral">&quot;AElig;&quot;</span>, <span class="stringliteral">&quot;Æ&quot;</span>, <span class="stringliteral">&quot;Ccedil;&quot;</span>, <span class="stringliteral">&quot;Ç&quot;</span>, <span class="stringliteral">&quot;Egrave;&quot;</span>, <span class="stringliteral">&quot;È&quot;</span>,</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="stringliteral">&quot;Eacute;&quot;</span>, <span class="stringliteral">&quot;É&quot;</span>, <span class="stringliteral">&quot;Ecirc;&quot;</span>, <span class="stringliteral">&quot;Ê&quot;</span>, <span class="stringliteral">&quot;Euml;&quot;</span>, <span class="stringliteral">&quot;Ë&quot;</span>, <span class="stringliteral">&quot;Igrave;&quot;</span>, <span class="stringliteral">&quot;Ì&quot;</span>,</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="stringliteral">&quot;Iacute;&quot;</span>, <span class="stringliteral">&quot;Í&quot;</span>, <span class="stringliteral">&quot;Icirc;&quot;</span>, <span class="stringliteral">&quot;Î&quot;</span>, <span class="stringliteral">&quot;Iuml;&quot;</span>, <span class="stringliteral">&quot;Ï&quot;</span>, <span class="stringliteral">&quot;ETH;&quot;</span>, <span class="stringliteral">&quot;Ð&quot;</span>,</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="stringliteral">&quot;Ntilde;&quot;</span>, <span class="stringliteral">&quot;Ñ&quot;</span>, <span class="stringliteral">&quot;Ograve;&quot;</span>, <span class="stringliteral">&quot;Ò&quot;</span>, <span class="stringliteral">&quot;Oacute;&quot;</span>, <span class="stringliteral">&quot;Ó&quot;</span>, <span class="stringliteral">&quot;Ocirc;&quot;</span>, <span class="stringliteral">&quot;Ô&quot;</span>,</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="stringliteral">&quot;Otilde;&quot;</span>, <span class="stringliteral">&quot;Õ&quot;</span>, <span class="stringliteral">&quot;Ouml;&quot;</span>, <span class="stringliteral">&quot;Ö&quot;</span>, <span class="stringliteral">&quot;times;&quot;</span>, <span class="stringliteral">&quot;×&quot;</span>, <span class="stringliteral">&quot;Oslash;&quot;</span>, <span class="stringliteral">&quot;Ø&quot;</span>,</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="stringliteral">&quot;Ugrave;&quot;</span>, <span class="stringliteral">&quot;Ù&quot;</span>, <span class="stringliteral">&quot;Uacute;&quot;</span>, <span class="stringliteral">&quot;Ú&quot;</span>, <span class="stringliteral">&quot;Ucirc;&quot;</span>, <span class="stringliteral">&quot;Û&quot;</span>, <span class="stringliteral">&quot;Uuml;&quot;</span>, <span class="stringliteral">&quot;Ü&quot;</span>,</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="stringliteral">&quot;Yacute;&quot;</span>, <span class="stringliteral">&quot;Ý&quot;</span>, <span class="stringliteral">&quot;THORN;&quot;</span>, <span class="stringliteral">&quot;Þ&quot;</span>, <span class="stringliteral">&quot;szlig;&quot;</span>, <span class="stringliteral">&quot;ß&quot;</span>, <span class="stringliteral">&quot;agrave;&quot;</span>, <span class="stringliteral">&quot;à&quot;</span>,</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="stringliteral">&quot;aacute;&quot;</span>, <span class="stringliteral">&quot;á&quot;</span>, <span class="stringliteral">&quot;acirc;&quot;</span>, <span class="stringliteral">&quot;â&quot;</span>, <span class="stringliteral">&quot;atilde;&quot;</span>, <span class="stringliteral">&quot;ã&quot;</span>, <span class="stringliteral">&quot;auml;&quot;</span>, <span class="stringliteral">&quot;ä&quot;</span>,</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="stringliteral">&quot;aring;&quot;</span>, <span class="stringliteral">&quot;å&quot;</span>, <span class="stringliteral">&quot;aelig;&quot;</span>, <span class="stringliteral">&quot;æ&quot;</span>, <span class="stringliteral">&quot;ccedil;&quot;</span>, <span class="stringliteral">&quot;ç&quot;</span>, <span class="stringliteral">&quot;egrave;&quot;</span>, <span class="stringliteral">&quot;è&quot;</span>,</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="stringliteral">&quot;eacute;&quot;</span>, <span class="stringliteral">&quot;é&quot;</span>, <span class="stringliteral">&quot;ecirc;&quot;</span>, <span class="stringliteral">&quot;ê&quot;</span>, <span class="stringliteral">&quot;euml;&quot;</span>, <span class="stringliteral">&quot;ë&quot;</span>, <span class="stringliteral">&quot;igrave;&quot;</span>, <span class="stringliteral">&quot;ì&quot;</span>,</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="stringliteral">&quot;iacute;&quot;</span>, <span class="stringliteral">&quot;í&quot;</span>, <span class="stringliteral">&quot;icirc;&quot;</span>, <span class="stringliteral">&quot;î&quot;</span>, <span class="stringliteral">&quot;iuml;&quot;</span>, <span class="stringliteral">&quot;ï&quot;</span>, <span class="stringliteral">&quot;eth;&quot;</span>, <span class="stringliteral">&quot;ð&quot;</span>,</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="stringliteral">&quot;ntilde;&quot;</span>, <span class="stringliteral">&quot;ñ&quot;</span>, <span class="stringliteral">&quot;ograve;&quot;</span>, <span class="stringliteral">&quot;ò&quot;</span>, <span class="stringliteral">&quot;oacute;&quot;</span>, <span class="stringliteral">&quot;ó&quot;</span>, <span class="stringliteral">&quot;ocirc;&quot;</span>, <span class="stringliteral">&quot;ô&quot;</span>,</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="stringliteral">&quot;otilde;&quot;</span>, <span class="stringliteral">&quot;õ&quot;</span>, <span class="stringliteral">&quot;ouml;&quot;</span>, <span class="stringliteral">&quot;ö&quot;</span>, <span class="stringliteral">&quot;divide;&quot;</span>, <span class="stringliteral">&quot;÷&quot;</span>, <span class="stringliteral">&quot;oslash;&quot;</span>, <span class="stringliteral">&quot;ø&quot;</span>,</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="stringliteral">&quot;ugrave;&quot;</span>, <span class="stringliteral">&quot;ù&quot;</span>, <span class="stringliteral">&quot;uacute;&quot;</span>, <span class="stringliteral">&quot;ú&quot;</span>, <span class="stringliteral">&quot;ucirc;&quot;</span>, <span class="stringliteral">&quot;û&quot;</span>, <span class="stringliteral">&quot;uuml;&quot;</span>, <span class="stringliteral">&quot;ü&quot;</span>,</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="stringliteral">&quot;yacute;&quot;</span>, <span class="stringliteral">&quot;ý&quot;</span>, <span class="stringliteral">&quot;thorn;&quot;</span>, <span class="stringliteral">&quot;þ&quot;</span>, <span class="stringliteral">&quot;yuml;&quot;</span>, <span class="stringliteral">&quot;ÿ&quot;</span>, <span class="stringliteral">&quot;OElig;&quot;</span>, <span class="stringliteral">&quot;Œ&quot;</span>,</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="stringliteral">&quot;oelig;&quot;</span>, <span class="stringliteral">&quot;œ&quot;</span>, <span class="stringliteral">&quot;Scaron;&quot;</span>, <span class="stringliteral">&quot;Š&quot;</span>, <span class="stringliteral">&quot;scaron;&quot;</span>, <span class="stringliteral">&quot;š&quot;</span>, <span class="stringliteral">&quot;Yuml;&quot;</span>, <span class="stringliteral">&quot;Ÿ&quot;</span>,</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="stringliteral">&quot;fnof;&quot;</span>, <span class="stringliteral">&quot;ƒ&quot;</span>, <span class="stringliteral">&quot;circ;&quot;</span>, <span class="stringliteral">&quot;ˆ&quot;</span>, <span class="stringliteral">&quot;tilde;&quot;</span>, <span class="stringliteral">&quot;˜&quot;</span>, <span class="stringliteral">&quot;Alpha;&quot;</span>, <span class="stringliteral">&quot;Α&quot;</span>,</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="stringliteral">&quot;Beta;&quot;</span>, <span class="stringliteral">&quot;Β&quot;</span>, <span class="stringliteral">&quot;Gamma;&quot;</span>, <span class="stringliteral">&quot;Γ&quot;</span>, <span class="stringliteral">&quot;Delta;&quot;</span>, <span class="stringliteral">&quot;Δ&quot;</span>, <span class="stringliteral">&quot;Epsilon;&quot;</span>, <span class="stringliteral">&quot;Ε&quot;</span>,</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="stringliteral">&quot;Zeta;&quot;</span>, <span class="stringliteral">&quot;Ζ&quot;</span>, <span class="stringliteral">&quot;Eta;&quot;</span>, <span class="stringliteral">&quot;Η&quot;</span>, <span class="stringliteral">&quot;Theta;&quot;</span>, <span class="stringliteral">&quot;Θ&quot;</span>, <span class="stringliteral">&quot;Iota;&quot;</span>, <span class="stringliteral">&quot;Ι&quot;</span>,</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="stringliteral">&quot;Kappa;&quot;</span>, <span class="stringliteral">&quot;Κ&quot;</span>, <span class="stringliteral">&quot;Lambda;&quot;</span>, <span class="stringliteral">&quot;Λ&quot;</span>, <span class="stringliteral">&quot;Mu;&quot;</span>, <span class="stringliteral">&quot;Μ&quot;</span>, <span class="stringliteral">&quot;Nu;&quot;</span>, <span class="stringliteral">&quot;Ν&quot;</span>,</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="stringliteral">&quot;Xi;&quot;</span>, <span class="stringliteral">&quot;Ξ&quot;</span>, <span class="stringliteral">&quot;Omicron;&quot;</span>, <span class="stringliteral">&quot;Ο&quot;</span>, <span class="stringliteral">&quot;Pi;&quot;</span>, <span class="stringliteral">&quot;Π&quot;</span>, <span class="stringliteral">&quot;Rho;&quot;</span>, <span class="stringliteral">&quot;Ρ&quot;</span>,</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="stringliteral">&quot;Sigma;&quot;</span>, <span class="stringliteral">&quot;Σ&quot;</span>, <span class="stringliteral">&quot;Tau;&quot;</span>, <span class="stringliteral">&quot;Τ&quot;</span>, <span class="stringliteral">&quot;Upsilon;&quot;</span>, <span class="stringliteral">&quot;Υ&quot;</span>, <span class="stringliteral">&quot;Phi;&quot;</span>, <span class="stringliteral">&quot;Φ&quot;</span>,</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="stringliteral">&quot;Chi;&quot;</span>, <span class="stringliteral">&quot;Χ&quot;</span>, <span class="stringliteral">&quot;Psi;&quot;</span>, <span class="stringliteral">&quot;Ψ&quot;</span>, <span class="stringliteral">&quot;Omega;&quot;</span>, <span class="stringliteral">&quot;Ω&quot;</span>, <span class="stringliteral">&quot;alpha;&quot;</span>, <span class="stringliteral">&quot;α&quot;</span>,</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="stringliteral">&quot;beta;&quot;</span>, <span class="stringliteral">&quot;β&quot;</span>, <span class="stringliteral">&quot;gamma;&quot;</span>, <span class="stringliteral">&quot;γ&quot;</span>, <span class="stringliteral">&quot;delta;&quot;</span>, <span class="stringliteral">&quot;δ&quot;</span>, <span class="stringliteral">&quot;epsilon;&quot;</span>, <span class="stringliteral">&quot;ε&quot;</span>,</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="stringliteral">&quot;zeta;&quot;</span>, <span class="stringliteral">&quot;ζ&quot;</span>, <span class="stringliteral">&quot;eta;&quot;</span>, <span class="stringliteral">&quot;η&quot;</span>, <span class="stringliteral">&quot;theta;&quot;</span>, <span class="stringliteral">&quot;θ&quot;</span>, <span class="stringliteral">&quot;iota;&quot;</span>, <span class="stringliteral">&quot;ι&quot;</span>,</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="stringliteral">&quot;kappa;&quot;</span>, <span class="stringliteral">&quot;κ&quot;</span>, <span class="stringliteral">&quot;lambda;&quot;</span>, <span class="stringliteral">&quot;λ&quot;</span>, <span class="stringliteral">&quot;mu;&quot;</span>, <span class="stringliteral">&quot;μ&quot;</span>, <span class="stringliteral">&quot;nu;&quot;</span>, <span class="stringliteral">&quot;ν&quot;</span>,</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="stringliteral">&quot;xi;&quot;</span>, <span class="stringliteral">&quot;ξ&quot;</span>, <span class="stringliteral">&quot;omicron;&quot;</span>, <span class="stringliteral">&quot;ο&quot;</span>, <span class="stringliteral">&quot;pi;&quot;</span>, <span class="stringliteral">&quot;π&quot;</span>, <span class="stringliteral">&quot;rho;&quot;</span>, <span class="stringliteral">&quot;ρ&quot;</span>,</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="stringliteral">&quot;sigmaf;&quot;</span>, <span class="stringliteral">&quot;ς&quot;</span>, <span class="stringliteral">&quot;sigma;&quot;</span>, <span class="stringliteral">&quot;σ&quot;</span>, <span class="stringliteral">&quot;tau;&quot;</span>, <span class="stringliteral">&quot;τ&quot;</span>, <span class="stringliteral">&quot;upsilon;&quot;</span>, <span class="stringliteral">&quot;υ&quot;</span>,</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="stringliteral">&quot;phi;&quot;</span>, <span class="stringliteral">&quot;φ&quot;</span>, <span class="stringliteral">&quot;chi;&quot;</span>, <span class="stringliteral">&quot;χ&quot;</span>, <span class="stringliteral">&quot;psi;&quot;</span>, <span class="stringliteral">&quot;ψ&quot;</span>, <span class="stringliteral">&quot;omega;&quot;</span>, <span class="stringliteral">&quot;ω&quot;</span>,</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="stringliteral">&quot;thetasym;&quot;</span>,<span class="stringliteral">&quot;ϑ&quot;</span>, <span class="stringliteral">&quot;upsih;&quot;</span>, <span class="stringliteral">&quot;ϒ&quot;</span>, <span class="stringliteral">&quot;piv;&quot;</span>, <span class="stringliteral">&quot;ϖ&quot;</span>, <span class="stringliteral">&quot;ensp;&quot;</span>, <span class="stringliteral">&quot; &quot;</span>,</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="stringliteral">&quot;emsp;&quot;</span>, <span class="stringliteral">&quot; &quot;</span>, <span class="stringliteral">&quot;thinsp;&quot;</span>, <span class="stringliteral">&quot; &quot;</span>, <span class="stringliteral">&quot;zwnj;&quot;</span>, <span class="stringliteral">&quot;&quot;</span> , <span class="stringliteral">&quot;zwj;&quot;</span>, <span class="stringliteral">&quot;&quot;</span> ,</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="stringliteral">&quot;lrm;&quot;</span>, <span class="stringliteral">&quot;&quot;</span> , <span class="stringliteral">&quot;rlm;&quot;</span>, <span class="stringliteral">&quot;&quot;</span> , <span class="stringliteral">&quot;ndash;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;mdash;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="stringliteral">&quot;lsquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rsquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;sbquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;ldquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="stringliteral">&quot;rdquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;bdquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;dagger;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Dagger;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="stringliteral">&quot;bull;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;hellip;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;permil;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;prime;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="stringliteral">&quot;Prime;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;lsaquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rsaquo;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;oline;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="stringliteral">&quot;frasl;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;euro;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;image;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;weierp;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="stringliteral">&quot;real;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;trade;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;alefsym;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;larr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="stringliteral">&quot;uarr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rarr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;darr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;harr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="stringliteral">&quot;crarr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;lArr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;uArr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rArr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="stringliteral">&quot;dArr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;hArr;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;forall;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;part;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="stringliteral">&quot;exist;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;empty;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;nabla;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;isin;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="stringliteral">&quot;notin;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;ni;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;prod;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;sum;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="stringliteral">&quot;minus;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;lowast;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;radic;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;prop;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="stringliteral">&quot;infin;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;ang;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;and;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;or;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="stringliteral">&quot;cap;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;cup;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;int;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;there4;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="stringliteral">&quot;sim;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;cong;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;asymp;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;ne;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="stringliteral">&quot;equiv;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;le;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;ge;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;sub;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="stringliteral">&quot;sup;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;nsub;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;sube;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;supe;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="stringliteral">&quot;oplus;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;otimes;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;perp;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;sdot;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="stringliteral">&quot;lceil;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rceil;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;lfloor;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;rfloor;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="stringliteral">&quot;lang;&quot;</span>, <span class="stringliteral">&quot;&lt;&quot;</span>, <span class="stringliteral">&quot;rang;&quot;</span>, <span class="stringliteral">&quot;&gt;&quot;</span>, <span class="stringliteral">&quot;loz;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;spades;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="stringliteral">&quot;clubs;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;hearts;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;diams;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>,</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">/* MUST be last */</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; NULL, NULL,</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;};</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="comment">/* Recursively decodes entity and character references and normalizes new lines.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment">set &quot;type&quot; to ...</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment">&#39;&amp;&#39; for general entity decoding,</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment">&#39;%&#39; for parameter entity decoding (currently not needed),</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment">&#39;c&#39; for cdata sections,</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment">&#39; &#39; for attribute normalization, or</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment">&#39;*&#39; for non-cdata attribute normalization (currently not needed).</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment">Returns s, or if the decoded string is longer than s, returns a malloced string</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment">that must be freed.</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment">Function based upon ezxml_decode() from the &quot;ezxml&quot; parser which is</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment">Copyright 2004-2006 Aaron Voisine &lt;aaron@voisine.org&gt; */</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="keyword">static</span> <span class="keywordtype">char</span>* xml_decode(<span class="keywordtype">char</span>* s, <span class="keywordtype">char</span> type)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;{</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordtype">char</span> *e, *r = s, *m = s;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordtype">long</span> b, c, d, l;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">for</span> (; *s; s++) { <span class="comment">/* normalize line endings */</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">while</span> (*s == <span class="charliteral">&#39;\r&#39;</span>) {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; *(s++) = <span class="charliteral">&#39;\n&#39;</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;\n&#39;</span>) memmove(s, (s + 1), strlen(s));</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">for</span> (s = r; ; ) {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">while</span>( *s &amp;&amp; *s != <span class="charliteral">&#39;&amp;&#39;</span> <span class="comment">/*&amp;&amp; (*s != &#39;%&#39; || type != &#39;%&#39;)*/</span> &amp;&amp; !isspace(*s)) s++;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">if</span>( ! *s )</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; }</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( type != <span class="charliteral">&#39;c&#39;</span> &amp;&amp; ! strncmp(s, <span class="stringliteral">&quot;&amp;#&quot;</span>, 2) )</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="comment">/* character reference */</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">if</span> (s[2] == <span class="charliteral">&#39;x&#39;</span>) c = strtol(s + 3, &amp;e, 16); <span class="comment">/* base 16 */</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">else</span> c = strtol(s + 2, &amp;e, 10); <span class="comment">/* base 10 */</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span> (! c || *e != <span class="charliteral">&#39;;&#39;</span>) { s++; <span class="keywordflow">continue</span>; } <span class="comment">/* not a character ref */</span></div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">if</span> (c &lt; 0x80) *(s++) = c; <span class="comment">/* US-ASCII subset */</span></div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">else</span> { <span class="comment">/* multi-byte UTF-8 sequence */</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">for</span> (b = 0, d = c; d; d /= 2) b++; <span class="comment">/* number of bits in c */</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; b = (b - 2) / 5; <span class="comment">/* number of bytes in payload */</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; *(s++) = (0xFF &lt;&lt; (7 - b)) | (c &gt;&gt; (6 * b)); <span class="comment">/* head */</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">while</span> (b) *(s++) = 0x80 | ((c &gt;&gt; (6 * --b)) &amp; 0x3F); <span class="comment">/* payload */</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; }</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; memmove(s, strchr(s, <span class="charliteral">&#39;;&#39;</span>) + 1, strlen(strchr(s, <span class="charliteral">&#39;;&#39;</span>)));</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( (*s == <span class="charliteral">&#39;&amp;&#39;</span> &amp;&amp; (type == <span class="charliteral">&#39;&amp;&#39;</span> || type == <span class="charliteral">&#39; &#39;</span> <span class="comment">/*|| type == &#39;*&#39;*/</span>))</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="comment">/*|| (*s == &#39;%&#39; &amp;&amp; type == &#39;%&#39;)*/</span> )</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="comment">/* entity reference */</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">for</span> (b = 0; s_ent[b] &amp;&amp; strncmp(s + 1, s_ent[b], strlen(s_ent[b])); b += 2)</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; ; <span class="comment">/* find entity in entity list */</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">if</span> (s_ent[b++]) { <span class="comment">/* found a match */</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span> ((c = strlen(s_ent[b])) - 1 &gt; (e = strchr(s, <span class="charliteral">&#39;;&#39;</span>)) - s) {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; l = (d = (s - r)) + c + strlen(e); <span class="comment">/* new length */</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; r = (r == m) ? strcpy(malloc(l), r) : realloc(r, l);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; e = strchr((s = r + d), <span class="charliteral">&#39;;&#39;</span>); <span class="comment">/* fix up pointers */</span></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; memmove(s + c, e + 1, strlen(e)); <span class="comment">/* shift rest of string */</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; strncpy(s, s_ent[b], c); <span class="comment">/* copy in replacement text */</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; }</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">else</span> s++; <span class="comment">/* not a known entity */</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; }</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((type == <span class="charliteral">&#39; &#39;</span> <span class="comment">/*|| type == &#39;*&#39;*/</span>) &amp;&amp; isspace(*s))</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; *(s++) = <span class="charliteral">&#39; &#39;</span>;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; }</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">else</span> s++; <span class="comment">/* no decoding needed */</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">/* normalize spaces for non-cdata attributes</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;<span class="comment"> if (type == &#39;*&#39;) {</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="comment"> for (s = r; *s; s++) {</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;<span class="comment"> if ((l = strspn(s, &quot; &quot;))) memmove(s, s + l, strlen(s + l) + 1);</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="comment"> while (*s &amp;&amp; *s != &#39; &#39;) s++;</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="comment"> }</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="comment"> if (--s &gt;= r &amp;&amp; *s == &#39; &#39;) *s = &#39;\0&#39;;</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="comment"> }*/</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">return</span> r;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;}</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160;<span class="comment"> * Tools</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;<span class="preprocessor">#define XML_WS &quot;\t\r\n &quot;</span></div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> def_starttag_cb (<span class="keywordtype">void</span>* userdata, <span class="keyword">const</span> <span class="keywordtype">char</span>* tag, <span class="keywordtype">char</span>** attr) { }</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> def_endtag_cb (<span class="keywordtype">void</span>* userdata, <span class="keyword">const</span> <span class="keywordtype">char</span>* tag) { }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> def_text_cb (<span class="keywordtype">void</span>* userdata, <span class="keyword">const</span> <span class="keywordtype">char</span>* text, <span class="keywordtype">int</span> len) { }</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> call_text_cb(mrsaxparser_t* ths, <span class="keywordtype">char</span>* text, <span class="keywordtype">size_t</span> len, <span class="keywordtype">char</span> type)</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;{</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">if</span>( text &amp;&amp; len )</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; {</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordtype">char</span> bak = text[len], *text_new;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; text[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; text_new = xml_decode(text, type);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; ths-&gt;m_text_cb(ths-&gt;m_userdata, text_new, len);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">if</span>( text != text_new ) { free(text_new); }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; text[len] = bak;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; }</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;}</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> do_free_attr(<span class="keywordtype">char</span>** attr, <span class="keywordtype">int</span>* free_attr)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;{</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">/* &quot;attr&quot; are key/value pairs; the function frees the data if the corresponding bit in &quot;free_attr&quot; is set.</span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;<span class="comment"> (we need this as we try to use the strings from the &quot;main&quot; document instead of allocating small strings) */</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;<span class="preprocessor"> #define FREE_KEY 0x01</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;<span class="preprocessor"> #define FREE_VALUE 0x02</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordtype">int</span> i = 0;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">while</span>( attr[i] ) {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">if</span>( free_attr[i&gt;&gt;1]&amp;FREE_KEY &amp;&amp; attr[i] ) { free(attr[i]); }</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">if</span>( free_attr[i&gt;&gt;1]&amp;FREE_VALUE &amp;&amp; attr[i+1] ) { free(attr[i+1]); }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; i += 2;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; attr[0] = NULL; <span class="comment">/* set list to zero-length */</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;}</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160;<span class="comment"> * Main interface</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;<span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* mrattr_find(<span class="keywordtype">char</span>** attr, <span class="keyword">const</span> <span class="keywordtype">char</span>* key)</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160;{</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">if</span>( attr &amp;&amp; key ) {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordtype">int</span> i = 0;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordflow">while</span>( attr[i] &amp;&amp; strcmp(key, attr[i]) ) {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; i += 2;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; }</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">if</span>( attr[i] ) {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">return</span> attr[i + 1];</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; }</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keywordflow">return</span> NULL;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;}</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="keywordtype">void</span> mrsaxparser_init(mrsaxparser_t* ths, <span class="keywordtype">void</span>* userdata)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;{</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; ths-&gt;m_userdata = userdata;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; ths-&gt;m_starttag_cb = def_starttag_cb;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; ths-&gt;m_endtag_cb = def_endtag_cb;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; ths-&gt;m_text_cb = def_text_cb;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160;}</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;<span class="keywordtype">void</span> mrsaxparser_set_tag_handler(mrsaxparser_t* ths, mrsaxparser_starttag_cb_t starttag_cb, mrsaxparser_endtag_cb_t endtag_cb)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160;{</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; ths-&gt;m_starttag_cb = starttag_cb? starttag_cb : def_starttag_cb;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; ths-&gt;m_endtag_cb = endtag_cb? endtag_cb : def_endtag_cb;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;}</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;<span class="keywordtype">void</span> mrsaxparser_set_text_handler (mrsaxparser_t* ths, mrsaxparser_text_cb_t text_cb)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;{</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; ths-&gt;m_text_cb = text_cb? text_cb : def_text_cb;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;}</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;<span class="keywordtype">void</span> mrsaxparser_parse(mrsaxparser_t* ths, <span class="keyword">const</span> <span class="keywordtype">char</span>* buf_start__)</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;{</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordtype">char</span> bak, *buf_start, *last_text_start, *p;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160;<span class="preprocessor"> #define MAX_ATTR 100 </span><span class="comment">/* attributes per tag - a fixed border here is a security feature, not a limit */</span><span class="preprocessor"></span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordtype">char</span>* attr[(MAX_ATTR+1)*2]; <span class="comment">/* attributes as key/value pairs, +1 for terminating the list */</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keywordtype">int</span> free_attr[MAX_ATTR]; <span class="comment">/* free the value at attr[i*2+1]? */</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; attr[0] = NULL; <span class="comment">/* null-terminate list, this also terminates &quot;free_values&quot; */</span></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordflow">if</span>( ths == NULL ) {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; buf_start = safe_strdup(buf_start__); <span class="comment">/* we make a copy as we can easily null-terminate tag names and attributes &quot;in place&quot; */</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; last_text_start = buf_start;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; p = buf_start;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">while</span>( *p )</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; {</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;&lt;&#39;</span> )</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; call_text_cb(ths, last_text_start, p - last_text_start, <span class="charliteral">&#39;&amp;&#39;</span>); <span class="comment">/* flush pending text */</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; p++;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">if</span>( strncmp(p, <span class="stringliteral">&quot;!--&quot;</span>, 3) == 0 )</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="comment">/* skip &lt;!-- ... --&gt; comment</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; p = strstr(p, <span class="stringliteral">&quot;--&gt;&quot;</span>);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keywordflow">if</span>( p == NULL ) { <span class="keywordflow">goto</span> cleanup; }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; p += 3;</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strncmp(p, <span class="stringliteral">&quot;![CDATA[&quot;</span>, 8) == 0 )</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="comment">/* process &lt;![CDATA[ ... ]]&gt; text</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="keywordtype">char</span>* text_beg = p + 8;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">if</span>( (p = strstr(p, <span class="stringliteral">&quot;]]&gt;&quot;</span>))!=NULL ) <span class="comment">/* `]]&gt;` itself is not allowed in CDATA and must be escaped by dividing into two CDATA parts */</span> {</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; call_text_cb(ths, text_beg, p-text_beg, <span class="charliteral">&#39;c&#39;</span>);</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; p += 3;</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; }</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; call_text_cb(ths, text_beg, strlen(text_beg), <span class="charliteral">&#39;c&#39;</span>); <span class="comment">/* CDATA not closed, add all remaining text */</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keywordflow">goto</span> cleanup;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( strncmp(p, <span class="stringliteral">&quot;!DOCTYPE&quot;</span>, 8) == 0 )</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">/* skip &lt;!DOCTYPE ...&gt; or &lt;!DOCTYPE name [ ... ]&gt;</span></div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">while</span>( *p &amp;&amp; *p != <span class="charliteral">&#39;[&#39;</span> &amp;&amp; *p != <span class="charliteral">&#39;&gt;&#39;</span> ) p++; <span class="comment">/* search for [ or &gt;, whatever comes first */</span></div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="keywordflow">if</span>( *p == 0 ) {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* unclosed doctype */</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;[&#39;</span> ) {</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; p = strstr(p, <span class="stringliteral">&quot;]&gt;&quot;</span>); <span class="comment">/* search end of inline doctype */</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">if</span>( p == NULL ) {</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="keywordflow">goto</span> cleanup; <span class="comment">/* unclosed inline doctype */</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; }</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; p += 2;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; p++;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; }</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;?&#39;</span> )</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; {</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="comment">/* skip &lt;? ... ?&gt; processing instruction</span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; p = strstr(p, <span class="stringliteral">&quot;?&gt;&quot;</span>);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">if</span>( p == NULL ) { <span class="keywordflow">goto</span> cleanup; } <span class="comment">/* unclosed processing instruction */</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; p += 2;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; p += strspn(p, XML_WS); <span class="comment">/* skip whitespace between `&lt;` and tagname */</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;/&#39;</span> )</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; {</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="comment">/* process &lt;/tag&gt; end tag</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; p++;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; p += strspn(p, XML_WS); <span class="comment">/* skip whitespace between `/` and tagname */</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordtype">char</span>* beg_tag_name = p;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; p += strcspn(p, XML_WS <span class="stringliteral">&quot;/&gt;&quot;</span>); <span class="comment">/* find character after tagname */</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordflow">if</span>( p != beg_tag_name )</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; bak = *p;</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; *p = <span class="charliteral">&#39;\0&#39;</span>; <span class="comment">/* null-terminate tag name temporary, eg. a covered `&gt;` may get important downwards */</span></div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; mr_strlower_in_place(beg_tag_name);</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; ths-&gt;m_endtag_cb(ths-&gt;m_userdata, beg_tag_name);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; *p = bak;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; }</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; {</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">/* process &lt;tag attr1=&quot;val&quot; attr2=&#39;val&#39; attr3=val ..&gt;</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160;<span class="comment"> **************************************************************/</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; do_free_attr(attr, free_attr);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="keywordtype">char</span>* beg_tag_name = p;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; p += strcspn(p, XML_WS <span class="stringliteral">&quot;/&gt;&quot;</span>); <span class="comment">/* find character after tagname */</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordflow">if</span>( p != beg_tag_name )</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; {</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordtype">char</span>* after_tag_name = p;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="comment">/* scan for attributes */</span></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="keywordtype">int</span> attr_index = 0;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">while</span>( isspace(*p) ) { p++; } <span class="comment">/* forward to first attribute name beginning */</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">for</span>( ; *p &amp;&amp; *p != <span class="charliteral">&#39;/&#39;</span> &amp;&amp; *p != <span class="charliteral">&#39;&gt;&#39;</span>; attr_index += 2 )</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; {</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keywordtype">char</span> *beg_attr_name = p, *beg_attr_value = NULL, *beg_attr_value_new = NULL;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; p += strcspn(p, XML_WS <span class="stringliteral">&quot;=/&gt;&quot;</span>); <span class="comment">/* get end of attribute name */</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">if</span>( p != beg_attr_name )</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="comment">/* attribute found */</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordtype">char</span>* after_attr_name = p;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; p += strspn(p, XML_WS); <span class="comment">/* skip whitespace between attribute name and possible `=` */</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;=&#39;</span> )</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; {</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; p += strspn(p, XML_WS <span class="stringliteral">&quot;=&quot;</span>); <span class="comment">/* skip spaces and equal signs */</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordtype">char</span> quote = *p;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">if</span>( quote == <span class="charliteral">&#39;&quot;&#39;</span> || quote == <span class="charliteral">&#39;\&#39;&#39;</span> )</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; {</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="comment">/* quoted attribute value */</span></div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; p++;</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; beg_attr_value = p;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keywordflow">while</span>( *p &amp;&amp; *p != quote ) { p++; }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">if</span>( *p ) {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; *p = <span class="charliteral">&#39;\0&#39;</span>; <span class="comment">/* null terminate attribute val */</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; p++;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; beg_attr_value_new = xml_decode(beg_attr_value, <span class="charliteral">&#39; &#39;</span>);</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; {</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">/* unquoted attribute value, as the needed null-terminated may overwrite important characters, we&#39;ll create a copy */</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; beg_attr_value = p;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; p += strcspn(p, XML_WS <span class="stringliteral">&quot;/&gt;&quot;</span>); <span class="comment">/* get end of attribute value */</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; bak = *p;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; *p = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordtype">char</span>* temp = safe_strdup(beg_attr_value);</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; beg_attr_value_new = xml_decode(temp, <span class="charliteral">&#39; &#39;</span>);</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">if</span>( beg_attr_value_new!=temp ) { free(temp); }</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; *p = bak;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; }</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; beg_attr_value_new = safe_strdup(NULL);</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; }</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="comment">/* add attribute */</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keywordflow">if</span>( attr_index &lt; MAX_ATTR )</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; {</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordtype">char</span>* beg_attr_name_new = beg_attr_name;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="keywordtype">int</span> free_bits = (beg_attr_value_new != beg_attr_value)? FREE_VALUE : 0;</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="keywordflow">if</span>( after_attr_name == p ) {</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">/* take care not to overwrite the current pointer (happens eg. for `&lt;tag attrWithoutValue&gt;` */</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; bak = *after_attr_name;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; *after_attr_name = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; beg_attr_name_new = safe_strdup(beg_attr_name);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; *after_attr_name = bak;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; free_bits |= FREE_KEY;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; }</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">else</span> {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; *after_attr_name = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; mr_strlower_in_place(beg_attr_name_new);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; attr[attr_index] = beg_attr_name_new;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; attr[attr_index+1] = beg_attr_value_new;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; attr[attr_index+2] = NULL; <span class="comment">/* null-terminate list */</span></div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; free_attr[attr_index&gt;&gt;1] = free_bits;</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">while</span>( isspace(*p) ) { p++; } <span class="comment">/* forward to attribute name beginning */</span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; }</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordtype">char</span> bak = *after_tag_name; <span class="comment">/* backup the character as it may be `/` or `&gt;` which gets important downwards */</span></div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; *after_tag_name = 0;</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; mr_strlower_in_place(beg_tag_name);</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; ths-&gt;m_starttag_cb(ths-&gt;m_userdata, beg_tag_name, attr);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; *after_tag_name = bak;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160;</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="comment">/* self-closing tag */</span></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; p += strspn(p, XML_WS); <span class="comment">/* skip whitespace before possible `/` */</span></div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keywordflow">if</span>( *p == <span class="charliteral">&#39;/&#39;</span> )</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; {</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; p++;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; *after_tag_name = 0;</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; ths-&gt;m_endtag_cb(ths-&gt;m_userdata, beg_tag_name); <span class="comment">/* already lowercase from starttag_cb()-call */</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; } <span class="comment">/* end of processing start-tag */</span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; p = strchr(p, <span class="charliteral">&#39;&gt;&#39;</span>);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">if</span>( p == NULL ) { <span class="keywordflow">goto</span> cleanup; } <span class="comment">/* unclosed start-tag or end-tag */</span></div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; p++;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; } <span class="comment">/* end of processing start-tag or end-tag */</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; last_text_start = p;</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; p++;</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; }</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; call_text_cb(ths, last_text_start, p - last_text_start, <span class="charliteral">&#39;&amp;&#39;</span>); <span class="comment">/* flush pending text */</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;cleanup:</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; do_free_attr(attr, free_attr);</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; free(buf_start);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;}</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;</div></div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Nov 14 2017 02:47:14 for Delta Chat Core C-Library by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>