aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/aho_corasick/autiter.rs.html747
-rw-r--r--src/aho_corasick/full.rs.html329
-rw-r--r--src/aho_corasick/lib.rs.html1823
-rw-r--r--src/bitflags/lib.rs.html1121
-rw-r--r--src/carboxyl/lib.rs.html419
-rw-r--r--src/carboxyl/lift.rs.html605
-rw-r--r--src/carboxyl/pending.rs.html271
-rw-r--r--src/carboxyl/readonly.rs.html173
-rw-r--r--src/carboxyl/signal.rs.html1601
-rw-r--r--src/carboxyl/source.rs.html359
-rw-r--r--src/carboxyl/stream.rs.html1645
-rw-r--r--src/carboxyl/transaction.rs.html459
-rw-r--r--src/gcc/lib.rs.html1093
-rw-r--r--src/irsc/callback.rs.html127
-rw-r--r--src/irsc/client.rs.html657
-rw-r--r--src/irsc/color.rs.html189
-rw-r--r--src/irsc/command.rs.html3997
-rw-r--r--src/irsc/event.rs.html145
-rw-r--r--src/irsc/ident.rs.html147
-rw-r--r--src/irsc/lib.rs.html221
-rw-r--r--src/irsc/message.rs.html567
-rw-r--r--src/irsc/reply.rs.html3053
-rw-r--r--src/lazy_static/lib.rs.html345
-rw-r--r--src/libc/lib.rs.html12869
-rw-r--r--src/log/lib.rs.html1643
-rw-r--r--src/log/macros.rs.html387
-rw-r--r--src/memchr/lib.rs.html287
-rw-r--r--src/openssl/asn1/mod.rs.html195
-rw-r--r--src/openssl/bio/mod.rs.html309
-rw-r--r--src/openssl/bn/mod.rs.html1305
-rw-r--r--src/openssl/crypto/hash.rs.html773
-rw-r--r--src/openssl/crypto/hmac.rs.html1053
-rw-r--r--src/openssl/crypto/memcmp.rs.html175
-rw-r--r--src/openssl/crypto/mod.rs.html145
-rw-r--r--src/openssl/crypto/pkcs5.rs.html335
-rw-r--r--src/openssl/crypto/pkey.rs.html1103
-rw-r--r--src/openssl/crypto/rand.rs.html151
-rw-r--r--src/openssl/crypto/symm.rs.html721
-rw-r--r--src/openssl/lib.rs.html147
-rw-r--r--src/openssl/nid.rs.html437
-rw-r--r--src/openssl/ssl/error.rs.html373
-rw-r--r--src/openssl/ssl/mod.rs.html2079
-rw-r--r--src/openssl/x509/mod.rs.html1461
-rw-r--r--src/openssl_sys/lib.rs.html1327
-rw-r--r--src/openssl_sys/probe.rs.html243
-rw-r--r--src/pkg_config/lib.rs.html679
-rw-r--r--src/regex/char.rs.html311
-rw-r--r--src/regex/input.rs.html325
-rw-r--r--src/regex/lib.rs.html959
-rw-r--r--src/regex/program.rs.html1057
-rw-r--r--src/regex/re.rs.html2393
-rw-r--r--src/regex_macros/lib.rs.html1215
-rw-r--r--src/regex_syntax/lib.rs.html2465
-rw-r--r--src/regex_syntax/parser.rs.html4751
54 files changed, 61766 insertions, 0 deletions
diff --git a/src/aho_corasick/autiter.rs.html b/src/aho_corasick/autiter.rs.html
new file mode 100644
index 0000000..af7f372
--- /dev/null
+++ b/src/aho_corasick/autiter.rs.html
@@ -0,0 +1,747 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/aho-corasick-0.2.1/src/autiter.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>autiter.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::{<span class='self'>self</span>, <span class='ident'>BufRead</span>, <span class='ident'>Read</span>};
+
+<span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>ROOT_STATE</span>, <span class='ident'>PatIdx</span>, <span class='ident'>StateIdx</span>};
+
+<span class='doccomment'>/// An abstraction over automatons and their corresponding iterators.</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Automaton</span>: <span class='ident'>Sized</span> {
+ <span class='doccomment'>/// Return the next state given the current state and next character.</span>
+ <span class='kw'>fn</span> <span class='ident'>next_state</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span>;
+
+ <span class='doccomment'>/// Return true if and only if the given state and current pattern index</span>
+ <span class='doccomment'>/// indicate a match.</span>
+ <span class='kw'>fn</span> <span class='ident'>has_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>PatIdx</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>;
+
+ <span class='doccomment'>/// Build a match given the current state, pattern index and input index.</span>
+ <span class='kw'>fn</span> <span class='ident'>get_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>PatIdx</span>, <span class='ident'>texti</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>Match</span>;
+
+ <span class='doccomment'>/// Attempt to skip through the input.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This returns the index into `text` at which the next match attempt</span>
+ <span class='doccomment'>/// should start. (If no skipping occurred, then the return value should</span>
+ <span class='doccomment'>/// be equal to `at`.)</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Finally, if no match is possible, then return `text.len()`.</span>
+ <span class='kw'>fn</span> <span class='ident'>skip_to</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>at</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span>;
+
+ <span class='doccomment'>/// Returns true if and only if this automaton can skip through the input.</span>
+ <span class='kw'>fn</span> <span class='ident'>is_skippable</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>;
+
+ <span class='doccomment'>/// Returns all of the patterns matched by this automaton.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The order of the patterns is the order in which they were added.</span>
+ <span class='kw'>fn</span> <span class='ident'>patterns</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>[<span class='ident'>String</span>];
+
+ <span class='doccomment'>/// Returns the pattern indexed at `i`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The index corresponds to the position at which the pattern was added</span>
+ <span class='doccomment'>/// to the automaton, starting at `0`.</span>
+ <span class='kw'>fn</span> <span class='ident'>pattern</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span>;
+
+ <span class='doccomment'>/// Return the number of patterns in the automaton.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>len</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>patterns</span>().<span class='ident'>len</span>()
+ }
+
+ <span class='doccomment'>/// Returns true if the automaton has no patterns.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>is_empty</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span>
+ }
+
+ <span class='doccomment'>/// Returns an iterator of non-overlapping matches in `s`.</span>
+ <span class='kw'>fn</span> <span class='ident'>find</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span><span class='op'>&gt;</span>(
+ <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>,
+ <span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;s</span> <span class='ident'>str</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>Matches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='kw'>Self</span><span class='op'>&gt;</span> {
+ <span class='ident'>Matches</span> {
+ <span class='ident'>aut</span>: <span class='self'>self</span>,
+ <span class='ident'>text</span>: <span class='ident'>s</span>.<span class='ident'>as_bytes</span>(),
+ <span class='ident'>texti</span>: <span class='number'>0</span>,
+ <span class='ident'>si</span>: <span class='ident'>ROOT_STATE</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator of overlapping matches in `s`.</span>
+ <span class='kw'>fn</span> <span class='ident'>find_overlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span><span class='op'>&gt;</span>(
+ <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>,
+ <span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;s</span> <span class='ident'>str</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>MatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='kw'>Self</span><span class='op'>&gt;</span> {
+ <span class='ident'>MatchesOverlapping</span> {
+ <span class='ident'>aut</span>: <span class='self'>self</span>,
+ <span class='ident'>text</span>: <span class='ident'>s</span>.<span class='ident'>as_bytes</span>(),
+ <span class='ident'>texti</span>: <span class='number'>0</span>,
+ <span class='ident'>si</span>: <span class='ident'>ROOT_STATE</span>,
+ <span class='ident'>outi</span>: <span class='number'>0</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator of non-overlapping matches in the given reader.</span>
+ <span class='kw'>fn</span> <span class='ident'>stream_find</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>: <span class='ident'>io</span>::<span class='ident'>Read</span><span class='op'>&gt;</span>(
+ <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>,
+ <span class='ident'>rdr</span>: <span class='ident'>R</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>StreamMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='kw'>Self</span><span class='op'>&gt;</span> {
+ <span class='ident'>StreamMatches</span> {
+ <span class='ident'>aut</span>: <span class='self'>self</span>,
+ <span class='ident'>buf</span>: <span class='ident'>io</span>::<span class='ident'>BufReader</span>::<span class='ident'>new</span>(<span class='ident'>rdr</span>),
+ <span class='ident'>texti</span>: <span class='number'>0</span>,
+ <span class='ident'>si</span>: <span class='ident'>ROOT_STATE</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator of overlapping matches in the given reader.</span>
+ <span class='kw'>fn</span> <span class='ident'>stream_find_overlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>: <span class='ident'>io</span>::<span class='ident'>Read</span><span class='op'>&gt;</span>(
+ <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>,
+ <span class='ident'>rdr</span>: <span class='ident'>R</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>StreamMatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='kw'>Self</span><span class='op'>&gt;</span> {
+ <span class='ident'>StreamMatchesOverlapping</span> {
+ <span class='ident'>aut</span>: <span class='self'>self</span>,
+ <span class='ident'>buf</span>: <span class='ident'>io</span>::<span class='ident'>BufReader</span>::<span class='ident'>new</span>(<span class='ident'>rdr</span>),
+ <span class='ident'>texti</span>: <span class='number'>0</span>,
+ <span class='ident'>si</span>: <span class='ident'>ROOT_STATE</span>,
+ <span class='ident'>outi</span>: <span class='number'>0</span>,
+ }
+ }
+}
+
+<span class='doccomment'>/// Records a match in the search text.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>Hash</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Match</span> {
+ <span class='doccomment'>/// The pattern index.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This corresponds to the ordering in which the matched pattern was</span>
+ <span class='doccomment'>/// added to the automaton, starting at `0`.</span>
+ <span class='kw'>pub</span> <span class='ident'>pati</span>: <span class='ident'>usize</span>,
+ <span class='doccomment'>/// The starting byte offset of the match in the search text.</span>
+ <span class='kw'>pub</span> <span class='ident'>start</span>: <span class='ident'>usize</span>,
+ <span class='doccomment'>/// The ending byte offset of the match in the search text.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// (This can be re-captiulated with `pati` and adding the pattern&#39;s</span>
+ <span class='doccomment'>/// length to `start`, but it is convenient to have it here.)</span>
+ <span class='kw'>pub</span> <span class='ident'>end</span>: <span class='ident'>usize</span>,
+}
+
+<span class='doccomment'>/// An iterator of non-overlapping matches for in-memory text.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This iterator yields `Match` values.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;a` is the lifetime of the automaton and `&#39;s` is the lifetime of the</span>
+<span class='doccomment'>/// search text.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Matches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span>: <span class='lifetime'>&#39;a</span> <span class='op'>+</span> <span class='ident'>Automaton</span><span class='op'>&gt;</span> {
+ <span class='ident'>aut</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>A</span>,
+ <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;s</span> [<span class='ident'>u8</span>],
+ <span class='ident'>texti</span>: <span class='ident'>usize</span>,
+ <span class='ident'>si</span>: <span class='ident'>StateIdx</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span>: <span class='ident'>Automaton</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>Matches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>Match</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span> {
+ <span class='comment'>// When there&#39;s an initial lone start byte, it is usually worth it</span>
+ <span class='comment'>// to use `memchr` to skip along the input. The problem is that</span>
+ <span class='comment'>// the skipping function is called in the inner match loop, which</span>
+ <span class='comment'>// can be quite costly if the skipping condition is never met.</span>
+ <span class='comment'>// Therefore, we lift the case analysis outside of the main loop at</span>
+ <span class='comment'>// the cost of repeating code.</span>
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>is_skippable</span>() {
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>skip_to</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>text</span>.<span class='ident'>len</span>() {
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>next_state</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>texti</span>]);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>) {
+ <span class='kw'>let</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='ident'>ROOT_STATE</span>;
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='ident'>m</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>skip_to</span>(
+ <span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>, <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+</span> <span class='number'>1</span>);
+ }
+ } <span class='kw'>else</span> {
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>text</span>.<span class='ident'>len</span>() {
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>next_state</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>texti</span>]);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>) {
+ <span class='kw'>let</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='ident'>ROOT_STATE</span>;
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='ident'>m</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ }
+ <span class='prelude-val'>None</span>
+ }
+}
+
+<span class='doccomment'>/// An iterator of non-overlapping matches for streaming text.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This iterator yields `io::Result&lt;Match&gt;` values.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;a` is the lifetime of the automaton and `R` is the type of the underlying</span>
+<span class='doccomment'>/// `io::Read`er.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>StreamMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='ident'>A</span>: <span class='lifetime'>&#39;a</span> <span class='op'>+</span> <span class='ident'>Automaton</span><span class='op'>&gt;</span> {
+ <span class='ident'>aut</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>A</span>,
+ <span class='ident'>buf</span>: <span class='ident'>io</span>::<span class='ident'>BufReader</span><span class='op'>&lt;</span><span class='ident'>R</span><span class='op'>&gt;</span>,
+ <span class='ident'>texti</span>: <span class='ident'>usize</span>,
+ <span class='ident'>si</span>: <span class='ident'>StateIdx</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>: <span class='ident'>io</span>::<span class='ident'>Read</span>, <span class='ident'>A</span>: <span class='ident'>Automaton</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>StreamMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>consumed</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='lifetime'>&#39;LOOP</span>: <span class='kw'>loop</span> {
+ <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>consume</span>(<span class='ident'>consumed</span>);
+ <span class='kw'>let</span> <span class='ident'>bs</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>fill_buf</span>() {
+ <span class='prelude-val'>Err</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='prelude-val'>Err</span>(<span class='ident'>err</span>)),
+ <span class='prelude-val'>Ok</span>(<span class='ident'>bs</span>) <span class='kw'>if</span> <span class='ident'>bs</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>break</span>,
+ <span class='prelude-val'>Ok</span>(<span class='ident'>bs</span>) <span class='op'>=&gt;</span> <span class='ident'>bs</span>,
+ };
+ <span class='ident'>consumed</span> <span class='op'>=</span> <span class='ident'>bs</span>.<span class='ident'>len</span>(); <span class='comment'>// is shortened if we find a match</span>
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='kw-2'>&amp;</span><span class='ident'>b</span>) <span class='kw'>in</span> <span class='ident'>bs</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>next_state</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='ident'>b</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>) {
+ <span class='ident'>m</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='prelude-val'>Ok</span>(<span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='number'>0</span>, <span class='self'>self</span>.<span class='ident'>texti</span>)));
+ <span class='ident'>consumed</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>;
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='ident'>ROOT_STATE</span>;
+ <span class='kw'>break</span> <span class='lifetime'>&#39;LOOP</span>;
+ }
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>consume</span>(<span class='ident'>consumed</span>);
+ <span class='ident'>m</span>
+ }
+}
+
+<span class='doccomment'>/// An iterator of overlapping matches for in-memory text.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This iterator yields `Match` values.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;a` is the lifetime of the automaton and `&#39;s` is the lifetime of the</span>
+<span class='doccomment'>/// search text.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>MatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span>: <span class='lifetime'>&#39;a</span> <span class='op'>+</span> <span class='ident'>Automaton</span><span class='op'>&gt;</span> {
+ <span class='ident'>aut</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>A</span>,
+ <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;s</span> [<span class='ident'>u8</span>],
+ <span class='ident'>texti</span>: <span class='ident'>usize</span>,
+ <span class='ident'>si</span>: <span class='ident'>StateIdx</span>,
+ <span class='ident'>outi</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span>: <span class='ident'>Automaton</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>MatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='lifetime'>&#39;s</span>, <span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>Match</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='kw'>let</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='self'>self</span>.<span class='ident'>outi</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='ident'>m</span>);
+ }
+
+ <span class='self'>self</span>.<span class='ident'>outi</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>skip_to</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>text</span>.<span class='ident'>len</span>() {
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>texti</span>];
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>next_state</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='ident'>b</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>next</span>();
+ }
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>skip_to</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>text</span>, <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+</span> <span class='number'>1</span>);
+ }
+ <span class='prelude-val'>None</span>
+ }
+}
+
+<span class='doccomment'>/// An iterator of overlapping matches for streaming text.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This iterator yields `io::Result&lt;Match&gt;` values.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;a` is the lifetime of the automaton and `R` is the type of the underlying</span>
+<span class='doccomment'>/// `io::Read`er.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>StreamMatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='ident'>A</span>: <span class='lifetime'>&#39;a</span> <span class='op'>+</span> <span class='ident'>Automaton</span><span class='op'>&gt;</span> {
+ <span class='ident'>aut</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>A</span>,
+ <span class='ident'>buf</span>: <span class='ident'>io</span>::<span class='ident'>BufReader</span><span class='op'>&lt;</span><span class='ident'>R</span><span class='op'>&gt;</span>,
+ <span class='ident'>texti</span>: <span class='ident'>usize</span>,
+ <span class='ident'>si</span>: <span class='ident'>StateIdx</span>,
+ <span class='ident'>outi</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span>
+ <span class='lifetime'>&#39;a</span>,
+ <span class='ident'>R</span>: <span class='ident'>io</span>::<span class='ident'>Read</span>,
+ <span class='ident'>A</span>: <span class='ident'>Automaton</span>,
+<span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>StreamMatchesOverlapping</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>R</span>, <span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='kw'>let</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>, <span class='self'>self</span>.<span class='ident'>texti</span>);
+ <span class='self'>self</span>.<span class='ident'>outi</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='prelude-val'>Ok</span>(<span class='ident'>m</span>));
+ }
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>consumed</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='self'>self</span>.<span class='ident'>outi</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='lifetime'>&#39;LOOP</span>: <span class='kw'>loop</span> {
+ <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>consume</span>(<span class='ident'>consumed</span>);
+ <span class='kw'>let</span> <span class='ident'>bs</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>fill_buf</span>() {
+ <span class='prelude-val'>Err</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='prelude-val'>Err</span>(<span class='ident'>err</span>)),
+ <span class='prelude-val'>Ok</span>(<span class='ident'>bs</span>) <span class='kw'>if</span> <span class='ident'>bs</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>break</span>,
+ <span class='prelude-val'>Ok</span>(<span class='ident'>bs</span>) <span class='op'>=&gt;</span> <span class='ident'>bs</span>,
+ };
+ <span class='ident'>consumed</span> <span class='op'>=</span> <span class='ident'>bs</span>.<span class='ident'>len</span>(); <span class='comment'>// is shortened if we find a match</span>
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='kw-2'>&amp;</span><span class='ident'>b</span>) <span class='kw'>in</span> <span class='ident'>bs</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='self'>self</span>.<span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>next_state</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='ident'>b</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='ident'>m</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='prelude-val'>Ok</span>(<span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>get_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>,
+ <span class='self'>self</span>.<span class='ident'>texti</span>)));
+ <span class='ident'>consumed</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>;
+ <span class='self'>self</span>.<span class='ident'>outi</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>aut</span>.<span class='ident'>has_match</span>(<span class='self'>self</span>.<span class='ident'>si</span>, <span class='self'>self</span>.<span class='ident'>outi</span>) {
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>break</span> <span class='lifetime'>&#39;LOOP</span>;
+ }
+ <span class='self'>self</span>.<span class='ident'>texti</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>consume</span>(<span class='ident'>consumed</span>);
+ <span class='ident'>m</span>
+ }
+}
+
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "aho_corasick";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/aho_corasick/full.rs.html b/src/aho_corasick/full.rs.html
new file mode 100644
index 0000000..f9f4f65
--- /dev/null
+++ b/src/aho_corasick/full.rs.html
@@ -0,0 +1,329 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/aho-corasick-0.2.1/src/full.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>full.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>memchr</span>::<span class='ident'>memchr</span>;
+
+<span class='kw'>use</span> <span class='ident'>super</span>::{
+ <span class='ident'>FAIL_STATE</span>, <span class='ident'>ROOT_STATE</span>,
+ <span class='ident'>StateIdx</span>, <span class='ident'>PatIdx</span>,
+ <span class='ident'>AcAutomaton</span>, <span class='ident'>Transitions</span>, <span class='ident'>Match</span>,
+};
+<span class='kw'>use</span> <span class='ident'>super</span>::<span class='ident'>autiter</span>::<span class='ident'>Automaton</span>;
+
+<span class='doccomment'>/// A complete Aho-Corasick automaton.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This uses a single transition matrix that permits each input character</span>
+<span class='doccomment'>/// to move to the next state with a single lookup in the matrix.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This is as fast as it gets, but it is guaranteed to use a lot of memory.</span>
+<span class='doccomment'>/// Namely, it will use at least `4 * 256 * #states`, where the number of</span>
+<span class='doccomment'>/// states is capped at length of all patterns concatenated.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='ident'>pats</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='comment'>// i * #states + si</span>
+ <span class='ident'>trans</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>StateIdx</span><span class='op'>&gt;</span>, <span class='comment'>// row-major, where states are rows</span>
+ <span class='ident'>out</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PatIdx</span><span class='op'>&gt;&gt;</span>, <span class='comment'>// indexed by StateIdx</span>
+ <span class='ident'>start_bytes</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='doccomment'>/// Build a new expanded Aho-Corasick automaton from an existing</span>
+ <span class='doccomment'>/// Aho-Corasick automaton.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span>(<span class='ident'>ac</span>: <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>fac</span> <span class='op'>=</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='ident'>pats</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ <span class='ident'>trans</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>FAIL_STATE</span>; <span class='number'>256</span> <span class='op'>*</span> <span class='ident'>ac</span>.<span class='ident'>states</span>.<span class='ident'>len</span>()],
+ <span class='ident'>out</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='macro'>vec</span><span class='macro'>!</span>[]; <span class='ident'>ac</span>.<span class='ident'>states</span>.<span class='ident'>len</span>()],
+ <span class='ident'>start_bytes</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ };
+ <span class='ident'>fac</span>.<span class='ident'>build_matrix</span>(<span class='kw-2'>&amp;</span><span class='ident'>ac</span>);
+ <span class='ident'>fac</span>.<span class='ident'>pats</span> <span class='op'>=</span> <span class='ident'>ac</span>.<span class='ident'>pats</span>;
+ <span class='ident'>fac</span>.<span class='ident'>start_bytes</span> <span class='op'>=</span> <span class='ident'>ac</span>.<span class='ident'>start_bytes</span>;
+ <span class='ident'>fac</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>set</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>i</span>: <span class='ident'>u8</span>, <span class='ident'>goto</span>: <span class='ident'>StateIdx</span>) {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>num_states</span>();
+ <span class='self'>self</span>.<span class='ident'>trans</span>[<span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>*</span> <span class='ident'>ns</span> <span class='op'>+</span> <span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>] <span class='op'>=</span> <span class='ident'>goto</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>num_states</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>out</span>.<span class='ident'>len</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Automaton</span> <span class='kw'>for</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>next_state</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>i</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> {
+ <span class='self'>self</span>.<span class='ident'>trans</span>[<span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>*</span> <span class='self'>self</span>.<span class='ident'>num_states</span>() <span class='op'>+</span> <span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>]
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>get_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>usize</span>, <span class='ident'>texti</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>Match</span> {
+ <span class='kw'>let</span> <span class='ident'>pati</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>out</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>][<span class='ident'>outi</span>];
+ <span class='kw'>let</span> <span class='ident'>patlen</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>pats</span>[<span class='ident'>pati</span>].<span class='ident'>len</span>();
+ <span class='kw'>let</span> <span class='ident'>start</span> <span class='op'>=</span> <span class='ident'>texti</span> <span class='op'>+</span> <span class='number'>1</span> <span class='op'>-</span> <span class='ident'>patlen</span>;
+ <span class='ident'>Match</span> {
+ <span class='ident'>pati</span>: <span class='ident'>pati</span>,
+ <span class='ident'>start</span>: <span class='ident'>start</span>,
+ <span class='ident'>end</span>: <span class='ident'>start</span> <span class='op'>+</span> <span class='ident'>patlen</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>has_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>outi</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>out</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>len</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>skip_to</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>at</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>if</span> <span class='ident'>si</span> <span class='op'>!=</span> <span class='ident'>ROOT_STATE</span> <span class='op'>||</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>is_skippable</span>() {
+ <span class='kw'>return</span> <span class='ident'>at</span>;
+ }
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>start_bytes</span>[<span class='number'>0</span>];
+ <span class='kw'>match</span> <span class='ident'>memchr</span>(<span class='ident'>b</span>, <span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>at</span>..]) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>text</span>.<span class='ident'>len</span>(),
+ <span class='prelude-val'>Some</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> <span class='ident'>at</span> <span class='op'>+</span> <span class='ident'>i</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>is_skippable</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>start_bytes</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>1</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>patterns</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>[<span class='ident'>String</span>] {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>pats</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>pattern</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>pats</span>[<span class='ident'>i</span>]
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='kw'>fn</span> <span class='ident'>build_matrix</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>ac</span>: <span class='kw-2'>&amp;</span><span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>) {
+ <span class='kw'>for</span> (<span class='ident'>si</span>, <span class='ident'>s</span>) <span class='kw'>in</span> <span class='ident'>ac</span>.<span class='ident'>states</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>skip</span>(<span class='number'>1</span>) {
+ <span class='kw'>for</span> <span class='ident'>b</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>b</span><span class='op'>|</span> <span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='self'>self</span>.<span class='ident'>set</span>(<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>StateIdx</span>, <span class='ident'>b</span>, <span class='ident'>ac</span>.<span class='ident'>next_state</span>(<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>StateIdx</span>, <span class='ident'>b</span>));
+ }
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='ident'>pati</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>out</span> {
+ <span class='self'>self</span>.<span class='ident'>out</span>[<span class='ident'>si</span>].<span class='ident'>push</span>(<span class='ident'>pati</span>);
+ }
+ }
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "aho_corasick";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/aho_corasick/lib.rs.html b/src/aho_corasick/lib.rs.html
new file mode 100644
index 0000000..e75bc4d
--- /dev/null
+++ b/src/aho_corasick/lib.rs.html
@@ -0,0 +1,1823 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/aho-corasick-0.2.1/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+<span id="683">683</span>
+<span id="684">684</span>
+<span id="685">685</span>
+<span id="686">686</span>
+<span id="687">687</span>
+<span id="688">688</span>
+<span id="689">689</span>
+<span id="690">690</span>
+<span id="691">691</span>
+<span id="692">692</span>
+<span id="693">693</span>
+<span id="694">694</span>
+<span id="695">695</span>
+<span id="696">696</span>
+<span id="697">697</span>
+<span id="698">698</span>
+<span id="699">699</span>
+<span id="700">700</span>
+<span id="701">701</span>
+<span id="702">702</span>
+<span id="703">703</span>
+<span id="704">704</span>
+<span id="705">705</span>
+<span id="706">706</span>
+<span id="707">707</span>
+<span id="708">708</span>
+<span id="709">709</span>
+<span id="710">710</span>
+<span id="711">711</span>
+<span id="712">712</span>
+<span id="713">713</span>
+<span id="714">714</span>
+<span id="715">715</span>
+<span id="716">716</span>
+<span id="717">717</span>
+<span id="718">718</span>
+<span id="719">719</span>
+<span id="720">720</span>
+<span id="721">721</span>
+<span id="722">722</span>
+<span id="723">723</span>
+<span id="724">724</span>
+<span id="725">725</span>
+<span id="726">726</span>
+<span id="727">727</span>
+<span id="728">728</span>
+<span id="729">729</span>
+<span id="730">730</span>
+<span id="731">731</span>
+<span id="732">732</span>
+<span id="733">733</span>
+<span id="734">734</span>
+<span id="735">735</span>
+<span id="736">736</span>
+<span id="737">737</span>
+<span id="738">738</span>
+<span id="739">739</span>
+<span id="740">740</span>
+<span id="741">741</span>
+<span id="742">742</span>
+<span id="743">743</span>
+<span id="744">744</span>
+<span id="745">745</span>
+<span id="746">746</span>
+<span id="747">747</span>
+<span id="748">748</span>
+<span id="749">749</span>
+<span id="750">750</span>
+<span id="751">751</span>
+<span id="752">752</span>
+<span id="753">753</span>
+<span id="754">754</span>
+<span id="755">755</span>
+<span id="756">756</span>
+<span id="757">757</span>
+<span id="758">758</span>
+<span id="759">759</span>
+<span id="760">760</span>
+<span id="761">761</span>
+<span id="762">762</span>
+<span id="763">763</span>
+<span id="764">764</span>
+<span id="765">765</span>
+<span id="766">766</span>
+<span id="767">767</span>
+<span id="768">768</span>
+<span id="769">769</span>
+<span id="770">770</span>
+<span id="771">771</span>
+<span id="772">772</span>
+<span id="773">773</span>
+<span id="774">774</span>
+<span id="775">775</span>
+<span id="776">776</span>
+<span id="777">777</span>
+<span id="778">778</span>
+<span id="779">779</span>
+<span id="780">780</span>
+<span id="781">781</span>
+<span id="782">782</span>
+<span id="783">783</span>
+<span id="784">784</span>
+<span id="785">785</span>
+<span id="786">786</span>
+<span id="787">787</span>
+<span id="788">788</span>
+<span id="789">789</span>
+<span id="790">790</span>
+<span id="791">791</span>
+<span id="792">792</span>
+<span id="793">793</span>
+<span id="794">794</span>
+<span id="795">795</span>
+<span id="796">796</span>
+<span id="797">797</span>
+<span id="798">798</span>
+<span id="799">799</span>
+<span id="800">800</span>
+<span id="801">801</span>
+<span id="802">802</span>
+<span id="803">803</span>
+<span id="804">804</span>
+<span id="805">805</span>
+<span id="806">806</span>
+<span id="807">807</span>
+<span id="808">808</span>
+<span id="809">809</span>
+<span id="810">810</span>
+<span id="811">811</span>
+<span id="812">812</span>
+<span id="813">813</span>
+<span id="814">814</span>
+<span id="815">815</span>
+<span id="816">816</span>
+<span id="817">817</span>
+<span id="818">818</span>
+<span id="819">819</span>
+<span id="820">820</span>
+<span id="821">821</span>
+<span id="822">822</span>
+<span id="823">823</span>
+<span id="824">824</span>
+<span id="825">825</span>
+<span id="826">826</span>
+<span id="827">827</span>
+<span id="828">828</span>
+<span id="829">829</span>
+<span id="830">830</span>
+<span id="831">831</span>
+<span id="832">832</span>
+<span id="833">833</span>
+<span id="834">834</span>
+<span id="835">835</span>
+<span id="836">836</span>
+<span id="837">837</span>
+<span id="838">838</span>
+<span id="839">839</span>
+<span id="840">840</span>
+<span id="841">841</span>
+<span id="842">842</span>
+<span id="843">843</span>
+<span id="844">844</span>
+<span id="845">845</span>
+<span id="846">846</span>
+<span id="847">847</span>
+<span id="848">848</span>
+<span id="849">849</span>
+<span id="850">850</span>
+<span id="851">851</span>
+<span id="852">852</span>
+<span id="853">853</span>
+<span id="854">854</span>
+<span id="855">855</span>
+<span id="856">856</span>
+<span id="857">857</span>
+<span id="858">858</span>
+<span id="859">859</span>
+<span id="860">860</span>
+<span id="861">861</span>
+<span id="862">862</span>
+<span id="863">863</span>
+</pre><pre class='rust '>
+<span class='doccomment'>/*!
+An implementation of the
+[Aho-Corasick string search algorithm](https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm).
+
+The Aho-Corasick algorithm is principally useful when you need to search many
+large texts for a fixed (possibly large) set of keywords. In particular, the
+Aho-Corasick algorithm preprocesses the set of keywords by constructing a
+finite state machine. The search phase is then a quick linear scan through the
+text. Each character in the search text causes a state transition in the
+automaton. Matches are reported when the automaton enters a match state.
+
+# Examples
+
+The main type exposed by this crate is `AcAutomaton`, which can be constructed
+from an iterator of pattern strings:
+
+```rust
+use aho_corasick::{Automaton, AcAutomaton};
+
+let aut = AcAutomaton::new(vec![&quot;apple&quot;, &quot;maple&quot;]);
+
+// AcAutomaton also implements `FromIterator`:
+let aut: AcAutomaton = [&quot;apple&quot;, &quot;maple&quot;].iter().cloned().collect();
+```
+
+Finding matches can be done with `find`:
+
+```rust
+use aho_corasick::{Automaton, AcAutomaton, Match};
+
+let aut = AcAutomaton::new(vec![&quot;apple&quot;, &quot;maple&quot;]);
+let mut it = aut.find(&quot;I like maple apples.&quot;);
+assert_eq!(it.next(), Some(Match {
+ pati: 1,
+ start: 7,
+ end: 12,
+}));
+assert_eq!(it.next(), Some(Match {
+ pati: 0,
+ start: 13,
+ end: 18,
+}));
+assert_eq!(it.next(), None);
+```
+
+Use `find_overlapping` if you want to report all matches, even if they
+overlap with each other.
+
+```rust
+use aho_corasick::{Automaton, AcAutomaton, Match};
+
+let aut = AcAutomaton::new(vec![&quot;abc&quot;, &quot;a&quot;]);
+let matches: Vec&lt;_&gt; = aut.find_overlapping(&quot;abc&quot;).collect();
+assert_eq!(matches, vec![
+ Match { pati: 1, start: 0, end: 1}, Match { pati: 0, start: 0, end: 3 },
+]);
+
+// Regular `find` will report only one match:
+let matches: Vec&lt;_&gt; = aut.find(&quot;abc&quot;).collect();
+assert_eq!(matches, vec![Match { pati: 1, start: 0, end: 1}]);
+```
+
+Finally, there are also methods for finding matches on *streams*. Namely, the
+search text does not have to live in memory. It&#39;s useful to run this on files
+that can&#39;t fit into memory:
+
+```no_run
+use std::fs::File;
+
+use aho_corasick::{Automaton, AcAutomaton};
+
+let aut = AcAutomaton::new(vec![&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;]);
+let rdr = File::open(&quot;search.txt&quot;).unwrap();
+for m in aut.stream_find(rdr) {
+ let m = m.unwrap(); // could be an IO error
+ println!(&quot;Pattern &#39;{}&#39; matched at: ({}, {})&quot;,
+ aut.pattern(m.pati), m.start, m.end);
+}
+```
+
+There is also `stream_find_overlapping`, which is just like `find_overlapping`,
+but it operates on streams.
+
+Please see `dict-search.rs` in this crate&#39;s `examples` directory for a more
+complete example. It creates a large automaton from a dictionary and can do a
+streaming match over arbitrarily large data.
+
+# Memory usage
+
+A key aspect of an Aho-Corasick implementation is how the state transitions
+are represented. The easiest way to make the automaton fast is to store a
+sparse 256-slot map in each state. It maps an input byte to a state index.
+This makes the matching loop extremely fast, since it translates to a simple
+pointer read.
+
+The problem is that as the automaton accumulates more states, you end up paying
+a `256 * 4` (`4` is for the `u32` state index) byte penalty for every state
+regardless of how many transitions it has.
+
+To solve this, only states near the root of the automaton have this sparse
+map representation. States near the leaves of the automaton use a dense mapping
+that requires a linear scan.
+
+(The specific limit currently set is `3`, so that states with a depth less than
+or equal to `3` are less memory efficient. The result is that the memory usage
+of the automaton stops growing rapidly past ~60MB, even for automatons with
+thousands of patterns.)
+
+If you&#39;d like to opt for the less-memory-efficient-but-faster version, then
+you can construct an `AcAutomaton` with a `Sparse` transition strategy:
+
+```rust
+use aho_corasick::{Automaton, AcAutomaton, Match, Sparse};
+
+let aut = AcAutomaton::&lt;Sparse&gt;::with_transitions(vec![&quot;abc&quot;, &quot;a&quot;]);
+let matches: Vec&lt;_&gt; = aut.find(&quot;abc&quot;).collect();
+assert_eq!(matches, vec![Match { pati: 1, start: 0, end: 1}]);
+```
+*/</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(<span class='ident'>missing_docs</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>memchr</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>quickcheck</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rand</span>;
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>VecDeque</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>FromIterator</span>;
+
+<span class='kw'>use</span> <span class='ident'>memchr</span>::<span class='ident'>memchr</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>autiter</span>::{
+ <span class='ident'>Automaton</span>, <span class='ident'>Match</span>,
+ <span class='ident'>Matches</span>, <span class='ident'>MatchesOverlapping</span>, <span class='ident'>StreamMatches</span>, <span class='ident'>StreamMatchesOverlapping</span>,
+};
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>full</span>::<span class='ident'>FullAcAutomaton</span>;
+
+<span class='comment'>// We&#39;re specifying paths explicitly so that we can use</span>
+<span class='comment'>// these modules simultaneously from `main.rs`.</span>
+<span class='comment'>// Should probably make just make `main.rs` a separate crate.</span>
+<span class='attribute'>#[<span class='ident'>path</span> <span class='op'>=</span> <span class='string'>&quot;autiter.rs&quot;</span>]</span>
+<span class='kw'>mod</span> <span class='ident'>autiter</span>;
+<span class='attribute'>#[<span class='ident'>path</span> <span class='op'>=</span> <span class='string'>&quot;full.rs&quot;</span>]</span>
+<span class='kw'>mod</span> <span class='ident'>full</span>;
+
+<span class='doccomment'>/// The integer type used for the state index.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Limiting this to 32 bit integers can have a big impact on memory usage</span>
+<span class='doccomment'>/// when using the `Sparse` transition representation.</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>StateIdx</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+
+<span class='kw'>type</span> <span class='ident'>PatIdx</span> <span class='op'>=</span> <span class='ident'>usize</span>;
+
+<span class='comment'>// Constants for special state indexes.</span>
+<span class='kw'>const</span> <span class='ident'>FAIL_STATE</span>: <span class='ident'>u32</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='kw'>const</span> <span class='ident'>ROOT_STATE</span>: <span class='ident'>u32</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+<span class='comment'>// Limit the depth at which we use a dense alphabet map. Once the limit is</span>
+<span class='comment'>// reached, a sparse set is used (and lookup becomes O(n)).</span>
+<span class='comment'>//</span>
+<span class='comment'>// This does have a performance hit, but the (straight forward) alternative</span>
+<span class='comment'>// is to have a `256 * 4` byte overhead for every state.</span>
+<span class='comment'>// Given that Aho-Corasick is typically used for dictionary searching, this</span>
+<span class='comment'>// can lead to dramatic memory bloat.</span>
+<span class='comment'>//</span>
+<span class='comment'>// This limit should only be increased at your peril. Namely, in the worst</span>
+<span class='comment'>// case, `256^DENSE_DEPTH_THRESHOLD * 4` corresponds to the memory usage in</span>
+<span class='comment'>// bytes. A value of `3` gives us a solid cap at around 64MB, which works</span>
+<span class='comment'>// well in practice even for dictionary sized automatons.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Why not make this user configurable? Well, it doesn&#39;t make much sense</span>
+<span class='comment'>// because we pay for it with case analysis in the matching loop. Increasing it</span>
+<span class='comment'>// doesn&#39;t have much impact on performance (outside of pathological cases?).</span>
+<span class='comment'>//</span>
+<span class='comment'>// There is probably room for adding a new automaton type that doesn&#39;t have</span>
+<span class='comment'>// this restriction.</span>
+<span class='comment'>//</span>
+<span class='comment'>// N.B. Someone else seems to have discovered an alternative, but I haven&#39;t</span>
+<span class='comment'>// grokked it yet: https://github.com/mischasan/aho-corasick</span>
+<span class='kw'>const</span> <span class='ident'>DENSE_DEPTH_THRESHOLD</span>: <span class='ident'>u32</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+<span class='doccomment'>/// An Aho-Corasick finite automaton.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>=</span><span class='ident'>Dense</span><span class='op'>&gt;</span> {
+ <span class='ident'>pats</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='ident'>states</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>start_bytes</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>,
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>struct</span> <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>out</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PatIdx</span><span class='op'>&gt;</span>,
+ <span class='ident'>fail</span>: <span class='ident'>StateIdx</span>,
+ <span class='ident'>goto</span>: <span class='ident'>T</span>,
+ <span class='ident'>depth</span>: <span class='ident'>u32</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>AcAutomaton</span> {
+ <span class='doccomment'>/// Create a new automaton from an iterator of patterns.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The patterns must be convertible to Unicode `String` values via the</span>
+ <span class='doccomment'>/// `Into` trait.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span><span class='op'>&lt;</span><span class='ident'>S</span>, <span class='ident'>I</span><span class='op'>&gt;</span>(<span class='ident'>pats</span>: <span class='ident'>I</span>) <span class='op'>-&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>Dense</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>I</span>: <span class='ident'>IntoIterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>with_transitions</span>(<span class='ident'>pats</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new automaton from an iterator of patterns.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This constructor allows one to choose the transition representation.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The patterns must be convertible to Unicode `String` values via the</span>
+ <span class='doccomment'>/// `Into` trait.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_transitions</span><span class='op'>&lt;</span><span class='ident'>S</span>, <span class='ident'>I</span><span class='op'>&gt;</span>(<span class='ident'>pats</span>: <span class='ident'>I</span>) <span class='op'>-&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>I</span>: <span class='ident'>IntoIterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span> {
+ <span class='ident'>pats</span>: <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='comment'>// filled in later, avoid wrath of borrow checker</span>
+ <span class='ident'>states</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>State</span>::<span class='ident'>new</span>(<span class='number'>0</span>), <span class='ident'>State</span>::<span class='ident'>new</span>(<span class='number'>0</span>)], <span class='comment'>// empty and root</span>
+ <span class='ident'>start_bytes</span>: <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='comment'>// also filled in later</span>
+ }.<span class='ident'>build</span>(<span class='ident'>pats</span>.<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='ident'>Into</span>::<span class='ident'>into</span>).<span class='ident'>collect</span>())
+ }
+
+ <span class='doccomment'>/// Build out the entire automaton into a single matrix.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This will make searching as fast as possible at the expense of using</span>
+ <span class='doccomment'>/// at least `4 * 256 * #states` bytes of memory.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>into_full</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>FullAcAutomaton</span> {
+ <span class='ident'>FullAcAutomaton</span>::<span class='ident'>new</span>(<span class='self'>self</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>Automaton</span> <span class='kw'>for</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>next_state</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> {
+ <span class='kw'>loop</span> {
+ <span class='kw'>let</span> <span class='ident'>maybe_si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>b</span>);
+ <span class='kw'>if</span> <span class='ident'>maybe_si</span> <span class='op'>!=</span> <span class='ident'>FAIL_STATE</span> {
+ <span class='ident'>si</span> <span class='op'>=</span> <span class='ident'>maybe_si</span>;
+ <span class='kw'>break</span>;
+ } <span class='kw'>else</span> {
+ <span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>fail</span>;
+ }
+ }
+ <span class='ident'>si</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>get_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>usize</span>, <span class='ident'>texti</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>Match</span> {
+ <span class='kw'>let</span> <span class='ident'>pati</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>out</span>[<span class='ident'>outi</span>];
+ <span class='kw'>let</span> <span class='ident'>patlen</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>pats</span>[<span class='ident'>pati</span>].<span class='ident'>len</span>();
+ <span class='kw'>let</span> <span class='ident'>start</span> <span class='op'>=</span> <span class='ident'>texti</span> <span class='op'>+</span> <span class='number'>1</span> <span class='op'>-</span> <span class='ident'>patlen</span>;
+ <span class='ident'>Match</span> {
+ <span class='ident'>pati</span>: <span class='ident'>pati</span>,
+ <span class='ident'>start</span>: <span class='ident'>start</span>,
+ <span class='ident'>end</span>: <span class='ident'>start</span> <span class='op'>+</span> <span class='ident'>patlen</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>has_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>outi</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>outi</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>out</span>.<span class='ident'>len</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>skip_to</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>at</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>if</span> <span class='ident'>si</span> <span class='op'>!=</span> <span class='ident'>ROOT_STATE</span> <span class='op'>||</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>is_skippable</span>() {
+ <span class='kw'>return</span> <span class='ident'>at</span>;
+ }
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>start_bytes</span>[<span class='number'>0</span>];
+ <span class='kw'>match</span> <span class='ident'>memchr</span>(<span class='ident'>b</span>, <span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>at</span>..]) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>text</span>.<span class='ident'>len</span>(),
+ <span class='prelude-val'>Some</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> <span class='ident'>at</span> <span class='op'>+</span> <span class='ident'>i</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>is_skippable</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>start_bytes</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>1</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>patterns</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span>[<span class='ident'>String</span>] {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>pats</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>pattern</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>pats</span>[<span class='ident'>i</span>]
+ }
+}
+
+<span class='comment'>// Below contains code for *building* the automaton. It&#39;s a reasonably faithful</span>
+<span class='comment'>// translation of the description/psuedo-code from:</span>
+<span class='comment'>// http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf</span>
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='comment'>// This is the first phase and builds the initial keyword tree.</span>
+ <span class='kw'>fn</span> <span class='ident'>build</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>pats</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>for</span> (<span class='ident'>pati</span>, <span class='ident'>pat</span>) <span class='kw'>in</span> <span class='ident'>pats</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='kw'>if</span> <span class='ident'>pat</span>.<span class='ident'>is_empty</span>() {
+ <span class='kw'>continue</span>;
+ }
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>previ</span> <span class='op'>=</span> <span class='ident'>ROOT_STATE</span>;
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='ident'>b</span> <span class='kw'>in</span> <span class='ident'>pat</span>.<span class='ident'>as_bytes</span>() {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>previ</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>b</span>) <span class='op'>!=</span> <span class='ident'>FAIL_STATE</span> {
+ <span class='ident'>previ</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>previ</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>b</span>);
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>depth</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>previ</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>depth</span> <span class='op'>+</span> <span class='number'>1</span>;
+ <span class='kw'>let</span> <span class='ident'>nexti</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>add_state</span>(<span class='ident'>State</span>::<span class='ident'>new</span>(<span class='ident'>depth</span>));
+ <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>previ</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>set_goto</span>(<span class='ident'>b</span>, <span class='ident'>nexti</span>);
+ <span class='ident'>previ</span> <span class='op'>=</span> <span class='ident'>nexti</span>;
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>previ</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>out</span>.<span class='ident'>push</span>(<span class='ident'>pati</span>);
+ }
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>ROOT_STATE</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>c</span>) <span class='op'>==</span> <span class='ident'>FAIL_STATE</span> {
+ <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>ROOT_STATE</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>set_goto</span>(<span class='ident'>c</span>, <span class='ident'>ROOT_STATE</span>);
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>start_bytes</span>.<span class='ident'>push</span>(<span class='ident'>c</span>);
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>pats</span> <span class='op'>=</span> <span class='ident'>pats</span>;
+ <span class='self'>self</span>.<span class='ident'>fill</span>()
+ }
+
+ <span class='comment'>// The second phase that fills in the back links.</span>
+ <span class='kw'>fn</span> <span class='ident'>fill</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='comment'>// Fill up the queue with all non-root transitions out of the root</span>
+ <span class='comment'>// node. Then proceed by breadth first traversal.</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>q</span> <span class='op'>=</span> <span class='ident'>VecDeque</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='kw'>let</span> <span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>ROOT_STATE</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>c</span>);
+ <span class='kw'>if</span> <span class='ident'>si</span> <span class='op'>!=</span> <span class='ident'>ROOT_STATE</span> {
+ <span class='ident'>q</span>.<span class='ident'>push_front</span>(<span class='ident'>si</span>);
+ }
+ }
+ <span class='kw'>while</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>si</span>) <span class='op'>=</span> <span class='ident'>q</span>.<span class='ident'>pop_back</span>() {
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='kw'>let</span> <span class='ident'>u</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>c</span>);
+ <span class='kw'>if</span> <span class='ident'>u</span> <span class='op'>!=</span> <span class='ident'>FAIL_STATE</span> {
+ <span class='ident'>q</span>.<span class='ident'>push_front</span>(<span class='ident'>u</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>si</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>fail</span>;
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>v</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>c</span>) <span class='op'>==</span> <span class='ident'>FAIL_STATE</span> {
+ <span class='ident'>v</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>v</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>fail</span>;
+ }
+ <span class='kw'>let</span> <span class='ident'>ufail</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>v</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>goto</span>(<span class='ident'>c</span>);
+ <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>u</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>fail</span> <span class='op'>=</span> <span class='ident'>ufail</span>;
+ <span class='kw'>let</span> <span class='ident'>ufail_out</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>ufail</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>out</span>.<span class='ident'>clone</span>();
+ <span class='self'>self</span>.<span class='ident'>states</span>[<span class='ident'>u</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>out</span>.<span class='ident'>extend</span>(<span class='ident'>ufail_out</span>);
+ }
+ }
+ }
+ <span class='self'>self</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>add_state</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>state</span>: <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> {
+ <span class='kw'>let</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>states</span>.<span class='ident'>len</span>();
+ <span class='self'>self</span>.<span class='ident'>states</span>.<span class='ident'>push</span>(<span class='ident'>state</span>);
+ <span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>StateIdx</span>
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>depth</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>State</span> {
+ <span class='ident'>out</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ <span class='ident'>fail</span>: <span class='number'>1</span>,
+ <span class='ident'>goto</span>: <span class='ident'>Transitions</span>::<span class='ident'>new</span>(<span class='ident'>depth</span>),
+ <span class='ident'>depth</span>: <span class='ident'>depth</span>,
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>goto</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> { <span class='self'>self</span>.<span class='ident'>goto</span>.<span class='ident'>goto</span>(<span class='ident'>b</span>) }
+ <span class='kw'>fn</span> <span class='ident'>set_goto</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>) { <span class='self'>self</span>.<span class='ident'>goto</span>.<span class='ident'>set_goto</span>(<span class='ident'>b</span>, <span class='ident'>si</span>); }
+}
+
+<span class='doccomment'>/// An abstraction over state transition strategies.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This is an attempt to let the caller choose the space/time trade offs</span>
+<span class='doccomment'>/// used for state transitions.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// (It&#39;s possible that this interface is merely good enough for just the two</span>
+<span class='doccomment'>/// implementations in this crate.)</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Transitions</span> {
+ <span class='doccomment'>/// Return a new state at the given depth.</span>
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>depth</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='kw'>Self</span>;
+ <span class='doccomment'>/// Return the next state index given the next character.</span>
+ <span class='kw'>fn</span> <span class='ident'>goto</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>alpha</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span>;
+ <span class='doccomment'>/// Set the next state index for the character given.</span>
+ <span class='kw'>fn</span> <span class='ident'>set_goto</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>alpha</span>: <span class='ident'>u8</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>);
+}
+
+<span class='doccomment'>/// State transitions that can be stored either sparsely or densely.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This uses less space but at the expense of slower matching.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Dense</span>(<span class='ident'>DenseChoice</span>);
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>enum</span> <span class='ident'>DenseChoice</span> {
+ <span class='ident'>Sparse</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>StateIdx</span><span class='op'>&gt;</span>), <span class='comment'>// indexed by alphabet</span>
+ <span class='ident'>Dense</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>u8</span>, <span class='ident'>StateIdx</span>)<span class='op'>&gt;</span>),
+}
+
+<span class='kw'>impl</span> <span class='ident'>Transitions</span> <span class='kw'>for</span> <span class='ident'>Dense</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>depth</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>Dense</span> {
+ <span class='kw'>if</span> <span class='ident'>depth</span> <span class='op'>&lt;=</span> <span class='ident'>DENSE_DEPTH_THRESHOLD</span> {
+ <span class='ident'>Dense</span>(<span class='ident'>DenseChoice</span>::<span class='ident'>Sparse</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span>; <span class='number'>256</span>]))
+ } <span class='kw'>else</span> {
+ <span class='ident'>Dense</span>(<span class='ident'>DenseChoice</span>::<span class='ident'>Dense</span>(<span class='macro'>vec</span><span class='macro'>!</span>[]))
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>goto</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>b1</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='number'>0</span> {
+ <span class='ident'>DenseChoice</span>::<span class='ident'>Sparse</span>(<span class='kw-2'>ref</span> <span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='ident'>m</span>[<span class='ident'>b1</span> <span class='kw'>as</span> <span class='ident'>usize</span>],
+ <span class='ident'>DenseChoice</span>::<span class='ident'>Dense</span>(<span class='kw-2'>ref</span> <span class='ident'>m</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='ident'>b2</span>, <span class='ident'>si</span>) <span class='kw'>in</span> <span class='ident'>m</span> {
+ <span class='kw'>if</span> <span class='ident'>b1</span> <span class='op'>==</span> <span class='ident'>b2</span> {
+ <span class='kw'>return</span> <span class='ident'>si</span>;
+ }
+ }
+ <span class='ident'>FAIL_STATE</span>
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>set_goto</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>) {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='number'>0</span> {
+ <span class='ident'>DenseChoice</span>::<span class='ident'>Sparse</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='ident'>m</span>[<span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>usize</span>] <span class='op'>=</span> <span class='ident'>si</span>,
+ <span class='ident'>DenseChoice</span>::<span class='ident'>Dense</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='ident'>m</span>.<span class='ident'>push</span>((<span class='ident'>b</span>, <span class='ident'>si</span>)),
+ }
+ }
+}
+
+<span class='doccomment'>/// State transitions that are always sparse.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This can use enormous amounts of memory when there are many patterns,</span>
+<span class='doccomment'>/// but matching is very fast.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Sparse</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>StateIdx</span><span class='op'>&gt;</span>);
+
+<span class='kw'>impl</span> <span class='ident'>Transitions</span> <span class='kw'>for</span> <span class='ident'>Sparse</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>(_: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>Sparse</span> {
+ <span class='ident'>Sparse</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>0</span>; <span class='number'>256</span>])
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>goto</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>StateIdx</span> {
+ <span class='self'>self</span>.<span class='number'>0</span>[<span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>usize</span>]
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>set_goto</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>b</span>: <span class='ident'>u8</span>, <span class='ident'>si</span>: <span class='ident'>StateIdx</span>) {
+ <span class='self'>self</span>.<span class='number'>0</span>[<span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>usize</span>] <span class='op'>=</span> <span class='ident'>si</span>;
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span>: <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span> <span class='ident'>FromIterator</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>AcAutomaton</span> {
+ <span class='doccomment'>/// Create an automaton from an iterator of strings.</span>
+ <span class='kw'>fn</span> <span class='ident'>from_iter</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>it</span>: <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>AcAutomaton</span> <span class='kw'>where</span> <span class='ident'>T</span>: <span class='ident'>IntoIterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>it</span>)
+ }
+}
+
+<span class='comment'>// Provide some question debug impls for viewing automatons.</span>
+<span class='comment'>// The custom impls mostly exist for special showing of sparse maps.</span>
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>writeln</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>repeat</span>(<span class='string'>&#39;-&#39;</span>).<span class='ident'>take</span>(<span class='number'>79</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>()));
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>writeln</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Patterns: {:?}&quot;</span>, <span class='self'>self</span>.<span class='ident'>pats</span>));
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>state</span>) <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>states</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>skip</span>(<span class='number'>1</span>) {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>writeln</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{:3}: {}&quot;</span>, <span class='ident'>i</span>, <span class='ident'>state</span>.<span class='ident'>debug</span>(<span class='ident'>i</span> <span class='op'>==</span> <span class='number'>1</span>)));
+ }
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>repeat</span>(<span class='string'>&#39;-&#39;</span>).<span class='ident'>take</span>(<span class='number'>79</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>())
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>debug</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>root</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;State {{ depth: {:?}, out: {:?}, fail: {:?}, goto: {{{}}} }}&quot;</span>,
+ <span class='self'>self</span>.<span class='ident'>depth</span>, <span class='self'>self</span>.<span class='ident'>out</span>, <span class='self'>self</span>.<span class='ident'>fail</span>, <span class='self'>self</span>.<span class='ident'>goto_string</span>(<span class='ident'>root</span>))
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>goto_string</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>root</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>::<span class='ident'>from_u32</span>;
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>goto</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>for</span> <span class='ident'>b</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>b</span><span class='op'>|</span> <span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='kw'>let</span> <span class='ident'>si</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>goto</span>(<span class='ident'>b</span>);
+ <span class='kw'>if</span> (<span class='op'>!</span><span class='ident'>root</span> <span class='op'>&amp;&amp;</span> <span class='ident'>si</span> <span class='op'>==</span> <span class='ident'>FAIL_STATE</span>) <span class='op'>||</span> (<span class='ident'>root</span> <span class='op'>&amp;&amp;</span> <span class='ident'>si</span> <span class='op'>==</span> <span class='ident'>ROOT_STATE</span>) {
+ <span class='kw'>continue</span>;
+ }
+ <span class='ident'>goto</span>.<span class='ident'>push</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{} =&gt; {}&quot;</span>, <span class='ident'>from_u32</span>(<span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>u32</span>).<span class='ident'>unwrap</span>(), <span class='ident'>si</span>));
+ }
+ <span class='ident'>goto</span>.<span class='ident'>connect</span>(<span class='string'>&quot;, &quot;</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>State</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='self'>self</span>.<span class='ident'>debug</span>(<span class='boolval'>false</span>))
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Transitions</span><span class='op'>&gt;</span> <span class='ident'>AcAutomaton</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dot</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='ident'>Write</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>new</span>();
+ <span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>w</span> {
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>w</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>tt</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> { {<span class='macro'>write</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>w</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>tt</span>)<span class='op'>*</span>)}.<span class='ident'>unwrap</span>() }
+ }
+
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>r#&quot;
+digraph automaton {{
+ label=&lt;&lt;FONT POINT-SIZE=&quot;20&quot;&gt;{}&lt;/FONT&gt;&gt;;
+ labelloc=&quot;l&quot;;
+ labeljust=&quot;l&quot;;
+ rankdir=&quot;LR&quot;;
+&quot;#</span>, <span class='self'>self</span>.<span class='ident'>pats</span>.<span class='ident'>connect</span>(<span class='string'>&quot;, &quot;</span>));
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>s</span>) <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>states</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>skip</span>(<span class='number'>1</span>) {
+ <span class='kw'>let</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>u32</span>;
+ <span class='kw'>if</span> <span class='ident'>s</span>.<span class='ident'>out</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>&quot; {};\n&quot;</span>, <span class='ident'>i</span>);
+ } <span class='kw'>else</span> {
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>&quot; {} [peripheries=2];\n&quot;</span>, <span class='ident'>i</span>);
+ }
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>&quot; {} -&gt; {} [style=dashed];\n&quot;</span>, <span class='ident'>i</span>, <span class='ident'>s</span>.<span class='ident'>fail</span>);
+ <span class='kw'>for</span> <span class='ident'>b</span> <span class='kw'>in</span> (<span class='number'>0</span>..<span class='number'>256</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>b</span><span class='op'>|</span> <span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>u8</span>) {
+ <span class='kw'>let</span> <span class='ident'>si</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>goto</span>(<span class='ident'>b</span>);
+ <span class='kw'>if</span> <span class='ident'>si</span> <span class='op'>==</span> <span class='ident'>FAIL_STATE</span> <span class='op'>||</span> (<span class='ident'>i</span> <span class='op'>==</span> <span class='ident'>ROOT_STATE</span> <span class='op'>&amp;&amp;</span> <span class='ident'>si</span> <span class='op'>==</span> <span class='ident'>ROOT_STATE</span>) {
+ <span class='kw'>continue</span>;
+ }
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>&quot; {} -&gt; {} [label={}];\n&quot;</span>, <span class='ident'>i</span>, <span class='ident'>si</span>, <span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>char</span>);
+ }
+ }
+ <span class='macro'>w</span><span class='macro'>!</span>(<span class='ident'>out</span>, <span class='string'>&quot;}}&quot;</span>);
+ <span class='ident'>out</span>
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>HashSet</span>;
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+
+ <span class='kw'>use</span> <span class='ident'>quickcheck</span>::{<span class='ident'>Arbitrary</span>, <span class='ident'>Gen</span>, <span class='ident'>quickcheck</span>};
+ <span class='kw'>use</span> <span class='ident'>rand</span>::<span class='ident'>Rng</span>;
+
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>Automaton</span>, <span class='ident'>AcAutomaton</span>, <span class='ident'>Match</span>};
+
+ <span class='kw'>fn</span> <span class='ident'>aut_find</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>()).<span class='ident'>find</span>(<span class='kw-2'>&amp;</span><span class='ident'>haystack</span>).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_finds</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='ident'>Cursor</span>::<span class='ident'>new</span>(<span class='ident'>haystack</span>.<span class='ident'>as_bytes</span>());
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>())
+ .<span class='ident'>stream_find</span>(<span class='ident'>cur</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>unwrap</span>()).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findf</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>()).<span class='ident'>into_full</span>().<span class='ident'>find</span>(<span class='ident'>haystack</span>).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findfs</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='ident'>Cursor</span>::<span class='ident'>new</span>(<span class='ident'>haystack</span>.<span class='ident'>as_bytes</span>());
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>())
+ .<span class='ident'>into_full</span>()
+ .<span class='ident'>stream_find</span>(<span class='ident'>cur</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>unwrap</span>()).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findo</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>()).<span class='ident'>find_overlapping</span>(<span class='ident'>haystack</span>).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findos</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='ident'>Cursor</span>::<span class='ident'>new</span>(<span class='ident'>haystack</span>.<span class='ident'>as_bytes</span>());
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>())
+ .<span class='ident'>stream_find_overlapping</span>(<span class='ident'>cur</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>unwrap</span>()).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findfo</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>())
+ .<span class='ident'>into_full</span>().<span class='ident'>find_overlapping</span>(<span class='ident'>haystack</span>).<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>aut_findfos</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>io</span>::<span class='ident'>Cursor</span>::<span class='ident'>new</span>(<span class='ident'>haystack</span>.<span class='ident'>as_bytes</span>());
+ <span class='ident'>AcAutomaton</span>::<span class='ident'>new</span>(<span class='ident'>xs</span>.<span class='ident'>to_vec</span>())
+ .<span class='ident'>into_full</span>()
+ .<span class='ident'>stream_find_overlapping</span>(<span class='ident'>cur</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>unwrap</span>()).<span class='ident'>collect</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>one_pattern_one_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;a&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;za&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>1</span>, <span class='ident'>end</span>: <span class='number'>2</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>one_pattern_many_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;a&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazazzzza&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>1</span>, <span class='ident'>end</span>: <span class='number'>2</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>4</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>8</span>, <span class='ident'>end</span>: <span class='number'>9</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>one_longer_pattern_one_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazabcz&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> } ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>one_longer_pattern_many_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazabczzzzazzzabc&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>14</span>, <span class='ident'>end</span>: <span class='number'>17</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_pattern_one_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;a&quot;</span>, <span class='string'>&quot;b&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zb&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>1</span>, <span class='ident'>end</span>: <span class='number'>2</span> } ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_pattern_many_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;a&quot;</span>, <span class='string'>&quot;b&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zbzazzzzb&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>1</span>, <span class='ident'>end</span>: <span class='number'>2</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>4</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>8</span>, <span class='ident'>end</span>: <span class='number'>9</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_one_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;xyz&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazxyzz&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> } ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_many_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;xyz&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazxyzzzzzazzzabcxyz&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>14</span>, <span class='ident'>end</span>: <span class='number'>17</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>17</span>, <span class='ident'>end</span>: <span class='number'>20</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_finds</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findf</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfs</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_overlap_one_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;bc&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zazabcz&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>4</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_overlap_one_match_reverse</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;bc&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;xbc&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>1</span>, <span class='ident'>end</span>: <span class='number'>3</span> } ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_overlap_many_match</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;bc&quot;</span>, <span class='string'>&quot;c&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zzzabczzzbczzzc&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>4</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>5</span>, <span class='ident'>end</span>: <span class='number'>6</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>9</span>, <span class='ident'>end</span>: <span class='number'>11</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>10</span>, <span class='ident'>end</span>: <span class='number'>11</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>14</span>, <span class='ident'>end</span>: <span class='number'>15</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>many_longer_pattern_overlap_many_match_reverse</span>() {
+ <span class='kw'>let</span> <span class='ident'>ns</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;abc&quot;</span>, <span class='string'>&quot;bc&quot;</span>, <span class='string'>&quot;c&quot;</span>];
+ <span class='kw'>let</span> <span class='ident'>hay</span> <span class='op'>=</span> <span class='string'>&quot;zzzczzzbczzzabc&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>3</span>, <span class='ident'>end</span>: <span class='number'>4</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>7</span>, <span class='ident'>end</span>: <span class='number'>9</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>8</span>, <span class='ident'>end</span>: <span class='number'>9</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>0</span>, <span class='ident'>start</span>: <span class='number'>12</span>, <span class='ident'>end</span>: <span class='number'>15</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>1</span>, <span class='ident'>start</span>: <span class='number'>13</span>, <span class='ident'>end</span>: <span class='number'>15</span> },
+ <span class='ident'>Match</span> { <span class='ident'>pati</span>: <span class='number'>2</span>, <span class='ident'>start</span>: <span class='number'>14</span>, <span class='ident'>end</span>: <span class='number'>15</span> },
+ ];
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfo</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>aut_findfos</span>(<span class='kw-2'>&amp;</span><span class='ident'>ns</span>, <span class='ident'>hay</span>), <span class='kw-2'>&amp;</span><span class='ident'>matches</span>);
+ }
+
+ <span class='comment'>// Quickcheck time.</span>
+
+ <span class='comment'>// This generates very small ascii strings, which makes them more likely</span>
+ <span class='comment'>// to interact in interesting ways with larger haystack strings.</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>PartialOrd</span>, <span class='ident'>Ord</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SmallAscii</span>(<span class='ident'>String</span>);
+
+ <span class='kw'>impl</span> <span class='ident'>Arbitrary</span> <span class='kw'>for</span> <span class='ident'>SmallAscii</span> {
+ <span class='kw'>fn</span> <span class='ident'>arbitrary</span><span class='op'>&lt;</span><span class='ident'>G</span>: <span class='ident'>Gen</span><span class='op'>&gt;</span>(<span class='ident'>g</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>G</span>) <span class='op'>-&gt;</span> <span class='ident'>SmallAscii</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>::<span class='ident'>from_u32</span>;
+ <span class='ident'>SmallAscii</span>((<span class='number'>0</span>..<span class='number'>2</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>from_u32</span>(<span class='ident'>g</span>.<span class='ident'>gen_range</span>(<span class='number'>97</span>, <span class='number'>123</span>)).<span class='ident'>unwrap</span>())
+ .<span class='ident'>collect</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>shrink</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Iterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>SmallAscii</span><span class='op'>&gt;&gt;</span> {
+ <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='number'>0</span>.<span class='ident'>shrink</span>().<span class='ident'>map</span>(<span class='ident'>SmallAscii</span>))
+ }
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>SmallAscii</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>String</span> {
+ <span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>s</span>: <span class='ident'>SmallAscii</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> { <span class='ident'>s</span>.<span class='number'>0</span> }
+ }
+
+ <span class='comment'>// This is the same arbitrary impl as `String`, except it has a bias toward</span>
+ <span class='comment'>// ASCII characters.</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>PartialOrd</span>, <span class='ident'>Ord</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>BiasAscii</span>(<span class='ident'>String</span>);
+
+ <span class='kw'>impl</span> <span class='ident'>Arbitrary</span> <span class='kw'>for</span> <span class='ident'>BiasAscii</span> {
+ <span class='kw'>fn</span> <span class='ident'>arbitrary</span><span class='op'>&lt;</span><span class='ident'>G</span>: <span class='ident'>Gen</span><span class='op'>&gt;</span>(<span class='ident'>g</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>G</span>) <span class='op'>-&gt;</span> <span class='ident'>BiasAscii</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>::<span class='ident'>from_u32</span>;
+ <span class='kw'>let</span> <span class='ident'>size</span> <span class='op'>=</span> { <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>g</span>.<span class='ident'>size</span>(); <span class='ident'>g</span>.<span class='ident'>gen_range</span>(<span class='number'>0</span>, <span class='ident'>s</span>) };
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>with_capacity</span>(<span class='ident'>size</span>);
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>size</span> {
+ <span class='kw'>if</span> <span class='ident'>g</span>.<span class='ident'>gen_weighted_bool</span>(<span class='number'>3</span>) {
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='ident'>char</span>::<span class='ident'>arbitrary</span>(<span class='ident'>g</span>));
+ } <span class='kw'>else</span> {
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>5</span> {
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='ident'>from_u32</span>(<span class='ident'>g</span>.<span class='ident'>gen_range</span>(<span class='number'>97</span>, <span class='number'>123</span>)).<span class='ident'>unwrap</span>());
+ }
+ }
+ }
+ <span class='ident'>BiasAscii</span>(<span class='ident'>s</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>shrink</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Iterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>BiasAscii</span><span class='op'>&gt;&gt;</span> {
+ <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='number'>0</span>.<span class='ident'>shrink</span>().<span class='ident'>map</span>(<span class='ident'>BiasAscii</span>))
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>naive_find</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>(<span class='ident'>xs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>S</span>], <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Into</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>needles</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> <span class='op'>=</span>
+ <span class='ident'>xs</span>.<span class='ident'>to_vec</span>().<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='ident'>Into</span>::<span class='ident'>into</span>).<span class='ident'>collect</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>matches</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>for</span> <span class='ident'>hi</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>haystack</span>.<span class='ident'>len</span>() {
+ <span class='kw'>for</span> (<span class='ident'>pati</span>, <span class='ident'>needle</span>) <span class='kw'>in</span> <span class='ident'>needles</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='kw'>let</span> <span class='ident'>needle</span> <span class='op'>=</span> <span class='ident'>needle</span>.<span class='ident'>as_bytes</span>();
+ <span class='kw'>if</span> <span class='ident'>needle</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>||</span> <span class='ident'>needle</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='ident'>haystack</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='ident'>hi</span> {
+ <span class='kw'>continue</span>;
+ }
+ <span class='kw'>if</span> <span class='ident'>needle</span> <span class='op'>==</span> <span class='kw-2'>&amp;</span><span class='ident'>haystack</span>.<span class='ident'>as_bytes</span>()[<span class='ident'>hi</span>..<span class='ident'>hi</span><span class='op'>+</span><span class='ident'>needle</span>.<span class='ident'>len</span>()] {
+ <span class='ident'>matches</span>.<span class='ident'>push</span>(<span class='ident'>Match</span> {
+ <span class='ident'>pati</span>: <span class='ident'>pati</span>,
+ <span class='ident'>start</span>: <span class='ident'>hi</span>,
+ <span class='ident'>end</span>: <span class='ident'>hi</span> <span class='op'>+</span> <span class='ident'>needle</span>.<span class='ident'>len</span>(),
+ });
+ }
+ }
+ }
+ <span class='ident'>matches</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>qc_ac_equals_naive</span>() {
+ <span class='kw'>fn</span> <span class='ident'>prop</span>(<span class='ident'>needles</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>SmallAscii</span><span class='op'>&gt;</span>, <span class='ident'>haystack</span>: <span class='ident'>BiasAscii</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>aut_matches</span> <span class='op'>=</span> <span class='ident'>aut_findo</span>(<span class='kw-2'>&amp;</span><span class='ident'>needles</span>, <span class='kw-2'>&amp;</span><span class='ident'>haystack</span>.<span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='ident'>naive_matches</span> <span class='op'>=</span> <span class='ident'>naive_find</span>(<span class='kw-2'>&amp;</span><span class='ident'>needles</span>, <span class='kw-2'>&amp;</span><span class='ident'>haystack</span>.<span class='number'>0</span>);
+ <span class='comment'>// Ordering isn&#39;t always the same. I don&#39;t think we care, so do</span>
+ <span class='comment'>// an unordered comparison.</span>
+ <span class='kw'>let</span> <span class='ident'>aset</span>: <span class='ident'>HashSet</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>aut_matches</span>.<span class='ident'>iter</span>().<span class='ident'>cloned</span>().<span class='ident'>collect</span>();
+ <span class='kw'>let</span> <span class='ident'>nset</span>: <span class='ident'>HashSet</span><span class='op'>&lt;</span><span class='ident'>Match</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>naive_matches</span>.<span class='ident'>iter</span>().<span class='ident'>cloned</span>().<span class='ident'>collect</span>();
+ <span class='ident'>aset</span> <span class='op'>==</span> <span class='ident'>nset</span>
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>prop</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>SmallAscii</span><span class='op'>&gt;</span>, <span class='ident'>BiasAscii</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "aho_corasick";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/bitflags/lib.rs.html b/src/bitflags/lib.rs.html
new file mode 100644
index 0000000..83312e8
--- /dev/null
+++ b/src/bitflags/lib.rs.html
@@ -0,0 +1,1121 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/bitflags-0.2.1/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='doccomment'>//! A typesafe bitmask flag generator.</span>
+
+<span class='doccomment'>/// The `bitflags!` macro generates a `struct` that holds a set of C-style</span>
+<span class='doccomment'>/// bitmask flags. It is useful for creating typesafe wrappers for C APIs.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The flags should only be defined for integer types, otherwise unexpected</span>
+<span class='doccomment'>/// type errors may occur at compile time.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Example</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```{.rust}</span>
+<span class='doccomment'>/// #[macro_use]</span>
+<span class='doccomment'>/// extern crate bitflags;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// bitflags! {</span>
+<span class='doccomment'>/// flags Flags: u32 {</span>
+<span class='doccomment'>/// const FLAG_A = 0b00000001,</span>
+<span class='doccomment'>/// const FLAG_B = 0b00000010,</span>
+<span class='doccomment'>/// const FLAG_C = 0b00000100,</span>
+<span class='doccomment'>/// const FLAG_ABC = FLAG_A.bits</span>
+<span class='doccomment'>/// | FLAG_B.bits</span>
+<span class='doccomment'>/// | FLAG_C.bits,</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// fn main() {</span>
+<span class='doccomment'>/// let e1 = FLAG_A | FLAG_C;</span>
+<span class='doccomment'>/// let e2 = FLAG_B | FLAG_C;</span>
+<span class='doccomment'>/// assert!((e1 | e2) == FLAG_ABC); // union</span>
+<span class='doccomment'>/// assert!((e1 &amp; e2) == FLAG_C); // intersection</span>
+<span class='doccomment'>/// assert!((e1 - e2) == FLAG_A); // set difference</span>
+<span class='doccomment'>/// assert!(!e2 == FLAG_A); // set complement</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The generated `struct`s can also be extended with type and trait</span>
+<span class='doccomment'>/// implementations:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```{.rust}</span>
+<span class='doccomment'>/// #[macro_use]</span>
+<span class='doccomment'>/// extern crate bitflags;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// use std::fmt;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// bitflags! {</span>
+<span class='doccomment'>/// flags Flags: u32 {</span>
+<span class='doccomment'>/// const FLAG_A = 0b00000001,</span>
+<span class='doccomment'>/// const FLAG_B = 0b00000010,</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// impl Flags {</span>
+<span class='doccomment'>/// pub fn clear(&amp;mut self) {</span>
+<span class='doccomment'>/// self.bits = 0; // The `bits` field can be accessed from within the</span>
+<span class='doccomment'>/// // same module where the `bitflags!` macro was invoked.</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// impl fmt::Display for Flags {</span>
+<span class='doccomment'>/// fn fmt(&amp;self, f: &amp;mut fmt::Formatter) -&gt; fmt::Result {</span>
+<span class='doccomment'>/// write!(f, &quot;hi!&quot;)</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// fn main() {</span>
+<span class='doccomment'>/// let mut flags = FLAG_A | FLAG_B;</span>
+<span class='doccomment'>/// flags.clear();</span>
+<span class='doccomment'>/// assert!(flags.is_empty());</span>
+<span class='doccomment'>/// assert_eq!(format!(&quot;{}&quot;, flags), &quot;hi!&quot;);</span>
+<span class='doccomment'>/// assert_eq!(format!(&quot;{:?}&quot;, FLAG_A | FLAG_B), &quot;Flags { bits: 0b11 }&quot;);</span>
+<span class='doccomment'>/// assert_eq!(format!(&quot;{:?}&quot;, FLAG_B), &quot;Flags { bits: 0b10 }&quot;);</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Attributes</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Attributes can be attached to the generated `struct` by placing them</span>
+<span class='doccomment'>/// before the `flags` keyword.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Derived traits</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The `PartialEq` and `Clone` traits are automatically derived for the</span>
+<span class='doccomment'>/// `struct` using the `deriving` attribute. Additional traits can be derived by</span>
+<span class='doccomment'>/// providing an explicit `deriving` attribute on `flags`. The `Debug` trait is</span>
+<span class='doccomment'>/// also implemented by displaying the bits value of the internal struct.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Operators</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The following operator traits are implemented for the generated `struct`:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// - `BitOr`: union</span>
+<span class='doccomment'>/// - `BitAnd`: intersection</span>
+<span class='doccomment'>/// - `BitXor`: toggle</span>
+<span class='doccomment'>/// - `Sub`: set difference</span>
+<span class='doccomment'>/// - `Not`: set complement</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Methods</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The following methods are defined for the generated `struct`:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// - `empty`: an empty set of flags</span>
+<span class='doccomment'>/// - `all`: the set of all flags</span>
+<span class='doccomment'>/// - `bits`: the raw value of the flags currently stored</span>
+<span class='doccomment'>/// - `from_bits`: convert from underlying bit representation, unless that</span>
+<span class='doccomment'>/// representation contains bits that do not correspond to a flag</span>
+<span class='doccomment'>/// - `from_bits_truncate`: convert from underlying bit representation, dropping</span>
+<span class='doccomment'>/// any bits that do not correspond to flags</span>
+<span class='doccomment'>/// - `is_empty`: `true` if no flags are currently stored</span>
+<span class='doccomment'>/// - `is_all`: `true` if all flags are currently set</span>
+<span class='doccomment'>/// - `intersects`: `true` if there are flags common to both `self` and `other`</span>
+<span class='doccomment'>/// - `contains`: `true` all of the flags in `other` are contained within `self`</span>
+<span class='doccomment'>/// - `insert`: inserts the specified flags in-place</span>
+<span class='doccomment'>/// - `remove`: removes the specified flags in-place</span>
+<span class='doccomment'>/// - `toggle`: the specified flags will be inserted if not present, and removed</span>
+<span class='doccomment'>/// if they are.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>bitflags</span> {
+ ($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>attr</span>:<span class='ident'>meta</span>]</span>)<span class='op'>*</span> <span class='ident'>flags</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>:<span class='ident'>ident</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>:<span class='ident'>ty</span> {
+ $($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag_attr</span>:<span class='ident'>meta</span>]</span>)<span class='op'>*</span> <span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag</span>:<span class='ident'>ident</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>:<span class='ident'>expr</span>),<span class='op'>+</span>
+ }) <span class='op'>=&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialOrd</span>, <span class='ident'>Ord</span>, <span class='ident'>Hash</span>)]</span>
+ $(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>attr</span>]</span>)<span class='op'>*</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='ident'>bits</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>,
+ }
+
+ $($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag_attr</span>]</span>)<span class='op'>*</span> <span class='kw'>pub</span> <span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span> };)<span class='op'>+</span>
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>let</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{} {{ bits: {:#b} }}&quot;</span>,
+ <span class='macro'>stringify</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>),
+ <span class='self'>self</span>.<span class='ident'>bits</span>);
+ <span class='ident'>f</span>.<span class='ident'>write_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>out</span>[..])
+ }
+ }
+
+ <span class='kw'>impl</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='doccomment'>/// Returns an empty set of flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>empty</span>() <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='number'>0</span> }
+ }
+
+ <span class='doccomment'>/// Returns the set containing all flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>all</span>() <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>)<span class='op'>|</span><span class='op'>+</span> }
+ }
+
+ <span class='doccomment'>/// Returns the raw value of the flags currently stored.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>bits</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> {
+ <span class='self'>self</span>.<span class='ident'>bits</span>
+ }
+
+ <span class='doccomment'>/// Convert from underlying bit representation, unless that</span>
+ <span class='doccomment'>/// representation contains bits that do not correspond to a flag.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_bits</span>(<span class='ident'>bits</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> (<span class='ident'>bits</span> <span class='kw-2'>&amp;</span> <span class='op'>!</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>::<span class='ident'>all</span>().<span class='ident'>bits</span>()) <span class='op'>!=</span> <span class='number'>0</span> {
+ ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ ::<span class='ident'>std</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span>::<span class='prelude-val'>Some</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='ident'>bits</span> })
+ }
+ }
+
+ <span class='doccomment'>/// Convert from underlying bit representation, dropping any bits</span>
+ <span class='doccomment'>/// that do not correspond to flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_bits_truncate</span>(<span class='ident'>bits</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='ident'>bits</span> } <span class='kw-2'>&amp;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>::<span class='ident'>all</span>()
+ }
+
+ <span class='doccomment'>/// Returns `true` if no flags are currently stored.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_empty</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='op'>==</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>::<span class='ident'>empty</span>()
+ }
+
+ <span class='doccomment'>/// Returns `true` if all flags are currently set.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_all</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='op'>==</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>::<span class='ident'>all</span>()
+ }
+
+ <span class='doccomment'>/// Returns `true` if there are flags common to both `self` and `other`.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>intersects</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>!</span>(<span class='op'>*</span><span class='self'>self</span> <span class='kw-2'>&amp;</span> <span class='ident'>other</span>).<span class='ident'>is_empty</span>()
+ }
+
+ <span class='doccomment'>/// Returns `true` all of the flags in `other` are contained within `self`.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>contains</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ (<span class='op'>*</span><span class='self'>self</span> <span class='kw-2'>&amp;</span> <span class='ident'>other</span>) <span class='op'>==</span> <span class='ident'>other</span>
+ }
+
+ <span class='doccomment'>/// Inserts the specified flags in-place.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>insert</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) {
+ <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>|=</span> <span class='ident'>other</span>.<span class='ident'>bits</span>;
+ }
+
+ <span class='doccomment'>/// Removes the specified flags in-place.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>remove</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) {
+ <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>&amp;=</span> <span class='op'>!</span><span class='ident'>other</span>.<span class='ident'>bits</span>;
+ }
+
+ <span class='doccomment'>/// Toggles the specified flags in-place.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>toggle</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) {
+ <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>^=</span> <span class='ident'>other</span>.<span class='ident'>bits</span>;
+ }
+ }
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>BitOr</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>;
+
+ <span class='doccomment'>/// Returns the union of the two sets of flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>bitor</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>|</span> <span class='ident'>other</span>.<span class='ident'>bits</span> }
+ }
+ }
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>BitXor</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>;
+
+ <span class='doccomment'>/// Returns the left flags, but with all the right flags toggled.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>bitxor</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>^</span> <span class='ident'>other</span>.<span class='ident'>bits</span> }
+ }
+ }
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>BitAnd</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>;
+
+ <span class='doccomment'>/// Returns the intersection between the two sets of flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>bitand</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='self'>self</span>.<span class='ident'>bits</span> <span class='kw-2'>&amp;</span> <span class='ident'>other</span>.<span class='ident'>bits</span> }
+ }
+ }
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Sub</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>;
+
+ <span class='doccomment'>/// Returns the set difference of the two sets of flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>sub</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='self'>self</span>.<span class='ident'>bits</span> <span class='kw-2'>&amp;</span> <span class='op'>!</span><span class='ident'>other</span>.<span class='ident'>bits</span> }
+ }
+ }
+
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Not</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>;
+
+ <span class='doccomment'>/// Returns the complement of this set of flags.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>not</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span> { <span class='ident'>bits</span>: <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bits</span> } <span class='kw-2'>&amp;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>::<span class='ident'>all</span>()
+ }
+ }
+ };
+ ($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>attr</span>:<span class='ident'>meta</span>]</span>)<span class='op'>*</span> <span class='ident'>flags</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>:<span class='ident'>ident</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>:<span class='ident'>ty</span> {
+ $($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag_attr</span>:<span class='ident'>meta</span>]</span>)<span class='op'>*</span> <span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag</span>:<span class='ident'>ident</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>:<span class='ident'>expr</span>),<span class='op'>+</span>,
+ }) <span class='op'>=&gt;</span> {
+ <span class='macro'>bitflags</span><span class='macro'>!</span> {
+ $(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>attr</span>]</span>)<span class='op'>*</span>
+ <span class='ident'>flags</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>BitFlags</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> {
+ $($(<span class='attribute'>#[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag_attr</span>]</span>)<span class='op'>*</span> <span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>Flag</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>),<span class='op'>+</span>
+ }
+ }
+ };
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_upper_case_globals</span>, <span class='ident'>dead_code</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>hash</span>::{<span class='ident'>SipHasher</span>, <span class='ident'>Hash</span>, <span class='ident'>Hasher</span>};
+
+ <span class='macro'>bitflags</span><span class='macro'>!</span> {
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&gt; The first principle is that you must not fool yourself — and&quot;</span>]</span>
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&gt; you are the easiest person to fool.&quot;</span>]</span>
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&gt; &quot;</span>]</span>
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&gt; - Richard Feynman&quot;</span>]</span>
+ <span class='ident'>flags</span> <span class='ident'>Flags</span>: <span class='ident'>u32</span> {
+ <span class='kw'>const</span> <span class='ident'>FlagA</span> <span class='op'>=</span> <span class='number'>0b00000001</span>,
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&lt;pcwalton&gt; macros are way better at generating code than trans is&quot;</span>]</span>
+ <span class='kw'>const</span> <span class='ident'>FlagB</span> <span class='op'>=</span> <span class='number'>0b00000010</span>,
+ <span class='kw'>const</span> <span class='ident'>FlagC</span> <span class='op'>=</span> <span class='number'>0b00000100</span>,
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;* cmr bed&quot;</span>]</span>
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;* strcat table&quot;</span>]</span>
+ <span class='attribute'>#[<span class='ident'>doc</span> <span class='op'>=</span> <span class='string'>&quot;&lt;strcat&gt; wait what?&quot;</span>]</span>
+ <span class='kw'>const</span> <span class='ident'>FlagABC</span> <span class='op'>=</span> <span class='ident'>FlagA</span>.<span class='ident'>bits</span>
+ <span class='op'>|</span> <span class='ident'>FlagB</span>.<span class='ident'>bits</span>
+ <span class='op'>|</span> <span class='ident'>FlagC</span>.<span class='ident'>bits</span>,
+ }
+ }
+
+ <span class='macro'>bitflags</span><span class='macro'>!</span> {
+ <span class='ident'>flags</span> <span class='ident'>_CfgFlags</span>: <span class='ident'>u32</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>windows</span>)]</span>
+ <span class='kw'>const</span> <span class='ident'>_CfgA</span> <span class='op'>=</span> <span class='number'>0b01</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span>
+ <span class='kw'>const</span> <span class='ident'>_CfgB</span> <span class='op'>=</span> <span class='number'>0b01</span>,
+ }
+ }
+
+ <span class='macro'>bitflags</span><span class='macro'>!</span> {
+ <span class='ident'>flags</span> <span class='ident'>AnotherSetOfFlags</span>: <span class='ident'>i8</span> {
+ <span class='kw'>const</span> <span class='ident'>AnotherFlag</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1_i8</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_bits</span>(){
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>empty</span>().<span class='ident'>bits</span>(), <span class='number'>0b00000000</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>FlagA</span>.<span class='ident'>bits</span>(), <span class='number'>0b00000001</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>FlagABC</span>.<span class='ident'>bits</span>(), <span class='number'>0b00000111</span>);
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>().<span class='ident'>bits</span>(), <span class='number'>0b00</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>AnotherFlag</span>.<span class='ident'>bits</span>(), <span class='op'>!</span><span class='number'>0_i8</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_from_bits</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits</span>(<span class='number'>0</span>) <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='ident'>Flags</span>::<span class='ident'>empty</span>()));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits</span>(<span class='number'>0b1</span>) <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='ident'>FlagA</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits</span>(<span class='number'>0b10</span>) <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='ident'>FlagB</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits</span>(<span class='number'>0b11</span>) <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits</span>(<span class='number'>0b1000</span>) <span class='op'>==</span> <span class='prelude-val'>None</span>);
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>from_bits</span>(<span class='op'>!</span><span class='number'>0_i8</span>) <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='ident'>AnotherFlag</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_from_bits_truncate</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0</span>) <span class='op'>==</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0b1</span>) <span class='op'>==</span> <span class='ident'>FlagA</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0b10</span>) <span class='op'>==</span> <span class='ident'>FlagB</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0b11</span>) <span class='op'>==</span> (<span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0b1000</span>) <span class='op'>==</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0b1001</span>) <span class='op'>==</span> <span class='ident'>FlagA</span>);
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>from_bits_truncate</span>(<span class='number'>0_i8</span>) <span class='op'>==</span> <span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_is_empty</span>(){
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>empty</span>().<span class='ident'>is_empty</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>FlagA</span>.<span class='ident'>is_empty</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>FlagABC</span>.<span class='ident'>is_empty</span>());
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>AnotherFlag</span>.<span class='ident'>is_empty</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_is_all</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>Flags</span>::<span class='ident'>all</span>().<span class='ident'>is_all</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>FlagA</span>.<span class='ident'>is_all</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>FlagABC</span>.<span class='ident'>is_all</span>());
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>AnotherFlag</span>.<span class='ident'>is_all</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_two_empties_do_not_intersect</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>e1</span>.<span class='ident'>intersects</span>(<span class='ident'>e2</span>));
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>AnotherFlag</span>.<span class='ident'>intersects</span>(<span class='ident'>AnotherFlag</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_empty_does_not_intersect_with_full</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagABC</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>e1</span>.<span class='ident'>intersects</span>(<span class='ident'>e2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_disjoint_intersects</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>e1</span>.<span class='ident'>intersects</span>(<span class='ident'>e2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_overlapping_intersects</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e1</span>.<span class='ident'>intersects</span>(<span class='ident'>e2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_contains</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>e1</span>.<span class='ident'>contains</span>(<span class='ident'>e2</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e2</span>.<span class='ident'>contains</span>(<span class='ident'>e1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>FlagABC</span>.<span class='ident'>contains</span>(<span class='ident'>e2</span>));
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>AnotherFlag</span>.<span class='ident'>contains</span>(<span class='ident'>AnotherFlag</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_insert</span>(){
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>;
+ <span class='ident'>e1</span>.<span class='ident'>insert</span>(<span class='ident'>e2</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e1</span> <span class='op'>==</span> <span class='ident'>e2</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>e3</span> <span class='op'>=</span> <span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>();
+ <span class='ident'>e3</span>.<span class='ident'>insert</span>(<span class='ident'>AnotherFlag</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e3</span> <span class='op'>==</span> <span class='ident'>AnotherFlag</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_remove</span>(){
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagC</span>;
+ <span class='ident'>e1</span>.<span class='ident'>remove</span>(<span class='ident'>e2</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e1</span> <span class='op'>==</span> <span class='ident'>FlagB</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>e3</span> <span class='op'>=</span> <span class='ident'>AnotherFlag</span>;
+ <span class='ident'>e3</span>.<span class='ident'>remove</span>(<span class='ident'>AnotherFlag</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e3</span> <span class='op'>==</span> <span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_operators</span>() {
+ <span class='kw'>let</span> <span class='ident'>e1</span> <span class='op'>=</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagC</span>;
+ <span class='kw'>let</span> <span class='ident'>e2</span> <span class='op'>=</span> <span class='ident'>FlagB</span> <span class='op'>|</span> <span class='ident'>FlagC</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>((<span class='ident'>e1</span> <span class='op'>|</span> <span class='ident'>e2</span>) <span class='op'>==</span> <span class='ident'>FlagABC</span>); <span class='comment'>// union</span>
+ <span class='macro'>assert</span><span class='macro'>!</span>((<span class='ident'>e1</span> <span class='kw-2'>&amp;</span> <span class='ident'>e2</span>) <span class='op'>==</span> <span class='ident'>FlagC</span>); <span class='comment'>// intersection</span>
+ <span class='macro'>assert</span><span class='macro'>!</span>((<span class='ident'>e1</span> <span class='op'>-</span> <span class='ident'>e2</span>) <span class='op'>==</span> <span class='ident'>FlagA</span>); <span class='comment'>// set difference</span>
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>e2</span> <span class='op'>==</span> <span class='ident'>FlagA</span>); <span class='comment'>// set complement</span>
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e1</span> <span class='op'>^</span> <span class='ident'>e2</span> <span class='op'>==</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>); <span class='comment'>// toggle</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>e3</span> <span class='op'>=</span> <span class='ident'>e1</span>;
+ <span class='ident'>e3</span>.<span class='ident'>toggle</span>(<span class='ident'>e2</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>e3</span> <span class='op'>==</span> <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>m4</span> <span class='op'>=</span> <span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>();
+ <span class='ident'>m4</span>.<span class='ident'>toggle</span>(<span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>m4</span> <span class='op'>==</span> <span class='ident'>AnotherSetOfFlags</span>::<span class='ident'>empty</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_lt</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;</span> <span class='ident'>b</span>) <span class='op'>&amp;&amp;</span> <span class='op'>!</span>(<span class='ident'>b</span> <span class='op'>&lt;</span> <span class='ident'>a</span>));
+ <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;</span> <span class='ident'>b</span>);
+ <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>FlagC</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;</span> <span class='ident'>b</span>) <span class='op'>&amp;&amp;</span> <span class='ident'>b</span> <span class='op'>&lt;</span> <span class='ident'>a</span>);
+ <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>FlagC</span> <span class='op'>|</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;</span> <span class='ident'>b</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_ord</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;=</span> <span class='ident'>b</span> <span class='op'>&amp;&amp;</span> <span class='ident'>a</span> <span class='op'>&gt;=</span> <span class='ident'>b</span>);
+ <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>FlagA</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span> <span class='op'>&gt;</span> <span class='ident'>b</span> <span class='op'>&amp;&amp;</span> <span class='ident'>a</span> <span class='op'>&gt;=</span> <span class='ident'>b</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>b</span> <span class='op'>&lt;</span> <span class='ident'>a</span> <span class='op'>&amp;&amp;</span> <span class='ident'>b</span> <span class='op'>&lt;=</span> <span class='ident'>a</span>);
+ <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>FlagB</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>b</span> <span class='op'>&gt;</span> <span class='ident'>a</span> <span class='op'>&amp;&amp;</span> <span class='ident'>b</span> <span class='op'>&gt;=</span> <span class='ident'>a</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span> <span class='op'>&lt;</span> <span class='ident'>b</span> <span class='op'>&amp;&amp;</span> <span class='ident'>a</span> <span class='op'>&lt;=</span> <span class='ident'>b</span>);
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>hash</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Hash</span><span class='op'>&gt;</span>(<span class='ident'>t</span>: <span class='kw-2'>&amp;</span><span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>u64</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>SipHasher</span>::<span class='ident'>new_with_keys</span>(<span class='number'>0</span>, <span class='number'>0</span>);
+ <span class='ident'>t</span>.<span class='ident'>hash</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>s</span>);
+ <span class='ident'>s</span>.<span class='ident'>finish</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hash</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>x</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>y</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>empty</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>x</span>) <span class='op'>==</span> <span class='ident'>hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>y</span>));
+ <span class='ident'>x</span> <span class='op'>=</span> <span class='ident'>Flags</span>::<span class='ident'>all</span>();
+ <span class='ident'>y</span> <span class='op'>=</span> <span class='ident'>FlagABC</span>;
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>x</span>) <span class='op'>==</span> <span class='ident'>hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>y</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_debug</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{:?}&quot;</span>, <span class='ident'>FlagA</span> <span class='op'>|</span> <span class='ident'>FlagB</span>), <span class='string'>&quot;Flags { bits: 0b11 }&quot;</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{:?}&quot;</span>, <span class='ident'>FlagABC</span>), <span class='string'>&quot;Flags { bits: 0b111 }&quot;</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "bitflags";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/lib.rs.html b/src/carboxyl/lib.rs.html
new file mode 100644
index 0000000..912fa0d
--- /dev/null
+++ b/src/carboxyl/lib.rs.html
@@ -0,0 +1,419 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! *Carboxyl* provides primitives for functional reactive programming in Rust.</span>
+<span class='doccomment'>//! It draws inspiration from the [Sodium][sodium] libraries and Push-Pull FRP,</span>
+<span class='doccomment'>//! as described by [Elliott (2009)][elliott_push_pull].</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! [sodium]: https://github.com/SodiumFRP/sodium/</span>
+<span class='doccomment'>//! [elliott_push_pull]: http://conal.net/papers/push-pull-frp/push-pull-frp.pdf</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Overview</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Functional reactive programming (FRP) is a composable and modular</span>
+<span class='doccomment'>//! abstraction for creating dynamic and reactive systems. In its most general</span>
+<span class='doccomment'>//! form it models these systems as a composition of two basic primitives:</span>
+<span class='doccomment'>//! *streams* are a series of singular events and *signals* are continuously</span>
+<span class='doccomment'>//! changing values.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! *Carboxyl* is an imperative, hybrid push- and pull-based implementation of</span>
+<span class='doccomment'>//! FRP. Streams and the discrete components of signals are data-driven, i.e.</span>
+<span class='doccomment'>//! whenever an event occurs the resulting changes are propagated to everything</span>
+<span class='doccomment'>//! that depends on it.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! However, the continuous components of signals are demand-driven. Internally,</span>
+<span class='doccomment'>//! *Carboxyl* stores the state of a signal as a function. This function has to</span>
+<span class='doccomment'>//! be evaluated by consumers of a signal to obtain a concrete value.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Nonetheless, *Carboxyl* has no explicit notion of time. Its signals are</span>
+<span class='doccomment'>//! functions that can be evaluated at any time, but they do not carry any</span>
+<span class='doccomment'>//! inherent notion of time. Synchronization and atomicity is achieved by a</span>
+<span class='doccomment'>//! transaction system.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Functional reactive primitives</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This library provides two basic types: `Stream` and `Signal`. A stream is a</span>
+<span class='doccomment'>//! discrete sequence of events, a signal is a container for values that change</span>
+<span class='doccomment'>//! (discretely) over time.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The FRP primitives are mostly implemented as methods of the basic types to</span>
+<span class='doccomment'>//! ease method chaining, except for the various lifting functions, as they do</span>
+<span class='doccomment'>//! not really belong to any type in particular.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! In addition, the `Sink` type allows one to create a stream of events by</span>
+<span class='doccomment'>//! sending values into it. It is the only way to create a stream from scratch,</span>
+<span class='doccomment'>//! i.e. without using any of the other primitives.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Usage example</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Here is a simple example of how you can use the primitives provided by</span>
+<span class='doccomment'>//! *Carboxyl*. First of all, events can be sent into a *sink*. From a sink one</span>
+<span class='doccomment'>//! can create a *stream* of events. Streams can also be filtered, mapped and</span>
+<span class='doccomment'>//! merged. One can e.g. hold the last event from a stream as a signal.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//! use carboxyl::Sink;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! let sink = Sink::new();</span>
+<span class='doccomment'>//! let stream = sink.stream();</span>
+<span class='doccomment'>//! let signal = stream.hold(3);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! // The current value of the signal is initially 3</span>
+<span class='doccomment'>//! assert_eq!(signal.sample(), 3);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! // When we fire an event, the signal get updated accordingly</span>
+<span class='doccomment'>//! sink.send(5);</span>
+<span class='doccomment'>//! assert_eq!(signal.sample(), 5);</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! One can also directly iterate over the stream instead of holding it in a</span>
+<span class='doccomment'>//! signal:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//! # use carboxyl::Sink;</span>
+<span class='doccomment'>//! # let sink = Sink::new();</span>
+<span class='doccomment'>//! # let stream = sink.stream();</span>
+<span class='doccomment'>//! let mut events = stream.events();</span>
+<span class='doccomment'>//! sink.send(4);</span>
+<span class='doccomment'>//! assert_eq!(events.next(), Some(4));</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Streams and signals can be combined using various primitives. We can map a</span>
+<span class='doccomment'>//! stream to another stream using a function:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//! # use carboxyl::Sink;</span>
+<span class='doccomment'>//! # let sink: Sink&lt;i32&gt; = Sink::new();</span>
+<span class='doccomment'>//! # let stream = sink.stream();</span>
+<span class='doccomment'>//! let squares = stream.map(|x| x * x).hold(0);</span>
+<span class='doccomment'>//! sink.send(4);</span>
+<span class='doccomment'>//! assert_eq!(squares.sample(), 16);</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Or we can filter a stream to create a new one that only contains events that</span>
+<span class='doccomment'>//! satisfy a certain predicate:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//! # use carboxyl::Sink;</span>
+<span class='doccomment'>//! # let sink: Sink&lt;i32&gt; = Sink::new();</span>
+<span class='doccomment'>//! # let stream = sink.stream();</span>
+<span class='doccomment'>//! let negatives = stream.filter(|&amp;x| x &lt; 0).hold(0);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! // This won&#39;t arrive at the signal.</span>
+<span class='doccomment'>//! sink.send(4);</span>
+<span class='doccomment'>//! assert_eq!(negatives.sample(), 0);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! // But this will!</span>
+<span class='doccomment'>//! sink.send(-3);</span>
+<span class='doccomment'>//! assert_eq!(negatives.sample(), -3);</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! There are some other methods on streams and signals, that you can find in</span>
+<span class='doccomment'>//! their respective APIs.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Note that all these objects are `Send + Sync + Clone`. This means you can</span>
+<span class='doccomment'>//! easily pass them around in your code, make clones, give them to another</span>
+<span class='doccomment'>//! thread, and they will still be updated correctly.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! You may have noticed that certain primitives take a function as an argument.</span>
+<span class='doccomment'>//! There is a limitation on what kind of functions can and should be used here.</span>
+<span class='doccomment'>//! In general, as FRP provides an abstraction around mutable state, they should</span>
+<span class='doccomment'>//! be pure functions (i.e. free of side effects).</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! For the most part this is guaranteed by Rust&#39;s type system. A static</span>
+<span class='doccomment'>//! function with a matching signature always works. A closure though is very</span>
+<span class='doccomment'>//! restricted: it must not borrow its environment, as it is impossible to</span>
+<span class='doccomment'>//! satisfy the lifetime requirements for that. So you can only move stuff into</span>
+<span class='doccomment'>//! it from the environment. However, the moved contents of the closure may also</span>
+<span class='doccomment'>//! not be altered, which is guaranteed by the `Fn(…) -&gt; …)` trait bound.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! However, both closures and functions could still have side effects such as</span>
+<span class='doccomment'>//! I/O, changing mutable state via `Mutex` or `RefCell`, etc. While Rust&#39;s type</span>
+<span class='doccomment'>//! system cannot prevent this, you should generally not pass such functions to</span>
+<span class='doccomment'>//! the FRP primitives, as they break the benefits you get from using FRP.</span>
+<span class='doccomment'>//! (An exception here is debugging output.)</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>feature</span>(<span class='ident'>arc_weak</span>, <span class='ident'>fnbox</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>test</span>, <span class='ident'>feature</span>(<span class='ident'>test</span>, <span class='ident'>scoped</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>warn</span>(<span class='ident'>missing_docs</span>)]</span>
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>test</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rand</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>quickcheck</span>;
+<span class='attribute'>#[<span class='ident'>macro_use</span>(<span class='ident'>lazy_static</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>lazy_static</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>stream</span>::{ <span class='ident'>Sink</span>, <span class='ident'>Stream</span> };
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>signal</span>::{ <span class='ident'>Signal</span>, <span class='ident'>SignalMut</span> };
+
+<span class='kw'>mod</span> <span class='ident'>transaction</span>;
+<span class='kw'>mod</span> <span class='ident'>source</span>;
+<span class='kw'>mod</span> <span class='ident'>pending</span>;
+<span class='kw'>mod</span> <span class='ident'>readonly</span>;
+<span class='kw'>mod</span> <span class='ident'>stream</span>;
+<span class='kw'>mod</span> <span class='ident'>signal</span>;
+<span class='attribute'>#[<span class='ident'>macro_use</span>]</span>
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>lift</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>testing</span>;
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/lift.rs.html b/src/carboxyl/lift.rs.html
new file mode 100644
index 0000000..224dbe8
--- /dev/null
+++ b/src/carboxyl/lift.rs.html
@@ -0,0 +1,605 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/lift.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lift.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Lifting of n-ary functions.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! A lift maps a function on values to a function on signals. Given a function of</span>
+<span class='doccomment'>//! type `F: Fn(A, B, …) -&gt; R` and signals of types `Signal&lt;A&gt;, Signal&lt;B&gt;, …` the</span>
+<span class='doccomment'>//! `lift!` macro creates a `Signal&lt;R&gt;`, whose content is computed using the</span>
+<span class='doccomment'>//! function.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Currently lift is only implemented for functions with up to four arguments.</span>
+<span class='doccomment'>//! This limitation is due to the current implementation strategy (and maybe</span>
+<span class='doccomment'>//! limitations of Rust&#39;s type system), but it can be increased to arbitrary but</span>
+<span class='doccomment'>//! finite arity if required.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Example</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//! # #[macro_use] extern crate carboxyl;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! # use carboxyl::Sink;</span>
+<span class='doccomment'>//! let sink_a = Sink::new();</span>
+<span class='doccomment'>//! let sink_b = Sink::new();</span>
+<span class='doccomment'>//! let product = lift!(</span>
+<span class='doccomment'>//! |a, b| a * b,</span>
+<span class='doccomment'>//! &amp;sink_a.stream().hold(0),</span>
+<span class='doccomment'>//! &amp;sink_b.stream().hold(0)</span>
+<span class='doccomment'>//! );</span>
+<span class='doccomment'>//! assert_eq!(product.sample(), 0);</span>
+<span class='doccomment'>//! sink_a.send(3);</span>
+<span class='doccomment'>//! sink_b.send(5);</span>
+<span class='doccomment'>//! assert_eq!(product.sample(), 15);</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::<span class='ident'>Arc</span>;
+<span class='kw'>use</span> <span class='ident'>signal</span>::{ <span class='ident'>Signal</span>, <span class='ident'>SignalFn</span>, <span class='ident'>signal_build</span>, <span class='ident'>signal_current</span>, <span class='ident'>signal_source</span>, <span class='ident'>reg_signal</span>, <span class='ident'>sample_raw</span> };
+<span class='kw'>use</span> <span class='ident'>transaction</span>::<span class='ident'>commit</span>;
+
+
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>lift</span> {
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>: <span class='ident'>expr</span>)
+ <span class='op'>=&gt;</span> ( <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>lift</span>::<span class='ident'>lift0</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>) );
+
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>: <span class='ident'>expr</span>)
+ <span class='op'>=&gt;</span> ( <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>lift</span>::<span class='ident'>lift1</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>) );
+
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>: <span class='ident'>expr</span>)
+ <span class='op'>=&gt;</span> ( <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>lift</span>::<span class='ident'>lift2</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>) );
+
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span>: <span class='ident'>expr</span>)
+ <span class='op'>=&gt;</span> ( <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>lift</span>::<span class='ident'>lift3</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span>) );
+
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span>: <span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>d</span>: <span class='ident'>expr</span>)
+ <span class='op'>=&gt;</span> ( <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>lift</span>::<span class='ident'>lift4</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>f</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>a</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>b</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>d</span>) );
+}
+
+
+<span class='doccomment'>/// Lift a 0-ary function.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lift0</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>() <span class='op'>-&gt;</span> <span class='ident'>A</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>
+{
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='ident'>signal_build</span>(<span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='ident'>f</span>), ()))
+}
+
+
+<span class='doccomment'>/// Lift a unary function.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lift1</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>, <span class='ident'>sa</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>B</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='kw'>fn</span> <span class='ident'>make_callback</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>, <span class='ident'>parent</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>B</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='kw'>let</span> <span class='ident'>pclone</span> <span class='op'>=</span> <span class='ident'>parent</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>f</span> <span class='op'>=</span> <span class='ident'>f</span>.<span class='ident'>clone</span>();
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>signal_current</span>(<span class='kw-2'>&amp;</span><span class='ident'>parent</span>).<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>future</span>() {
+ <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>) <span class='op'>=&gt;</span> <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>f</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>())),
+ <span class='ident'>SignalFn</span>::<span class='ident'>Func</span>(_) <span class='op'>=&gt;</span> <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>f</span>(<span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>pclone</span>))),
+ }
+ }
+
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>f</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>f</span>);
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>signal_build</span>(<span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>sa</span>), ());
+ <span class='kw'>let</span> <span class='ident'>sa_clone</span> <span class='op'>=</span> <span class='ident'>sa</span>.<span class='ident'>clone</span>();
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>signal_source</span>(<span class='kw-2'>&amp;</span><span class='ident'>sa</span>).<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>,
+ <span class='kw'>move</span> <span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>sa_clone</span>));
+ <span class='ident'>signal</span>
+ })
+}
+
+
+<span class='doccomment'>/// Lift a binary function.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lift2</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>, <span class='ident'>sa</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>sb</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='kw'>fn</span> <span class='ident'>make_callback</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>, <span class='ident'>sa</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>sb</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='kw'>use</span> <span class='ident'>signal</span>::<span class='ident'>SignalFn</span>::{ <span class='ident'>Const</span>, <span class='ident'>Func</span> };
+ <span class='kw'>let</span> <span class='ident'>sa_clone</span> <span class='op'>=</span> <span class='ident'>sa</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>sb_clone</span> <span class='op'>=</span> <span class='ident'>sb</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>f</span> <span class='op'>=</span> <span class='ident'>f</span>.<span class='ident'>clone</span>();
+ <span class='kw'>match</span> (
+ <span class='ident'>signal_current</span>(<span class='kw-2'>&amp;</span><span class='ident'>sa</span>).<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>future</span>(),
+ <span class='ident'>signal_current</span>(<span class='kw-2'>&amp;</span><span class='ident'>sb</span>).<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>future</span>(),
+ ) {
+ (<span class='kw-2'>&amp;</span><span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>), <span class='kw-2'>&amp;</span><span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>b</span>)) <span class='op'>=&gt;</span> <span class='ident'>Const</span>(<span class='ident'>f</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>(), <span class='ident'>b</span>.<span class='ident'>clone</span>())),
+ (<span class='kw-2'>&amp;</span><span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>), <span class='kw-2'>&amp;</span><span class='ident'>Func</span>(_)) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>clone</span>();
+ <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>f</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>(), <span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>sb_clone</span>)))
+ },
+ (<span class='kw-2'>&amp;</span><span class='ident'>Func</span>(_), <span class='kw-2'>&amp;</span><span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>b</span>)) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>b</span>.<span class='ident'>clone</span>();
+ <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>f</span>(<span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>sa_clone</span>), <span class='ident'>b</span>.<span class='ident'>clone</span>()))
+ },
+ (<span class='kw-2'>&amp;</span><span class='ident'>Func</span>(_), <span class='kw-2'>&amp;</span><span class='ident'>Func</span>(_)) <span class='op'>=&gt;</span> <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(
+ <span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>f</span>(<span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>sa_clone</span>), <span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>sb_clone</span>))
+ ),
+ }
+ }
+
+ <span class='ident'>commit</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>f</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>f</span>);
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>signal_build</span>(<span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>sa</span>, <span class='kw-2'>&amp;</span><span class='ident'>sb</span>), ());
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>signal_source</span>(<span class='kw-2'>&amp;</span><span class='ident'>sa</span>).<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>, {
+ <span class='kw'>let</span> <span class='ident'>sa_clone</span> <span class='op'>=</span> <span class='ident'>sa</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>sb_clone</span> <span class='op'>=</span> <span class='ident'>sb</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>f</span> <span class='op'>=</span> <span class='ident'>f</span>.<span class='ident'>clone</span>();
+ <span class='kw'>move</span> <span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>sa_clone</span>, <span class='kw-2'>&amp;</span><span class='ident'>sb_clone</span>)
+ });
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>signal_source</span>(<span class='kw-2'>&amp;</span><span class='ident'>sb</span>).<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>, {
+ <span class='kw'>let</span> <span class='ident'>sa_clone</span> <span class='op'>=</span> <span class='ident'>sa</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>sb_clone</span> <span class='op'>=</span> <span class='ident'>sb</span>.<span class='ident'>clone</span>();
+ <span class='kw'>move</span> <span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>sa_clone</span>, <span class='kw-2'>&amp;</span><span class='ident'>sb_clone</span>)
+ });
+ <span class='ident'>signal</span>
+ })
+}
+
+<span class='doccomment'>/// Lift a ternary function.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lift3</span><span class='op'>&lt;</span><span class='ident'>F</span>, <span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>Ret</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>, <span class='ident'>ca</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>cb</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>cc</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>Ret</span><span class='op'>&gt;</span>
+<span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>) <span class='op'>-&gt;</span> <span class='ident'>Ret</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>Ret</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='ident'>lift2</span>(<span class='kw'>move</span> <span class='op'>|</span>(<span class='ident'>a</span>, <span class='ident'>b</span>), <span class='ident'>c</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='ident'>a</span>, <span class='ident'>b</span>, <span class='ident'>c</span>), <span class='kw-2'>&amp;</span><span class='ident'>lift2</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>), <span class='ident'>ca</span>, <span class='ident'>cb</span>), <span class='ident'>cc</span>)
+}
+
+<span class='doccomment'>/// Lift a quarternary function.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lift4</span><span class='op'>&lt;</span><span class='ident'>F</span>, <span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>D</span>, <span class='ident'>Ret</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>, <span class='ident'>ca</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>cb</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>cc</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>, <span class='ident'>cd</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>D</span><span class='op'>&gt;</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>Ret</span><span class='op'>&gt;</span>
+<span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>D</span>) <span class='op'>-&gt;</span> <span class='ident'>Ret</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>D</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>Ret</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='ident'>lift2</span>(
+ <span class='kw'>move</span> <span class='op'>|</span>(<span class='ident'>a</span>, <span class='ident'>b</span>), (<span class='ident'>c</span>, <span class='ident'>d</span>)<span class='op'>|</span> <span class='ident'>f</span>(<span class='ident'>a</span>, <span class='ident'>b</span>, <span class='ident'>c</span>, <span class='ident'>d</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>lift2</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>), <span class='ident'>ca</span>, <span class='ident'>cb</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>lift2</span>(<span class='op'>|</span><span class='ident'>c</span>, <span class='ident'>d</span><span class='op'>|</span> (<span class='ident'>c</span>, <span class='ident'>d</span>), <span class='ident'>cc</span>, <span class='ident'>cd</span>)
+ )
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>stream</span>::<span class='ident'>Sink</span>;
+ <span class='kw'>use</span> <span class='ident'>signal</span>::<span class='ident'>Signal</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift0</span>() {
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>||</span> <span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>signal</span>.<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift1</span>() {
+ <span class='kw'>let</span> <span class='ident'>sig2</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> <span class='ident'>n</span> <span class='op'>+</span> <span class='number'>2</span>, <span class='kw-2'>&amp;</span><span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='number'>3</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>sig2</span>.<span class='ident'>sample</span>(), <span class='number'>5</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift2</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink1</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink2</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>lifted</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>a</span> <span class='op'>+</span> <span class='ident'>b</span>, <span class='kw-2'>&amp;</span><span class='ident'>sink1</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>0</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink2</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>3</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>lifted</span>.<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ <span class='ident'>sink1</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>lifted</span>.<span class='ident'>sample</span>(), <span class='number'>4</span>);
+ <span class='ident'>sink2</span>.<span class='ident'>send</span>(<span class='number'>11</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>lifted</span>.<span class='ident'>sample</span>(), <span class='number'>12</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift2_identical</span>() {
+ <span class='kw'>let</span> <span class='ident'>sig</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='number'>16</span>);
+ <span class='kw'>let</span> <span class='ident'>sig2</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>a</span> <span class='op'>+</span> <span class='ident'>b</span>, <span class='kw-2'>&amp;</span><span class='ident'>sig</span>, <span class='kw-2'>&amp;</span><span class='ident'>sig</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>sig2</span>.<span class='ident'>sample</span>(), <span class='number'>32</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift3</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>x</span>, <span class='ident'>y</span>, <span class='ident'>z</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>+</span> <span class='number'>2</span> <span class='op'>*</span> <span class='ident'>y</span> <span class='op'>+</span> <span class='ident'>z</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>5</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>3</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='op'>-</span><span class='number'>4</span>)
+ ).<span class='ident'>sample</span>(),
+ <span class='number'>7</span>
+ );
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift4</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>w</span>, <span class='ident'>x</span>, <span class='ident'>y</span>, <span class='ident'>z</span><span class='op'>|</span> <span class='number'>4</span> <span class='op'>*</span> <span class='ident'>w</span> <span class='op'>+</span> <span class='ident'>x</span> <span class='op'>+</span> <span class='number'>2</span> <span class='op'>*</span> <span class='ident'>y</span> <span class='op'>+</span> <span class='ident'>z</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='op'>-</span><span class='number'>2</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>5</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>3</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='op'>-</span><span class='number'>4</span>)
+ ).<span class='ident'>sample</span>(),
+ <span class='op'>-</span><span class='number'>1</span>
+ );
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>lift0_equal_within_transaction</span>() {
+ <span class='kw'>use</span> <span class='ident'>rand</span>::<span class='ident'>random</span>;
+ <span class='comment'>// Generate a completely random signal</span>
+ <span class='kw'>let</span> <span class='ident'>rnd</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='ident'>random</span>::<span class='op'>&lt;</span><span class='ident'>i64</span><span class='op'>&gt;</span>);
+ <span class='comment'>// Make a tuple with itself</span>
+ <span class='kw'>let</span> <span class='ident'>gather</span> <span class='op'>=</span> <span class='macro'>lift</span><span class='macro'>!</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>), <span class='kw-2'>&amp;</span><span class='ident'>rnd</span>, <span class='kw-2'>&amp;</span><span class='ident'>rnd</span>);
+ <span class='comment'>// Both components should be equal</span>
+ <span class='kw'>let</span> (<span class='ident'>a</span>, <span class='ident'>b</span>) <span class='op'>=</span> <span class='ident'>gather</span>.<span class='ident'>sample</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>a</span>, <span class='ident'>b</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/pending.rs.html b/src/carboxyl/pending.rs.html
new file mode 100644
index 0000000..6e0f11f
--- /dev/null
+++ b/src/carboxyl/pending.rs.html
@@ -0,0 +1,271 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/pending.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>pending.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+<span id="47">47</span>
+<span id="48">48</span>
+<span id="49">49</span>
+<span id="50">50</span>
+<span id="51">51</span>
+<span id="52">52</span>
+<span id="53">53</span>
+<span id="54">54</span>
+<span id="55">55</span>
+<span id="56">56</span>
+<span id="57">57</span>
+<span id="58">58</span>
+<span id="59">59</span>
+<span id="60">60</span>
+<span id="61">61</span>
+<span id="62">62</span>
+<span id="63">63</span>
+<span id="64">64</span>
+<span id="65">65</span>
+<span id="66">66</span>
+<span id="67">67</span>
+<span id="68">68</span>
+<span id="69">69</span>
+<span id="70">70</span>
+<span id="71">71</span>
+<span id="72">72</span>
+<span id="73">73</span>
+<span id="74">74</span>
+<span id="75">75</span>
+<span id="76">76</span>
+<span id="77">77</span>
+<span id="78">78</span>
+<span id="79">79</span>
+<span id="80">80</span>
+<span id="81">81</span>
+<span id="82">82</span>
+<span id="83">83</span>
+<span id="84">84</span>
+<span id="85">85</span>
+<span id="86">86</span>
+<span id="87">87</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Pending wrapper</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+
+
+<span class='doccomment'>/// A pending value. This is a wrapper type that allows one to queue one new</span>
+<span class='doccomment'>/// value without actually overwriting the old value. Later the most recently</span>
+<span class='doccomment'>/// queued value can be updated.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>current</span>: <span class='ident'>T</span>,
+ <span class='ident'>update</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new pending value.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>t</span>: <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>Pending</span> { <span class='ident'>current</span>: <span class='ident'>t</span>, <span class='ident'>update</span>: <span class='prelude-val'>None</span> }
+ }
+
+ <span class='doccomment'>/// Put an item in the queue. Ignores any previously queued items.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>queue</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>new</span>: <span class='ident'>T</span>) {
+ <span class='self'>self</span>.<span class='ident'>update</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>new</span>);
+ }
+
+ <span class='doccomment'>/// Updates any update pending.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>t</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>update</span>.<span class='ident'>take</span>() {
+ <span class='self'>self</span>.<span class='ident'>current</span> <span class='op'>=</span> <span class='ident'>t</span>;
+ }
+ }
+
+ <span class='doccomment'>/// Get the future value.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>future</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>T</span> {
+ <span class='self'>self</span>.<span class='ident'>update</span>.<span class='ident'>as_ref</span>().<span class='ident'>unwrap_or</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>current</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>T</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>T</span> { <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>current</span> }
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='op'>*</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>new_derefs_identical</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='number'>3</span>), <span class='number'>3</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>queue_does_not_affect_deref</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='number'>2</span>);
+ <span class='ident'>p</span>.<span class='ident'>queue</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>p</span>, <span class='number'>2</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>new_future_identical</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='number'>5</span>).<span class='ident'>future</span>(), <span class='number'>5</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>queue_affects_future</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='number'>10</span>);
+ <span class='ident'>p</span>.<span class='ident'>queue</span>(<span class='number'>6</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>p</span>.<span class='ident'>future</span>(), <span class='number'>6</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>updated_deref</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='op'>-</span><span class='number'>2</span>);
+ <span class='ident'>p</span>.<span class='ident'>queue</span>(<span class='number'>2</span>);
+ <span class='ident'>p</span>.<span class='ident'>update</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>p</span>, <span class='number'>2</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>updated_future</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='op'>-</span><span class='number'>7</span>);
+ <span class='ident'>p</span>.<span class='ident'>queue</span>(<span class='number'>0</span>);
+ <span class='ident'>p</span>.<span class='ident'>update</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>p</span>.<span class='ident'>future</span>(), <span class='number'>0</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/readonly.rs.html b/src/carboxyl/readonly.rs.html
new file mode 100644
index 0000000..84fce7f
--- /dev/null
+++ b/src/carboxyl/readonly.rs.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/readonly.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>readonly.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Thread-safe read-only smart pointer.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>Arc</span>, <span class='ident'>RwLock</span>, <span class='ident'>RwLockReadGuard</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+
+<span class='doccomment'>/// Guards read-access into a read-only pointer.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ReadOnlyGuard</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span>: <span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>guard</span>: <span class='ident'>RwLockReadGuard</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>ReadOnlyGuard</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>T</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>T</span> { <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>guard</span> }
+}
+
+<span class='doccomment'>/// A thread-safe read-only smart pointer.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>ptr</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='ident'>ReadOnly</span> { <span class='ident'>ptr</span>: <span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>clone</span>() }
+ }
+}
+
+<span class='doccomment'>/// Create a new read-only pointer.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>create</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>ptr</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> { <span class='ident'>ReadOnly</span> { <span class='ident'>ptr</span>: <span class='ident'>ptr</span> } }
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Gain read-access to the stored value.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// In case, the underlying data structure has been poisoned, it returns</span>
+ <span class='doccomment'>/// `None`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>ReadOnlyGuard</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>read</span>().<span class='ident'>ok</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>g</span><span class='op'>|</span> <span class='ident'>ReadOnlyGuard</span> { <span class='ident'>guard</span>: <span class='ident'>g</span> })
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/signal.rs.html b/src/carboxyl/signal.rs.html
new file mode 100644
index 0000000..659a0a7
--- /dev/null
+++ b/src/carboxyl/signal.rs.html
@@ -0,0 +1,1601 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/signal.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>signal.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+<span id="683">683</span>
+<span id="684">684</span>
+<span id="685">685</span>
+<span id="686">686</span>
+<span id="687">687</span>
+<span id="688">688</span>
+<span id="689">689</span>
+<span id="690">690</span>
+<span id="691">691</span>
+<span id="692">692</span>
+<span id="693">693</span>
+<span id="694">694</span>
+<span id="695">695</span>
+<span id="696">696</span>
+<span id="697">697</span>
+<span id="698">698</span>
+<span id="699">699</span>
+<span id="700">700</span>
+<span id="701">701</span>
+<span id="702">702</span>
+<span id="703">703</span>
+<span id="704">704</span>
+<span id="705">705</span>
+<span id="706">706</span>
+<span id="707">707</span>
+<span id="708">708</span>
+<span id="709">709</span>
+<span id="710">710</span>
+<span id="711">711</span>
+<span id="712">712</span>
+<span id="713">713</span>
+<span id="714">714</span>
+<span id="715">715</span>
+<span id="716">716</span>
+<span id="717">717</span>
+<span id="718">718</span>
+<span id="719">719</span>
+<span id="720">720</span>
+<span id="721">721</span>
+<span id="722">722</span>
+<span id="723">723</span>
+<span id="724">724</span>
+<span id="725">725</span>
+<span id="726">726</span>
+<span id="727">727</span>
+<span id="728">728</span>
+<span id="729">729</span>
+<span id="730">730</span>
+<span id="731">731</span>
+<span id="732">732</span>
+<span id="733">733</span>
+<span id="734">734</span>
+<span id="735">735</span>
+<span id="736">736</span>
+<span id="737">737</span>
+<span id="738">738</span>
+<span id="739">739</span>
+<span id="740">740</span>
+<span id="741">741</span>
+<span id="742">742</span>
+<span id="743">743</span>
+<span id="744">744</span>
+<span id="745">745</span>
+<span id="746">746</span>
+<span id="747">747</span>
+<span id="748">748</span>
+<span id="749">749</span>
+<span id="750">750</span>
+<span id="751">751</span>
+<span id="752">752</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Continuous time signals</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>Arc</span>, <span class='ident'>Mutex</span>, <span class='ident'>RwLock</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>use</span> <span class='ident'>quickcheck</span>::{ <span class='ident'>Arbitrary</span>, <span class='ident'>Gen</span> };
+
+<span class='kw'>use</span> <span class='ident'>source</span>::{ <span class='ident'>Source</span>, <span class='ident'>with_weak</span>, <span class='ident'>CallbackError</span> };
+<span class='kw'>use</span> <span class='ident'>stream</span>::{ <span class='self'>self</span>, <span class='ident'>BoxClone</span>, <span class='ident'>Stream</span> };
+<span class='kw'>use</span> <span class='ident'>transaction</span>::{ <span class='ident'>commit</span>, <span class='ident'>end</span> };
+<span class='kw'>use</span> <span class='ident'>pending</span>::<span class='ident'>Pending</span>;
+<span class='kw'>use</span> <span class='ident'>readonly</span>::{ <span class='self'>self</span>, <span class='ident'>ReadOnly</span> };
+<span class='kw'>use</span> <span class='ident'>lift</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>use</span> <span class='ident'>testing</span>::<span class='ident'>ArcFn</span>;
+
+
+<span class='doccomment'>/// A functional signal. Caches its return value during a transaction.</span>
+<span class='kw'>struct</span> <span class='ident'>FuncSignal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>func</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Fn</span>() <span class='op'>-&gt;</span> <span class='ident'>A</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>,
+ <span class='ident'>cache</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>Mutex</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>FuncSignal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>Fn</span>() <span class='op'>-&gt;</span> <span class='ident'>A</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>FuncSignal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>FuncSignal</span> {
+ <span class='ident'>func</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>f</span>),
+ <span class='ident'>cache</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='prelude-val'>None</span>)),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>FuncSignal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Call the function or fetch the cached value if present.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>call</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cached</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cache</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>();
+ <span class='kw'>match</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='ident'>cached</span> {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>value</span>) <span class='op'>=&gt;</span> <span class='ident'>value</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>cached</span> <span class='op'>=&gt;</span> {
+ <span class='comment'>// Register callback to reset cache at the end of the transaction</span>
+ <span class='kw'>let</span> <span class='ident'>cache</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cache</span>.<span class='ident'>clone</span>();
+ <span class='ident'>end</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>live</span> <span class='op'>=</span> <span class='ident'>cache</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>();
+ <span class='op'>*</span><span class='ident'>live</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ });
+ <span class='comment'>// Calculate &amp; cache value</span>
+ <span class='kw'>let</span> <span class='ident'>value</span> <span class='op'>=</span> (<span class='self'>self</span>.<span class='ident'>func</span>)();
+ <span class='op'>*</span><span class='ident'>cached</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>value</span>.<span class='ident'>clone</span>());
+ <span class='ident'>value</span>
+ },
+ }
+ }
+}
+
+
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Const</span>(<span class='ident'>A</span>),
+ <span class='ident'>Func</span>(<span class='ident'>FuncSignal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>),
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_fn</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>Fn</span>() <span class='op'>-&gt;</span> <span class='ident'>A</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>SignalFn</span>::<span class='ident'>Func</span>(<span class='ident'>FuncSignal</span>::<span class='ident'>new</span>(<span class='ident'>f</span>))
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>call</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>) <span class='op'>=&gt;</span> <span class='ident'>a</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>SignalFn</span>::<span class='ident'>Func</span>(<span class='kw-2'>ref</span> <span class='ident'>f</span>) <span class='op'>=&gt;</span> <span class='ident'>f</span>.<span class='ident'>call</span>(),
+ }
+ }
+}
+
+
+<span class='doccomment'>/// Helper function to register callback handlers related to signal construction.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>reg_signal</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>parent_source</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>handler</span>: <span class='ident'>F</span>)
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='kw'>let</span> <span class='ident'>weak_source</span> <span class='op'>=</span> <span class='ident'>signal</span>.<span class='ident'>source</span>.<span class='ident'>downgrade</span>();
+ <span class='kw'>let</span> <span class='ident'>weak_current</span> <span class='op'>=</span> <span class='ident'>signal</span>.<span class='ident'>current</span>.<span class='ident'>downgrade</span>();
+ <span class='ident'>parent_source</span>.<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span>
+ <span class='ident'>weak_current</span>.<span class='ident'>upgrade</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>cur</span><span class='op'>|</span> <span class='ident'>end</span>(
+ <span class='kw'>move</span> <span class='op'>||</span> { <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>cur</span>.<span class='ident'>write</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>cur</span><span class='op'>|</span> <span class='ident'>cur</span>.<span class='ident'>update</span>()); }))
+ .<span class='ident'>ok_or</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>)
+ .<span class='ident'>and</span>(<span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak_current</span>, <span class='op'>|</span><span class='ident'>cur</span><span class='op'>|</span> <span class='ident'>cur</span>.<span class='ident'>queue</span>(<span class='ident'>handler</span>(<span class='ident'>a</span>))))
+ .<span class='ident'>and</span>(<span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak_source</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(())))
+ );
+}
+
+
+<span class='doccomment'>/// External helper function to build a signal.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>signal_build</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>K</span><span class='op'>&gt;</span>(<span class='ident'>func</span>: <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>keep_alive</span>: <span class='ident'>K</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>K</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>
+{
+ <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>func</span>, <span class='ident'>keep_alive</span>)
+}
+
+<span class='doccomment'>/// External accessor to current state of a signal.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>signal_current</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>signal</span>.<span class='ident'>current</span>
+}
+
+<span class='doccomment'>/// External accessor to signal source.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>signal_source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span>()<span class='op'>&gt;&gt;</span><span class='op'>&gt;</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>signal</span>.<span class='ident'>source</span>
+}
+
+<span class='doccomment'>/// Sample the value of the signal without committing it as a transaction.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sample_raw</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='ident'>signal</span>.<span class='ident'>current</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>call</span>()
+}
+
+
+<span class='doccomment'>/// A continuous signal that changes over time.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Signals can be thought of as values that change over time. They have both a</span>
+<span class='doccomment'>/// continuous and a discrete component. This means that their current value is</span>
+<span class='doccomment'>/// defined by a function that can be called at any time. That function is only</span>
+<span class='doccomment'>/// evaluated on-demand, when the signal&#39;s current value is sampled. (This is</span>
+<span class='doccomment'>/// also called pull semantics in the literature on FRP.)</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// In addition, the current function used to sample a signal may change</span>
+<span class='doccomment'>/// discretely in reaction to some event. For instance, it is possible to create</span>
+<span class='doccomment'>/// a signal from an event stream, by holding the last event occurence as the</span>
+<span class='doccomment'>/// current value of the stream.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Algebraic laws</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Signals come with some primitive methods to compose them with each other and</span>
+<span class='doccomment'>/// with streams. Some of these primitives give the signals an algebraic</span>
+<span class='doccomment'>/// structure.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ## Functor</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Signals form a functor under unary lifting. Thus, the following laws hold:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// - Preservation of identity: `lift!(|x| x, &amp;a) == a`,</span>
+<span class='doccomment'>/// - Function composition: `lift!(|x| g(f(x)), &amp;a) == lift!(g, &amp;lift!(f, &amp;a))`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ## Applicative functor</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// By extension, using the notion of a signal of a function, signals also</span>
+<span class='doccomment'>/// become an [applicative][ghc-applicative] using `Signal::new` as `pure` and</span>
+<span class='doccomment'>/// `|sf, sa| lift!(|f, a| f(a), &amp;sf, &amp;sa)` as `&lt;*&gt;`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// *TODO: Expand on this and replace the Haskell reference.*</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// [ghc-applicative]: https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base/Control-Applicative.html</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>current</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>source</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span>()<span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>,
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>BoxClone</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Signal</span> {
+ <span class='ident'>current</span>: <span class='self'>self</span>.<span class='ident'>current</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>source</span>: <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>keep_alive</span>: <span class='self'>self</span>.<span class='ident'>keep_alive</span>.<span class='ident'>box_clone</span>(),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>build</span><span class='op'>&lt;</span><span class='ident'>K</span><span class='op'>&gt;</span>(<span class='ident'>func</span>: <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>keep_alive</span>: <span class='ident'>K</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>K</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>
+ {
+ <span class='ident'>Signal</span> {
+ <span class='ident'>current</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='ident'>func</span>))),
+ <span class='ident'>source</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>())),
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>keep_alive</span>),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a constant signal.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>a</span>: <span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>a</span>), ())
+ }
+
+ <span class='doccomment'>/// Sample the current value of the signal.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sample</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='ident'>sample_raw</span>(<span class='self'>self</span>))
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a signal with a cyclic definition.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The closure gets an undefined forward-declaration of a signal. It is</span>
+ <span class='doccomment'>/// supposed to return a self-referential definition of the same signal.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Sampling the forward-declared signal, before it is properly defined,</span>
+ <span class='doccomment'>/// will cause a run-time panic.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This pattern is useful to implement accumulators, counters and other</span>
+ <span class='doccomment'>/// loops that depend on the sampling behaviour of a signal before a</span>
+ <span class='doccomment'>/// transaction.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cyclic</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>def</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>FnOnce</span>(<span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>cycle</span> <span class='op'>=</span> <span class='ident'>SignalCycle</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>finished</span> <span class='op'>=</span> <span class='ident'>def</span>(<span class='kw-2'>&amp;</span><span class='ident'>cycle</span>);
+ <span class='ident'>cycle</span>.<span class='ident'>define</span>(<span class='ident'>finished</span>)
+ })
+ }
+
+ <span class='doccomment'>/// Combine the signal with a stream in a snapshot.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `snapshot` creates a new stream given a signal and a stream. Whenever</span>
+ <span class='doccomment'>/// the input stream fires an event, the output stream fires an event</span>
+ <span class='doccomment'>/// created from the signal&#39;s current value and that event using the</span>
+ <span class='doccomment'>/// supplied function.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink1: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let sink2: Sink&lt;f64&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let mut events = sink1.stream().hold(1)</span>
+ <span class='doccomment'>/// .snapshot(&amp;sink2.stream(), |a, b| (a, b))</span>
+ <span class='doccomment'>/// .events();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Updating its signal does not cause the snapshot to fire</span>
+ <span class='doccomment'>/// sink1.send(4);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // However sending an event down the stream does</span>
+ <span class='doccomment'>/// sink2.send(3.0);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some((4, 3.0)));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>snapshot</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>stream</span>::<span class='ident'>snapshot</span>(<span class='self'>self</span>, <span class='ident'>stream</span>, <span class='ident'>f</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span> {
+ <span class='doccomment'>/// Switch between signals.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This transforms a `Signal&lt;Signal&lt;A&gt;&gt;` into a `Signal&lt;A&gt;`. The nested</span>
+ <span class='doccomment'>/// signal can be thought of as a representation of a switch between different</span>
+ <span class='doccomment'>/// input signals, that allows one to change the structure of the dependency</span>
+ <span class='doccomment'>/// graph at run-time. `switch` provides a way to access the inner value of</span>
+ <span class='doccomment'>/// the currently active signal.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The following example demonstrates how to use this to switch between two</span>
+ <span class='doccomment'>/// input signals based on a `Button` event stream:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// // Button type</span>
+ <span class='doccomment'>/// #[derive(Clone, Show)]</span>
+ <span class='doccomment'>/// enum Button { A, B };</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // The input sinks</span>
+ <span class='doccomment'>/// let sink_a = Sink::&lt;i32&gt;::new();</span>
+ <span class='doccomment'>/// let sink_b = Sink::&lt;i32&gt;::new();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // The button sink</span>
+ <span class='doccomment'>/// let sink_button = Sink::&lt;Button&gt;::new();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Create the output</span>
+ <span class='doccomment'>/// let output = {</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Hold input sinks in a signal with some initials</span>
+ <span class='doccomment'>/// let channel_a = sink_a.stream().hold(1);</span>
+ <span class='doccomment'>/// let channel_b = sink_b.stream().hold(2);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // A trivial default channel used before any button event</span>
+ <span class='doccomment'>/// let default_channel = Sink::new().stream().hold(0);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Map button to the channel signals, hold with the default channel as</span>
+ <span class='doccomment'>/// // initial value and switch between the signals</span>
+ <span class='doccomment'>/// sink_button</span>
+ <span class='doccomment'>/// .stream()</span>
+ <span class='doccomment'>/// .map(move |b| match b {</span>
+ <span class='doccomment'>/// Button::A =&gt; channel_a.clone(),</span>
+ <span class='doccomment'>/// Button::B =&gt; channel_b.clone(),</span>
+ <span class='doccomment'>/// })</span>
+ <span class='doccomment'>/// .hold(default_channel)</span>
+ <span class='doccomment'>/// .switch()</span>
+ <span class='doccomment'>/// };</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // In the beginning, output will come from the default channel</span>
+ <span class='doccomment'>/// assert_eq!(output.sample(), 0);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Let&#39;s switch to channel A</span>
+ <span class='doccomment'>/// sink_button.send(Button::A);</span>
+ <span class='doccomment'>/// assert_eq!(output.sample(), 1);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // And to channel B</span>
+ <span class='doccomment'>/// sink_button.send(Button::B);</span>
+ <span class='doccomment'>/// assert_eq!(output.sample(), 2);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // The channels can change, too, of course</span>
+ <span class='doccomment'>/// for k in 4..13 {</span>
+ <span class='doccomment'>/// sink_b.send(k);</span>
+ <span class='doccomment'>/// assert_eq!(output.sample(), k);</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// sink_button.send(Button::A);</span>
+ <span class='doccomment'>/// for k in 21..77 {</span>
+ <span class='doccomment'>/// sink_a.send(k);</span>
+ <span class='doccomment'>/// assert_eq!(output.sample(), k);</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>switch</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>make_callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>parent</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='comment'>// TODO: use information on inner value</span>
+ <span class='kw'>let</span> <span class='ident'>current_signal</span> <span class='op'>=</span> <span class='ident'>parent</span>.<span class='ident'>current</span>.<span class='ident'>clone</span>();
+ <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='kw'>move</span> <span class='op'>||</span>
+ <span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>current_signal</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>call</span>())
+ )
+ }
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>make_callback</span>(<span class='self'>self</span>), ());
+ <span class='kw'>let</span> <span class='ident'>parent</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>clone</span>();
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>,
+ <span class='kw'>move</span> <span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>parent</span>));
+ <span class='ident'>signal</span>
+ })
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span><span class='op'>&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>ArcFn</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span><span class='op'>&gt;&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='doccomment'>/// Applicative functionality. Applies a signal of function to a signal of</span>
+ <span class='doccomment'>/// its argument.</span>
+ <span class='kw'>fn</span> <span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span> {
+ <span class='ident'>lift</span>::<span class='ident'>lift2</span>(<span class='op'>|</span><span class='ident'>f</span>, <span class='ident'>a</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='ident'>a</span>), <span class='self'>self</span>, <span class='ident'>signal</span>)
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Arbitrary</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Arbitrary</span> <span class='kw'>for</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>arbitrary</span><span class='op'>&lt;</span><span class='ident'>G</span>: <span class='ident'>Gen</span><span class='op'>&gt;</span>(<span class='ident'>g</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>G</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>values</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>::<span class='ident'>arbitrary</span>(<span class='ident'>g</span>);
+ <span class='kw'>if</span> <span class='ident'>values</span>.<span class='ident'>is_empty</span>() {
+ <span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='ident'>Arbitrary</span>::<span class='ident'>arbitrary</span>(<span class='ident'>g</span>))
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='number'>0</span>);
+ <span class='ident'>lift</span>::<span class='ident'>lift0</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>n</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>();
+ <span class='op'>*</span><span class='ident'>n</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>if</span> <span class='op'>*</span><span class='ident'>n</span> <span class='op'>&gt;=</span> <span class='ident'>values</span>.<span class='ident'>len</span>() { <span class='op'>*</span><span class='ident'>n</span> <span class='op'>=</span> <span class='number'>0</span> }
+ <span class='ident'>values</span>[<span class='op'>*</span><span class='ident'>n</span>].<span class='ident'>clone</span>()
+ })
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>fmt</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='kw'>match</span> <span class='op'>*</span><span class='op'>*</span><span class='self'>self</span>.<span class='ident'>current</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>() {
+ <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>fmt</span>.<span class='ident'>debug_struct</span>(<span class='string'>&quot;Signal::const&quot;</span>).<span class='ident'>field</span>(<span class='string'>&quot;value&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>a</span>).<span class='ident'>finish</span>(),
+ <span class='ident'>SignalFn</span>::<span class='ident'>Func</span>(<span class='kw-2'>ref</span> <span class='ident'>f</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>fmt</span>.<span class='ident'>debug_struct</span>(<span class='string'>&quot;Signal::fn&quot;</span>).<span class='ident'>field</span>(<span class='string'>&quot;current&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>f</span>.<span class='ident'>call</span>()).<span class='ident'>finish</span>(),
+ })
+ }
+}
+
+
+<span class='doccomment'>/// Forward declaration of a signal to create value loops.</span>
+<span class='kw'>struct</span> <span class='ident'>SignalCycle</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>signal</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>SignalCycle</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Forward-declare a new signal.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>SignalCycle</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>const</span> <span class='ident'>ERR</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;sampled on forward-declaration of signal&quot;</span>;
+ <span class='ident'>SignalCycle</span> { <span class='ident'>signal</span>: <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>(<span class='op'>||</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='ident'>ERR</span>)), ()) }
+ }
+
+ <span class='doccomment'>/// Provide the signal with a definition.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>define</span>(<span class='self'>self</span>, <span class='ident'>definition</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Generate a callback from the signal definition&#39;s current value.</span>
+ <span class='kw'>fn</span> <span class='ident'>make_callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>current_def</span>: <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Pending</span><span class='op'>&lt;</span><span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalFn</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>
+ {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>current_def</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>future</span>() {
+ <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>) <span class='op'>=&gt;</span> <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>()),
+ <span class='ident'>SignalFn</span>::<span class='ident'>Func</span>(_) <span class='op'>=&gt;</span> <span class='ident'>SignalFn</span>::<span class='ident'>from_fn</span>({
+ <span class='kw'>let</span> <span class='ident'>sig</span> <span class='op'>=</span> <span class='ident'>current_def</span>.<span class='ident'>downgrade</span>();
+ <span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>strong</span> <span class='op'>=</span> <span class='ident'>sig</span>.<span class='ident'>upgrade</span>().<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='ident'>strong</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>().<span class='ident'>call</span>();
+ <span class='ident'>ret</span>
+ }
+ }),
+ }
+ }
+ <span class='ident'>commit</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='op'>*</span><span class='self'>self</span>.<span class='ident'>signal</span>.<span class='ident'>current</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>() <span class='op'>=</span> <span class='ident'>Pending</span>::<span class='ident'>new</span>(<span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>definition</span>.<span class='ident'>current</span>));
+ <span class='kw'>let</span> <span class='ident'>weak_parent</span> <span class='op'>=</span> <span class='ident'>definition</span>.<span class='ident'>current</span>.<span class='ident'>downgrade</span>();
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>definition</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>signal</span>,
+ <span class='kw'>move</span> <span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>make_callback</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak_parent</span>.<span class='ident'>upgrade</span>().<span class='ident'>unwrap</span>()));
+ <span class='ident'>Signal</span> { <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>definition</span>), ..<span class='self'>self</span>.<span class='ident'>signal</span> }
+ })
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>SignalCycle</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> { <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>signal</span> }
+}
+
+
+<span class='doccomment'>/// Signal variant using inner mutability for efficient in-place updates.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This is the only kind of primitive that allows non-`Clone` types to be</span>
+<span class='doccomment'>/// wrapped into functional reactive abstractions. The API is somewhat different</span>
+<span class='doccomment'>/// from that of a regular signal to accommodate this.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// One cannot directly sample a `SignalMut` as this would require a clone.</span>
+<span class='doccomment'>/// Instead it comes with a couple of adaptor methods that mimick a subset of</span>
+<span class='doccomment'>/// the `Signal` API. However, all functions passed to these methods take the</span>
+<span class='doccomment'>/// argument coming from the `SignalMut` by reference.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SignalMut</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>inner</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>ReadOnly</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>SignalMut</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Semantically the same as `Signal::snapshot`</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The key difference here is, that the combining function takes its first</span>
+ <span class='doccomment'>/// argument by reference, as it can&#39;t be moved out of the `SignalMut`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink1 = Sink::new();</span>
+ <span class='doccomment'>/// let sink2 = Sink::new();</span>
+ <span class='doccomment'>/// // Collect values in a mutable `Vec`</span>
+ <span class='doccomment'>/// let values = sink1.stream().scan_mut(vec![], |v, a| v.push(a));</span>
+ <span class='doccomment'>/// // Snapshot some value from it</span>
+ <span class='doccomment'>/// let mut index = values.snapshot(&amp;sink2.stream(),</span>
+ <span class='doccomment'>/// |v, k| v.get(k).map(|x| *x)</span>
+ <span class='doccomment'>/// ).events();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink1.send(4);</span>
+ <span class='doccomment'>/// sink1.send(5);</span>
+ <span class='doccomment'>/// sink2.send(0);</span>
+ <span class='doccomment'>/// assert_eq!(index.next(), Some(Some(4)));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink2.send(1);</span>
+ <span class='doccomment'>/// assert_eq!(index.next(), Some(Some(5)));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink2.send(2);</span>
+ <span class='doccomment'>/// assert_eq!(index.next(), Some(None));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>snapshot</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='self'>self</span>.<span class='ident'>inner</span>.<span class='ident'>snapshot</span>(<span class='ident'>stream</span>, <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>(), <span class='ident'>b</span>))
+ }
+
+ <span class='doccomment'>/// Similar to `lift2`. Combines a `SignalMut` with a `Signal` using a</span>
+ <span class='doccomment'>/// function. The function takes its first argument by reference.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>combine</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>lift</span>::<span class='ident'>lift2</span>(
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>(), <span class='ident'>b</span>),
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>inner</span>, <span class='kw-2'>&amp;</span><span class='ident'>signal</span>
+ )
+ }
+
+ <span class='doccomment'>/// Similar to `lift2`, but combines two `SignalMut` using a function. The</span>
+ <span class='doccomment'>/// supplied function takes both arguments by reference.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let sum = sink.stream().scan_mut(0, |sum, a| *sum += a);</span>
+ <span class='doccomment'>/// let product = sink.stream().scan_mut(1, |prod, a| *prod *= a);</span>
+ <span class='doccomment'>/// let combo = sum.combine_mut(&amp;product, |s, p| (*s, *p));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink.send(1);</span>
+ <span class='doccomment'>/// assert_eq!(combo.sample(), (1, 1));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink.send(3);</span>
+ <span class='doccomment'>/// assert_eq!(combo.sample(), (4, 3));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// sink.send(5);</span>
+ <span class='doccomment'>/// assert_eq!(combo.sample(), (9, 15));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>combine_mut</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>SignalMut</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='ident'>A</span>, <span class='kw-2'>&amp;</span><span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>lift</span>::<span class='ident'>lift2</span>(
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>b</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>()),
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>inner</span>, <span class='kw-2'>&amp;</span><span class='ident'>other</span>.<span class='ident'>inner</span>
+ )
+ }
+}
+
+
+<span class='doccomment'>/// Same as Stream::hold.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>hold</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>initial</span>: <span class='ident'>A</span>, <span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>initial</span>), <span class='ident'>stream</span>.<span class='ident'>clone</span>());
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>stream</span>::<span class='ident'>source</span>(<span class='kw-2'>&amp;</span><span class='ident'>stream</span>).<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>, <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>);
+ <span class='ident'>signal</span>
+ })
+}
+
+
+<span class='doccomment'>/// Same as Stream::scan_mut.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>scan_mut</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>initial</span>: <span class='ident'>B</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalMut</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>B</span>, <span class='ident'>A</span>) <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='ident'>commit</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>initial</span>));
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>build</span>(<span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>readonly</span>::<span class='ident'>create</span>(<span class='ident'>state</span>.<span class='ident'>clone</span>())), <span class='ident'>stream</span>.<span class='ident'>clone</span>());
+ <span class='ident'>reg_signal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>stream</span>::<span class='ident'>source</span>(<span class='kw-2'>&amp;</span><span class='ident'>stream</span>).<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>,
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> { <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>state</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>(), <span class='ident'>a</span>); <span class='ident'>SignalFn</span>::<span class='ident'>Const</span>(<span class='ident'>readonly</span>::<span class='ident'>create</span>(<span class='ident'>state</span>.<span class='ident'>clone</span>())) });
+ <span class='ident'>SignalMut</span> { <span class='ident'>inner</span>: <span class='ident'>signal</span> }
+ })
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>quickcheck</span>::<span class='ident'>quickcheck</span>;
+
+ <span class='kw'>use</span> ::<span class='ident'>stream</span>::<span class='ident'>Sink</span>;
+ <span class='kw'>use</span> ::<span class='ident'>signal</span>::{ <span class='self'>self</span>, <span class='ident'>Signal</span>, <span class='ident'>SignalCycle</span> };
+ <span class='kw'>use</span> ::<span class='ident'>lift</span>::<span class='ident'>lift1</span>;
+ <span class='kw'>use</span> ::<span class='ident'>testing</span>::{ <span class='ident'>ArcFn</span>, <span class='ident'>signal_eq</span>, <span class='ident'>id</span>, <span class='ident'>pure_fn</span>, <span class='ident'>partial_comp</span> };
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>functor_identity</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>signal</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>signal</span>, <span class='kw-2'>&amp;</span><span class='ident'>lift1</span>(<span class='ident'>id</span>, <span class='kw-2'>&amp;</span><span class='ident'>signal</span>));
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>functor_composition</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>signal</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>fn</span> <span class='ident'>f</span>(<span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='number'>3</span> <span class='op'>*</span> <span class='ident'>n</span> }
+ <span class='kw'>fn</span> <span class='ident'>g</span>(<span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='ident'>n</span> <span class='op'>+</span> <span class='number'>2</span> }
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(
+ <span class='kw-2'>&amp;</span><span class='ident'>lift1</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='ident'>g</span>(<span class='ident'>n</span>)), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>lift1</span>(<span class='ident'>f</span>, <span class='kw-2'>&amp;</span><span class='ident'>lift1</span>(<span class='ident'>g</span>, <span class='kw-2'>&amp;</span><span class='ident'>signal</span>))
+ );
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>applicative_identity</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>signal</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>pure_fn</span>(<span class='ident'>id</span>).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>signal</span>), <span class='kw-2'>&amp;</span><span class='ident'>signal</span>);
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>applicative_composition</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>signal</span>: <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>fn</span> <span class='ident'>f</span>(<span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='ident'>n</span> <span class='op'>*</span> <span class='number'>4</span> }
+ <span class='kw'>fn</span> <span class='ident'>g</span>(<span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='ident'>n</span> <span class='op'>-</span> <span class='number'>3</span> }
+ <span class='kw'>let</span> <span class='ident'>u</span> <span class='op'>=</span> <span class='ident'>pure_fn</span>(<span class='ident'>f</span>);
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>pure_fn</span>(<span class='ident'>g</span>);
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(
+ <span class='kw-2'>&amp;</span><span class='ident'>pure_fn</span>(<span class='ident'>partial_comp</span>).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>u</span>).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>v</span>).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>signal</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>u</span>.<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>v</span>.<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>signal</span>))
+ );
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>applicative_homomorphism</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>x</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>fn</span> <span class='ident'>f</span>(<span class='ident'>x</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='ident'>x</span> <span class='op'>*</span> (<span class='op'>-</span><span class='number'>5</span>) }
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(
+ <span class='kw-2'>&amp;</span><span class='ident'>pure_fn</span>(<span class='ident'>f</span>).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='ident'>x</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='ident'>f</span>(<span class='ident'>x</span>))
+ );
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>applicative_interchange</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>x</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>fn</span> <span class='ident'>f</span>(<span class='ident'>x</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> { <span class='ident'>x</span> <span class='op'>*</span> <span class='number'>2</span> <span class='op'>-</span> <span class='number'>7</span> }
+ <span class='kw'>let</span> <span class='ident'>u</span> <span class='op'>=</span> <span class='ident'>pure_fn</span>(<span class='ident'>f</span>);
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>signal_eq</span>(
+ <span class='kw-2'>&amp;</span><span class='ident'>u</span>.<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='ident'>x</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>pure_fn</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>f</span>: <span class='ident'>ArcFn</span><span class='op'>&lt;</span><span class='ident'>i32</span>, <span class='ident'>i32</span><span class='op'>&gt;</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='ident'>x</span>)).<span class='ident'>apply</span>(<span class='kw-2'>&amp;</span><span class='ident'>u</span>)
+ );
+ (<span class='number'>0</span>..<span class='number'>10</span>).<span class='ident'>all</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>eq</span>.<span class='ident'>sample</span>())
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>clone</span>() {
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>new</span>(<span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>b</span>.<span class='ident'>clone</span>().<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>hold</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>signal</span>.<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>signal</span>.<span class='ident'>sample</span>(), <span class='number'>4</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>hold_implicit_stream</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>signal</span>::<span class='ident'>hold</span>(<span class='number'>0</span>, <span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> <span class='number'>2</span> <span class='op'>*</span> <span class='ident'>n</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>signal</span>.<span class='ident'>sample</span>(), <span class='number'>0</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>signal</span>.<span class='ident'>sample</span>(), <span class='number'>8</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>snapshot</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink1</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink2</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>f64</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>snap_events</span> <span class='op'>=</span> <span class='ident'>sink1</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>1</span>)
+ .<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>sink2</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>+</span> <span class='number'>3.0</span>), <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>))
+ .<span class='ident'>events</span>();
+ <span class='ident'>sink2</span>.<span class='ident'>send</span>(<span class='number'>4.0</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>snap_events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='number'>1</span>, <span class='number'>7.0</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>snapshot_2</span>() {
+ <span class='kw'>let</span> <span class='ident'>ev1</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>beh1</span> <span class='op'>=</span> <span class='ident'>ev1</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>5</span>);
+ <span class='kw'>let</span> <span class='ident'>ev2</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>snap</span> <span class='op'>=</span> <span class='ident'>beh1</span>.<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>ev2</span>.<span class='ident'>stream</span>(), <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>));
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>snap</span>.<span class='ident'>events</span>();
+ <span class='ident'>ev2</span>.<span class='ident'>send</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='number'>5</span>, <span class='number'>4</span>)));
+ <span class='ident'>ev1</span>.<span class='ident'>send</span>(<span class='op'>-</span><span class='number'>2</span>);
+ <span class='ident'>ev2</span>.<span class='ident'>send</span>(<span class='number'>6</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='op'>-</span><span class='number'>2</span>, <span class='number'>6</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>cyclic_snapshot_accum</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>stream</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>accum</span> <span class='op'>=</span> <span class='ident'>SignalCycle</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>def</span> <span class='op'>=</span> <span class='ident'>accum</span>.<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>stream</span>, <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>s</span><span class='op'>|</span> <span class='ident'>a</span> <span class='op'>+</span> <span class='ident'>s</span>).<span class='ident'>hold</span>(<span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='ident'>accum</span> <span class='op'>=</span> <span class='ident'>accum</span>.<span class='ident'>define</span>(<span class='ident'>def</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>accum</span>.<span class='ident'>sample</span>(), <span class='number'>0</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>accum</span>.<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>7</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>accum</span>.<span class='ident'>sample</span>(), <span class='number'>10</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='op'>-</span><span class='number'>21</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>accum</span>.<span class='ident'>sample</span>(), <span class='op'>-</span><span class='number'>11</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>snapshot_order_standard</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>signal</span>
+ .<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>(), <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>))
+ .<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='number'>0</span>, <span class='number'>1</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>snapshot_lift_order_standard</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>lift1</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>, <span class='kw-2'>&amp;</span><span class='ident'>signal</span>)
+ .<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>(), <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>))
+ .<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='number'>0</span>, <span class='number'>1</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>snapshot_order_alternative</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='comment'>// Invert the &quot;natural&quot; order of the registry by declaring the stream before</span>
+ <span class='comment'>// the signal, which are both used by the snapshot.</span>
+ <span class='kw'>let</span> <span class='ident'>first</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>);
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>hold</span>(<span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>signal</span>.<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>first</span>, <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> (<span class='ident'>a</span>, <span class='ident'>b</span>)).<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>((<span class='number'>0</span>, <span class='number'>1</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>cyclic_signal_intermediate</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>stream</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>snap</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>let</span> <span class='ident'>sum</span> <span class='op'>=</span> <span class='ident'>Signal</span>::<span class='ident'>cyclic</span>(<span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>my_snap</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>snapshot</span>(<span class='kw-2'>&amp;</span><span class='ident'>stream</span>, <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>e</span><span class='op'>|</span> <span class='ident'>e</span> <span class='op'>+</span> <span class='ident'>a</span>);
+ <span class='ident'>snap</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>my_snap</span>.<span class='ident'>clone</span>());
+ <span class='ident'>my_snap</span>.<span class='ident'>hold</span>(<span class='number'>0</span>)
+ });
+ <span class='kw'>let</span> <span class='ident'>snap</span> <span class='op'>=</span> <span class='ident'>snap</span>.<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>snap</span>.<span class='ident'>events</span>();
+
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>sum</span>.<span class='ident'>sample</span>(), <span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>3</span>));
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/source.rs.html b/src/carboxyl/source.rs.html
new file mode 100644
index 0000000..5aab27b
--- /dev/null
+++ b/src/carboxyl/source.rs.html
@@ -0,0 +1,359 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/source.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>source.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Event sources and callbacks.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This is a light-weight implementation of the observer pattern. Subjects are</span>
+<span class='doccomment'>//! modelled as the `Source` type and observers as boxed closures.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>RwLock</span>, <span class='ident'>Weak</span> };
+
+<span class='doccomment'>/// An error that can occur with a weakly referenced callback.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>CallbackError</span> {
+ <span class='ident'>Disappeared</span>,
+ <span class='ident'>Poisoned</span>,
+}
+
+<span class='doccomment'>/// Shorthand for common callback results.</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CallbackResult</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>=</span>()<span class='op'>&gt;</span> <span class='op'>=</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>CallbackError</span><span class='op'>&gt;</span>;
+
+<span class='doccomment'>/// A boxed callback.</span>
+<span class='kw'>type</span> <span class='ident'>Callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>FnMut</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>CallbackResult</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>;
+
+
+<span class='doccomment'>/// Perform some callback on a weak reference to a mutex and handle errors</span>
+<span class='doccomment'>/// gracefully.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_weak</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>U</span>, <span class='ident'>F</span>: <span class='ident'>FnOnce</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>U</span><span class='op'>&gt;</span>(<span class='ident'>weak</span>: <span class='kw-2'>&amp;</span><span class='ident'>Weak</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>CallbackResult</span><span class='op'>&lt;</span><span class='ident'>U</span><span class='op'>&gt;</span> {
+ <span class='ident'>weak</span>.<span class='ident'>upgrade</span>()
+ .<span class='ident'>ok_or</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>)
+ .<span class='ident'>and_then</span>(<span class='op'>|</span><span class='ident'>mutex</span><span class='op'>|</span> <span class='ident'>mutex</span>.<span class='ident'>write</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>t</span><span class='op'>|</span> <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>t</span>))
+ .<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>CallbackError</span>::<span class='ident'>Poisoned</span>)
+ )
+}
+
+
+<span class='doccomment'>/// An event source.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>callbacks</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new source.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Source</span> { <span class='ident'>callbacks</span>: <span class='macro'>vec</span><span class='macro'>!</span>[] }
+ }
+
+ <span class='doccomment'>/// Register a callback. The callback will be a mutable closure that takes</span>
+ <span class='doccomment'>/// an event and must return a result. To unsubscribe from further events,</span>
+ <span class='doccomment'>/// the callback has to return an error.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>register</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>callback</span>: <span class='ident'>F</span>)
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>FnMut</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>CallbackResult</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>
+ {
+ <span class='self'>self</span>.<span class='ident'>callbacks</span>.<span class='ident'>push</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>callback</span>));
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Make the source send an event to all its observers.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>a</span>: <span class='ident'>A</span>) {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>new_callbacks</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>();
+ <span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>new_callbacks</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>callbacks</span>);
+ <span class='self'>self</span>.<span class='ident'>callbacks</span> <span class='op'>=</span> <span class='ident'>new_callbacks</span>
+ .<span class='ident'>into_iter</span>()
+ .<span class='ident'>filter_map</span>(<span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>callback</span><span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>callback</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>());
+ <span class='kw'>match</span> <span class='ident'>result</span> {
+ <span class='prelude-val'>Ok</span>(_) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>callback</span>),
+ <span class='prelude-val'>Err</span>(_) <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ }
+ })
+ .<span class='ident'>collect</span>();
+ }
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>Arc</span>, <span class='ident'>RwLock</span> };
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>thread</span>;
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='op'>*</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>with_weak_no_error</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='number'>3</span>));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>downgrade</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> { <span class='op'>*</span><span class='ident'>a</span> <span class='op'>=</span> <span class='number'>4</span>; }), <span class='prelude-val'>Ok</span>(()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>a</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>(), <span class='number'>4</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>with_weak_disappeared</span>() {
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='number'>3</span>)).<span class='ident'>downgrade</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span>_<span class='op'>|</span> ()), <span class='prelude-val'>Err</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>with_weak_poisoned</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='number'>3</span>));
+ <span class='kw'>let</span> <span class='ident'>a2</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>downgrade</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>thread</span>::<span class='ident'>spawn</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>_g</span> <span class='op'>=</span> <span class='ident'>a2</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>();
+ <span class='macro'>panic</span><span class='macro'>!</span>();
+ }).<span class='ident'>join</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span>_<span class='op'>|</span> ()), <span class='prelude-val'>Err</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Poisoned</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>source_register_and_send</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Source</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='number'>3</span>));
+ {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>a</span>.<span class='ident'>clone</span>();
+ <span class='ident'>src</span>.<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> {
+ <span class='op'>*</span><span class='ident'>a</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>() <span class='op'>=</span> <span class='ident'>x</span>;
+ <span class='prelude-val'>Ok</span>(())
+ });
+ }
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>src</span>.<span class='ident'>callbacks</span>.<span class='ident'>len</span>(), <span class='number'>1</span>);
+ <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='op'>*</span><span class='ident'>a</span>.<span class='ident'>read</span>().<span class='ident'>unwrap</span>(), <span class='number'>4</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>source_unregister</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Source</span>::<span class='ident'>new</span>();
+ <span class='ident'>src</span>.<span class='ident'>register</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='prelude-val'>Err</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>src</span>.<span class='ident'>callbacks</span>.<span class='ident'>len</span>(), <span class='number'>1</span>);
+ <span class='ident'>src</span>.<span class='ident'>send</span>(());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>src</span>.<span class='ident'>callbacks</span>.<span class='ident'>len</span>(), <span class='number'>0</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/stream.rs.html b/src/carboxyl/stream.rs.html
new file mode 100644
index 0000000..8290275
--- /dev/null
+++ b/src/carboxyl/stream.rs.html
@@ -0,0 +1,1645 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/stream.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>stream.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+<span id="683">683</span>
+<span id="684">684</span>
+<span id="685">685</span>
+<span id="686">686</span>
+<span id="687">687</span>
+<span id="688">688</span>
+<span id="689">689</span>
+<span id="690">690</span>
+<span id="691">691</span>
+<span id="692">692</span>
+<span id="693">693</span>
+<span id="694">694</span>
+<span id="695">695</span>
+<span id="696">696</span>
+<span id="697">697</span>
+<span id="698">698</span>
+<span id="699">699</span>
+<span id="700">700</span>
+<span id="701">701</span>
+<span id="702">702</span>
+<span id="703">703</span>
+<span id="704">704</span>
+<span id="705">705</span>
+<span id="706">706</span>
+<span id="707">707</span>
+<span id="708">708</span>
+<span id="709">709</span>
+<span id="710">710</span>
+<span id="711">711</span>
+<span id="712">712</span>
+<span id="713">713</span>
+<span id="714">714</span>
+<span id="715">715</span>
+<span id="716">716</span>
+<span id="717">717</span>
+<span id="718">718</span>
+<span id="719">719</span>
+<span id="720">720</span>
+<span id="721">721</span>
+<span id="722">722</span>
+<span id="723">723</span>
+<span id="724">724</span>
+<span id="725">725</span>
+<span id="726">726</span>
+<span id="727">727</span>
+<span id="728">728</span>
+<span id="729">729</span>
+<span id="730">730</span>
+<span id="731">731</span>
+<span id="732">732</span>
+<span id="733">733</span>
+<span id="734">734</span>
+<span id="735">735</span>
+<span id="736">736</span>
+<span id="737">737</span>
+<span id="738">738</span>
+<span id="739">739</span>
+<span id="740">740</span>
+<span id="741">741</span>
+<span id="742">742</span>
+<span id="743">743</span>
+<span id="744">744</span>
+<span id="745">745</span>
+<span id="746">746</span>
+<span id="747">747</span>
+<span id="748">748</span>
+<span id="749">749</span>
+<span id="750">750</span>
+<span id="751">751</span>
+<span id="752">752</span>
+<span id="753">753</span>
+<span id="754">754</span>
+<span id="755">755</span>
+<span id="756">756</span>
+<span id="757">757</span>
+<span id="758">758</span>
+<span id="759">759</span>
+<span id="760">760</span>
+<span id="761">761</span>
+<span id="762">762</span>
+<span id="763">763</span>
+<span id="764">764</span>
+<span id="765">765</span>
+<span id="766">766</span>
+<span id="767">767</span>
+<span id="768">768</span>
+<span id="769">769</span>
+<span id="770">770</span>
+<span id="771">771</span>
+<span id="772">772</span>
+<span id="773">773</span>
+<span id="774">774</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! Streams of discrete events</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>Arc</span>, <span class='ident'>RwLock</span>, <span class='ident'>Mutex</span>, <span class='ident'>Weak</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::<span class='ident'>mpsc</span>::{ <span class='ident'>Receiver</span>, <span class='ident'>channel</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>thread</span>;
+<span class='kw'>use</span> <span class='ident'>source</span>::{ <span class='ident'>Source</span>, <span class='ident'>CallbackError</span>, <span class='ident'>CallbackResult</span>, <span class='ident'>with_weak</span> };
+<span class='kw'>use</span> <span class='ident'>signal</span>::{ <span class='self'>self</span>, <span class='ident'>Signal</span>, <span class='ident'>SignalMut</span>, <span class='ident'>sample_raw</span> };
+<span class='kw'>use</span> <span class='ident'>transaction</span>::{ <span class='ident'>commit</span>, <span class='ident'>later</span> };
+
+
+<span class='doccomment'>/// An event sink.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This primitive is a way of generating streams of events. One can send</span>
+<span class='doccomment'>/// input values into a sink and generate a stream that fires all these inputs</span>
+<span class='doccomment'>/// as events:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// # use carboxyl::Sink;</span>
+<span class='doccomment'>/// // A new sink</span>
+<span class='doccomment'>/// let sink = Sink::new();</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// // Make an iterator over a stream.</span>
+<span class='doccomment'>/// let mut events = sink.stream().events();</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// // Send a value into the sink</span>
+<span class='doccomment'>/// sink.send(5);</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// // The stream</span>
+<span class='doccomment'>/// assert_eq!(events.next(), Some(5));</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// You can also feed a sink with an iterator:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// # use carboxyl::Sink;</span>
+<span class='doccomment'>/// # let sink = Sink::new();</span>
+<span class='doccomment'>/// # let mut events = sink.stream().events();</span>
+<span class='doccomment'>/// sink.feed(20..40);</span>
+<span class='doccomment'>/// assert_eq!(events.take(4).collect::&lt;Vec&lt;_&gt;&gt;(), vec![20, 21, 22, 23]);</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Asynchronous calls</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It is possible to send events into the sink asynchronously using the methods</span>
+<span class='doccomment'>/// `send_async` and `feed_async`. Note though, that this will void some</span>
+<span class='doccomment'>/// guarantees on the order of events. In the following example, it is unclear,</span>
+<span class='doccomment'>/// which event is the first in the stream:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// # use carboxyl::Sink;</span>
+<span class='doccomment'>/// let sink = Sink::new();</span>
+<span class='doccomment'>/// let mut events = sink.stream().events();</span>
+<span class='doccomment'>/// sink.send_async(13);</span>
+<span class='doccomment'>/// sink.send_async(22);</span>
+<span class='doccomment'>/// let first = events.next().unwrap();</span>
+<span class='doccomment'>/// assert!(first == 13 || first == 22);</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `feed_async` provides a workaround, as it preserves the order of events from</span>
+<span class='doccomment'>/// the iterator. However, any event sent into the sink after a call to it, may</span>
+<span class='doccomment'>/// come at any point between the iterator events.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>source</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Sink</span> { <span class='ident'>source</span>: <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>clone</span>() }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span><span class='op'>&gt;</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new sink.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Sink</span> { <span class='ident'>source</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>())) }
+ }
+
+ <span class='doccomment'>/// Generate a stream that fires all events sent into the sink.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>stream</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Stream</span> { <span class='ident'>source</span>: <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>clone</span>(), <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(()), }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Asynchronous send.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Same as `send`, but it spawns a new thread to process the updates to</span>
+ <span class='doccomment'>/// dependent streams and signals.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send_async</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='ident'>A</span>) {
+ <span class='kw'>let</span> <span class='ident'>clone</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>clone</span>();
+ <span class='ident'>thread</span>::<span class='ident'>spawn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>clone</span>.<span class='ident'>send</span>(<span class='ident'>a</span>));
+ }
+
+ <span class='doccomment'>/// Feed values from an iterator into the sink.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method feeds events into the sink from an iterator.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>feed</span><span class='op'>&lt;</span><span class='ident'>I</span>: <span class='ident'>IntoIterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>iterator</span>: <span class='ident'>I</span>) {
+ <span class='kw'>for</span> <span class='ident'>event</span> <span class='kw'>in</span> <span class='ident'>iterator</span> {
+ <span class='self'>self</span>.<span class='ident'>send</span>(<span class='ident'>event</span>);
+ }
+ }
+
+ <span class='doccomment'>/// Asynchronous feed.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is the same as `feed`, but it does not block, since it spawns the</span>
+ <span class='doccomment'>/// feeding as a new task. This is useful, if the provided iterator is large</span>
+ <span class='doccomment'>/// or even infinite (e.g. an I/O event loop).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>feed_async</span><span class='op'>&lt;</span><span class='ident'>I</span>: <span class='ident'>IntoIterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>iterator</span>: <span class='ident'>I</span>) {
+ <span class='kw'>let</span> <span class='ident'>clone</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>clone</span>();
+ <span class='ident'>thread</span>::<span class='ident'>spawn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>clone</span>.<span class='ident'>feed</span>(<span class='ident'>iterator</span>));
+ }
+
+ <span class='doccomment'>/// Send a value into the sink.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When a value is sent into the sink, an event is fired in all dependent</span>
+ <span class='doccomment'>/// streams.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='ident'>A</span>) {
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>send</span>(<span class='ident'>a</span>))
+ }
+}
+
+
+<span class='doccomment'>/// Trait to wrap cloning of boxed values in a object-safe manner</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>BoxClone</span>: <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Send</span> {
+ <span class='doccomment'>/// Clone the object as a boxed trait object</span>
+ <span class='kw'>fn</span> <span class='ident'>box_clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>BoxClone</span><span class='op'>&gt;</span>;
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>BoxClone</span> <span class='kw'>for</span> <span class='ident'>T</span> {
+ <span class='kw'>fn</span> <span class='ident'>box_clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>BoxClone</span><span class='op'>&gt;</span> {
+ <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>clone</span>())
+ }
+}
+
+
+<span class='doccomment'>/// Access a stream&#39;s source.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This is not defined as a method, so that it can be public to other modules</span>
+<span class='doccomment'>/// in this crate while being private outside the crate.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>stream</span>.<span class='ident'>source</span>
+}
+
+
+<span class='doccomment'>/// A stream of events.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Conceptually a stream can be thought of as a series of discrete events that</span>
+<span class='doccomment'>/// occur at specific times. They are ordered by a transaction system. This</span>
+<span class='doccomment'>/// means that firings of disjoint events can not interfere with each other. The</span>
+<span class='doccomment'>/// consequences of one event are atomically reflected in dependent quantities.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Streams provide a number of primitive operations. These can be used to</span>
+<span class='doccomment'>/// compose streams and combine them with signals. For instance, streams can be</span>
+<span class='doccomment'>/// mapped over with a function, merged with another stream of the same type or</span>
+<span class='doccomment'>/// filtered by some predicate.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Algebraic laws</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Furthermore, streams satisfy certain algebraic properties that are useful to</span>
+<span class='doccomment'>/// reason about them.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ## Monoid</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// For once, streams of the same type form a **monoid** under merging. The</span>
+<span class='doccomment'>/// neutral element in this context is `Stream::never()`. So the following laws</span>
+<span class='doccomment'>/// always hold for streams `a`, `b` and `c` of the same type:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// - Left identity: `Stream::never().merge(&amp;a) == a`,</span>
+<span class='doccomment'>/// - Right identity: `a.merge(&amp;Stream::never()) == a`,</span>
+<span class='doccomment'>/// - Associativity: `a.merge(&amp;b).merge(&amp;c) == a.merge(&amp;b.merge(&amp;c))`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// *Note that equality in this context is not actually implemented as such,</span>
+<span class='doccomment'>/// since comparing two (potentially infinite) streams is a prohibitive</span>
+<span class='doccomment'>/// operation. Instead, the expressions above can be used interchangably and</span>
+<span class='doccomment'>/// behave identically.*</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ## Functor</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Under the mapping operation streams also become a functor. A functor is a</span>
+<span class='doccomment'>/// generic type like `Stream` with some mapping operation that takes a function</span>
+<span class='doccomment'>/// `Fn(A) -&gt; B` to map a `Stream&lt;A&gt;` to a `Stream&lt;B&gt;`. Algebraically it</span>
+<span class='doccomment'>/// satisfies the following laws:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// - The identity function is preserved: `a.map(|x| x) == a`,</span>
+<span class='doccomment'>/// - Function composition is respected: `a.map(f).map(g) == a.map(|x| g(f(x)))`.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>source</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>,
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>BoxClone</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>keep_alive</span>: <span class='self'>self</span>.<span class='ident'>keep_alive</span>.<span class='ident'>box_clone</span>(),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a stream that never fires. This can be useful in certain</span>
+ <span class='doccomment'>/// situations, where a stream is logically required, but no events are</span>
+ <span class='doccomment'>/// expected.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>never</span>() <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>())),
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(())
+ }
+ }
+
+ <span class='doccomment'>/// Map the stream to another stream using a function.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `map` applies a function to every event fired in this stream to create a</span>
+ <span class='doccomment'>/// new stream of type `B`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let mut events = sink.stream().map(|x| x + 4).events();</span>
+ <span class='doccomment'>/// sink.send(3);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(7));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>map</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>B</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>()
+ .<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>f</span>(<span class='ident'>a</span>))));
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>src</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>clone</span>()),
+ }
+ })
+ }
+
+ <span class='doccomment'>/// Filter a stream according to a predicate.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `filter` creates a new stream that only fires those events from the</span>
+ <span class='doccomment'>/// original stream that satisfy the predicate.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let mut events = sink.stream()</span>
+ <span class='doccomment'>/// .filter(|&amp;x| (x &gt;= 4) &amp;&amp; (x &lt;= 10))</span>
+ <span class='doccomment'>/// .events();</span>
+ <span class='doccomment'>/// sink.send(2); // won&#39;t arrive</span>
+ <span class='doccomment'>/// sink.send(5); // will arrive</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(5));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>filter</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='self'>self</span>.<span class='ident'>filter_map</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='kw'>if</span> <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>) { <span class='prelude-val'>Some</span>(<span class='ident'>a</span>) } <span class='kw'>else</span> { <span class='prelude-val'>None</span> })
+ }
+
+ <span class='doccomment'>/// Both filter and map a stream.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is equivalent to `.map(f).filter_some()`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink = Sink::new();</span>
+ <span class='doccomment'>/// let mut events = sink.stream()</span>
+ <span class='doccomment'>/// .filter_map(|i| if i &gt; 3 { Some(i + 2) } else { None })</span>
+ <span class='doccomment'>/// .events();</span>
+ <span class='doccomment'>/// sink.send(2);</span>
+ <span class='doccomment'>/// sink.send(4);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(6));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>filter_map</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='self'>self</span>.<span class='ident'>map</span>(<span class='ident'>f</span>).<span class='ident'>filter_some</span>()
+ }
+
+ <span class='doccomment'>/// Merge with another stream.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `merge` takes two streams and creates a new stream that fires events</span>
+ <span class='doccomment'>/// from both input streams.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink_1 = Sink::&lt;i32&gt;::new();</span>
+ <span class='doccomment'>/// let sink_2 = Sink::&lt;i32&gt;::new();</span>
+ <span class='doccomment'>/// let mut events = sink_1.stream().merge(&amp;sink_2.stream()).events();</span>
+ <span class='doccomment'>/// sink_1.send(2);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(2));</span>
+ <span class='doccomment'>/// sink_2.send(4);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(4));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>for</span> <span class='ident'>parent</span> <span class='kw'>in</span> [<span class='self'>self</span>, <span class='ident'>other</span>].<span class='ident'>iter</span>() {
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='ident'>parent</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>()
+ .<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>a</span>)));
+ }
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>src</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>((<span class='self'>self</span>.<span class='ident'>clone</span>(), <span class='ident'>other</span>.<span class='ident'>clone</span>())),
+ }
+ })
+ }
+
+ <span class='doccomment'>/// Coalesce multiple event firings within the same transaction into a</span>
+ <span class='doccomment'>/// single event.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The function should ideally commute, as the order of events within a</span>
+ <span class='doccomment'>/// transaction is not well-defined.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>coalesce</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>register</span>({
+ <span class='kw'>let</span> <span class='ident'>mutex</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='prelude-val'>None</span>));
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>inner</span> <span class='op'>=</span> <span class='ident'>mutex</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>();
+ <span class='op'>*</span><span class='ident'>inner</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='kw'>match</span> <span class='ident'>inner</span>.<span class='ident'>take</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>b</span>) <span class='op'>=&gt;</span> <span class='ident'>f</span>(<span class='ident'>a</span>, <span class='ident'>b</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>a</span>,
+ });
+ <span class='comment'>// Send the updated value later</span>
+ <span class='ident'>later</span>({
+ <span class='kw'>let</span> <span class='ident'>mutex</span> <span class='op'>=</span> <span class='ident'>mutex</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>weak</span>.<span class='ident'>clone</span>();
+ <span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>inner</span> <span class='op'>=</span> <span class='ident'>mutex</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>();
+ <span class='comment'>// Take it out and map, so that it does not happen twice</span>
+ <span class='ident'>inner</span>.<span class='ident'>take</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>value</span><span class='op'>|</span>
+ <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>value</span>))
+ );
+ }
+ });
+ <span class='prelude-val'>Ok</span>(())
+ }
+ });
+ <span class='ident'>Stream</span> { <span class='ident'>source</span>: <span class='ident'>src</span>, <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>clone</span>()) }
+ })
+ }
+
+ <span class='doccomment'>/// Hold an event in a signal.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The resulting signal `hold`s the value of the last event fired by the</span>
+ <span class='doccomment'>/// stream.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink = Sink::new();</span>
+ <span class='doccomment'>/// let signal = sink.stream().hold(0);</span>
+ <span class='doccomment'>/// assert_eq!(signal.sample(), 0);</span>
+ <span class='doccomment'>/// sink.send(2);</span>
+ <span class='doccomment'>/// assert_eq!(signal.sample(), 2);</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>hold</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>initial</span>: <span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>signal</span>::<span class='ident'>hold</span>(<span class='ident'>initial</span>, <span class='self'>self</span>)
+ }
+
+ <span class='doccomment'>/// A blocking iterator over the stream.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>events</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Events</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> { <span class='ident'>Events</span>::<span class='ident'>new</span>(<span class='self'>self</span>) }
+
+ <span class='doccomment'>/// Scan a stream and accumulate its event firings in a signal.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Starting at some initial value, each new event changes the value of the</span>
+ <span class='doccomment'>/// resulting signal as prescribed by the supplied function.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink = Sink::new();</span>
+ <span class='doccomment'>/// let sum = sink.stream().scan(0, |a, b| a + b);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 0);</span>
+ <span class='doccomment'>/// sink.send(2);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 2);</span>
+ <span class='doccomment'>/// sink.send(4);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 6);</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>scan</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>initial</span>: <span class='ident'>B</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>B</span>, <span class='ident'>A</span>) <span class='op'>-&gt;</span> <span class='ident'>B</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>Signal</span>::<span class='ident'>cyclic</span>(<span class='op'>|</span><span class='ident'>scan</span><span class='op'>|</span> <span class='ident'>scan</span>.<span class='ident'>snapshot</span>(<span class='self'>self</span>, <span class='ident'>f</span>).<span class='ident'>hold</span>(<span class='ident'>initial</span>))
+ }
+
+ <span class='doccomment'>/// Scan a stream and accumulate its event firings in some mutable state.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Semantically this is equivalent to `scan`. However, it allows one to use</span>
+ <span class='doccomment'>/// a non-Clone type as an accumulator and update it with efficient in-place</span>
+ <span class='doccomment'>/// operations.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The resulting `SignalMut` does have a slightly different API from a</span>
+ <span class='doccomment'>/// regular `Signal` as it does not allow clones.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::{ Sink, Signal };</span>
+ <span class='doccomment'>/// let sink: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let sum = sink.stream()</span>
+ <span class='doccomment'>/// .scan_mut(0, |sum, a| *sum += a)</span>
+ <span class='doccomment'>/// .combine(&amp;Signal::new(()), |sum, ()| *sum);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 0);</span>
+ <span class='doccomment'>/// sink.send(2);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 2);</span>
+ <span class='doccomment'>/// sink.send(4);</span>
+ <span class='doccomment'>/// assert_eq!(sum.sample(), 6);</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>scan_mut</span><span class='op'>&lt;</span><span class='ident'>B</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>initial</span>: <span class='ident'>B</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>SignalMut</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>B</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>B</span>, <span class='ident'>A</span>) <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='ident'>signal</span>::<span class='ident'>scan_mut</span>(<span class='self'>self</span>, <span class='ident'>initial</span>, <span class='ident'>f</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span> {
+ <span class='doccomment'>/// Filter a stream of options.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `filter_some` creates a new stream that only fires the unwrapped</span>
+ <span class='doccomment'>/// `Some(…)` events from the original stream omitting any `None` events.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::Sink;</span>
+ <span class='doccomment'>/// let sink = Sink::new();</span>
+ <span class='doccomment'>/// let mut events = sink.stream().filter_some().events();</span>
+ <span class='doccomment'>/// sink.send(None); // won&#39;t arrive</span>
+ <span class='doccomment'>/// sink.send(Some(5)); // will arrive</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(5));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>filter_some</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>()
+ .<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>a</span>.<span class='ident'>map_or</span>(
+ <span class='prelude-val'>Ok</span>(()),
+ <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>a</span>))
+ ));
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>src</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>clone</span>())
+ }
+ })
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span> {
+ <span class='doccomment'>/// Switch between streams.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This takes a stream of streams and maps it to a new stream, which fires</span>
+ <span class='doccomment'>/// all events from the most recent stream fired into it.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>/// # use carboxyl::{ Sink, Stream };</span>
+ <span class='doccomment'>/// // Create sinks</span>
+ <span class='doccomment'>/// let stream_sink: Sink&lt;Stream&lt;i32&gt;&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let sink1: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>/// let sink2: Sink&lt;i32&gt; = Sink::new();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Switch and listen</span>
+ <span class='doccomment'>/// let switched = stream_sink.stream().switch();</span>
+ <span class='doccomment'>/// let mut events = switched.events();</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Should not receive events from either sink</span>
+ <span class='doccomment'>/// sink1.send(1); sink2.send(2);</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // Now switch to sink 2</span>
+ <span class='doccomment'>/// stream_sink.send(sink2.stream());</span>
+ <span class='doccomment'>/// sink1.send(3); sink2.send(4);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(4));</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// // And then to sink 1</span>
+ <span class='doccomment'>/// stream_sink.send(sink1.stream());</span>
+ <span class='doccomment'>/// sink1.send(5); sink2.send(6);</span>
+ <span class='doccomment'>/// assert_eq!(events.next(), Some(5));</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>switch</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>rewire_callbacks</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>new_stream</span>: <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>source</span>: <span class='ident'>Weak</span><span class='op'>&lt;</span><span class='ident'>RwLock</span><span class='op'>&lt;</span><span class='ident'>Source</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>,
+ <span class='ident'>terminate</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Arc</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>CallbackResult</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='ident'>Clone</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ {
+ <span class='op'>*</span><span class='ident'>terminate</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(());
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>terminate</span>.<span class='ident'>downgrade</span>();
+ <span class='ident'>new_stream</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>register</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span>
+ <span class='ident'>weak</span>.<span class='ident'>upgrade</span>()
+ .<span class='ident'>ok_or</span>(<span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>)
+ .<span class='ident'>and_then</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>source</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>a</span>)))
+ );
+ <span class='prelude-val'>Ok</span>(())
+ }
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>register</span>({
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>terminate</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(());
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>stream</span><span class='op'>|</span> <span class='ident'>rewire_callbacks</span>(<span class='ident'>stream</span>, <span class='ident'>weak</span>.<span class='ident'>clone</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>terminate</span>)
+ });
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>src</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>clone</span>()),
+ }
+ })
+ }
+}
+
+
+<span class='doccomment'>/// Make a snapshot of a signal, whenever a stream fires an event.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>snapshot</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>B</span>, <span class='ident'>C</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>signal</span>: <span class='kw-2'>&amp;</span><span class='ident'>Signal</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>, <span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>B</span><span class='op'>&gt;</span>, <span class='ident'>f</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>C</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>A</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>B</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>C</span>: <span class='ident'>Clone</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+ <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='ident'>A</span>, <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>C</span> <span class='op'>+</span> <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span>,
+{
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>RwLock</span>::<span class='ident'>new</span>(<span class='ident'>Source</span>::<span class='ident'>new</span>()));
+ <span class='kw'>let</span> <span class='ident'>weak</span> <span class='op'>=</span> <span class='ident'>src</span>.<span class='ident'>downgrade</span>();
+ <span class='ident'>stream</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>register</span>({
+ <span class='kw'>let</span> <span class='ident'>signal</span> <span class='op'>=</span> <span class='ident'>signal</span>.<span class='ident'>clone</span>();
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>b</span><span class='op'>|</span> <span class='ident'>with_weak</span>(<span class='kw-2'>&amp;</span><span class='ident'>weak</span>, <span class='op'>|</span><span class='ident'>src</span><span class='op'>|</span> <span class='ident'>src</span>.<span class='ident'>send</span>(<span class='ident'>f</span>(<span class='ident'>sample_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>signal</span>), <span class='ident'>b</span>)))
+ });
+ <span class='ident'>Stream</span> {
+ <span class='ident'>source</span>: <span class='ident'>src</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>((<span class='ident'>stream</span>.<span class='ident'>clone</span>(), <span class='ident'>signal</span>.<span class='ident'>clone</span>())),
+ }
+ })
+}
+
+
+<span class='doccomment'>/// A blocking iterator over events in a stream.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Events</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>receiver</span>: <span class='ident'>Receiver</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>,
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>BoxClone</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Events</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new events iterator.</span>
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>stream</span>: <span class='kw-2'>&amp;</span><span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Events</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> (<span class='ident'>tx</span>, <span class='ident'>rx</span>) <span class='op'>=</span> <span class='ident'>channel</span>();
+ <span class='kw'>let</span> <span class='ident'>tx</span> <span class='op'>=</span> <span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='ident'>tx</span>);
+ <span class='ident'>stream</span>.<span class='ident'>source</span>.<span class='ident'>write</span>().<span class='ident'>unwrap</span>().<span class='ident'>register</span>(
+ <span class='kw'>move</span> <span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>tx</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>().<span class='ident'>send</span>(<span class='ident'>a</span>).<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>CallbackError</span>::<span class='ident'>Disappeared</span>)
+ );
+ <span class='ident'>Events</span> {
+ <span class='ident'>receiver</span>: <span class='ident'>rx</span>,
+ <span class='ident'>keep_alive</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>stream</span>.<span class='ident'>clone</span>()),
+ }
+ })
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Send</span> <span class='op'>+</span> <span class='ident'>Sync</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>Events</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>A</span>;
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>receiver</span>.<span class='ident'>recv</span>().<span class='ident'>ok</span>() }
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>thread</span>;
+ <span class='kw'>use</span> <span class='ident'>quickcheck</span>::<span class='ident'>quickcheck</span>;
+
+ <span class='kw'>use</span> <span class='ident'>testing</span>::{ <span class='ident'>id</span>, <span class='ident'>stream_eq</span> };
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='op'>*</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>sink</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>2</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>1</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>map</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>triple</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='number'>3</span> <span class='op'>*</span> <span class='ident'>x</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>triple</span>.<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>3</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>filter_some</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>small</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>filter_some</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>small</span>.<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='prelude-val'>None</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='prelude-val'>Some</span>(<span class='number'>9</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>9</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>chain_1</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>chain</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>/</span> <span class='number'>2</span>)
+ .<span class='ident'>filter</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>&lt;</span> <span class='number'>3</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>chain</span>.<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>7</span>);
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>4</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>merge</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink1</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink2</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink1</span>.<span class='ident'>stream</span>().<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>sink2</span>.<span class='ident'>stream</span>()).<span class='ident'>events</span>();
+ <span class='ident'>sink1</span>.<span class='ident'>send</span>(<span class='number'>12</span>);
+ <span class='ident'>sink2</span>.<span class='ident'>send</span>(<span class='number'>9</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>12</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>9</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>chain_2</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink1</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink2</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink1</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>+</span> <span class='number'>4</span>)
+ .<span class='ident'>merge</span>(
+ <span class='kw-2'>&amp;</span><span class='ident'>sink2</span>.<span class='ident'>stream</span>()
+ .<span class='ident'>filter_map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='kw'>if</span> <span class='ident'>x</span> <span class='op'>&lt;</span> <span class='number'>4</span> { <span class='prelude-val'>Some</span>(<span class='ident'>x</span>) } <span class='kw'>else</span> { <span class='prelude-val'>None</span> })
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span> <span class='op'>*</span> <span class='number'>5</span>))
+ .<span class='ident'>events</span>();
+ <span class='ident'>sink1</span>.<span class='ident'>send</span>(<span class='number'>12</span>);
+ <span class='ident'>sink2</span>.<span class='ident'>send</span>(<span class='number'>3</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>16</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>15</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>move_closure</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>x</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>map</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>y</span><span class='op'>|</span> <span class='ident'>y</span> <span class='op'>+</span> <span class='ident'>x</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>scan_race_condition</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='comment'>// Feed the sink in the background</span>
+ <span class='ident'>sink</span>.<span class='ident'>feed_async</span>(<span class='number'>0</span>..<span class='number'>100000</span>);
+ <span class='comment'>// Try it multiple times to increase failure probability, when a data</span>
+ <span class='comment'>// race can potentially happen.</span>
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>10</span> {
+ <span class='kw'>let</span> <span class='ident'>_sum</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>scan</span>(<span class='number'>0</span>, <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>a</span> <span class='op'>+</span> <span class='ident'>b</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>sink_send_async</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>send_async</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>1</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>sink_feed</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>feed</span>(<span class='number'>0</span>..<span class='number'>10</span>);
+ <span class='kw'>for</span> (<span class='ident'>n</span>, <span class='ident'>m</span>) <span class='kw'>in</span> <span class='ident'>events</span>.<span class='ident'>take</span>(<span class='number'>10</span>).<span class='ident'>enumerate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>i32</span>, <span class='ident'>m</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>sink_feed_async</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>().<span class='ident'>events</span>();
+ <span class='ident'>sink</span>.<span class='ident'>feed_async</span>(<span class='number'>0</span>..<span class='number'>10</span>);
+ <span class='kw'>for</span> (<span class='ident'>n</span>, <span class='ident'>m</span>) <span class='kw'>in</span> <span class='ident'>events</span>.<span class='ident'>take</span>(<span class='number'>10</span>).<span class='ident'>enumerate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>i32</span>, <span class='ident'>m</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>coalesce</span>() {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>stream</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>()
+ .<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>sink</span>.<span class='ident'>stream</span>())
+ .<span class='ident'>coalesce</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>a</span> <span class='op'>+</span> <span class='ident'>b</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>events</span> <span class='op'>=</span> <span class='ident'>stream</span>.<span class='ident'>events</span>();
+
+ <span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='number'>1</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>events</span>.<span class='ident'>next</span>(), <span class='prelude-val'>Some</span>(<span class='number'>2</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>monoid_left_identity</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>input</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>stream_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>Stream</span>::<span class='ident'>never</span>().<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>), <span class='kw-2'>&amp;</span><span class='ident'>a</span>);
+ <span class='ident'>sink</span>.<span class='ident'>feed</span>(<span class='ident'>input</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>eq</span>.<span class='ident'>sample</span>()
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>monoid_right_identity</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>input</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>stream_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>Stream</span>::<span class='ident'>never</span>()), <span class='kw-2'>&amp;</span><span class='ident'>a</span>);
+ <span class='ident'>sink</span>.<span class='ident'>feed</span>(<span class='ident'>input</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>eq</span>.<span class='ident'>sample</span>()
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>monoid_associative</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>input_a</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>, <span class='ident'>input_b</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>, <span class='ident'>input_c</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>sink_a</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink_b</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>sink_c</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>sink_a</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='ident'>sink_b</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>sink_c</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>stream_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>b</span>.<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>c</span>)), <span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>b</span>).<span class='ident'>merge</span>(<span class='kw-2'>&amp;</span><span class='ident'>c</span>));
+ <span class='comment'>/* feed in parallel */</span> {
+ <span class='kw'>let</span> <span class='ident'>_g1</span> <span class='op'>=</span> <span class='ident'>thread</span>::<span class='ident'>scoped</span>(<span class='op'>||</span> <span class='ident'>sink_a</span>.<span class='ident'>feed</span>(<span class='ident'>input_a</span>.<span class='ident'>into_iter</span>()));
+ <span class='kw'>let</span> <span class='ident'>_g2</span> <span class='op'>=</span> <span class='ident'>thread</span>::<span class='ident'>scoped</span>(<span class='op'>||</span> <span class='ident'>sink_b</span>.<span class='ident'>feed</span>(<span class='ident'>input_b</span>.<span class='ident'>into_iter</span>()));
+ <span class='kw'>let</span> <span class='ident'>_g3</span> <span class='op'>=</span> <span class='ident'>thread</span>::<span class='ident'>scoped</span>(<span class='op'>||</span> <span class='ident'>sink_c</span>.<span class='ident'>feed</span>(<span class='ident'>input_c</span>.<span class='ident'>into_iter</span>()));
+ }
+ <span class='ident'>eq</span>.<span class='ident'>sample</span>()
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>functor_identity</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>input</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>stream_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>map</span>(<span class='ident'>id</span>), <span class='kw-2'>&amp;</span><span class='ident'>a</span>);
+ <span class='ident'>sink</span>.<span class='ident'>feed</span>(<span class='ident'>input</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>eq</span>.<span class='ident'>sample</span>()
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>functor_composition</span>() {
+ <span class='kw'>fn</span> <span class='ident'>check</span>(<span class='ident'>input</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>f</span>(<span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>i64</span> { (<span class='ident'>n</span> <span class='op'>+</span> <span class='number'>3</span>) <span class='kw'>as</span> <span class='ident'>i64</span> }
+ <span class='kw'>fn</span> <span class='ident'>g</span>(<span class='ident'>n</span>: <span class='ident'>i64</span>) <span class='op'>-&gt;</span> <span class='ident'>f64</span> { <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>f64</span> <span class='op'>/</span> <span class='number'>2.5</span> }
+
+ <span class='kw'>let</span> <span class='ident'>sink</span> <span class='op'>=</span> <span class='ident'>Sink</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>sink</span>.<span class='ident'>stream</span>();
+ <span class='kw'>let</span> <span class='ident'>eq</span> <span class='op'>=</span> <span class='ident'>stream_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>map</span>(<span class='ident'>f</span>).<span class='ident'>map</span>(<span class='ident'>g</span>), <span class='kw-2'>&amp;</span><span class='ident'>a</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> <span class='ident'>g</span>(<span class='ident'>f</span>(<span class='ident'>n</span>))));
+ <span class='ident'>sink</span>.<span class='ident'>feed</span>(<span class='ident'>input</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>eq</span>.<span class='ident'>sample</span>()
+ }
+ <span class='ident'>quickcheck</span>(<span class='ident'>check</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>String</span><span class='op'>&gt;</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/carboxyl/transaction.rs.html b/src/carboxyl/transaction.rs.html
new file mode 100644
index 0000000..e9cc7b6
--- /dev/null
+++ b/src/carboxyl/transaction.rs.html
@@ -0,0 +1,459 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/carboxyl-0.1.1/src/transaction.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>transaction.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! A trivial global lock transaction system.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! At the moment, this is really just a global static mutex, that needs to be</span>
+<span class='doccomment'>//! locked, to ensure the atomicity of a transaction.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::<span class='ident'>Mutex</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cell</span>::<span class='ident'>RefCell</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>boxed</span>::<span class='ident'>FnBox</span>;
+
+
+<span class='doccomment'>/// The global transaction lock.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// TODO: revert this to use a static mutex, as soon as that is stabilized in</span>
+<span class='doccomment'>/// the standard library.</span>
+<span class='macro'>lazy_static</span><span class='macro'>!</span> {
+ <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='ident'>TRANSACTION_MUTEX</span>: <span class='ident'>Mutex</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Mutex</span>::<span class='ident'>new</span>(());
+}
+
+<span class='doccomment'>/// Registry for callbacks to be executed at the end of a transaction.</span>
+<span class='macro'>thread_local</span><span class='macro'>!</span>(
+ <span class='kw'>static</span> <span class='ident'>CURRENT_TRANSACTION</span>: <span class='ident'>RefCell</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Transaction</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span>
+ <span class='ident'>RefCell</span>::<span class='ident'>new</span>(<span class='prelude-val'>None</span>)
+);
+
+
+<span class='doccomment'>/// A callback.</span>
+<span class='kw'>type</span> <span class='ident'>Callback</span> <span class='op'>=</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>FnBox</span>() <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>;
+
+
+<span class='doccomment'>/// A transaction.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Transaction</span> {
+ <span class='ident'>intermediate</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Callback</span><span class='op'>&gt;</span>,
+ <span class='ident'>finalizers</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Callback</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Transaction</span> {
+ <span class='doccomment'>/// Create a new transaction</span>
+ <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Transaction</span> {
+ <span class='ident'>Transaction</span> {
+ <span class='ident'>intermediate</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ <span class='ident'>finalizers</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ }
+ }
+
+ <span class='doccomment'>/// Add a callback that will be called, when the transaction is done</span>
+ <span class='doccomment'>/// except for finalizers.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>later</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>FnOnce</span>() <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>callback</span>: <span class='ident'>F</span>) {
+ <span class='self'>self</span>.<span class='ident'>intermediate</span>.<span class='ident'>push</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>callback</span>));
+ }
+
+ <span class='doccomment'>/// Add a finalizing callback. This should not have far reaching</span>
+ <span class='doccomment'>/// side-effects, and in particular not commit by itself. Typical operations</span>
+ <span class='doccomment'>/// for a finalizer are executing queued state updates.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>end</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>FnOnce</span>() <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>callback</span>: <span class='ident'>F</span>) {
+ <span class='self'>self</span>.<span class='ident'>finalizers</span>.<span class='ident'>push</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>callback</span>));
+ }
+
+ <span class='doccomment'>/// Advance transactions by moving out intermediate stage callbacks.</span>
+ <span class='kw'>fn</span> <span class='ident'>advance</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Callback</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>intermediate</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>intermediate</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>intermediate</span>);
+ <span class='ident'>intermediate</span>
+ }
+
+ <span class='doccomment'>/// Finalize the transaction</span>
+ <span class='kw'>fn</span> <span class='ident'>finalize</span>(<span class='self'>self</span>) {
+ <span class='kw'>for</span> <span class='ident'>finalizer</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>finalizers</span> {
+ <span class='ident'>finalizer</span>.<span class='ident'>call_box</span>(());
+ }
+ }
+}
+
+
+<span class='doccomment'>/// Commit a transaction.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// If the thread is not running any transactions currently, the global lock is</span>
+<span class='doccomment'>/// acquired. Otherwise a new transaction begins, since given the interface of</span>
+<span class='doccomment'>/// this module it is safely assumed that the lock is already held.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>commit</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>F</span>: <span class='ident'>FnOnce</span>() <span class='op'>-&gt;</span> <span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>body</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+ <span class='comment'>// Begin a new transaction</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>prev</span> <span class='op'>=</span> <span class='ident'>CURRENT_TRANSACTION</span>.<span class='ident'>with</span>(<span class='op'>|</span><span class='ident'>current</span><span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>prev</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>Transaction</span>::<span class='ident'>new</span>());
+ <span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>prev</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>current</span>.<span class='ident'>borrow_mut</span>());
+ <span class='ident'>prev</span>
+ });
+ <span class='comment'>// Acquire global lock if necessary</span>
+ <span class='kw'>let</span> <span class='ident'>_lock</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>prev</span> {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>TRANSACTION_MUTEX</span>.<span class='ident'>lock</span>().<span class='ident'>ok</span>()
+ .<span class='ident'>expect</span>(<span class='string'>&quot;global transaction mutex poisoned&quot;</span>)
+ ),
+ <span class='prelude-val'>Some</span>(_) <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ };
+ <span class='comment'>// Perform the main body of the transaction</span>
+ <span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>body</span>();
+ <span class='comment'>// Advance the transaction as long as necessary</span>
+ <span class='kw'>loop</span> {
+ <span class='kw'>let</span> <span class='ident'>callbacks</span> <span class='op'>=</span> <span class='ident'>with_current</span>(<span class='ident'>Transaction</span>::<span class='ident'>advance</span>);
+ <span class='kw'>if</span> <span class='ident'>callbacks</span>.<span class='ident'>is_empty</span>() { <span class='kw'>break</span> }
+ <span class='kw'>for</span> <span class='ident'>callback</span> <span class='kw'>in</span> <span class='ident'>callbacks</span> {
+ <span class='ident'>callback</span>.<span class='ident'>call_box</span>(());
+ }
+ }
+ <span class='comment'>// Call all finalizers and drop the transaction</span>
+ <span class='ident'>CURRENT_TRANSACTION</span>.<span class='ident'>with</span>(<span class='op'>|</span><span class='ident'>current</span><span class='op'>|</span>
+ <span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>prev</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>current</span>.<span class='ident'>borrow_mut</span>())
+ );
+ <span class='ident'>prev</span>.<span class='ident'>unwrap</span>().<span class='ident'>finalize</span>();
+ <span class='comment'>// Return</span>
+ <span class='ident'>result</span>
+}
+
+
+<span class='doccomment'>/// Register a callback during a transaction.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_current</span><span class='op'>&lt;</span><span class='ident'>A</span>, <span class='ident'>F</span>: <span class='ident'>FnOnce</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Transaction</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span><span class='op'>&gt;</span>(<span class='ident'>action</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>A</span> {
+ <span class='ident'>CURRENT_TRANSACTION</span>.<span class='ident'>with</span>(<span class='op'>|</span><span class='ident'>current</span><span class='op'>|</span>
+ <span class='kw'>match</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='ident'>current</span>.<span class='ident'>borrow_mut</span>() {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>trans</span>) <span class='op'>=&gt;</span> <span class='ident'>action</span>(<span class='ident'>trans</span>),
+ _ <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;there is no active transaction to register a callback&quot;</span>),
+ }
+ )
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>later</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>FnOnce</span>() <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='ident'>action</span>: <span class='ident'>F</span>) {
+ <span class='ident'>with_current</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>later</span>(<span class='ident'>action</span>))
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>end</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>FnOnce</span>() <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>(<span class='ident'>action</span>: <span class='ident'>F</span>) {
+ <span class='ident'>with_current</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>end</span>(<span class='ident'>action</span>))
+}
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='op'>*</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>commit_single</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='ident'>v</span> <span class='op'>+=</span> <span class='number'>5</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>v</span>, <span class='number'>8</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>commit_nested</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='ident'>commit</span>(<span class='op'>||</span> {
+ <span class='ident'>commit</span>(<span class='op'>||</span> <span class='ident'>v</span> <span class='op'>*=</span> <span class='number'>2</span>);
+ <span class='ident'>v</span> <span class='op'>+=</span> <span class='number'>4</span>;
+ });
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>v</span>, <span class='number'>10</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>commits_parallel</span>() {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{<span class='ident'>Arc</span>, <span class='ident'>Mutex</span>};
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>thread</span>;
+
+ <span class='comment'>// Set up a ref-counted value</span>
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='number'>3</span>));
+ <span class='comment'>// Spawn a couple of scoped threads performing atomic operations on it</span>
+ <span class='kw'>let</span> <span class='ident'>guards</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;</span> <span class='op'>=</span> (<span class='number'>0</span>..<span class='number'>3</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>v</span>.<span class='ident'>clone</span>();
+ <span class='ident'>thread</span>::<span class='ident'>spawn</span>(<span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>commit</span>(<span class='kw'>move</span> <span class='op'>||</span> {
+ <span class='comment'>// Acquire locks independently, s.t. commit atomicity does</span>
+ <span class='comment'>// not rely on the local locks here</span>
+ <span class='op'>*</span><span class='ident'>v</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>() <span class='op'>*=</span> <span class='number'>2</span>;
+ <span class='comment'>// …and sleep for a bit</span>
+ <span class='ident'>thread</span>::<span class='ident'>sleep_ms</span>(<span class='number'>1</span>);
+ <span class='op'>*</span><span class='ident'>v</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>() <span class='op'>-=</span> <span class='number'>1</span>;
+ }))
+ })
+ .<span class='ident'>collect</span>();
+ <span class='comment'>// Rejoin with all guards</span>
+ <span class='kw'>for</span> <span class='ident'>guard</span> <span class='kw'>in</span> <span class='ident'>guards</span> { <span class='ident'>guard</span>.<span class='ident'>join</span>().<span class='ident'>ok</span>().<span class='ident'>expect</span>(<span class='string'>&quot;thread failed&quot;</span>); }
+ <span class='comment'>// Check result</span>
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>v</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='number'>17</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "carboxyl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/gcc/lib.rs.html b/src/gcc/lib.rs.html
new file mode 100644
index 0000000..40271e9
--- /dev/null
+++ b/src/gcc/lib.rs.html
@@ -0,0 +1,1093 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/gcc-0.3.8/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! A library for build scripts to compile custom C code</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This library is intended to be used as a `build-dependencies` entry in</span>
+<span class='doccomment'>//! `Cargo.toml`:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```toml</span>
+<span class='doccomment'>//! [build-dependencies]</span>
+<span class='doccomment'>//! gcc = &quot;0.2&quot;</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The purpose of this crate is to provide the utility functions necessary to</span>
+<span class='doccomment'>//! compile C code into a static archive which is then linked into a Rust crate.</span>
+<span class='doccomment'>//! The top-level `compile_library` function serves as a convenience and more</span>
+<span class='doccomment'>//! advanced configuration is available through the `Config` builder.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This crate will automatically detect situations such as cross compilation or</span>
+<span class='doccomment'>//! other environment variables set by Cargo and will build code appropriately.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Examples</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Use the default configuration:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```no_run</span>
+<span class='doccomment'>//! extern crate gcc;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! gcc::compile_library(&quot;libfoo.a&quot;, &amp;[&quot;src/foo.c&quot;]);</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Use more advanced configuration:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```no_run</span>
+<span class='doccomment'>//! extern crate gcc;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! gcc::Config::new()</span>
+<span class='doccomment'>//! .file(&quot;src/foo.c&quot;)</span>
+<span class='doccomment'>//! .define(&quot;FOO&quot;, Some(&quot;bar&quot;))</span>
+<span class='doccomment'>//! .include(&quot;src&quot;)</span>
+<span class='doccomment'>//! .compile(&quot;libfoo.a&quot;);</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://alexcrichton.com/gcc-rs&quot;</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>test</span>, <span class='ident'>deny</span>(<span class='ident'>warnings</span>))]</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>env</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::<span class='ident'>OsString</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fs</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::{<span class='ident'>PathBuf</span>, <span class='ident'>Path</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>process</span>::{<span class='ident'>Command</span>, <span class='ident'>Stdio</span>};
+
+<span class='doccomment'>/// Extra configuration to pass to gcc.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Config</span> {
+ <span class='ident'>include_directories</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='ident'>definitions</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>String</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>,
+ <span class='ident'>objects</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='ident'>flags</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='ident'>files</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='ident'>cpp</span>: <span class='ident'>bool</span>,
+ <span class='ident'>cpp_link_stdlib</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='ident'>cpp_set_stdlib</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+}
+
+<span class='doccomment'>/// Returns the default C++ standard library for the current target: `libc++`</span>
+<span class='doccomment'>/// for OS X and `libstdc++` for anything else.</span>
+<span class='kw'>fn</span> <span class='ident'>target_default_cpp_stdlib</span>() <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>target</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;TARGET&quot;</span>);
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;darwin&quot;</span>) {
+ <span class='prelude-val'>Some</span>(<span class='string'>&quot;c++&quot;</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='string'>&quot;stdc++&quot;</span>)
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>getenv</span>(<span class='ident'>v</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>env</span>::<span class='ident'>var</span>(<span class='ident'>v</span>).<span class='ident'>ok</span>();
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;{} = {:?}&quot;</span>, <span class='ident'>v</span>, <span class='ident'>r</span>);
+ <span class='ident'>r</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>getenv_unwrap</span>(<span class='ident'>v</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>match</span> <span class='ident'>getenv</span>(<span class='ident'>v</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>,
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>fail</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;environment variable `{}` not defined&quot;</span>, <span class='ident'>v</span>)),
+ }
+}
+
+<span class='doccomment'>/// Compile a library from the given set of input C files.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This will simply compile all files into object files and then assemble them</span>
+<span class='doccomment'>/// into the output. This will read the standard environment variables to detect</span>
+<span class='doccomment'>/// cross compilations and such.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This function will also print all metadata on standard output for Cargo.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Example</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```no_run</span>
+<span class='doccomment'>/// gcc::compile_library(&quot;libfoo.a&quot;, &amp;[&quot;foo.c&quot;, &quot;bar.c&quot;]);</span>
+<span class='doccomment'>/// ```</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>compile_library</span>(<span class='ident'>output</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>files</span>: <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span><span class='ident'>str</span>]) {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>Config</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>f</span> <span class='kw'>in</span> <span class='ident'>files</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>c</span>.<span class='ident'>file</span>(<span class='op'>*</span><span class='ident'>f</span>);
+ }
+ <span class='ident'>c</span>.<span class='ident'>compile</span>(<span class='ident'>output</span>)
+}
+
+<span class='kw'>impl</span> <span class='ident'>Config</span> {
+ <span class='doccomment'>/// Construct a new instance of a blank set of configuration.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This builder is finished with the `compile` function.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Config</span> {
+ <span class='ident'>Config</span> {
+ <span class='ident'>include_directories</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>definitions</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>objects</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>flags</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>files</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>cpp</span>: <span class='boolval'>false</span>,
+ <span class='ident'>cpp_link_stdlib</span>: <span class='ident'>target_default_cpp_stdlib</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>into</span>()),
+ <span class='ident'>cpp_set_stdlib</span>: <span class='prelude-val'>None</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Add a directory to the `-I` or include path for headers</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>include</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>dir</span>: <span class='ident'>P</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>include_directories</span>.<span class='ident'>push</span>(<span class='ident'>dir</span>.<span class='ident'>as_ref</span>().<span class='ident'>to_path_buf</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Specify a `-D` variable with an optional value.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>define</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>var</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>val</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>definitions</span>.<span class='ident'>push</span>((<span class='ident'>var</span>.<span class='ident'>to_string</span>(), <span class='ident'>val</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>to_string</span>())));
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Add an arbitrary object file to link in</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>object</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>obj</span>: <span class='ident'>P</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>objects</span>.<span class='ident'>push</span>(<span class='ident'>obj</span>.<span class='ident'>as_ref</span>().<span class='ident'>to_path_buf</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Add an arbitrary flag to the invocation of the compiler</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>flag</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>flag</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>push</span>(<span class='ident'>flag</span>.<span class='ident'>to_string</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Add a file which will be compiled</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>file</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>p</span>: <span class='ident'>P</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>files</span>.<span class='ident'>push</span>(<span class='ident'>p</span>.<span class='ident'>as_ref</span>().<span class='ident'>to_path_buf</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Set C++ support.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The other `cpp_*` options will only become active if this is set to</span>
+ <span class='doccomment'>/// `true`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cpp</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cpp</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>cpp</span> <span class='op'>=</span> <span class='ident'>cpp</span>;
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Set the standard library to link against when compiling with C++</span>
+ <span class='doccomment'>/// support.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The default value of this property depends on the current target: On</span>
+ <span class='doccomment'>/// OS X `Some(&quot;c++&quot;)` is used, when compiling for a Visual Studio based</span>
+ <span class='doccomment'>/// target `None` is used and for other targets `Some(&quot;stdc++&quot;)` is used.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A value of `None` indicates that no automatic linking should happen,</span>
+ <span class='doccomment'>/// otherwise cargo will link against the specified library.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The given library name must not contain the `lib` prefix.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cpp_link_stdlib</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cpp_link_stdlib</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>cpp_link_stdlib</span> <span class='op'>=</span> <span class='ident'>cpp_link_stdlib</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>into</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Force the C++ compiler to use the specified standard library.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Setting this option will automatically set `cpp_link_stdlib` to the same</span>
+ <span class='doccomment'>/// value.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The default value of this option is always `None`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This option has no effect when compiling for a Visual Studio based</span>
+ <span class='doccomment'>/// target.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This option sets the `-stdlib` flag, which is only supported by some</span>
+ <span class='doccomment'>/// compilers (clang, icc) but not by others (gcc). The library will not</span>
+ <span class='doccomment'>/// detect which compiler is used, as such it is the responsibility of the</span>
+ <span class='doccomment'>/// caller to ensure that this option is only used in conjuction with a</span>
+ <span class='doccomment'>/// compiler which supports the `-stdlib` flag.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A value of `None` indicates that no specific C++ standard library should</span>
+ <span class='doccomment'>/// be used, otherwise `-stdlib` is added to the compile invocation.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The given library name must not contain the `lib` prefix.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cpp_set_stdlib</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cpp_set_stdlib</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>cpp_set_stdlib</span> <span class='op'>=</span> <span class='ident'>cpp_set_stdlib</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>into</span>());
+
+ <span class='self'>self</span>.<span class='ident'>cpp_link_stdlib</span>(<span class='ident'>cpp_set_stdlib</span>);
+
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Run the compiler, generating the file `output`</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The name `output` must begin with `lib` and end with `.a`</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>compile</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>output</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>output</span>.<span class='ident'>starts_with</span>(<span class='string'>&quot;lib&quot;</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>output</span>.<span class='ident'>ends_with</span>(<span class='string'>&quot;.a&quot;</span>));
+ <span class='kw'>let</span> <span class='ident'>lib_name</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>output</span>[<span class='number'>3</span>..<span class='ident'>output</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='number'>2</span>];
+
+ <span class='kw'>let</span> <span class='ident'>target</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;TARGET&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>src</span> <span class='op'>=</span> <span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;CARGO_MANIFEST_DIR&quot;</span>));
+ <span class='kw'>let</span> <span class='ident'>dst</span> <span class='op'>=</span> <span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;OUT_DIR&quot;</span>));
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>objects</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>file</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>files</span>.<span class='ident'>iter</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cmd</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>compile_cmd</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>);
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='ident'>src</span>.<span class='ident'>join</span>(<span class='ident'>file</span>));
+
+ <span class='kw'>let</span> <span class='ident'>obj</span> <span class='op'>=</span> <span class='ident'>dst</span>.<span class='ident'>join</span>(<span class='ident'>file</span>).<span class='ident'>with_extension</span>(<span class='string'>&quot;o&quot;</span>);
+ <span class='ident'>fs</span>::<span class='ident'>create_dir_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>obj</span>.<span class='ident'>parent</span>().<span class='ident'>unwrap</span>()).<span class='ident'>unwrap</span>();
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>OsString</span>::<span class='ident'>from</span>(<span class='string'>&quot;/Fo:&quot;</span>);
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='kw-2'>&amp;</span><span class='ident'>obj</span>);
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='ident'>s</span>);
+ } <span class='kw'>else</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-o&quot;</span>).<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='ident'>obj</span>);
+ }
+ <span class='ident'>run</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>cmd</span>, <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>compiler</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>));
+ <span class='ident'>objects</span>.<span class='ident'>push</span>(<span class='ident'>obj</span>);
+ }
+
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='ident'>OsString</span>::<span class='ident'>from</span>(<span class='string'>&quot;/OUT:&quot;</span>);
+ <span class='ident'>out</span>.<span class='ident'>push</span>(<span class='ident'>dst</span>.<span class='ident'>join</span>(<span class='ident'>output</span>));
+ <span class='ident'>run</span>(<span class='ident'>Command</span>::<span class='ident'>new</span>(<span class='string'>&quot;lib&quot;</span>).<span class='ident'>arg</span>(<span class='ident'>out</span>).<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='ident'>objects</span>).<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>objects</span>),
+ <span class='string'>&quot;lib&quot;</span>);
+
+ <span class='comment'>// The Rust compiler will look for libfoo.a and foo.lib, but the</span>
+ <span class='comment'>// MSVC linker will also be passed foo.lib, so be sure that both</span>
+ <span class='comment'>// exist for now.</span>
+ <span class='kw'>let</span> <span class='ident'>lib_dst</span> <span class='op'>=</span> <span class='ident'>dst</span>.<span class='ident'>join</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}.lib&quot;</span>, <span class='ident'>lib_name</span>));
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>fs</span>::<span class='ident'>remove_file</span>(<span class='kw-2'>&amp;</span><span class='ident'>lib_dst</span>);
+ <span class='ident'>fs</span>::<span class='ident'>hard_link</span>(<span class='ident'>dst</span>.<span class='ident'>join</span>(<span class='ident'>output</span>), <span class='ident'>lib_dst</span>).<span class='ident'>unwrap</span>();
+ } <span class='kw'>else</span> {
+ <span class='ident'>run</span>(<span class='ident'>Command</span>::<span class='ident'>new</span>(<span class='kw-2'>&amp;</span><span class='ident'>ar</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>)).<span class='ident'>arg</span>(<span class='string'>&quot;crus&quot;</span>)
+ .<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='ident'>dst</span>.<span class='ident'>join</span>(<span class='ident'>output</span>))
+ .<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='ident'>objects</span>)
+ .<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>objects</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ar</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>));
+ }
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-search=native={}&quot;</span>, <span class='ident'>dst</span>.<span class='ident'>display</span>());
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-lib=static={}&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>output</span>[<span class='number'>3</span>..<span class='ident'>output</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='number'>2</span>]);
+
+ <span class='comment'>// Add specific C++ libraries, if enabled.</span>
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cpp</span> {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>stdlib</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cpp_link_stdlib</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-lib={}&quot;</span>, <span class='ident'>stdlib</span>);
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>compiler</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cpp</span> {
+ <span class='ident'>gxx</span>(<span class='ident'>target</span>)
+ } <span class='kw'>else</span> {
+ <span class='ident'>gcc</span>(<span class='ident'>target</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>compile_flags</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cpp</span> {
+ <span class='ident'>cxxflags</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>cflags</span>()
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>compile_cmd</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Command</span> {
+ <span class='kw'>let</span> <span class='ident'>opt_level</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;OPT_LEVEL&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>profile</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;PROFILE&quot;</span>);
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;{} {}&quot;</span>, <span class='ident'>profile</span>, <span class='ident'>opt_level</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cmd</span> <span class='op'>=</span> <span class='ident'>Command</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>compiler</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>));
+
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;/c&quot;</span>);
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;/MD&quot;</span>); <span class='comment'>// link against msvcrt.dll for now</span>
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;/O{}&quot;</span>, <span class='ident'>opt_level</span>));
+ } <span class='kw'>else</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;-O{}&quot;</span>, <span class='ident'>opt_level</span>));
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-c&quot;</span>);
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-ffunction-sections&quot;</span>).<span class='ident'>arg</span>(<span class='string'>&quot;-fdata-sections&quot;</span>);
+ }
+ <span class='ident'>cmd</span>.<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>compile_flags</span>());
+
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;-ios&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='ident'>ios_flags</span>(<span class='kw-2'>&amp;</span><span class='ident'>target</span>));
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;windows&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-mwin32&quot;</span>);
+ }
+
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;i686&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-m32&quot;</span>);
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;x86_64&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-m64&quot;</span>);
+ }
+
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;i686&quot;</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;-fPIC&quot;</span>);
+ }
+ }
+
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cpp</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>stdlib</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cpp_set_stdlib</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;-stdlib=lib{}&quot;</span>, <span class='ident'>stdlib</span>));
+ }
+ }
+
+ <span class='kw'>for</span> <span class='ident'>directory</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>include_directories</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {<span class='string'>&quot;/I&quot;</span>} <span class='kw'>else</span> {<span class='string'>&quot;-I&quot;</span>});
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='ident'>directory</span>);
+ }
+
+ <span class='kw'>for</span> <span class='ident'>flag</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='ident'>flag</span>);
+ }
+
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>key</span>, <span class='kw-2'>ref</span> <span class='ident'>value</span>) <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>definitions</span>.<span class='ident'>iter</span>() {
+ <span class='kw'>let</span> <span class='ident'>lead</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {<span class='string'>&quot;/&quot;</span>} <span class='kw'>else</span> {<span class='string'>&quot;-&quot;</span>};
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='kw-2'>&amp;</span><span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>value</span>) <span class='op'>=</span> <span class='ident'>value</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}D{}={}&quot;</span>, <span class='ident'>lead</span>, <span class='ident'>key</span>, <span class='ident'>value</span>));
+ } <span class='kw'>else</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}D{}&quot;</span>, <span class='ident'>lead</span>, <span class='ident'>key</span>));
+ }
+ }
+ <span class='kw'>return</span> <span class='ident'>cmd</span>;
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>run</span>(<span class='ident'>cmd</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Command</span>, <span class='ident'>program</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;running: {:?}&quot;</span>, <span class='ident'>cmd</span>);
+ <span class='kw'>let</span> <span class='ident'>status</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>cmd</span>.<span class='ident'>status</span>() {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>status</span>) <span class='op'>=&gt;</span> <span class='ident'>status</span>,
+ <span class='prelude-val'>Err</span>(<span class='kw-2'>ref</span> <span class='ident'>e</span>) <span class='kw'>if</span> <span class='ident'>e</span>.<span class='ident'>kind</span>() <span class='op'>==</span> <span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>NotFound</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>extra</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>windows</span>) {
+ <span class='string'>&quot; (see https://github.com/alexcrichton/gcc-rs#windows-notes \
+ for help)&quot;</span>
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;&quot;</span>
+ };
+ <span class='ident'>fail</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;failed to execute command: {}\nIs `{}` \
+ not installed?{}&quot;</span>, <span class='ident'>e</span>, <span class='ident'>program</span>, <span class='ident'>extra</span>));
+ }
+ <span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='ident'>fail</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;failed to execute command: {}&quot;</span>, <span class='ident'>e</span>)),
+ };
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>status</span>.<span class='ident'>success</span>() {
+ <span class='ident'>fail</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;command did not execute successfully, got: {}&quot;</span>, <span class='ident'>status</span>));
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>get_var</span>(<span class='ident'>var_base</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>String</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>target</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;TARGET&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>host</span> <span class='op'>=</span> <span class='ident'>getenv_unwrap</span>(<span class='string'>&quot;HOST&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>kind</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>host</span> <span class='op'>==</span> <span class='ident'>target</span> {<span class='string'>&quot;HOST&quot;</span>} <span class='kw'>else</span> {<span class='string'>&quot;TARGET&quot;</span>};
+ <span class='kw'>let</span> <span class='ident'>target_u</span> <span class='op'>=</span> <span class='ident'>target</span>.<span class='ident'>replace</span>(<span class='string'>&quot;-&quot;</span>, <span class='string'>&quot;_&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>getenv</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_{}&quot;</span>, <span class='ident'>var_base</span>, <span class='ident'>target</span>))
+ .<span class='ident'>or_else</span>(<span class='op'>||</span> <span class='ident'>getenv</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_{}&quot;</span>, <span class='ident'>var_base</span>, <span class='ident'>target_u</span>)))
+ .<span class='ident'>or_else</span>(<span class='op'>||</span> <span class='ident'>getenv</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_{}&quot;</span>, <span class='ident'>kind</span>, <span class='ident'>var_base</span>)))
+ .<span class='ident'>or_else</span>(<span class='op'>||</span> <span class='ident'>getenv</span>(<span class='ident'>var_base</span>));
+
+ <span class='kw'>match</span> <span class='ident'>res</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>res</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Ok</span>(<span class='ident'>res</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='string'>&quot;Could not get environment variable&quot;</span>.<span class='ident'>to_string</span>()),
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>gcc</span>(<span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='ident'>is_android</span> <span class='op'>=</span> <span class='ident'>target</span>.<span class='ident'>find</span>(<span class='string'>&quot;android&quot;</span>).<span class='ident'>is_some</span>();
+
+ <span class='ident'>get_var</span>(<span class='string'>&quot;CC&quot;</span>).<span class='ident'>unwrap_or</span>(<span class='kw'>if</span> <span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>windows</span>) {
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='string'>&quot;cl&quot;</span>.<span class='ident'>to_string</span>()
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;gcc&quot;</span>.<span class='ident'>to_string</span>()
+ }
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>is_android</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}-gcc&quot;</span>, <span class='ident'>target</span>)
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;cc&quot;</span>.<span class='ident'>to_string</span>()
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>gxx</span>(<span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='ident'>is_android</span> <span class='op'>=</span> <span class='ident'>target</span>.<span class='ident'>find</span>(<span class='string'>&quot;android&quot;</span>).<span class='ident'>is_some</span>();
+
+ <span class='ident'>get_var</span>(<span class='string'>&quot;CXX&quot;</span>).<span class='ident'>unwrap_or</span>(<span class='kw'>if</span> <span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>windows</span>) {
+ <span class='kw'>if</span> <span class='ident'>target</span>.<span class='ident'>contains</span>(<span class='string'>&quot;msvc&quot;</span>) {
+ <span class='string'>&quot;cl&quot;</span>.<span class='ident'>to_string</span>()
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;g++&quot;</span>.<span class='ident'>to_string</span>()
+ }
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>is_android</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}-g++&quot;</span>, <span class='ident'>target</span>)
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;c++&quot;</span>.<span class='ident'>to_string</span>()
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>ar</span>(<span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='ident'>is_android</span> <span class='op'>=</span> <span class='ident'>target</span>.<span class='ident'>find</span>(<span class='string'>&quot;android&quot;</span>).<span class='ident'>is_some</span>();
+
+ <span class='ident'>get_var</span>(<span class='string'>&quot;AR&quot;</span>).<span class='ident'>unwrap_or</span>(<span class='kw'>if</span> <span class='ident'>is_android</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}-ar&quot;</span>, <span class='ident'>target</span>)
+ } <span class='kw'>else</span> {
+ <span class='string'>&quot;ar&quot;</span>.<span class='ident'>to_string</span>()
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>envflags</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>get_var</span>(<span class='ident'>name</span>).<span class='ident'>unwrap_or</span>(<span class='ident'>String</span>::<span class='ident'>new</span>())
+ .<span class='ident'>split</span>(<span class='op'>|</span><span class='ident'>c</span>: <span class='ident'>char</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>is_whitespace</span>()).<span class='ident'>filter</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='op'>!</span><span class='ident'>s</span>.<span class='ident'>is_empty</span>())
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>to_string</span>())
+ .<span class='ident'>collect</span>()
+}
+
+<span class='kw'>fn</span> <span class='ident'>cflags</span>() <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>envflags</span>(<span class='string'>&quot;CFLAGS&quot;</span>)
+}
+
+<span class='kw'>fn</span> <span class='ident'>cxxflags</span>() <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>envflags</span>(<span class='string'>&quot;CXXFLAGS&quot;</span>)
+}
+
+<span class='kw'>fn</span> <span class='ident'>ios_flags</span>(<span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>enum</span> <span class='ident'>ArchSpec</span> {
+ <span class='ident'>Device</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>),
+ <span class='ident'>Simulator</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>),
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
+
+ <span class='kw'>let</span> <span class='ident'>arch</span> <span class='op'>=</span> <span class='ident'>target</span>.<span class='ident'>split</span>(<span class='string'>&#39;-&#39;</span>).<span class='ident'>nth</span>(<span class='number'>0</span>).<span class='ident'>expect</span>(<span class='string'>&quot;expected target in format `arch-vendor-os`&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>arch</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>arch</span> {
+ <span class='string'>&quot;arm&quot;</span> <span class='op'>|</span> <span class='string'>&quot;armv7&quot;</span> <span class='op'>|</span> <span class='string'>&quot;thumbv7&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>ArchSpec</span>::<span class='ident'>Device</span>(<span class='string'>&quot;armv7&quot;</span>),
+ <span class='string'>&quot;armv7s&quot;</span> <span class='op'>|</span> <span class='string'>&quot;thumbv7s&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>ArchSpec</span>::<span class='ident'>Device</span>(<span class='string'>&quot;armv7s&quot;</span>),
+ <span class='string'>&quot;arm64&quot;</span> <span class='op'>|</span> <span class='string'>&quot;aarch64&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>ArchSpec</span>::<span class='ident'>Device</span>(<span class='string'>&quot;arm64&quot;</span>),
+ <span class='string'>&quot;i386&quot;</span> <span class='op'>|</span> <span class='string'>&quot;i686&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>ArchSpec</span>::<span class='ident'>Simulator</span>(<span class='string'>&quot;-m32&quot;</span>),
+ <span class='string'>&quot;x86_64&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>ArchSpec</span>::<span class='ident'>Simulator</span>(<span class='string'>&quot;-m64&quot;</span>),
+ _ <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(<span class='string'>&quot;Unknown arch for iOS target&quot;</span>)
+ };
+
+ <span class='kw'>let</span> <span class='ident'>sdk</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>arch</span> {
+ <span class='ident'>ArchSpec</span>::<span class='ident'>Device</span>(<span class='ident'>arch</span>) <span class='op'>=&gt;</span> {
+ <span class='ident'>res</span>.<span class='ident'>push</span>(<span class='string'>&quot;-arch&quot;</span>.<span class='ident'>to_string</span>());
+ <span class='ident'>res</span>.<span class='ident'>push</span>(<span class='ident'>arch</span>.<span class='ident'>to_string</span>());
+ <span class='string'>&quot;iphoneos&quot;</span>
+ },
+ <span class='ident'>ArchSpec</span>::<span class='ident'>Simulator</span>(<span class='ident'>arch</span>) <span class='op'>=&gt;</span> {
+ <span class='ident'>res</span>.<span class='ident'>push</span>(<span class='ident'>arch</span>.<span class='ident'>to_string</span>());
+ <span class='string'>&quot;iphonesimulator&quot;</span>
+ }
+ };
+
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Detecting iOS SDK path for {}&quot;</span>, <span class='ident'>sdk</span>);
+ <span class='kw'>let</span> <span class='ident'>sdk_path</span> <span class='op'>=</span> <span class='ident'>Command</span>::<span class='ident'>new</span>(<span class='string'>&quot;xcrun&quot;</span>)
+ .<span class='ident'>arg</span>(<span class='string'>&quot;--show-sdk-path&quot;</span>)
+ .<span class='ident'>arg</span>(<span class='string'>&quot;--sdk&quot;</span>)
+ .<span class='ident'>arg</span>(<span class='ident'>sdk</span>)
+ .<span class='ident'>stderr</span>(<span class='ident'>Stdio</span>::<span class='ident'>inherit</span>())
+ .<span class='ident'>output</span>()
+ .<span class='ident'>unwrap</span>()
+ .<span class='ident'>stdout</span>;
+
+ <span class='kw'>let</span> <span class='ident'>sdk_path</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>sdk_path</span>).<span class='ident'>unwrap</span>();
+
+ <span class='ident'>res</span>.<span class='ident'>push</span>(<span class='string'>&quot;-isysroot&quot;</span>.<span class='ident'>to_string</span>());
+ <span class='ident'>res</span>.<span class='ident'>push</span>(<span class='ident'>sdk_path</span>.<span class='ident'>trim</span>().<span class='ident'>to_string</span>());
+
+ <span class='ident'>res</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>fail</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='op'>!</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;\n\n{}\n\n&quot;</span>, <span class='ident'>s</span>);
+ <span class='macro'>panic</span><span class='macro'>!</span>()
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "gcc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/callback.rs.html b/src/irsc/callback.rs.html
new file mode 100644
index 0000000..ed767cf
--- /dev/null
+++ b/src/irsc/callback.rs.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/callback.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>callback.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+</pre><pre class='rust '>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Callback</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Sized</span><span class='op'>&gt;</span> {
+ <span class='ident'>items</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='kw'>fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>A</span>)<span class='op'>&gt;</span>
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>A</span>: <span class='ident'>Sized</span><span class='op'>&gt;</span> <span class='ident'>Callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Callback</span><span class='op'>&lt;</span><span class='ident'>A</span><span class='op'>&gt;</span> {
+ <span class='ident'>Callback</span> { <span class='ident'>items</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>() }
+ }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>register</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw'>fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>A</span>)) {
+ <span class='self'>self</span>.<span class='ident'>items</span>.<span class='ident'>push</span>(<span class='ident'>f</span>)
+ }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fire</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>v</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>A</span>) {
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>items</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>(<span class='ident'>v</span>)) {}
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/client.rs.html b/src/irsc/client.rs.html
new file mode 100644
index 0000000..4b8adc5
--- /dev/null
+++ b/src/irsc/client.rs.html
@@ -0,0 +1,657 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/client.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>client.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::{
+ <span class='self'>self</span>,
+ <span class='ident'>Write</span>,
+ <span class='ident'>Read</span>,
+ <span class='ident'>BufRead</span>,
+ <span class='ident'>BufReader</span>,
+};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>net</span>::<span class='ident'>TcpStream</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::<span class='ident'>Cow</span>::{ <span class='self'>self</span>, <span class='ident'>Borrowed</span>, <span class='ident'>Owned</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{ <span class='ident'>Arc</span>, <span class='ident'>RwLock</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cell</span>::<span class='ident'>UnsafeCell</span>;
+
+<span class='kw'>use</span> <span class='ident'>carboxyl</span>::{ <span class='ident'>Stream</span>, <span class='ident'>Sink</span> };
+
+<span class='kw'>use</span> <span class='ident'>message</span>::<span class='ident'>Message</span>;
+<span class='kw'>use</span> <span class='ident'>command</span>::<span class='ident'>Command</span>;
+<span class='kw'>use</span> <span class='ident'>command</span>::<span class='ident'>Command</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>reply</span>::<span class='ident'>Reply</span>;
+<span class='kw'>use</span> <span class='ident'>event</span>::<span class='ident'>Event</span>;
+<span class='kw'>use</span> ::{ <span class='ident'>DEBUG</span>, <span class='prelude-ty'>Result</span>, <span class='ident'>IrscError</span> };
+
+<span class='kw'>use</span> <span class='ident'>openssl</span>::<span class='ident'>ssl</span>::{ <span class='ident'>Ssl</span>, <span class='ident'>SslContext</span>, <span class='ident'>SslMethod</span>, <span class='ident'>SslStream</span> };
+
+<span class='doccomment'>/// Yes, I don&#39;t like the name either, but it&#39;s private, so...</span>
+<span class='kw'>enum</span> <span class='ident'>StreamKind</span> {
+ <span class='ident'>Plain</span>(<span class='ident'>TcpStream</span>),
+ <span class='ident'>Ssl</span>(<span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>TcpStream</span><span class='op'>&gt;</span>)
+}
+
+<span class='kw'>impl</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>StreamKind</span> {
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>write</span>(<span class='ident'>buf</span>),
+ <span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>write</span>(<span class='ident'>buf</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>flush</span>(),
+ <span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>flush</span>()
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Read</span> <span class='kw'>for</span> <span class='ident'>StreamKind</span> {
+ <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>read</span>(<span class='ident'>buf</span>),
+ <span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>read</span>(<span class='ident'>buf</span>)
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Client</span> {
+ <span class='kw'>fn</span> <span class='ident'>send_message</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>msg</span>: <span class='ident'>Message</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>join</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>channel</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>password</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>JOIN</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>channel</span>.<span class='ident'>into</span>()], <span class='ident'>password</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>p</span><span class='op'>|</span> <span class='ident'>p</span>.<span class='ident'>into</span>()).<span class='ident'>collect</span>()).<span class='ident'>to_message</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>msg</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>to</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>message</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>PRIVMSG</span>(<span class='ident'>to</span>.<span class='ident'>into</span>(), <span class='ident'>message</span>.<span class='ident'>into</span>()).<span class='ident'>to_message</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>msg_many</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>to</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>message</span>: <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span><span class='ident'>str</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>for</span> <span class='ident'>m</span> <span class='kw'>in</span> <span class='ident'>message</span> {
+ <span class='self'>self</span>.<span class='ident'>msg</span>(<span class='ident'>to</span>, <span class='ident'>m</span>);
+ }
+ <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>msg_word_wrap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>to</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>message</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>limit</span>: <span class='ident'>u16</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>line</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>word</span> <span class='kw'>in</span> <span class='ident'>message</span>.<span class='ident'>split_whitespace</span>() {
+ <span class='kw'>if</span> <span class='ident'>line</span>.<span class='ident'>len</span>() <span class='op'>+</span> <span class='ident'>word</span>.<span class='ident'>len</span>() <span class='op'>&lt;</span> <span class='ident'>limit</span> <span class='kw'>as</span> <span class='ident'>usize</span> {
+ <span class='ident'>line</span>.<span class='ident'>push_str</span>(<span class='string'>&quot; &quot;</span>);
+ <span class='ident'>line</span>.<span class='ident'>push_str</span>(<span class='ident'>word</span>);
+ } <span class='kw'>else</span> {
+ <span class='macro'>debug</span><span class='macro'>!</span>(<span class='string'>&quot;Sending {}&quot;</span>, <span class='ident'>line</span>);
+ <span class='self'>self</span>.<span class='ident'>msg</span>(<span class='ident'>to</span>, <span class='kw-2'>&amp;</span><span class='ident'>line</span>);
+ <span class='ident'>line</span>.<span class='ident'>clear</span>();
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>msg</span>(<span class='ident'>to</span>, <span class='kw-2'>&amp;</span><span class='ident'>line</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>register</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>nick</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>user</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>desc</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>pass</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='prelude-ty'>Result</span>(<span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>pass</span>) <span class='op'>=</span> <span class='ident'>pass</span> {
+ <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>PASS</span>(<span class='ident'>pass</span>.<span class='ident'>into</span>()).<span class='ident'>to_message</span>()).<span class='ident'>inner</span>()
+ } <span class='kw'>else</span> { <span class='prelude-val'>Ok</span>(()) }
+ .<span class='ident'>and_then</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>NICK</span>(<span class='ident'>nick</span>.<span class='ident'>into</span>()).<span class='ident'>to_message</span>()).<span class='ident'>inner</span>())
+ .<span class='ident'>and_then</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>USER</span>(<span class='ident'>user</span>.<span class='ident'>into</span>(), <span class='ident'>Borrowed</span>(<span class='string'>&quot;0&quot;</span>), <span class='ident'>Borrowed</span>(<span class='string'>&quot;*&quot;</span>), <span class='ident'>desc</span>.<span class='ident'>into</span>()).<span class='ident'>to_message</span>()).<span class='ident'>inner</span>())
+ )
+ }
+
+}
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>OwnedClient</span> {
+ <span class='ident'>stream</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>StreamKind</span><span class='op'>&gt;</span>,
+ <span class='ident'>sink</span>: <span class='ident'>Sink</span><span class='op'>&lt;</span><span class='ident'>Message</span><span class='op'>&gt;</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>OwnedClient</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>OwnedClient</span> {
+ <span class='ident'>OwnedClient</span> {
+ <span class='ident'>stream</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>sink</span>: <span class='ident'>Sink</span>::<span class='ident'>new</span>()
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>handle_event</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>msg</span>: <span class='kw-2'>&amp;</span><span class='ident'>Message</span>) {
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>Command</span>::<span class='ident'>from_message</span>(<span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>PING</span>(<span class='ident'>s1</span>, <span class='ident'>s2</span>)) <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>send</span>(<span class='ident'>PONG</span>(<span class='ident'>s1</span>, <span class='ident'>s2</span>)),
+ _ <span class='op'>=&gt;</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ };
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>connect</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>host</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>port</span>: <span class='ident'>u16</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>stream</span>;
+ <span class='kw'>if</span> <span class='ident'>s</span>.<span class='ident'>is_some</span>() { <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>AlreadyConnected</span>)) }
+ <span class='op'>*</span><span class='ident'>s</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>TcpStream</span>::<span class='ident'>connect</span>((<span class='ident'>host</span>, <span class='ident'>port</span>)) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>tcp</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='ident'>tcp</span>)),
+ <span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>Io</span>(<span class='ident'>e</span>)))
+ };
+
+ <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>connect_ssl</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>host</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>port</span>: <span class='ident'>u16</span>, <span class='ident'>ssl</span>: <span class='ident'>Ssl</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>stream</span>;
+ <span class='kw'>if</span> <span class='ident'>s</span>.<span class='ident'>is_some</span>() { <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>AlreadyConnected</span>)) };
+ <span class='kw'>let</span> <span class='ident'>tcp_stream</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>TcpStream</span>::<span class='ident'>connect</span>((<span class='ident'>host</span>, <span class='ident'>port</span>)) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>tcp</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>tcp</span>),
+ <span class='prelude-val'>Err</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>Io</span>(<span class='ident'>e</span>)))
+ };
+
+ <span class='kw'>match</span> <span class='ident'>tcp_stream</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>tcp</span><span class='op'>|</span> <span class='ident'>SslStream</span>::<span class='ident'>new_from</span>(<span class='ident'>ssl</span>, <span class='ident'>tcp</span>)) {
+ <span class='prelude-val'>Some</span>(<span class='prelude-val'>Ok</span>(<span class='ident'>ssl_stream</span>)) <span class='op'>=&gt;</span> {
+ <span class='op'>*</span><span class='ident'>s</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='ident'>ssl_stream</span>));
+ <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ },
+ <span class='prelude-val'>Some</span>(<span class='prelude-val'>Err</span>(<span class='ident'>ssl_error</span>)) <span class='op'>=&gt;</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>Ssl</span>(<span class='ident'>ssl_error</span>))),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>NotConnected</span>))
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>send_raw</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='macro'>info</span><span class='macro'>!</span>(<span class='string'>&quot;&gt;&gt; {}&quot;</span>, <span class='ident'>s</span>);
+ <span class='kw'>if</span> <span class='ident'>DEBUG</span> <span class='op'>&amp;&amp;</span> <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>512</span> {
+ <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;Message too long, kittens will die if this runs in release mode. Msg: {}&quot;</span>, <span class='ident'>s</span>)
+ }
+
+ <span class='prelude-ty'>Result</span>(<span class='self'>self</span>.<span class='ident'>stream</span>.<span class='ident'>as_mut</span>()
+ .<span class='ident'>ok_or</span>(<span class='ident'>IrscError</span>::<span class='ident'>NotConnected</span>)
+ .<span class='ident'>and_then</span>(<span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>stream</span><span class='op'>|</span> <span class='ident'>stream</span>.<span class='ident'>write_all</span>(<span class='ident'>s</span>.<span class='ident'>as_bytes</span>())
+ .<span class='ident'>and_then</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='ident'>stream</span>.<span class='ident'>flush</span>())
+ .<span class='ident'>map_err</span>(<span class='ident'>IrscError</span>::<span class='ident'>Io</span>)))
+ }
+
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cmd</span>: <span class='ident'>Command</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>send_message</span>(<span class='ident'>cmd</span>.<span class='ident'>to_message</span>())
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>listen_with_callback</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>on_event</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>Fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Client</span>, <span class='kw-2'>&amp;</span><span class='ident'>Message</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Event</span><span class='op'>&gt;</span>) {
+ <span class='kw'>let</span> <span class='ident'>reader</span> <span class='op'>=</span> <span class='ident'>BufReader</span>::<span class='ident'>new</span>(<span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stream</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>)) <span class='op'>=&gt;</span> <span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>((<span class='op'>*</span><span class='ident'>s</span>).<span class='ident'>try_clone</span>().<span class='ident'>unwrap</span>()),
+ <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>)) <span class='op'>=&gt;</span> <span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>((<span class='op'>*</span><span class='ident'>s</span>).<span class='ident'>try_clone</span>().<span class='ident'>unwrap</span>()),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>NotConnected</span>))
+ });
+
+ <span class='kw'>for</span> <span class='ident'>raw_line</span> <span class='kw'>in</span> <span class='ident'>reader</span>.<span class='ident'>lines</span>() {
+ <span class='kw'>let</span> <span class='ident'>line</span> <span class='op'>=</span> <span class='ident'>raw_line</span>.<span class='ident'>as_ref</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>();
+ <span class='macro'>info</span><span class='macro'>!</span>(<span class='string'>&quot;&lt;&lt; {}&quot;</span>, <span class='ident'>raw_line</span>.<span class='ident'>unwrap</span>());
+
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Ok</span>(<span class='ident'>msg</span>) <span class='op'>=</span> <span class='ident'>line</span> {
+ <span class='self'>self</span>.<span class='ident'>handle_event</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>);
+
+ <span class='comment'>// Try to parse the message into a Command or a Reply, and call back.</span>
+ <span class='kw'>let</span> <span class='ident'>event</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>Command</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>Event</span>::<span class='ident'>Command</span>(<span class='ident'>m</span>)),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='ident'>Reply</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>r</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>Event</span>::<span class='ident'>Reply</span>(<span class='ident'>r</span>)),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ };
+ <span class='ident'>on_event</span>(<span class='self'>self</span>, <span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='ident'>event</span>);
+ }
+ }
+ <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ }
+
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>mutable_transmutes</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>listen_with_events</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>OwnedClient</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='self'>self</span>) };
+ <span class='kw'>let</span> <span class='ident'>reader</span> <span class='op'>=</span> <span class='ident'>BufReader</span>::<span class='ident'>new</span>(<span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stream</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>)) <span class='op'>=&gt;</span> <span class='ident'>StreamKind</span>::<span class='ident'>Plain</span>((<span class='op'>*</span><span class='ident'>s</span>).<span class='ident'>try_clone</span>().<span class='ident'>unwrap</span>()),
+ <span class='prelude-val'>Some</span>(<span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>)) <span class='op'>=&gt;</span> <span class='ident'>StreamKind</span>::<span class='ident'>Ssl</span>((<span class='op'>*</span><span class='ident'>s</span>).<span class='ident'>try_clone</span>().<span class='ident'>unwrap</span>()),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Err</span>(<span class='ident'>IrscError</span>::<span class='ident'>NotConnected</span>))
+ });
+
+ <span class='kw'>for</span> <span class='ident'>raw_line</span> <span class='kw'>in</span> <span class='ident'>reader</span>.<span class='ident'>lines</span>() {
+ <span class='kw'>let</span> <span class='ident'>line</span> <span class='op'>=</span> <span class='ident'>raw_line</span>.<span class='ident'>as_ref</span>().<span class='ident'>unwrap</span>().<span class='ident'>parse</span>();
+ <span class='macro'>info</span><span class='macro'>!</span>(<span class='string'>&quot;&lt;&lt; {}&quot;</span>, <span class='ident'>raw_line</span>.<span class='ident'>unwrap</span>());
+
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Ok</span>(<span class='ident'>msg</span>) <span class='op'>=</span> <span class='ident'>line</span> {
+ <span class='ident'>s</span>.<span class='ident'>handle_event</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>);
+ <span class='self'>self</span>.<span class='ident'>sink</span>.<span class='ident'>send</span>(<span class='ident'>msg</span>);
+ }
+ }
+ <span class='prelude-ty'>Result</span>(<span class='prelude-val'>Ok</span>(()))
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>into_shared</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SharedClient</span> {
+ <span class='ident'>SharedClient</span> {
+ <span class='ident'>client</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>OwnedClientCell</span>(<span class='ident'>UnsafeCell</span>::<span class='ident'>new</span>(<span class='self'>self</span>))),
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>messages</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span><span class='ident'>Message</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>sink</span>.<span class='ident'>stream</span>() }
+}
+
+<span class='kw'>struct</span> <span class='ident'>OwnedClientCell</span>(<span class='ident'>UnsafeCell</span><span class='op'>&lt;</span><span class='ident'>OwnedClient</span><span class='op'>&gt;</span>);
+<span class='kw'>unsafe</span> <span class='kw'>impl</span> <span class='ident'>Sync</span> <span class='kw'>for</span> <span class='ident'>OwnedClientCell</span> {}
+
+<span class='kw'>impl</span> <span class='ident'>Client</span> <span class='kw'>for</span> <span class='ident'>OwnedClient</span> {
+ <span class='kw'>fn</span> <span class='ident'>send_message</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>msg</span>: <span class='ident'>Message</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>send_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>.<span class='ident'>to_string</span>())
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SharedClient</span> {
+ <span class='ident'>client</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>OwnedClientCell</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>SharedClient</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>messages</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span>(<span class='ident'>SharedClient</span>, <span class='ident'>Message</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cl</span> <span class='op'>=</span> <span class='ident'>SharedClient</span> { <span class='ident'>client</span>: <span class='self'>self</span>.<span class='ident'>client</span>.<span class='ident'>clone</span>() };
+ <span class='kw'>unsafe</span> { <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='self'>self</span>.<span class='ident'>client</span>.<span class='number'>0</span>.<span class='ident'>get</span>() }.<span class='ident'>messages</span>()
+ .<span class='ident'>map</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>m</span><span class='op'>|</span> (<span class='ident'>cl</span>.<span class='ident'>clone</span>(), <span class='ident'>m</span>))
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>events</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span>(<span class='ident'>SharedClient</span>, <span class='ident'>Message</span>, <span class='ident'>Event</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>messages</span>().<span class='ident'>filter_map</span>(<span class='op'>|</span>(<span class='ident'>cl</span>, <span class='ident'>msg</span>)<span class='op'>|</span> <span class='kw'>match</span> <span class='ident'>Command</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>((<span class='ident'>cl</span>, <span class='ident'>msg</span>.<span class='ident'>clone</span>(), <span class='ident'>Event</span>::<span class='ident'>Command</span>(<span class='ident'>m</span>.<span class='ident'>clone</span>()).<span class='ident'>to_static</span>())),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='ident'>Reply</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>r</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>((<span class='ident'>cl</span>, <span class='ident'>msg</span>.<span class='ident'>clone</span>(), <span class='ident'>Event</span>::<span class='ident'>Reply</span>(<span class='ident'>r</span>).<span class='ident'>to_static</span>())),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>listen_with_events</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> { <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='self'>self</span>.<span class='ident'>client</span>.<span class='number'>0</span>.<span class='ident'>get</span>() }.<span class='ident'>listen_with_events</span>()
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>commands</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span>(<span class='ident'>SharedClient</span>, <span class='ident'>Message</span>, <span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>messages</span>().<span class='ident'>filter_map</span>(<span class='op'>|</span>(<span class='ident'>cl</span>, <span class='ident'>msg</span>)<span class='op'>|</span> <span class='kw'>match</span> <span class='ident'>Command</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>((<span class='ident'>cl</span>, <span class='ident'>msg</span>.<span class='ident'>clone</span>(), <span class='ident'>m</span>.<span class='ident'>to_static</span>())),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>replies</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Stream</span><span class='op'>&lt;</span>(<span class='ident'>SharedClient</span>, <span class='ident'>Message</span>, <span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>messages</span>().<span class='ident'>filter_map</span>(<span class='op'>|</span>(<span class='ident'>cl</span>, <span class='ident'>msg</span>)<span class='op'>|</span> <span class='kw'>match</span> <span class='ident'>Reply</span>::<span class='ident'>from_message</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>m</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>((<span class='ident'>cl</span>, <span class='ident'>msg</span>.<span class='ident'>clone</span>(), <span class='ident'>m</span>.<span class='ident'>to_static</span>())),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ })
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Client</span> <span class='kw'>for</span> <span class='ident'>SharedClient</span> {
+ <span class='kw'>fn</span> <span class='ident'>send_message</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>msg</span>: <span class='ident'>Message</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> { <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='self'>self</span>.<span class='ident'>client</span>.<span class='number'>0</span>.<span class='ident'>get</span>() }.<span class='ident'>send_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>.<span class='ident'>to_string</span>())
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/color.rs.html b/src/irsc/color.rs.html
new file mode 100644
index 0000000..de361f2
--- /dev/null
+++ b/src/irsc/color.rs.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/color.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>color.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+</pre><pre class='rust '>
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WHITE</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;00&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BLACK</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;01&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BLUE</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;02&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GREEN</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;03&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RED</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;04&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BROWN</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;05&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PURPLE</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;06&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ORANGE</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;07&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>YELLOW</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;08&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>LIME</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;09&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TEAL</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;10&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>LIGHT_CYAN</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;11&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>LIGHT_BLUE</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;12&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PINK</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;13&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GREY</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;14&quot;</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>LIGHT_GREY</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;15&quot;</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TRANSPARENT</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>&quot;99&quot;</span>;
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>normal</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x0F{}\x0F&quot;</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>bold</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x02{}\x02&quot;</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>italic</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x1D{}\x1D&quot;</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>underline</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x1F{}\x1F&quot;</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>foreground</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>foreground</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x03{}{}\x03&quot;</span>, <span class='ident'>foreground</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>background</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>background</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x03,{}{}\x03&quot;</span>, <span class='ident'>background</span>, <span class='ident'>s</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>color</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>foreground</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>background</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;\x03{},{}{}\x03&quot;</span>, <span class='ident'>foreground</span>, <span class='ident'>background</span>, <span class='ident'>s</span>)
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/command.rs.html b/src/irsc/command.rs.html
new file mode 100644
index 0000000..37fc316
--- /dev/null
+++ b/src/irsc/command.rs.html
@@ -0,0 +1,3997 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/command.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>command.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+<span id="1149">1149</span>
+<span id="1150">1150</span>
+<span id="1151">1151</span>
+<span id="1152">1152</span>
+<span id="1153">1153</span>
+<span id="1154">1154</span>
+<span id="1155">1155</span>
+<span id="1156">1156</span>
+<span id="1157">1157</span>
+<span id="1158">1158</span>
+<span id="1159">1159</span>
+<span id="1160">1160</span>
+<span id="1161">1161</span>
+<span id="1162">1162</span>
+<span id="1163">1163</span>
+<span id="1164">1164</span>
+<span id="1165">1165</span>
+<span id="1166">1166</span>
+<span id="1167">1167</span>
+<span id="1168">1168</span>
+<span id="1169">1169</span>
+<span id="1170">1170</span>
+<span id="1171">1171</span>
+<span id="1172">1172</span>
+<span id="1173">1173</span>
+<span id="1174">1174</span>
+<span id="1175">1175</span>
+<span id="1176">1176</span>
+<span id="1177">1177</span>
+<span id="1178">1178</span>
+<span id="1179">1179</span>
+<span id="1180">1180</span>
+<span id="1181">1181</span>
+<span id="1182">1182</span>
+<span id="1183">1183</span>
+<span id="1184">1184</span>
+<span id="1185">1185</span>
+<span id="1186">1186</span>
+<span id="1187">1187</span>
+<span id="1188">1188</span>
+<span id="1189">1189</span>
+<span id="1190">1190</span>
+<span id="1191">1191</span>
+<span id="1192">1192</span>
+<span id="1193">1193</span>
+<span id="1194">1194</span>
+<span id="1195">1195</span>
+<span id="1196">1196</span>
+<span id="1197">1197</span>
+<span id="1198">1198</span>
+<span id="1199">1199</span>
+<span id="1200">1200</span>
+<span id="1201">1201</span>
+<span id="1202">1202</span>
+<span id="1203">1203</span>
+<span id="1204">1204</span>
+<span id="1205">1205</span>
+<span id="1206">1206</span>
+<span id="1207">1207</span>
+<span id="1208">1208</span>
+<span id="1209">1209</span>
+<span id="1210">1210</span>
+<span id="1211">1211</span>
+<span id="1212">1212</span>
+<span id="1213">1213</span>
+<span id="1214">1214</span>
+<span id="1215">1215</span>
+<span id="1216">1216</span>
+<span id="1217">1217</span>
+<span id="1218">1218</span>
+<span id="1219">1219</span>
+<span id="1220">1220</span>
+<span id="1221">1221</span>
+<span id="1222">1222</span>
+<span id="1223">1223</span>
+<span id="1224">1224</span>
+<span id="1225">1225</span>
+<span id="1226">1226</span>
+<span id="1227">1227</span>
+<span id="1228">1228</span>
+<span id="1229">1229</span>
+<span id="1230">1230</span>
+<span id="1231">1231</span>
+<span id="1232">1232</span>
+<span id="1233">1233</span>
+<span id="1234">1234</span>
+<span id="1235">1235</span>
+<span id="1236">1236</span>
+<span id="1237">1237</span>
+<span id="1238">1238</span>
+<span id="1239">1239</span>
+<span id="1240">1240</span>
+<span id="1241">1241</span>
+<span id="1242">1242</span>
+<span id="1243">1243</span>
+<span id="1244">1244</span>
+<span id="1245">1245</span>
+<span id="1246">1246</span>
+<span id="1247">1247</span>
+<span id="1248">1248</span>
+<span id="1249">1249</span>
+<span id="1250">1250</span>
+<span id="1251">1251</span>
+<span id="1252">1252</span>
+<span id="1253">1253</span>
+<span id="1254">1254</span>
+<span id="1255">1255</span>
+<span id="1256">1256</span>
+<span id="1257">1257</span>
+<span id="1258">1258</span>
+<span id="1259">1259</span>
+<span id="1260">1260</span>
+<span id="1261">1261</span>
+<span id="1262">1262</span>
+<span id="1263">1263</span>
+<span id="1264">1264</span>
+<span id="1265">1265</span>
+<span id="1266">1266</span>
+<span id="1267">1267</span>
+<span id="1268">1268</span>
+<span id="1269">1269</span>
+<span id="1270">1270</span>
+<span id="1271">1271</span>
+<span id="1272">1272</span>
+<span id="1273">1273</span>
+<span id="1274">1274</span>
+<span id="1275">1275</span>
+<span id="1276">1276</span>
+<span id="1277">1277</span>
+<span id="1278">1278</span>
+<span id="1279">1279</span>
+<span id="1280">1280</span>
+<span id="1281">1281</span>
+<span id="1282">1282</span>
+<span id="1283">1283</span>
+<span id="1284">1284</span>
+<span id="1285">1285</span>
+<span id="1286">1286</span>
+<span id="1287">1287</span>
+<span id="1288">1288</span>
+<span id="1289">1289</span>
+<span id="1290">1290</span>
+<span id="1291">1291</span>
+<span id="1292">1292</span>
+<span id="1293">1293</span>
+<span id="1294">1294</span>
+<span id="1295">1295</span>
+<span id="1296">1296</span>
+<span id="1297">1297</span>
+<span id="1298">1298</span>
+<span id="1299">1299</span>
+<span id="1300">1300</span>
+<span id="1301">1301</span>
+<span id="1302">1302</span>
+<span id="1303">1303</span>
+<span id="1304">1304</span>
+<span id="1305">1305</span>
+<span id="1306">1306</span>
+<span id="1307">1307</span>
+<span id="1308">1308</span>
+<span id="1309">1309</span>
+<span id="1310">1310</span>
+<span id="1311">1311</span>
+<span id="1312">1312</span>
+<span id="1313">1313</span>
+<span id="1314">1314</span>
+<span id="1315">1315</span>
+<span id="1316">1316</span>
+<span id="1317">1317</span>
+<span id="1318">1318</span>
+<span id="1319">1319</span>
+<span id="1320">1320</span>
+<span id="1321">1321</span>
+<span id="1322">1322</span>
+<span id="1323">1323</span>
+<span id="1324">1324</span>
+<span id="1325">1325</span>
+<span id="1326">1326</span>
+<span id="1327">1327</span>
+<span id="1328">1328</span>
+<span id="1329">1329</span>
+<span id="1330">1330</span>
+<span id="1331">1331</span>
+<span id="1332">1332</span>
+<span id="1333">1333</span>
+<span id="1334">1334</span>
+<span id="1335">1335</span>
+<span id="1336">1336</span>
+<span id="1337">1337</span>
+<span id="1338">1338</span>
+<span id="1339">1339</span>
+<span id="1340">1340</span>
+<span id="1341">1341</span>
+<span id="1342">1342</span>
+<span id="1343">1343</span>
+<span id="1344">1344</span>
+<span id="1345">1345</span>
+<span id="1346">1346</span>
+<span id="1347">1347</span>
+<span id="1348">1348</span>
+<span id="1349">1349</span>
+<span id="1350">1350</span>
+<span id="1351">1351</span>
+<span id="1352">1352</span>
+<span id="1353">1353</span>
+<span id="1354">1354</span>
+<span id="1355">1355</span>
+<span id="1356">1356</span>
+<span id="1357">1357</span>
+<span id="1358">1358</span>
+<span id="1359">1359</span>
+<span id="1360">1360</span>
+<span id="1361">1361</span>
+<span id="1362">1362</span>
+<span id="1363">1363</span>
+<span id="1364">1364</span>
+<span id="1365">1365</span>
+<span id="1366">1366</span>
+<span id="1367">1367</span>
+<span id="1368">1368</span>
+<span id="1369">1369</span>
+<span id="1370">1370</span>
+<span id="1371">1371</span>
+<span id="1372">1372</span>
+<span id="1373">1373</span>
+<span id="1374">1374</span>
+<span id="1375">1375</span>
+<span id="1376">1376</span>
+<span id="1377">1377</span>
+<span id="1378">1378</span>
+<span id="1379">1379</span>
+<span id="1380">1380</span>
+<span id="1381">1381</span>
+<span id="1382">1382</span>
+<span id="1383">1383</span>
+<span id="1384">1384</span>
+<span id="1385">1385</span>
+<span id="1386">1386</span>
+<span id="1387">1387</span>
+<span id="1388">1388</span>
+<span id="1389">1389</span>
+<span id="1390">1390</span>
+<span id="1391">1391</span>
+<span id="1392">1392</span>
+<span id="1393">1393</span>
+<span id="1394">1394</span>
+<span id="1395">1395</span>
+<span id="1396">1396</span>
+<span id="1397">1397</span>
+<span id="1398">1398</span>
+<span id="1399">1399</span>
+<span id="1400">1400</span>
+<span id="1401">1401</span>
+<span id="1402">1402</span>
+<span id="1403">1403</span>
+<span id="1404">1404</span>
+<span id="1405">1405</span>
+<span id="1406">1406</span>
+<span id="1407">1407</span>
+<span id="1408">1408</span>
+<span id="1409">1409</span>
+<span id="1410">1410</span>
+<span id="1411">1411</span>
+<span id="1412">1412</span>
+<span id="1413">1413</span>
+<span id="1414">1414</span>
+<span id="1415">1415</span>
+<span id="1416">1416</span>
+<span id="1417">1417</span>
+<span id="1418">1418</span>
+<span id="1419">1419</span>
+<span id="1420">1420</span>
+<span id="1421">1421</span>
+<span id="1422">1422</span>
+<span id="1423">1423</span>
+<span id="1424">1424</span>
+<span id="1425">1425</span>
+<span id="1426">1426</span>
+<span id="1427">1427</span>
+<span id="1428">1428</span>
+<span id="1429">1429</span>
+<span id="1430">1430</span>
+<span id="1431">1431</span>
+<span id="1432">1432</span>
+<span id="1433">1433</span>
+<span id="1434">1434</span>
+<span id="1435">1435</span>
+<span id="1436">1436</span>
+<span id="1437">1437</span>
+<span id="1438">1438</span>
+<span id="1439">1439</span>
+<span id="1440">1440</span>
+<span id="1441">1441</span>
+<span id="1442">1442</span>
+<span id="1443">1443</span>
+<span id="1444">1444</span>
+<span id="1445">1445</span>
+<span id="1446">1446</span>
+<span id="1447">1447</span>
+<span id="1448">1448</span>
+<span id="1449">1449</span>
+<span id="1450">1450</span>
+<span id="1451">1451</span>
+<span id="1452">1452</span>
+<span id="1453">1453</span>
+<span id="1454">1454</span>
+<span id="1455">1455</span>
+<span id="1456">1456</span>
+<span id="1457">1457</span>
+<span id="1458">1458</span>
+<span id="1459">1459</span>
+<span id="1460">1460</span>
+<span id="1461">1461</span>
+<span id="1462">1462</span>
+<span id="1463">1463</span>
+<span id="1464">1464</span>
+<span id="1465">1465</span>
+<span id="1466">1466</span>
+<span id="1467">1467</span>
+<span id="1468">1468</span>
+<span id="1469">1469</span>
+<span id="1470">1470</span>
+<span id="1471">1471</span>
+<span id="1472">1472</span>
+<span id="1473">1473</span>
+<span id="1474">1474</span>
+<span id="1475">1475</span>
+<span id="1476">1476</span>
+<span id="1477">1477</span>
+<span id="1478">1478</span>
+<span id="1479">1479</span>
+<span id="1480">1480</span>
+<span id="1481">1481</span>
+<span id="1482">1482</span>
+<span id="1483">1483</span>
+<span id="1484">1484</span>
+<span id="1485">1485</span>
+<span id="1486">1486</span>
+<span id="1487">1487</span>
+<span id="1488">1488</span>
+<span id="1489">1489</span>
+<span id="1490">1490</span>
+<span id="1491">1491</span>
+<span id="1492">1492</span>
+<span id="1493">1493</span>
+<span id="1494">1494</span>
+<span id="1495">1495</span>
+<span id="1496">1496</span>
+<span id="1497">1497</span>
+<span id="1498">1498</span>
+<span id="1499">1499</span>
+<span id="1500">1500</span>
+<span id="1501">1501</span>
+<span id="1502">1502</span>
+<span id="1503">1503</span>
+<span id="1504">1504</span>
+<span id="1505">1505</span>
+<span id="1506">1506</span>
+<span id="1507">1507</span>
+<span id="1508">1508</span>
+<span id="1509">1509</span>
+<span id="1510">1510</span>
+<span id="1511">1511</span>
+<span id="1512">1512</span>
+<span id="1513">1513</span>
+<span id="1514">1514</span>
+<span id="1515">1515</span>
+<span id="1516">1516</span>
+<span id="1517">1517</span>
+<span id="1518">1518</span>
+<span id="1519">1519</span>
+<span id="1520">1520</span>
+<span id="1521">1521</span>
+<span id="1522">1522</span>
+<span id="1523">1523</span>
+<span id="1524">1524</span>
+<span id="1525">1525</span>
+<span id="1526">1526</span>
+<span id="1527">1527</span>
+<span id="1528">1528</span>
+<span id="1529">1529</span>
+<span id="1530">1530</span>
+<span id="1531">1531</span>
+<span id="1532">1532</span>
+<span id="1533">1533</span>
+<span id="1534">1534</span>
+<span id="1535">1535</span>
+<span id="1536">1536</span>
+<span id="1537">1537</span>
+<span id="1538">1538</span>
+<span id="1539">1539</span>
+<span id="1540">1540</span>
+<span id="1541">1541</span>
+<span id="1542">1542</span>
+<span id="1543">1543</span>
+<span id="1544">1544</span>
+<span id="1545">1545</span>
+<span id="1546">1546</span>
+<span id="1547">1547</span>
+<span id="1548">1548</span>
+<span id="1549">1549</span>
+<span id="1550">1550</span>
+<span id="1551">1551</span>
+<span id="1552">1552</span>
+<span id="1553">1553</span>
+<span id="1554">1554</span>
+<span id="1555">1555</span>
+<span id="1556">1556</span>
+<span id="1557">1557</span>
+<span id="1558">1558</span>
+<span id="1559">1559</span>
+<span id="1560">1560</span>
+<span id="1561">1561</span>
+<span id="1562">1562</span>
+<span id="1563">1563</span>
+<span id="1564">1564</span>
+<span id="1565">1565</span>
+<span id="1566">1566</span>
+<span id="1567">1567</span>
+<span id="1568">1568</span>
+<span id="1569">1569</span>
+<span id="1570">1570</span>
+<span id="1571">1571</span>
+<span id="1572">1572</span>
+<span id="1573">1573</span>
+<span id="1574">1574</span>
+<span id="1575">1575</span>
+<span id="1576">1576</span>
+<span id="1577">1577</span>
+<span id="1578">1578</span>
+<span id="1579">1579</span>
+<span id="1580">1580</span>
+<span id="1581">1581</span>
+<span id="1582">1582</span>
+<span id="1583">1583</span>
+<span id="1584">1584</span>
+<span id="1585">1585</span>
+<span id="1586">1586</span>
+<span id="1587">1587</span>
+<span id="1588">1588</span>
+<span id="1589">1589</span>
+<span id="1590">1590</span>
+<span id="1591">1591</span>
+<span id="1592">1592</span>
+<span id="1593">1593</span>
+<span id="1594">1594</span>
+<span id="1595">1595</span>
+<span id="1596">1596</span>
+<span id="1597">1597</span>
+<span id="1598">1598</span>
+<span id="1599">1599</span>
+<span id="1600">1600</span>
+<span id="1601">1601</span>
+<span id="1602">1602</span>
+<span id="1603">1603</span>
+<span id="1604">1604</span>
+<span id="1605">1605</span>
+<span id="1606">1606</span>
+<span id="1607">1607</span>
+<span id="1608">1608</span>
+<span id="1609">1609</span>
+<span id="1610">1610</span>
+<span id="1611">1611</span>
+<span id="1612">1612</span>
+<span id="1613">1613</span>
+<span id="1614">1614</span>
+<span id="1615">1615</span>
+<span id="1616">1616</span>
+<span id="1617">1617</span>
+<span id="1618">1618</span>
+<span id="1619">1619</span>
+<span id="1620">1620</span>
+<span id="1621">1621</span>
+<span id="1622">1622</span>
+<span id="1623">1623</span>
+<span id="1624">1624</span>
+<span id="1625">1625</span>
+<span id="1626">1626</span>
+<span id="1627">1627</span>
+<span id="1628">1628</span>
+<span id="1629">1629</span>
+<span id="1630">1630</span>
+<span id="1631">1631</span>
+<span id="1632">1632</span>
+<span id="1633">1633</span>
+<span id="1634">1634</span>
+<span id="1635">1635</span>
+<span id="1636">1636</span>
+<span id="1637">1637</span>
+<span id="1638">1638</span>
+<span id="1639">1639</span>
+<span id="1640">1640</span>
+<span id="1641">1641</span>
+<span id="1642">1642</span>
+<span id="1643">1643</span>
+<span id="1644">1644</span>
+<span id="1645">1645</span>
+<span id="1646">1646</span>
+<span id="1647">1647</span>
+<span id="1648">1648</span>
+<span id="1649">1649</span>
+<span id="1650">1650</span>
+<span id="1651">1651</span>
+<span id="1652">1652</span>
+<span id="1653">1653</span>
+<span id="1654">1654</span>
+<span id="1655">1655</span>
+<span id="1656">1656</span>
+<span id="1657">1657</span>
+<span id="1658">1658</span>
+<span id="1659">1659</span>
+<span id="1660">1660</span>
+<span id="1661">1661</span>
+<span id="1662">1662</span>
+<span id="1663">1663</span>
+<span id="1664">1664</span>
+<span id="1665">1665</span>
+<span id="1666">1666</span>
+<span id="1667">1667</span>
+<span id="1668">1668</span>
+<span id="1669">1669</span>
+<span id="1670">1670</span>
+<span id="1671">1671</span>
+<span id="1672">1672</span>
+<span id="1673">1673</span>
+<span id="1674">1674</span>
+<span id="1675">1675</span>
+<span id="1676">1676</span>
+<span id="1677">1677</span>
+<span id="1678">1678</span>
+<span id="1679">1679</span>
+<span id="1680">1680</span>
+<span id="1681">1681</span>
+<span id="1682">1682</span>
+<span id="1683">1683</span>
+<span id="1684">1684</span>
+<span id="1685">1685</span>
+<span id="1686">1686</span>
+<span id="1687">1687</span>
+<span id="1688">1688</span>
+<span id="1689">1689</span>
+<span id="1690">1690</span>
+<span id="1691">1691</span>
+<span id="1692">1692</span>
+<span id="1693">1693</span>
+<span id="1694">1694</span>
+<span id="1695">1695</span>
+<span id="1696">1696</span>
+<span id="1697">1697</span>
+<span id="1698">1698</span>
+<span id="1699">1699</span>
+<span id="1700">1700</span>
+<span id="1701">1701</span>
+<span id="1702">1702</span>
+<span id="1703">1703</span>
+<span id="1704">1704</span>
+<span id="1705">1705</span>
+<span id="1706">1706</span>
+<span id="1707">1707</span>
+<span id="1708">1708</span>
+<span id="1709">1709</span>
+<span id="1710">1710</span>
+<span id="1711">1711</span>
+<span id="1712">1712</span>
+<span id="1713">1713</span>
+<span id="1714">1714</span>
+<span id="1715">1715</span>
+<span id="1716">1716</span>
+<span id="1717">1717</span>
+<span id="1718">1718</span>
+<span id="1719">1719</span>
+<span id="1720">1720</span>
+<span id="1721">1721</span>
+<span id="1722">1722</span>
+<span id="1723">1723</span>
+<span id="1724">1724</span>
+<span id="1725">1725</span>
+<span id="1726">1726</span>
+<span id="1727">1727</span>
+<span id="1728">1728</span>
+<span id="1729">1729</span>
+<span id="1730">1730</span>
+<span id="1731">1731</span>
+<span id="1732">1732</span>
+<span id="1733">1733</span>
+<span id="1734">1734</span>
+<span id="1735">1735</span>
+<span id="1736">1736</span>
+<span id="1737">1737</span>
+<span id="1738">1738</span>
+<span id="1739">1739</span>
+<span id="1740">1740</span>
+<span id="1741">1741</span>
+<span id="1742">1742</span>
+<span id="1743">1743</span>
+<span id="1744">1744</span>
+<span id="1745">1745</span>
+<span id="1746">1746</span>
+<span id="1747">1747</span>
+<span id="1748">1748</span>
+<span id="1749">1749</span>
+<span id="1750">1750</span>
+<span id="1751">1751</span>
+<span id="1752">1752</span>
+<span id="1753">1753</span>
+<span id="1754">1754</span>
+<span id="1755">1755</span>
+<span id="1756">1756</span>
+<span id="1757">1757</span>
+<span id="1758">1758</span>
+<span id="1759">1759</span>
+<span id="1760">1760</span>
+<span id="1761">1761</span>
+<span id="1762">1762</span>
+<span id="1763">1763</span>
+<span id="1764">1764</span>
+<span id="1765">1765</span>
+<span id="1766">1766</span>
+<span id="1767">1767</span>
+<span id="1768">1768</span>
+<span id="1769">1769</span>
+<span id="1770">1770</span>
+<span id="1771">1771</span>
+<span id="1772">1772</span>
+<span id="1773">1773</span>
+<span id="1774">1774</span>
+<span id="1775">1775</span>
+<span id="1776">1776</span>
+<span id="1777">1777</span>
+<span id="1778">1778</span>
+<span id="1779">1779</span>
+<span id="1780">1780</span>
+<span id="1781">1781</span>
+<span id="1782">1782</span>
+<span id="1783">1783</span>
+<span id="1784">1784</span>
+<span id="1785">1785</span>
+<span id="1786">1786</span>
+<span id="1787">1787</span>
+<span id="1788">1788</span>
+<span id="1789">1789</span>
+<span id="1790">1790</span>
+<span id="1791">1791</span>
+<span id="1792">1792</span>
+<span id="1793">1793</span>
+<span id="1794">1794</span>
+<span id="1795">1795</span>
+<span id="1796">1796</span>
+<span id="1797">1797</span>
+<span id="1798">1798</span>
+<span id="1799">1799</span>
+<span id="1800">1800</span>
+<span id="1801">1801</span>
+<span id="1802">1802</span>
+<span id="1803">1803</span>
+<span id="1804">1804</span>
+<span id="1805">1805</span>
+<span id="1806">1806</span>
+<span id="1807">1807</span>
+<span id="1808">1808</span>
+<span id="1809">1809</span>
+<span id="1810">1810</span>
+<span id="1811">1811</span>
+<span id="1812">1812</span>
+<span id="1813">1813</span>
+<span id="1814">1814</span>
+<span id="1815">1815</span>
+<span id="1816">1816</span>
+<span id="1817">1817</span>
+<span id="1818">1818</span>
+<span id="1819">1819</span>
+<span id="1820">1820</span>
+<span id="1821">1821</span>
+<span id="1822">1822</span>
+<span id="1823">1823</span>
+<span id="1824">1824</span>
+<span id="1825">1825</span>
+<span id="1826">1826</span>
+<span id="1827">1827</span>
+<span id="1828">1828</span>
+<span id="1829">1829</span>
+<span id="1830">1830</span>
+<span id="1831">1831</span>
+<span id="1832">1832</span>
+<span id="1833">1833</span>
+<span id="1834">1834</span>
+<span id="1835">1835</span>
+<span id="1836">1836</span>
+<span id="1837">1837</span>
+<span id="1838">1838</span>
+<span id="1839">1839</span>
+<span id="1840">1840</span>
+<span id="1841">1841</span>
+<span id="1842">1842</span>
+<span id="1843">1843</span>
+<span id="1844">1844</span>
+<span id="1845">1845</span>
+<span id="1846">1846</span>
+<span id="1847">1847</span>
+<span id="1848">1848</span>
+<span id="1849">1849</span>
+<span id="1850">1850</span>
+<span id="1851">1851</span>
+<span id="1852">1852</span>
+<span id="1853">1853</span>
+<span id="1854">1854</span>
+<span id="1855">1855</span>
+<span id="1856">1856</span>
+<span id="1857">1857</span>
+<span id="1858">1858</span>
+<span id="1859">1859</span>
+<span id="1860">1860</span>
+<span id="1861">1861</span>
+<span id="1862">1862</span>
+<span id="1863">1863</span>
+<span id="1864">1864</span>
+<span id="1865">1865</span>
+<span id="1866">1866</span>
+<span id="1867">1867</span>
+<span id="1868">1868</span>
+<span id="1869">1869</span>
+<span id="1870">1870</span>
+<span id="1871">1871</span>
+<span id="1872">1872</span>
+<span id="1873">1873</span>
+<span id="1874">1874</span>
+<span id="1875">1875</span>
+<span id="1876">1876</span>
+<span id="1877">1877</span>
+<span id="1878">1878</span>
+<span id="1879">1879</span>
+<span id="1880">1880</span>
+<span id="1881">1881</span>
+<span id="1882">1882</span>
+<span id="1883">1883</span>
+<span id="1884">1884</span>
+<span id="1885">1885</span>
+<span id="1886">1886</span>
+<span id="1887">1887</span>
+<span id="1888">1888</span>
+<span id="1889">1889</span>
+<span id="1890">1890</span>
+<span id="1891">1891</span>
+<span id="1892">1892</span>
+<span id="1893">1893</span>
+<span id="1894">1894</span>
+<span id="1895">1895</span>
+<span id="1896">1896</span>
+<span id="1897">1897</span>
+<span id="1898">1898</span>
+<span id="1899">1899</span>
+<span id="1900">1900</span>
+<span id="1901">1901</span>
+<span id="1902">1902</span>
+<span id="1903">1903</span>
+<span id="1904">1904</span>
+<span id="1905">1905</span>
+<span id="1906">1906</span>
+<span id="1907">1907</span>
+<span id="1908">1908</span>
+<span id="1909">1909</span>
+<span id="1910">1910</span>
+<span id="1911">1911</span>
+<span id="1912">1912</span>
+<span id="1913">1913</span>
+<span id="1914">1914</span>
+<span id="1915">1915</span>
+<span id="1916">1916</span>
+<span id="1917">1917</span>
+<span id="1918">1918</span>
+<span id="1919">1919</span>
+<span id="1920">1920</span>
+<span id="1921">1921</span>
+<span id="1922">1922</span>
+<span id="1923">1923</span>
+<span id="1924">1924</span>
+<span id="1925">1925</span>
+<span id="1926">1926</span>
+<span id="1927">1927</span>
+<span id="1928">1928</span>
+<span id="1929">1929</span>
+<span id="1930">1930</span>
+<span id="1931">1931</span>
+<span id="1932">1932</span>
+<span id="1933">1933</span>
+<span id="1934">1934</span>
+<span id="1935">1935</span>
+<span id="1936">1936</span>
+<span id="1937">1937</span>
+<span id="1938">1938</span>
+<span id="1939">1939</span>
+<span id="1940">1940</span>
+<span id="1941">1941</span>
+<span id="1942">1942</span>
+<span id="1943">1943</span>
+<span id="1944">1944</span>
+<span id="1945">1945</span>
+<span id="1946">1946</span>
+<span id="1947">1947</span>
+<span id="1948">1948</span>
+<span id="1949">1949</span>
+<span id="1950">1950</span>
+</pre><pre class='rust '>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::{ <span class='ident'>Cow</span>, <span class='ident'>IntoCow</span>, <span class='ident'>Borrow</span>, <span class='ident'>ToOwned</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::<span class='ident'>Cow</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>Extend</span>;
+
+<span class='kw'>use</span> <span class='ident'>message</span>::{ <span class='ident'>Message</span>, <span class='ident'>MsgType</span> };
+
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span>;
+
+<span class='comment'>// If you hoped it couldn&#39;t get any uglier... I&#39;m sorry, it does.</span>
+<span class='comment'>// Why a giant match? API.</span>
+<span class='comment'>//</span>
+<span class='comment'>// I tried structuring it as a bunch of structs that impl a `Command` trait,</span>
+<span class='comment'>// but the user would have to use Any and lots of cats. Also, extensibility isn&#39;t</span>
+<span class='comment'>// really a goal; the IRC protocol doesn&#39;t seem to evolve very fast.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Granted, I *could* have used a phf-map to map to functions to parse this, which</span>
+<span class='comment'>// - while more readable - shouldn&#39;t have resulted in performance gains.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Please don&#39;t cry.</span>
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>Hash</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.1 Password message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: PASS</span>
+ <span class='doccomment'>/// Parameters: &lt;password&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The PASS command is used to set a &#39;connection password&#39;. The</span>
+ <span class='doccomment'>/// optional password can and MUST be set before any attempt to register</span>
+ <span class='doccomment'>/// the connection is made. Currently this requires that user send a</span>
+ <span class='doccomment'>/// PASS command before sending the NICK/USER combination.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PASS secretpasswordhere</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>PASS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.2 Nick message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: NICK</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NICK command is used to give user a nickname or change the existing</span>
+ <span class='doccomment'>/// one.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME</span>
+ <span class='doccomment'>/// ERR_NICKNAMEINUSE ERR_NICKCOLLISION</span>
+ <span class='doccomment'>/// ERR_UNAVAILRESOURCE ERR_RESTRICTED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NICK Wiz ; Introducing new nick &quot;Wiz&quot; if session is</span>
+ <span class='doccomment'>/// still unregistered, or user changing his</span>
+ <span class='doccomment'>/// nickname to &quot;Wiz&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi NICK Kilroy</span>
+ <span class='doccomment'>/// ; Server telling that WiZ changed his</span>
+ <span class='doccomment'>/// nickname to Kilroy.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>NICK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.3 User message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: USER</span>
+ <span class='doccomment'>/// Parameters: &lt;user&gt; &lt;mode&gt; &lt;unused&gt; &lt;realname&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The USER command is used at the beginning of connection to specify</span>
+ <span class='doccomment'>/// the username, hostname and realname of a new user.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;mode&gt; parameter should be a numeric, and can be used to</span>
+ <span class='doccomment'>/// automatically set user modes when registering with the server. This</span>
+ <span class='doccomment'>/// parameter is a bitmask, with only 2 bits having any signification: if</span>
+ <span class='doccomment'>/// the bit 2 is set, the user mode &#39;w&#39; will be set and if the bit 3 is</span>
+ <span class='doccomment'>/// set, the user mode &#39;i&#39; will be set. (See Section 3.1.5 &quot;User</span>
+ <span class='doccomment'>/// Modes&quot;).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;realname&gt; may contain space characters.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// USER guest 0 * :Ronnie Reagan ; User registering themselves with a</span>
+ <span class='doccomment'>/// username of &quot;guest&quot; and real name</span>
+ <span class='doccomment'>/// &quot;Ronnie Reagan&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// USER guest 8 * :Ronnie Reagan ; User registering themselves with a</span>
+ <span class='doccomment'>/// username of &quot;guest&quot; and real name</span>
+ <span class='doccomment'>/// &quot;Ronnie Reagan&quot;, and asking to be set</span>
+ <span class='doccomment'>/// invisible.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>USER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.4 Oper message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: OPER</span>
+ <span class='doccomment'>/// Parameters: &lt;name&gt; &lt;password&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A normal user uses the OPER command to obtain operator privileges.</span>
+ <span class='doccomment'>/// The combination of &lt;name&gt; and &lt;password&gt; are REQUIRED to gain</span>
+ <span class='doccomment'>/// Operator privileges. Upon success, the user will receive a MODE</span>
+ <span class='doccomment'>/// message (see section 3.1.5) indicating the new user modes.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS RPL_YOUREOPER</span>
+ <span class='doccomment'>/// ERR_NOOPERHOST ERR_PASSWDMISMATCH</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// OPER foo bar ; Attempt to register as an operator</span>
+ <span class='doccomment'>/// using a username of &quot;foo&quot; and &quot;bar&quot;</span>
+ <span class='doccomment'>/// as the password.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>OPER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.5 User mode message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: MODE</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt;</span>
+ <span class='doccomment'>/// *( ( &quot;+&quot; / &quot;-&quot; ) *( &quot;i&quot; / &quot;w&quot; / &quot;o&quot; / &quot;O&quot; / &quot;r&quot; ) )</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The user MODE&#39;s are typically changes which affect either how the</span>
+ <span class='doccomment'>/// client is seen by others or what &#39;extra&#39; messages the client is sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A user MODE command MUST only be accepted if both the sender of the</span>
+ <span class='doccomment'>/// message and the nickname given as a parameter are both the same. If</span>
+ <span class='doccomment'>/// no other parameter is given, then the server will return the current</span>
+ <span class='doccomment'>/// settings for the nick.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The available modes are as follows:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// a - user is flagged as away;</span>
+ <span class='doccomment'>/// i - marks a users as invisible;</span>
+ <span class='doccomment'>/// w - user receives wallops;</span>
+ <span class='doccomment'>/// r - restricted user connection;</span>
+ <span class='doccomment'>/// o - operator flag;</span>
+ <span class='doccomment'>/// O - local operator flag;</span>
+ <span class='doccomment'>/// s - marks a user for receipt of server notices.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Additional modes may be available later on.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The flag &#39;a&#39; SHALL NOT be toggled by the user using the MODE command,</span>
+ <span class='doccomment'>/// instead use of the AWAY command is REQUIRED.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If a user attempts to make themselves an operator using the &quot;+o&quot; or</span>
+ <span class='doccomment'>/// &quot;+O&quot; flag, the attempt SHOULD be ignored as users could bypass the</span>
+ <span class='doccomment'>/// authentication mechanisms of the OPER command. There is no</span>
+ <span class='doccomment'>/// restriction, however, on anyone `deopping&#39; themselves (using &quot;-o&quot; or</span>
+ <span class='doccomment'>/// &quot;-O&quot;).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// On the other hand, if a user attempts to make themselves unrestricted</span>
+ <span class='doccomment'>/// using the &quot;-r&quot; flag, the attempt SHOULD be ignored. There is no</span>
+ <span class='doccomment'>/// restriction, however, on anyone `deopping&#39; themselves (using &quot;+r&quot;).</span>
+ <span class='doccomment'>/// This flag is typically set by the server upon connection for</span>
+ <span class='doccomment'>/// administrative reasons. While the restrictions imposed are left up</span>
+ <span class='doccomment'>/// to the implementation, it is typical that a restricted user not be</span>
+ <span class='doccomment'>/// allowed to change nicknames, nor make use of the channel operator</span>
+ <span class='doccomment'>/// status on channels.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The flag &#39;s&#39; is obsolete but MAY still be used.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_USERSDONTMATCH</span>
+ <span class='doccomment'>/// ERR_UMODEUNKNOWNFLAG RPL_UMODEIS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE WiZ -w ; Command by WiZ to turn off</span>
+ <span class='doccomment'>/// reception of WALLOPS messages.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE Angel +i ; Command from Angel to make herself</span>
+ <span class='doccomment'>/// invisible.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE WiZ -o ; WiZ &#39;deopping&#39; (removing operator</span>
+ <span class='doccomment'>/// status).</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>UMODE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.6 Service message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: SERVICE</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt; &lt;reserved&gt; &lt;distribution&gt; &lt;type&gt;</span>
+ <span class='doccomment'>/// &lt;reserved&gt; &lt;info&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The SERVICE command to register a new service. Command parameters</span>
+ <span class='doccomment'>/// specify the service nickname, distribution, type and info of a new</span>
+ <span class='doccomment'>/// service.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;distribution&gt; parameter is used to specify the visibility of a</span>
+ <span class='doccomment'>/// service. The service may only be known to servers which have a name</span>
+ <span class='doccomment'>/// matching the distribution. For a matching server to have knowledge</span>
+ <span class='doccomment'>/// of the service, the network path between that server and the server</span>
+ <span class='doccomment'>/// on which the service is connected MUST be composed of servers which</span>
+ <span class='doccomment'>/// names all match the mask.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;type&gt; parameter is currently reserved for future usage.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_ALREADYREGISTRED ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>/// ERR_ERRONEUSNICKNAME</span>
+ <span class='doccomment'>/// RPL_YOURESERVICE RPL_YOURHOST</span>
+ <span class='doccomment'>/// RPL_MYINFO</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SERVICE dict * *.fr 0 0 :French Dictionary ; Service registering</span>
+ <span class='doccomment'>/// itself with a name of &quot;dict&quot;. This</span>
+ <span class='doccomment'>/// service will only be available on</span>
+ <span class='doccomment'>/// servers which name matches &quot;*.fr&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>SERVICE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.7 Quit</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: QUIT</span>
+ <span class='doccomment'>/// Parameters: [ &lt;Quit Message&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A client session is terminated with a quit message. The server</span>
+ <span class='doccomment'>/// acknowledges this by sending an ERROR message to the client.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// None.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// QUIT :Gone to have lunch ; Preferred message format.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :syrk!kalt@millennium.stealth.net QUIT :Gone to have lunch ; User</span>
+ <span class='doccomment'>/// syrk has quit IRC to have lunch.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>QUIT</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.1.8 Squit</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: SQUIT</span>
+ <span class='doccomment'>/// Parameters: &lt;server&gt; &lt;comment&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The SQUIT command is available only to operators. It is used to</span>
+ <span class='doccomment'>/// disconnect server links. Also servers can generate SQUIT messages on</span>
+ <span class='doccomment'>/// error conditions. A SQUIT message may also target a remote server</span>
+ <span class='doccomment'>/// connection. In this case, the SQUIT message will simply be sent to</span>
+ <span class='doccomment'>/// the remote server without affecting the servers in between the</span>
+ <span class='doccomment'>/// operator and the remote server.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;comment&gt; SHOULD be supplied by all operators who execute a SQUIT</span>
+ <span class='doccomment'>/// for a remote server. The server ordered to disconnect its peer</span>
+ <span class='doccomment'>/// generates a WALLOPS message with &lt;comment&gt; included, so that other</span>
+ <span class='doccomment'>/// users may be aware of the reason of this action.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOPRIVILEGES ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SQUIT tolsun.oulu.fi :Bad Link ? ; Command to uplink of the server</span>
+ <span class='doccomment'>/// tolson.oulu.fi to terminate its</span>
+ <span class='doccomment'>/// connection with comment &quot;Bad Link&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :Trillian SQUIT cm22.eng.umd.edu :Server out of control ; Command</span>
+ <span class='doccomment'>/// from Trillian from to disconnect</span>
+ <span class='doccomment'>/// &quot;cm22.eng.umd.edu&quot; from the net with</span>
+ <span class='doccomment'>/// comment &quot;Server out of control&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>SQUIT</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.1 Join message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: JOIN</span>
+ <span class='doccomment'>/// Parameters: ( &lt;channel&gt; *( &quot;,&quot; &lt;channel&gt; ) [ &lt;key&gt; *( &quot;,&quot; &lt;key&gt; ) ] )</span>
+ <span class='doccomment'>/// / &quot;0&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The JOIN command is used by a user to request to start listening to</span>
+ <span class='doccomment'>/// the specific channel. Servers MUST be able to parse arguments in the</span>
+ <span class='doccomment'>/// form of a list of target, but SHOULD NOT use lists when sending JOIN</span>
+ <span class='doccomment'>/// messages to clients.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Once a user has joined a channel, he receives information about</span>
+ <span class='doccomment'>/// all commands his server receives affecting the channel. This</span>
+ <span class='doccomment'>/// includes JOIN, MODE, KICK, PART, QUIT and of course PRIVMSG/NOTICE.</span>
+ <span class='doccomment'>/// This allows channel members to keep track of the other channel</span>
+ <span class='doccomment'>/// members, as well as channel modes.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If a JOIN is successful, the user receives a JOIN message as</span>
+ <span class='doccomment'>/// confirmation and is then sent the channel&#39;s topic (using RPL_TOPIC) and</span>
+ <span class='doccomment'>/// the list of users who are on the channel (using RPL_NAMREPLY), which</span>
+ <span class='doccomment'>/// MUST include the user joining.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that this message accepts a special argument (&quot;0&quot;), which is</span>
+ <span class='doccomment'>/// a special request to leave all channels the user is currently a member</span>
+ <span class='doccomment'>/// of. The server will process this message as if the user had sent</span>
+ <span class='doccomment'>/// a PART command (See Section 3.2.2) for each channel he is a member</span>
+ <span class='doccomment'>/// of.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_BANNEDFROMCHAN</span>
+ <span class='doccomment'>/// ERR_INVITEONLYCHAN ERR_BADCHANNELKEY</span>
+ <span class='doccomment'>/// ERR_CHANNELISFULL ERR_BADCHANMASK</span>
+ <span class='doccomment'>/// ERR_NOSUCHCHANNEL ERR_TOOMANYCHANNELS</span>
+ <span class='doccomment'>/// ERR_TOOMANYTARGETS ERR_UNAVAILRESOURCE</span>
+ <span class='doccomment'>/// RPL_TOPIC</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN #foobar ; Command to join channel #foobar.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN &amp;foo fubar ; Command to join channel &amp;foo using</span>
+ <span class='doccomment'>/// key &quot;fubar&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN #foo,&amp;bar fubar ; Command to join channel #foo using</span>
+ <span class='doccomment'>/// key &quot;fubar&quot; and &amp;bar using no key.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN #foo,#bar fubar,foobar ; Command to join channel #foo using</span>
+ <span class='doccomment'>/// key &quot;fubar&quot;, and channel #bar using</span>
+ <span class='doccomment'>/// key &quot;foobar&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN #foo,#bar ; Command to join channels #foo and</span>
+ <span class='doccomment'>/// #bar.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// JOIN 0 ; Leave all currently joined</span>
+ <span class='doccomment'>/// channels.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi JOIN #Twilight_zone ; JOIN message from WiZ</span>
+ <span class='doccomment'>/// on channel #Twilight_zone</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>JOIN</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.2 Part message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: PART</span>
+ <span class='doccomment'>/// Parameters: &lt;channel&gt; *( &quot;,&quot; &lt;channel&gt; ) [ &lt;Part Message&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The PART command causes the user sending the message to be removed</span>
+ <span class='doccomment'>/// from the list of active members for all given channels listed in the</span>
+ <span class='doccomment'>/// parameter string. If a &quot;Part Message&quot; is given, this will be sent</span>
+ <span class='doccomment'>/// instead of the default message, the nickname. This request is always</span>
+ <span class='doccomment'>/// granted by the server.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Servers MUST be able to parse arguments in the form of a list of</span>
+ <span class='doccomment'>/// target, but SHOULD NOT use lists when sending PART messages to</span>
+ <span class='doccomment'>/// clients.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL</span>
+ <span class='doccomment'>/// ERR_NOTONCHANNEL</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PART #twilight_zone ; Command to leave channel</span>
+ <span class='doccomment'>/// &quot;#twilight_zone&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PART #oz-ops,&amp;group5 ; Command to leave both channels</span>
+ <span class='doccomment'>/// &quot;&amp;group5&quot; and &quot;#oz-ops&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi PART #playzone :I lost</span>
+ <span class='doccomment'>/// ; User WiZ leaving channel</span>
+ <span class='doccomment'>/// &quot;#playzone&quot; with the message &quot;I</span>
+ <span class='doccomment'>/// lost&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>PART</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.3 Channel mode message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: MODE</span>
+ <span class='doccomment'>/// Parameters: &lt;channel&gt; *( ( &quot;-&quot; / &quot;+&quot; ) *&lt;modes&gt; *&lt;modeparams&gt; )</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The MODE command is provided so that users may query and change the</span>
+ <span class='doccomment'>/// characteristics of a channel. For more details on available modes</span>
+ <span class='doccomment'>/// and their uses, see &quot;Internet Relay Chat: Channel Management&quot; [IRC-</span>
+ <span class='doccomment'>/// CHAN]. Note that there is a maximum limit of three (3) changes per</span>
+ <span class='doccomment'>/// command for modes that take a parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_KEYSET</span>
+ <span class='doccomment'>/// ERR_NOCHANMODES ERR_CHANOPRIVSNEEDED</span>
+ <span class='doccomment'>/// ERR_USERNOTINCHANNEL ERR_UNKNOWNMODE</span>
+ <span class='doccomment'>/// RPL_CHANNELMODEIS</span>
+ <span class='doccomment'>/// RPL_BANLIST RPL_ENDOFBANLIST</span>
+ <span class='doccomment'>/// RPL_EXCEPTLIST RPL_ENDOFEXCEPTLIST</span>
+ <span class='doccomment'>/// RPL_INVITELIST RPL_ENDOFINVITELIST</span>
+ <span class='doccomment'>/// RPL_UNIQOPIS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The following examples are given to help understanding the syntax of</span>
+ <span class='doccomment'>/// the MODE command, but refer to modes defined in &quot;Internet Relay Chat:</span>
+ <span class='doccomment'>/// Channel Management&quot; [IRC-CHAN].</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #Finnish +imI *!*@*.fi ; Command to make #Finnish channel</span>
+ <span class='doccomment'>/// moderated and &#39;invite-only&#39; with user</span>
+ <span class='doccomment'>/// with a hostname matching *.fi</span>
+ <span class='doccomment'>/// automatically invited.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #Finnish +o Kilroy ; Command to give &#39;chanop&#39; privileges</span>
+ <span class='doccomment'>/// to Kilroy on channel #Finnish.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #Finnish +v Wiz ; Command to allow WiZ to speak on</span>
+ <span class='doccomment'>/// #Finnish.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #Fins -s ; Command to remove &#39;secret&#39; flag</span>
+ <span class='doccomment'>/// from channel #Fins.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #42 +k oulu ; Command to set the channel key to</span>
+ <span class='doccomment'>/// &quot;oulu&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #42 -k oulu ; Command to remove the &quot;oulu&quot;</span>
+ <span class='doccomment'>/// channel key on channel &quot;#42&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #eu-opers +l 10 ; Command to set the limit for the</span>
+ <span class='doccomment'>/// number of users on channel</span>
+ <span class='doccomment'>/// &quot;#eu-opers&quot; to 10.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi MODE #eu-opers -l</span>
+ <span class='doccomment'>/// ; User &quot;WiZ&quot; removing the limit for</span>
+ <span class='doccomment'>/// the number of users on channel &quot;#eu-</span>
+ <span class='doccomment'>/// opers&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE &amp;oulu +b ; Command to list ban masks set for</span>
+ <span class='doccomment'>/// the channel &quot;&amp;oulu&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE &amp;oulu +b *!*@* ; Command to prevent all users from</span>
+ <span class='doccomment'>/// joining.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE &amp;oulu +b *!*@*.edu +e *!*@*.bu.edu</span>
+ <span class='doccomment'>/// ; Command to prevent any user from a</span>
+ <span class='doccomment'>/// hostname matching *.edu from joining,</span>
+ <span class='doccomment'>/// except if matching *.bu.edu</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #bu +be *!*@*.edu *!*@*.bu.edu</span>
+ <span class='doccomment'>/// ; Comment to prevent any user from a</span>
+ <span class='doccomment'>/// hostname matching *.edu from joining,</span>
+ <span class='doccomment'>/// except if matching *.bu.edu</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #meditation e ; Command to list exception masks set</span>
+ <span class='doccomment'>/// for the channel &quot;#meditation&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE #meditation I ; Command to list invitations masks</span>
+ <span class='doccomment'>/// set for the channel &quot;#meditation&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// MODE !12345ircd O ; Command to ask who the channel</span>
+ <span class='doccomment'>/// creator for &quot;!12345ircd&quot; is</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>MODE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text```</span>
+ <span class='doccomment'>/// 3.2.4 Topic message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: TOPIC</span>
+ <span class='doccomment'>/// Parameters: &lt;channel&gt; [ &lt;topic&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The TOPIC command is used to change or view the topic of a channel.</span>
+ <span class='doccomment'>/// The topic for channel &lt;channel&gt; is returned if there is no &lt;topic&gt;</span>
+ <span class='doccomment'>/// given. If the &lt;topic&gt; parameter is present, the topic for that</span>
+ <span class='doccomment'>/// channel will be changed, if this action is allowed for the user</span>
+ <span class='doccomment'>/// requesting it. If the &lt;topic&gt; parameter is an empty string, the</span>
+ <span class='doccomment'>/// topic for that channel will be removed.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_NOTONCHANNEL</span>
+ <span class='doccomment'>/// RPL_NOTOPIC RPL_TOPIC</span>
+ <span class='doccomment'>/// ERR_CHANOPRIVSNEEDED ERR_NOCHANMODES</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi TOPIC #test :New topic ; User Wiz setting the</span>
+ <span class='doccomment'>/// topic.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TOPIC #test :another topic ; Command to set the topic on #test</span>
+ <span class='doccomment'>/// to &quot;another topic&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TOPIC #test : ; Command to clear the topic on</span>
+ <span class='doccomment'>/// #test.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TOPIC #test ; Command to check the topic for</span>
+ <span class='doccomment'>/// #test.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>TOPIC</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.5 Names message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: NAMES</span>
+ <span class='doccomment'>/// Parameters: [ &lt;channel&gt; *( &quot;,&quot; &lt;channel&gt; ) [ &lt;target&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// By using the NAMES command, a user can list all nicknames that are</span>
+ <span class='doccomment'>/// visible to him. For more details on what is visible and what is not,</span>
+ <span class='doccomment'>/// see &quot;Internet Relay Chat: Channel Management&quot; [IRC-CHAN]. The</span>
+ <span class='doccomment'>/// &lt;channel&gt; parameter specifies which channel(s) to return information</span>
+ <span class='doccomment'>/// about. There is no error reply for bad channel names.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If no &lt;channel&gt; parameter is given, a list of all channels and their</span>
+ <span class='doccomment'>/// occupants is returned. At the end of this list, a list of users who</span>
+ <span class='doccomment'>/// are visible but either not on any channel or not on a visible channel</span>
+ <span class='doccomment'>/// are listed as being on `channel&#39; &quot;*&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the &lt;target&gt; parameter is specified, the request is forwarded to</span>
+ <span class='doccomment'>/// that server which will generate the reply.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numerics:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_TOOMANYMATCHES ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_NAMREPLY RPL_ENDOFNAMES</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NAMES #twilight_zone,#42 ; Command to list visible users on</span>
+ <span class='doccomment'>/// #twilight_zone and #42</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NAMES ; Command to list all visible</span>
+ <span class='doccomment'>/// channels and users</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>NAMES</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.6 List message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: LIST</span>
+ <span class='doccomment'>/// Parameters: [ &lt;channel&gt; *( &quot;,&quot; &lt;channel&gt; ) [ &lt;target&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The list command is used to list channels and their topics. If the</span>
+ <span class='doccomment'>/// &lt;channel&gt; parameter is used, only the status of that channel is</span>
+ <span class='doccomment'>/// displayed.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the &lt;target&gt; parameter is specified, the request is forwarded to</span>
+ <span class='doccomment'>/// that server which will generate the reply.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_TOOMANYMATCHES ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_LIST RPL_LISTEND</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// LIST ; Command to list all channels.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// LIST #twilight_zone,#42 ; Command to list channels</span>
+ <span class='doccomment'>/// #twilight_zone and #42</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>LIST</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.7 Invite message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: INVITE</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt; &lt;channel&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The INVITE command is used to invite a user to a channel. The</span>
+ <span class='doccomment'>/// parameter &lt;nickname&gt; is the nickname of the person to be invited to</span>
+ <span class='doccomment'>/// the target channel &lt;channel&gt;. There is no requirement that the</span>
+ <span class='doccomment'>/// channel the target user is being invited to must exist or be a valid</span>
+ <span class='doccomment'>/// channel. However, if the channel exists, only members of the channel</span>
+ <span class='doccomment'>/// are allowed to invite other users. When the channel has invite-only</span>
+ <span class='doccomment'>/// flag set, only channel operators may issue INVITE command.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Only the user inviting and the user being invited will receive</span>
+ <span class='doccomment'>/// notification of the invitation. Other channel members are not</span>
+ <span class='doccomment'>/// notified. (This is unlike the MODE changes, and is occasionally the</span>
+ <span class='doccomment'>/// source of trouble for users.)</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_NOSUCHNICK</span>
+ <span class='doccomment'>/// ERR_NOTONCHANNEL ERR_USERONCHANNEL</span>
+ <span class='doccomment'>/// ERR_CHANOPRIVSNEEDED</span>
+ <span class='doccomment'>/// RPL_INVITING RPL_AWAY</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :Angel!wings@irc.org INVITE Wiz #Dust</span>
+ <span class='doccomment'>/// ; Message to WiZ when he has been</span>
+ <span class='doccomment'>/// invited by user Angel to channel</span>
+ <span class='doccomment'>/// #Dust</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// INVITE Wiz #Twilight_Zone ; Command to invite WiZ to</span>
+ <span class='doccomment'>/// #Twilight_zone</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>INVITE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.2.8 Kick command</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: KICK</span>
+ <span class='doccomment'>/// Parameters: &lt;channel&gt; *( &quot;,&quot; &lt;channel&gt; ) &lt;user&gt; *( &quot;,&quot; &lt;user&gt; )</span>
+ <span class='doccomment'>/// [&lt;comment&gt;]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The KICK command can be used to request the forced removal of a user</span>
+ <span class='doccomment'>/// from a channel. It causes the &lt;user&gt; to PART from the &lt;channel&gt; by</span>
+ <span class='doccomment'>/// force. For the message to be syntactically correct, there MUST be</span>
+ <span class='doccomment'>/// either one channel parameter and multiple user parameter, or as many</span>
+ <span class='doccomment'>/// channel parameters as there are user parameters. If a &quot;comment&quot; is</span>
+ <span class='doccomment'>/// given, this will be sent instead of the default message, the nickname</span>
+ <span class='doccomment'>/// of the user issuing the KICK.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The server MUST NOT send KICK messages with multiple channels or</span>
+ <span class='doccomment'>/// users to clients. This is necessarily to maintain backward</span>
+ <span class='doccomment'>/// compatibility with old client software.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL</span>
+ <span class='doccomment'>/// ERR_BADCHANMASK ERR_CHANOPRIVSNEEDED</span>
+ <span class='doccomment'>/// ERR_USERNOTINCHANNEL ERR_NOTONCHANNEL</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// KICK &amp;Melbourne Matthew ; Command to kick Matthew from</span>
+ <span class='doccomment'>/// &amp;Melbourne</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// KICK #Finnish John :Speaking English</span>
+ <span class='doccomment'>/// ; Command to kick John from #Finnish</span>
+ <span class='doccomment'>/// using &quot;Speaking English&quot; as the</span>
+ <span class='doccomment'>/// reason (comment).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :WiZ!jto@tolsun.oulu.fi KICK #Finnish John</span>
+ <span class='doccomment'>/// ; KICK message on channel #Finnish</span>
+ <span class='doccomment'>/// from WiZ to remove John from channel</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>KICK</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.3.1 Private messages</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: PRIVMSG</span>
+ <span class='doccomment'>/// Parameters: &lt;msgtarget&gt; &lt;text to be sent&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG is used to send private messages between users, as well as to</span>
+ <span class='doccomment'>/// send messages to channels. &lt;msgtarget&gt; is usually the nickname of</span>
+ <span class='doccomment'>/// the recipient of the message, or a channel name.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;msgtarget&gt; parameter may also be a host mask (#&lt;mask&gt;) or server</span>
+ <span class='doccomment'>/// mask ($&lt;mask&gt;). In both cases the server will only send the PRIVMSG</span>
+ <span class='doccomment'>/// to those who have a server or host matching the mask. The mask MUST</span>
+ <span class='doccomment'>/// have at least 1 (one) &quot;.&quot; in it and no wildcards following the last</span>
+ <span class='doccomment'>/// &quot;.&quot;. This requirement exists to prevent people sending messages to</span>
+ <span class='doccomment'>/// &quot;#*&quot; or &quot;$*&quot;, which would broadcast to all users. Wildcards are the</span>
+ <span class='doccomment'>/// &#39;*&#39; and &#39;?&#39; characters. This extension to the PRIVMSG command is</span>
+ <span class='doccomment'>/// only available to operators.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NORECIPIENT ERR_NOTEXTTOSEND</span>
+ <span class='doccomment'>/// ERR_CANNOTSENDTOCHAN ERR_NOTOPLEVEL</span>
+ <span class='doccomment'>/// ERR_WILDTOPLEVEL ERR_TOOMANYTARGETS</span>
+ <span class='doccomment'>/// ERR_NOSUCHNICK</span>
+ <span class='doccomment'>/// RPL_AWAY</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :Angel!wings@irc.org PRIVMSG Wiz :Are you receiving this message ?</span>
+ <span class='doccomment'>/// ; Message from Angel to Wiz.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG Angel :yes I&#39;m receiving it !</span>
+ <span class='doccomment'>/// ; Command to send a message to Angel.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG jto@tolsun.oulu.fi :Hello !</span>
+ <span class='doccomment'>/// ; Command to send a message to a user</span>
+ <span class='doccomment'>/// on server tolsun.oulu.fi with</span>
+ <span class='doccomment'>/// username of &quot;jto&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG kalt%millennium.stealth.net@irc.stealth.net :Are you a frog?</span>
+ <span class='doccomment'>/// ; Message to a user on server</span>
+ <span class='doccomment'>/// irc.stealth.net with username of</span>
+ <span class='doccomment'>/// &quot;kalt&quot;, and connected from the host</span>
+ <span class='doccomment'>/// millennium.stealth.net.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG kalt%millennium.stealth.net :Do you like cheese?</span>
+ <span class='doccomment'>/// ; Message to a user on the local</span>
+ <span class='doccomment'>/// server with username of &quot;kalt&quot;, and</span>
+ <span class='doccomment'>/// connected from the host</span>
+ <span class='doccomment'>/// millennium.stealth.net.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG Wiz!jto@tolsun.oulu.fi :Hello !</span>
+ <span class='doccomment'>/// ; Message to the user with nickname</span>
+ <span class='doccomment'>/// Wiz who is connected from the host</span>
+ <span class='doccomment'>/// tolsun.oulu.fi and has the username</span>
+ <span class='doccomment'>/// &quot;jto&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG $*.fi :Server tolsun.oulu.fi rebooting.</span>
+ <span class='doccomment'>/// ; Message to everyone on a server</span>
+ <span class='doccomment'>/// which has a name matching *.fi.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PRIVMSG #*.edu :NSFNet is undergoing work, expect interruptions</span>
+ <span class='doccomment'>/// ; Message to all users who come from</span>
+ <span class='doccomment'>/// a host which has a name matching</span>
+ <span class='doccomment'>/// *.edu.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>PRIVMSG</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.3.2 Notice</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: NOTICE</span>
+ <span class='doccomment'>/// Parameters: &lt;msgtarget&gt; &lt;text&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The NOTICE command is used similarly to PRIVMSG. The difference</span>
+ <span class='doccomment'>/// between NOTICE and PRIVMSG is that automatic replies MUST NEVER be</span>
+ <span class='doccomment'>/// sent in response to a NOTICE message. This rule applies to servers</span>
+ <span class='doccomment'>/// too - they MUST NOT send any error reply back to the client on</span>
+ <span class='doccomment'>/// receipt of a notice. The object of this rule is to avoid loops</span>
+ <span class='doccomment'>/// between clients automatically sending something in response to</span>
+ <span class='doccomment'>/// something it received.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This command is available to services as well as users.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is typically used by services, and automatons (clients with</span>
+ <span class='doccomment'>/// either an AI or other interactive program controlling their actions).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// See PRIVMSG for more details on replies and examples.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>NOTICE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.1 Motd message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: MOTD</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The MOTD command is used to get the &quot;Message Of The Day&quot; of the given</span>
+ <span class='doccomment'>/// server, or current server if &lt;target&gt; is omitted.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>/// RPL_MOTDSTART RPL_MOTD</span>
+ <span class='doccomment'>/// RPL_ENDOFMOTD ERR_NOMOTD</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>MOTD</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.2 Lusers message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: LUSERS</span>
+ <span class='doccomment'>/// Parameters: [ &lt;mask&gt; [ &lt;target&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The LUSERS command is used to get statistics about the size of the</span>
+ <span class='doccomment'>/// IRC network. If no parameter is given, the reply will be about the</span>
+ <span class='doccomment'>/// whole net. If a &lt;mask&gt; is specified, then the reply will only</span>
+ <span class='doccomment'>/// concern the part of the network formed by the servers matching the</span>
+ <span class='doccomment'>/// mask. Finally, if the &lt;target&gt; parameter is specified, the request</span>
+ <span class='doccomment'>/// is forwarded to that server which will generate the reply.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_LUSERCLIENT RPL_LUSEROP</span>
+ <span class='doccomment'>/// RPL_LUSERUNKOWN RPL_LUSERCHANNELS</span>
+ <span class='doccomment'>/// RPL_LUSERME ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>LUSERS</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.3 Version message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: VERSION</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The VERSION command is used to query the version of the server</span>
+ <span class='doccomment'>/// program. An optional parameter &lt;target&gt; is used to query the version</span>
+ <span class='doccomment'>/// of the server program which a client is not directly connected to.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER RPL_VERSION</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// VERSION tolsun.oulu.fi ; Command to check the version of</span>
+ <span class='doccomment'>/// server &quot;tolsun.oulu.fi&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>VERSION</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.4 Stats message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: STATS</span>
+ <span class='doccomment'>/// Parameters: [ &lt;query&gt; [ &lt;target&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The stats command is used to query statistics of certain server. If</span>
+ <span class='doccomment'>/// &lt;query&gt; parameter is omitted, only the end of stats reply is sent</span>
+ <span class='doccomment'>/// back.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A query may be given for any single letter which is only checked by</span>
+ <span class='doccomment'>/// the destination server and is otherwise passed on by intermediate</span>
+ <span class='doccomment'>/// servers, ignored and unaltered.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Except for the ones below, the list of valid queries is</span>
+ <span class='doccomment'>/// implementation dependent. The standard queries below SHOULD be</span>
+ <span class='doccomment'>/// supported by the server:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// l - returns a list of the server&#39;s connections, showing how</span>
+ <span class='doccomment'>/// long each connection has been established and the</span>
+ <span class='doccomment'>/// traffic over that connection in Kbytes and messages for</span>
+ <span class='doccomment'>/// each direction;</span>
+ <span class='doccomment'>/// m - returns the usage count for each of commands supported</span>
+ <span class='doccomment'>/// by the server; commands for which the usage count is</span>
+ <span class='doccomment'>/// zero MAY be omitted;</span>
+ <span class='doccomment'>/// o - returns a list of configured privileged users,</span>
+ <span class='doccomment'>/// operators;</span>
+ <span class='doccomment'>/// u - returns a string showing how long the server has been</span>
+ <span class='doccomment'>/// up.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// It is also RECOMMENDED that client and server access configuration be</span>
+ <span class='doccomment'>/// published this way.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_STATSLINKINFO RPL_STATSUPTIME</span>
+ <span class='doccomment'>/// RPL_STATSCOMMANDS RPL_STATSOLINE</span>
+ <span class='doccomment'>/// RPL_ENDOFSTATS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// STATS m ; Command to check the command usage</span>
+ <span class='doccomment'>/// for the server you are connected to</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>STATS</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.5 Links message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: LINKS</span>
+ <span class='doccomment'>/// Parameters: [ [ &lt;remote server&gt; ] &lt;server mask&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// With LINKS, a user can list all servernames, which are known by the</span>
+ <span class='doccomment'>/// server answering the query. The returned list of servers MUST match</span>
+ <span class='doccomment'>/// the mask, or if no mask is given, the full list is returned.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If &lt;remote server&gt; is given in addition to &lt;server mask&gt;, the LINKS</span>
+ <span class='doccomment'>/// command is forwarded to the first server found that matches that name</span>
+ <span class='doccomment'>/// (if any), and that server is then required to answer the query.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_LINKS RPL_ENDOFLINKS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// LINKS *.au ; Command to list all servers which</span>
+ <span class='doccomment'>/// have a name that matches *.au;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// LINKS *.edu *.bu.edu ; Command to list servers matching</span>
+ <span class='doccomment'>/// *.bu.edu as seen by the first server</span>
+ <span class='doccomment'>/// matching *.edu.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>LINKS</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.6 Time message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: TIME</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The time command is used to query local time from the specified</span>
+ <span class='doccomment'>/// server. If the &lt;target&gt; parameter is not given, the server receiving</span>
+ <span class='doccomment'>/// the command must reply to the query.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER RPL_TIME</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>/// TIME tolsun.oulu.fi ; check the time on the server</span>
+ <span class='doccomment'>/// &quot;tolson.oulu.fi&quot;</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>TIME</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.7 Connect message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: CONNECT</span>
+ <span class='doccomment'>/// Parameters: &lt;target server&gt; &lt;port&gt; [ &lt;remote server&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The CONNECT command can be used to request a server to try to</span>
+ <span class='doccomment'>/// establish a new connection to another server immediately. CONNECT is</span>
+ <span class='doccomment'>/// a privileged command and SHOULD be available only to IRC Operators.</span>
+ <span class='doccomment'>/// If a &lt;remote server&gt; is given and its mask doesn&#39;t match name of the</span>
+ <span class='doccomment'>/// parsing server, the CONNECT attempt is sent to the first match of</span>
+ <span class='doccomment'>/// remote server. Otherwise the CONNECT attempt is made by the server</span>
+ <span class='doccomment'>/// processing the request.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The server receiving a remote CONNECT command SHOULD generate a</span>
+ <span class='doccomment'>/// WALLOPS message describing the source and target of the request.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER ERR_NOPRIVILEGES</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// CONNECT tolsun.oulu.fi 6667 ; Command to attempt to connect local</span>
+ <span class='doccomment'>/// server to tolsun.oulu.fi on port 6667</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>CONNECT</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>i16</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.8 Trace message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: TRACE</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TRACE command is used to find the route to specific server and</span>
+ <span class='doccomment'>/// information about its peers. Each server that processes this command</span>
+ <span class='doccomment'>/// MUST report to the sender about it. The replies from pass-through</span>
+ <span class='doccomment'>/// links form a chain, which shows route to destination. After sending</span>
+ <span class='doccomment'>/// this reply back, the query MUST be sent to the next server until</span>
+ <span class='doccomment'>/// given &lt;target&gt; server is reached.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TRACE command is used to find the route to specific server. Each</span>
+ <span class='doccomment'>/// server that processes this message MUST tell the sender about it by</span>
+ <span class='doccomment'>/// sending a reply indicating it is a pass-through link, forming a chain</span>
+ <span class='doccomment'>/// of replies. After sending this reply back, it MUST then send the</span>
+ <span class='doccomment'>/// TRACE message to the next server until given server is reached. If</span>
+ <span class='doccomment'>/// the &lt;target&gt; parameter is omitted, it is RECOMMENDED that TRACE</span>
+ <span class='doccomment'>/// command sends a message to the sender telling which servers the local</span>
+ <span class='doccomment'>/// server has direct connection to.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the destination given by &lt;target&gt; is an actual server, the</span>
+ <span class='doccomment'>/// destination server is REQUIRED to report all servers, services and</span>
+ <span class='doccomment'>/// operators which are connected to it; if the command was issued by an</span>
+ <span class='doccomment'>/// operator, the server MAY also report all users which are connected to</span>
+ <span class='doccomment'>/// it. If the destination given by &lt;target&gt; is a nickname, then only a</span>
+ <span class='doccomment'>/// reply for that nickname is given. If the &lt;target&gt; parameter is</span>
+ <span class='doccomment'>/// omitted, it is RECOMMENDED that the TRACE command is parsed as</span>
+ <span class='doccomment'>/// targeted to the processing server.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the TRACE message is destined for another server, all</span>
+ <span class='doccomment'>/// intermediate servers must return a RPL_TRACELINK reply to indicate</span>
+ <span class='doccomment'>/// that the TRACE passed through it and where it is going next.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_TRACELINK</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A TRACE reply may be composed of any number of the following</span>
+ <span class='doccomment'>/// numeric replies.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_TRACECONNECTING RPL_TRACEHANDSHAKE</span>
+ <span class='doccomment'>/// RPL_TRACEUNKNOWN RPL_TRACEOPERATOR</span>
+ <span class='doccomment'>/// RPL_TRACEUSER RPL_TRACESERVER</span>
+ <span class='doccomment'>/// RPL_TRACESERVICE RPL_TRACENEWTYPE</span>
+ <span class='doccomment'>/// RPL_TRACECLASS RPL_TRACELOG</span>
+ <span class='doccomment'>/// RPL_TRACEEND</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// TRACE *.oulu.fi ; TRACE to a server matching</span>
+ <span class='doccomment'>/// *.oulu.fi</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>TRACE</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.9 Admin command</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: ADMIN</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The admin command is used to find information about the administrator</span>
+ <span class='doccomment'>/// of the given server, or current server if &lt;target&gt; parameter is</span>
+ <span class='doccomment'>/// omitted. Each server MUST have the ability to forward ADMIN messages</span>
+ <span class='doccomment'>/// to other servers.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_ADMINME RPL_ADMINLOC1</span>
+ <span class='doccomment'>/// RPL_ADMINLOC2 RPL_ADMINEMAIL</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ADMIN tolsun.oulu.fi ; request an ADMIN reply from</span>
+ <span class='doccomment'>/// tolsun.oulu.fi</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ADMIN syrk ; ADMIN request for the server to</span>
+ <span class='doccomment'>/// which the user syrk is connected</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>ADMIN</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.4.10 Info command</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: INFO</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The INFO command is REQUIRED to return information describing the</span>
+ <span class='doccomment'>/// server: its version, when it was compiled, the patchlevel, when it</span>
+ <span class='doccomment'>/// was started, and any other miscellaneous information which may be</span>
+ <span class='doccomment'>/// considered to be relevant.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_INFO RPL_ENDOFINFO</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// INFO csd.bu.edu ; request an INFO reply from</span>
+ <span class='doccomment'>/// csd.bu.edu</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// INFO Angel ; request info from the server that</span>
+ <span class='doccomment'>/// Angel is connected to.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>INFO</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.5.1 Servlist message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: SERVLIST</span>
+ <span class='doccomment'>/// Parameters: [ &lt;mask&gt; [ &lt;type&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The SERVLIST command is used to list services currently connected to</span>
+ <span class='doccomment'>/// the network and visible to the user issuing the command. The</span>
+ <span class='doccomment'>/// optional parameters may be used to restrict the result of the query</span>
+ <span class='doccomment'>/// (to matching services names, and services type).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_SERVLIST RPL_SERVLISTEND</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>SERVLIST</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.5.2 Squery</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: SQUERY</span>
+ <span class='doccomment'>/// Parameters: &lt;servicename&gt; &lt;text&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The SQUERY command is used similarly to PRIVMSG. The only difference</span>
+ <span class='doccomment'>/// is that the recipient MUST be a service. This is the only way for a</span>
+ <span class='doccomment'>/// text message to be delivered to a service.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// See PRIVMSG for more details on replies and example.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SQUERY irchelp :HELP privmsg</span>
+ <span class='doccomment'>/// ; Message to the service with</span>
+ <span class='doccomment'>/// nickname irchelp.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SQUERY dict@irc.fr :fr2en blaireau</span>
+ <span class='doccomment'>/// ; Message to the service with name</span>
+ <span class='doccomment'>/// dict@irc.fr.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>SQUERY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.6.1 Who query</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: WHO</span>
+ <span class='doccomment'>/// Parameters: [ &lt;mask&gt; [ &quot;o&quot; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The WHO command is used by a client to generate a query which returns</span>
+ <span class='doccomment'>/// a list of information which &#39;matches&#39; the &lt;mask&gt; parameter given by</span>
+ <span class='doccomment'>/// the client. In the absence of the &lt;mask&gt; parameter, all visible</span>
+ <span class='doccomment'>/// (users who aren&#39;t invisible (user mode +i) and who don&#39;t have a</span>
+ <span class='doccomment'>/// common channel with the requesting client) are listed. The same</span>
+ <span class='doccomment'>/// result can be achieved by using a &lt;mask&gt; of &quot;0&quot; or any wildcard which</span>
+ <span class='doccomment'>/// will end up matching every visible user.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &lt;mask&gt; passed to WHO is matched against users&#39; host, server, real</span>
+ <span class='doccomment'>/// name and nickname if the channel &lt;mask&gt; cannot be found.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the &quot;o&quot; parameter is passed only operators are returned according</span>
+ <span class='doccomment'>/// to the &lt;mask&gt; supplied.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// RPL_WHOREPLY RPL_ENDOFWHO</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHO *.fi ; Command to list all users who match</span>
+ <span class='doccomment'>/// against &quot;*.fi&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHO jto* o ; Command to list all users with a</span>
+ <span class='doccomment'>/// match against &quot;jto*&quot; if they are an</span>
+ <span class='doccomment'>/// operator.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>WHO</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='ident'>bool</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.6.2 Whois query</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: WHOIS</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ] &lt;mask&gt; *( &quot;,&quot; &lt;mask&gt; )</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This command is used to query information about particular user.</span>
+ <span class='doccomment'>/// The server will answer this command with several numeric messages</span>
+ <span class='doccomment'>/// indicating different statuses of each user which matches the mask (if</span>
+ <span class='doccomment'>/// you are entitled to see them). If no wildcard is present in the</span>
+ <span class='doccomment'>/// &lt;mask&gt;, any information about that nick which you are allowed to see</span>
+ <span class='doccomment'>/// is presented.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the &lt;target&gt; parameter is specified, it sends the query to a</span>
+ <span class='doccomment'>/// specific server. It is useful if you want to know how long the user</span>
+ <span class='doccomment'>/// in question has been idle as only local server (i.e., the server the</span>
+ <span class='doccomment'>/// user is directly connected to) knows that information, while</span>
+ <span class='doccomment'>/// everything else is globally known.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER ERR_NONICKNAMEGIVEN</span>
+ <span class='doccomment'>/// RPL_WHOISUSER RPL_WHOISCHANNELS</span>
+ <span class='doccomment'>/// RPL_WHOISCHANNELS RPL_WHOISSERVER</span>
+ <span class='doccomment'>/// RPL_AWAY RPL_WHOISOPERATOR</span>
+ <span class='doccomment'>/// RPL_WHOISIDLE ERR_NOSUCHNICK</span>
+ <span class='doccomment'>/// RPL_ENDOFWHOIS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHOIS wiz ; return available user information</span>
+ <span class='doccomment'>/// about nick WiZ</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHOIS eff.org trillian ; ask server eff.org for user</span>
+ <span class='doccomment'>/// information about trillian</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>WHOIS</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.6.3 Whowas</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: WHOWAS</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt; *( &quot;,&quot; &lt;nickname&gt; ) [ &lt;count&gt; [ &lt;target&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Whowas asks for information about a nickname which no longer exists.</span>
+ <span class='doccomment'>/// This may either be due to a nickname change or the user leaving IRC.</span>
+ <span class='doccomment'>/// In response to this query, the server searches through its nickname</span>
+ <span class='doccomment'>/// history, looking for any nicks which are lexically the same (no wild</span>
+ <span class='doccomment'>/// card matching here). The history is searched backward, returning the</span>
+ <span class='doccomment'>/// most recent entry first. If there are multiple entries, up to</span>
+ <span class='doccomment'>/// &lt;count&gt; replies will be returned (or all of them if no &lt;count&gt;</span>
+ <span class='doccomment'>/// parameter is given). If a non-positive number is passed as being</span>
+ <span class='doccomment'>/// &lt;count&gt;, then a full search is done.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Wildcards are allowed in the &lt;target&gt; parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NONICKNAMEGIVEN ERR_WASNOSUCHNICK</span>
+ <span class='doccomment'>/// RPL_WHOWASUSER RPL_WHOISSERVER</span>
+ <span class='doccomment'>/// RPL_ENDOFWHOWAS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHOWAS Wiz ; return all information in the nick</span>
+ <span class='doccomment'>/// history about nick &quot;WiZ&quot;;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHOWAS Mermaid 9 ; return at most, the 9 most recent</span>
+ <span class='doccomment'>/// entries in the nick history for</span>
+ <span class='doccomment'>/// &quot;Mermaid&quot;;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// WHOWAS Trillian 1 *.edu ; return the most recent history for</span>
+ <span class='doccomment'>/// &quot;Trillian&quot; from the first server</span>
+ <span class='doccomment'>/// found to match &quot;*.edu&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>WHOWAS</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.7.1 Kill message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: KILL</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt; &lt;comment&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The KILL command is used to cause a client-server connection to be</span>
+ <span class='doccomment'>/// closed by the server which has the actual connection. Servers</span>
+ <span class='doccomment'>/// generate KILL messages on nickname collisions. It MAY also be</span>
+ <span class='doccomment'>/// available available to users who have the operator status.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Clients which have automatic reconnect algorithms effectively make</span>
+ <span class='doccomment'>/// this command useless since the disconnection is only brief. It does</span>
+ <span class='doccomment'>/// however break the flow of data and can be used to stop large amounts</span>
+ <span class='doccomment'>/// of &#39;flooding&#39; from abusive users or accidents. Abusive users usually</span>
+ <span class='doccomment'>/// don&#39;t care as they will reconnect promptly and resume their abusive</span>
+ <span class='doccomment'>/// behaviour. To prevent this command from being abused, any user may</span>
+ <span class='doccomment'>/// elect to receive KILL messages generated for others to keep an &#39;eye&#39;</span>
+ <span class='doccomment'>/// on would be trouble spots.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// In an arena where nicknames are REQUIRED to be globally unique at all</span>
+ <span class='doccomment'>/// times, KILL messages are sent whenever &#39;duplicates&#39; are detected</span>
+ <span class='doccomment'>/// (that is an attempt to register two users with the same nickname) in</span>
+ <span class='doccomment'>/// the hope that both of them will disappear and only 1 reappear.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When a client is removed as the result of a KILL message, the server</span>
+ <span class='doccomment'>/// SHOULD add the nickname to the list of unavailable nicknames in an</span>
+ <span class='doccomment'>/// attempt to avoid clients to reuse this name immediately which is</span>
+ <span class='doccomment'>/// usually the pattern of abusive behaviour often leading to useless</span>
+ <span class='doccomment'>/// &quot;KILL loops&quot;. See the &quot;IRC Server Protocol&quot; document [IRC-SERVER]</span>
+ <span class='doccomment'>/// for more information on this procedure.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The comment given MUST reflect the actual reason for the KILL. For</span>
+ <span class='doccomment'>/// server-generated KILLs it usually is made up of details concerning</span>
+ <span class='doccomment'>/// the origins of the two conflicting nicknames. For users it is left</span>
+ <span class='doccomment'>/// up to them to provide an adequate reason to satisfy others who see</span>
+ <span class='doccomment'>/// it. To prevent/discourage fake KILLs from being generated to hide</span>
+ <span class='doccomment'>/// the identify of the KILLer, the comment also shows a &#39;kill-path&#39;</span>
+ <span class='doccomment'>/// which is updated by each server it passes through, each prepending</span>
+ <span class='doccomment'>/// its name to the path.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOPRIVILEGES ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>/// ERR_NOSUCHNICK ERR_CANTKILLSERVER</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NOTE:</span>
+ <span class='doccomment'>/// It is RECOMMENDED that only Operators be allowed to kill other users</span>
+ <span class='doccomment'>/// with KILL command. This command has been the subject of many</span>
+ <span class='doccomment'>/// controversies over the years, and along with the above</span>
+ <span class='doccomment'>/// recommendation, it is also widely recognized that not even operators</span>
+ <span class='doccomment'>/// should be allowed to kill users on remote servers.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>KILL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.7.2 Ping message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: PING</span>
+ <span class='doccomment'>/// Parameters: &lt;server1&gt; [ &lt;server2&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The PING command is used to test the presence of an active client or</span>
+ <span class='doccomment'>/// server at the other end of the connection. Servers send a PING</span>
+ <span class='doccomment'>/// message at regular intervals if no other activity detected coming</span>
+ <span class='doccomment'>/// from a connection. If a connection fails to respond to a PING</span>
+ <span class='doccomment'>/// message within a set amount of time, that connection is closed. A</span>
+ <span class='doccomment'>/// PING message MAY be sent even if the connection is active.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When a PING message is received, the appropriate PONG message MUST be</span>
+ <span class='doccomment'>/// sent as reply to &lt;server1&gt; (server which sent the PING message out)</span>
+ <span class='doccomment'>/// as soon as possible. If the &lt;server2&gt; parameter is specified, it</span>
+ <span class='doccomment'>/// represents the target of the ping, and the message gets forwarded</span>
+ <span class='doccomment'>/// there.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOORIGIN ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PING tolsun.oulu.fi ; Command to send a PING message to</span>
+ <span class='doccomment'>/// server</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PING WiZ tolsun.oulu.fi ; Command from WiZ to send a PING</span>
+ <span class='doccomment'>/// message to server &quot;tolsun.oulu.fi&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PING :irc.funet.fi ; Ping message sent by server</span>
+ <span class='doccomment'>/// &quot;irc.funet.fi&quot;</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>PING</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.7.3 Pong message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: PONG</span>
+ <span class='doccomment'>/// Parameters: &lt;server&gt; [ &lt;server2&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PONG message is a reply to ping message. If parameter &lt;server2&gt; is</span>
+ <span class='doccomment'>/// given, this message MUST be forwarded to given target. The &lt;server&gt;</span>
+ <span class='doccomment'>/// parameter is the name of the entity who has responded to PING message</span>
+ <span class='doccomment'>/// and generated this message.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOORIGIN ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// PONG csd.bu.edu tolsun.oulu.fi ; PONG message from csd.bu.edu to</span>
+ <span class='doccomment'>/// tolsun.oulu.fi</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>PONG</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 3.7.4 Error</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: ERROR</span>
+ <span class='doccomment'>/// Parameters: &lt;error message&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The ERROR command is for use by servers when reporting a serious or</span>
+ <span class='doccomment'>/// fatal error to its peers. It may also be sent from one server to</span>
+ <span class='doccomment'>/// another but MUST NOT be accepted from any normal unknown clients.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Only an ERROR message SHOULD be used for reporting errors which occur</span>
+ <span class='doccomment'>/// with a server-to-server link. An ERROR message is sent to the server</span>
+ <span class='doccomment'>/// at the other end (which reports it to appropriate local users and</span>
+ <span class='doccomment'>/// logs) and to appropriate local users and logs. It is not to be</span>
+ <span class='doccomment'>/// passed onto any other servers by a server if it is received from a</span>
+ <span class='doccomment'>/// server.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The ERROR message is also used before terminating a client</span>
+ <span class='doccomment'>/// connection.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When a server sends a received ERROR message to its operators, the</span>
+ <span class='doccomment'>/// message SHOULD be encapsulated inside a NOTICE message, indicating</span>
+ <span class='doccomment'>/// that the client was not responsible for the error.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numerics:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// None.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERROR :Server *.fi already exists ; ERROR message to the other server</span>
+ <span class='doccomment'>/// which caused this error.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// NOTICE WiZ :ERROR from csd.bu.edu -- Server *.fi already exists</span>
+ <span class='doccomment'>/// ; Same ERROR message as above but</span>
+ <span class='doccomment'>/// sent to user WiZ on the other server.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>ERROR</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.1 Away</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: AWAY</span>
+ <span class='doccomment'>/// Parameters: [ &lt;text&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// With the AWAY command, clients can set an automatic reply string for</span>
+ <span class='doccomment'>/// any PRIVMSG commands directed at them (not to a channel they are on).</span>
+ <span class='doccomment'>/// The server sends an automatic reply to the client sending the PRIVMSG</span>
+ <span class='doccomment'>/// command. The only replying server is the one to which the sending</span>
+ <span class='doccomment'>/// client is connected to.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The AWAY command is used either with one parameter, to set an AWAY</span>
+ <span class='doccomment'>/// message, or with no parameters, to remove the AWAY message.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Because of its high cost (memory and bandwidth wise), the AWAY</span>
+ <span class='doccomment'>/// message SHOULD only be used for client-server communication. A</span>
+ <span class='doccomment'>/// server MAY choose to silently ignore AWAY messages received from</span>
+ <span class='doccomment'>/// other servers. To update the away status of a client across servers,</span>
+ <span class='doccomment'>/// the user mode &#39;a&#39; SHOULD be used instead. (See Section 3.1.5)</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_UNAWAY RPL_NOWAWAY</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// AWAY :Gone to lunch. Back in 5 ; Command to set away message to</span>
+ <span class='doccomment'>/// &quot;Gone to lunch. Back in 5&quot;.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>AWAY</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.2 Rehash message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: REHASH</span>
+ <span class='doccomment'>/// Parameters: None</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The rehash command is an administrative command which can be used by</span>
+ <span class='doccomment'>/// an operator to force the server to re-read and process its</span>
+ <span class='doccomment'>/// configuration file.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_REHASHING ERR_NOPRIVILEGES</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// REHASH ; message from user with operator</span>
+ <span class='doccomment'>/// status to server asking it to reread</span>
+ <span class='doccomment'>/// its configuration file.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>REHASH</span>,
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.3 Die message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: DIE</span>
+ <span class='doccomment'>/// Parameters: None</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// An operator can use the DIE command to shutdown the server. This</span>
+ <span class='doccomment'>/// message is optional since it may be viewed as a risk to allow</span>
+ <span class='doccomment'>/// arbitrary people to connect to a server as an operator and execute</span>
+ <span class='doccomment'>/// this command.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The DIE command MUST always be fully processed by the server to which</span>
+ <span class='doccomment'>/// the sending client is connected and MUST NOT be passed onto other</span>
+ <span class='doccomment'>/// connected servers.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOPRIVILEGES</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// DIE ; no parameters required.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>DIE</span>,
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.4 Restart message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: RESTART</span>
+ <span class='doccomment'>/// Parameters: None</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// An operator can use the restart command to force the server to</span>
+ <span class='doccomment'>/// restart itself. This message is optional since it may be viewed as a</span>
+ <span class='doccomment'>/// risk to allow arbitrary people to connect to a server as an operator</span>
+ <span class='doccomment'>/// and execute this command, causing (at least) a disruption to service.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The RESTART command MUST always be fully processed by the server to</span>
+ <span class='doccomment'>/// which the sending client is connected and MUST NOT be passed onto</span>
+ <span class='doccomment'>/// other connected servers.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOPRIVILEGES</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RESTART ; no parameters required.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>RESTART</span>,
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.5 Summon message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: SUMMON</span>
+ <span class='doccomment'>/// Parameters: &lt;user&gt; [ &lt;target&gt; [ &lt;channel&gt; ] ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The SUMMON command can be used to give users who are on a host</span>
+ <span class='doccomment'>/// running an IRC server a message asking them to please join IRC. This</span>
+ <span class='doccomment'>/// message is only sent if the target server (a) has SUMMON enabled, (b)</span>
+ <span class='doccomment'>/// the user is logged in and (c) the server process can write to the</span>
+ <span class='doccomment'>/// user&#39;s tty (or similar).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If no &lt;server&gt; parameter is given it tries to summon &lt;user&gt; from the</span>
+ <span class='doccomment'>/// server the client is connected to is assumed as the target.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If summon is not enabled in a server, it MUST return the</span>
+ <span class='doccomment'>/// ERR_SUMMONDISABLED numeric.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NORECIPIENT ERR_FILEERROR</span>
+ <span class='doccomment'>/// ERR_NOLOGIN ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// ERR_SUMMONDISABLED RPL_SUMMONING</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Examples:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SUMMON jto ; summon user jto on the server&#39;s</span>
+ <span class='doccomment'>/// host</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// SUMMON jto tolsun.oulu.fi ; summon user jto on the host which a</span>
+ <span class='doccomment'>/// server named &quot;tolsun.oulu.fi&quot; is</span>
+ <span class='doccomment'>/// running.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>SUMMON</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>)<span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.6 Users</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: USERS</span>
+ <span class='doccomment'>/// Parameters: [ &lt;target&gt; ]</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The USERS command returns a list of users logged into the server in a</span>
+ <span class='doccomment'>/// format similar to the UNIX commands who(1), rusers(1) and finger(1).</span>
+ <span class='doccomment'>/// If disabled, the correct numeric MUST be returned to indicate this.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Because of the security implications of such a command, it SHOULD be</span>
+ <span class='doccomment'>/// disabled by default in server implementations. Enabling it SHOULD</span>
+ <span class='doccomment'>/// require recompiling the server or some equivalent change rather than</span>
+ <span class='doccomment'>/// simply toggling an option and restarting the server. The procedure</span>
+ <span class='doccomment'>/// to enable this command SHOULD also include suitable large comments.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NOSUCHSERVER ERR_FILEERROR</span>
+ <span class='doccomment'>/// RPL_USERSSTART RPL_USERS</span>
+ <span class='doccomment'>/// RPL_NOUSERS RPL_ENDOFUSERS</span>
+ <span class='doccomment'>/// ERR_USERSDISABLED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Disabled Reply:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_USERSDISABLED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// USERS eff.org ; request a list of users logged in</span>
+ <span class='doccomment'>/// on server eff.org</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>USERS</span>(<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.7 Operwall message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: WALLOPS</span>
+ <span class='doccomment'>/// Parameters: &lt;Text to be sent&gt;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The WALLOPS command is used to send a message to all currently</span>
+ <span class='doccomment'>/// connected users who have set the &#39;w&#39; user mode for themselves. (See</span>
+ <span class='doccomment'>/// Section 3.1.5 &quot;User modes&quot;).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// After implementing WALLOPS as a user command it was found that it was</span>
+ <span class='doccomment'>/// often and commonly abused as a means of sending a message to a lot of</span>
+ <span class='doccomment'>/// people. Due to this, it is RECOMMENDED that the implementation of</span>
+ <span class='doccomment'>/// WALLOPS allows and recognizes only servers as the originators of</span>
+ <span class='doccomment'>/// WALLOPS.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :csd.bu.edu WALLOPS :Connect &#39;*.uiuc.edu 6667&#39; from Joshua ; WALLOPS</span>
+ <span class='doccomment'>/// message from csd.bu.edu announcing a</span>
+ <span class='doccomment'>/// CONNECT message it received from</span>
+ <span class='doccomment'>/// Joshua and acted upon.</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>WALLOPS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// ```text</span>
+ <span class='doccomment'>/// 4.8 Userhost message</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Command: USERHOST</span>
+ <span class='doccomment'>/// Parameters: &lt;nickname&gt; *( SPACE &lt;nickname&gt; )</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The USERHOST command takes a list of up to 5 nicknames, each</span>
+ <span class='doccomment'>/// separated by a space character and returns a list of information</span>
+ <span class='doccomment'>/// about each nickname that it found. The returned list has each reply</span>
+ <span class='doccomment'>/// separated by a space.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Numeric Replies:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_USERHOST ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Example:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// USERHOST Wiz Michael syrk ; USERHOST request for information on</span>
+ <span class='doccomment'>/// nicks &quot;Wiz&quot;, &quot;Michael&quot;, and &quot;syrk&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// :ircd.stealth.net 302 yournick :syrk=+syrk@millennium.stealth.net</span>
+ <span class='doccomment'>/// ; Reply for user syrk</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='ident'>USERHOST</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span>),
+}
+
+<span class='comment'>/*impl&lt;&#39;a&gt; Clone for Command&lt;&#39;a&gt; {
+ fn clone(&amp;self) -&gt; Command&lt;&#39;a&gt; {
+ use self::Command::*;
+ match self {
+ &amp;PASS(ref pw) =&gt; PASS(pw.to_owned().clone()),
+ /*&amp;NICK(ref nick) =&gt;
+ Message::format(None, Borrowed(&quot;NICK&quot;), vec![], Some(nick.clone()), MsgType::Irc),
+ &amp;USER(ref user, ref mode, ref unused, ref realname) =&gt;
+ Message::format(None, Borrowed(&quot;USER&quot;),
+ vec![user.clone(), mode.clone(), unused.clone()],
+ Some(realname.clone()), MsgType::Irc),
+ &amp;OPER(ref name, ref pw) =&gt;
+ Message::format(None, Borrowed(&quot;OPER&quot;),
+ vec![name.clone(), pw.clone()], None, MsgType::Irc),
+ &amp;UMODE(ref mode) =&gt;
+ Message::format(None, Borrowed(&quot;MODE&quot;), vec![], Some(mode.clone()), MsgType::Irc),
+ &amp;SERVICE(ref nick, ref reserved, ref distribution, ref type_, ref reserved2, ref info) =&gt;
+ Message::format(None, Borrowed(&quot;SERVICE&quot;),
+ vec![nick.clone(), reserved.clone(), distribution.clone(),
+ type_.clone(), reserved2.clone()], Some(info.clone()), MsgType::Irc),
+ &amp;QUIT(ref msg) =&gt;
+ Message::format(None, Borrowed(&quot;QUIT&quot;), vec![], msg.clone(), MsgType::Irc),
+ &amp;SQUIT(ref server, ref comment) =&gt;
+ Message::format(None, Borrowed(&quot;SQUIT&quot;),
+ vec![server.clone()], Some(comment.clone()), MsgType::Irc),
+ &amp;JOIN(ref ch, ref pw) =&gt;
+ Message::format(None, Borrowed(&quot;JOIN&quot;),
+ vec![Owned(ch.connect(&quot;,&quot;)), Owned(pw.connect(&quot;,&quot;))], None, MsgType::Irc),
+ &amp;PART(ref ch, ref reason) =&gt;
+ Message::format(None, Borrowed(&quot;PART&quot;),
+ vec![Owned(ch.connect(&quot;,&quot;))], reason.clone(), MsgType::Irc),
+ &amp;MODE(ref channel, ref modes) =&gt;
+ // Screw this, folding will have to do.
+ Message::format(None, Borrowed(&quot;MODE&quot;),
+ modes.iter().fold(vec![channel.clone()], |mut v, &amp;(ref a, ref b)| {
+ v.push(a.clone());
+ v.push(b.clone());
+ v
+ }), None, MsgType::Irc),
+ &amp;TOPIC(ref channel, ref topic) =&gt;
+ Message::format(None, Borrowed(&quot;TOPIC&quot;),
+ vec![channel.clone()], topic.clone(), MsgType::Irc),
+ &amp;NAMES(ref ch, ref target) =&gt;
+ Message::format(None, Borrowed(&quot;NAMES&quot;),
+ vec![Owned(ch.connect(&quot;,&quot;))], target.clone(), MsgType::Irc),
+ &amp;LIST(ref ch, ref target) =&gt;
+ Message::format(None, Borrowed(&quot;LIST&quot;),
+ vec![Owned(ch.connect(&quot;,&quot;))], target.clone(), MsgType::Irc),
+ &amp;INVITE(ref nick, ref channel) =&gt;
+ Message::format(None, Borrowed(&quot;INVITE&quot;),
+ vec![nick.clone()], Some(channel.clone()), MsgType::Irc),
+ &amp;KICK(ref ch, ref users, ref comment) =&gt;
+ Message::format(None, Borrowed(&quot;KICK&quot;),
+ vec![Owned(ch.connect(&quot;,&quot;)), Owned(users.connect(&quot;,&quot;))],
+ comment.clone(), MsgType::Irc),
+ &amp;PRIVMSG(ref target, ref msg) =&gt;
+ Message::format(None, Borrowed(&quot;PRIVMSG&quot;),
+ vec![target.clone()], Some(msg.clone()), MsgType::Irc),
+ &amp;NOTICE(ref target, ref text) =&gt;
+ Message::format(None, Borrowed(&quot;NOTICE&quot;),
+ vec![target.clone()], Some(text.clone()), MsgType::Irc),
+ &amp;MOTD(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;MOTD&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;LUSERS(ref lu) =&gt;
+ Message::format(None, Borrowed(&quot;LUSERS&quot;),
+ lu.as_ref().map(|&amp;(ref mask, _)| vec![mask.clone()]).unwrap_or(vec![]),
+ lu.as_ref().and_then(|&amp;(_, ref target)| target.clone()), MsgType::Irc),
+ &amp;VERSION(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;VERSION&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;STATS(ref st) =&gt;
+ Message::format(None, Borrowed(&quot;STATS&quot;),
+ st.as_ref().map(|&amp;(ref query, _)| vec![query.clone()]).unwrap_or(vec![]),
+ st.as_ref().and_then(|&amp;(_, ref target)| target.clone()), MsgType::Irc),
+ &amp;LINKS(ref l) =&gt;
+ Message::format(None, Borrowed(&quot;LINKS&quot;),
+ l.as_ref().map(|&amp;(ref remote, ref mask)| if remote.is_some() {
+ vec![remote.clone().unwrap(), mask.clone()] } else { vec![mask.clone()] }).unwrap_or(vec![]),
+ None, MsgType::Irc),
+ &amp;TIME(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;TIME&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;CONNECT(ref server, ref port, ref remote) =&gt;
+ Message::format(None, Borrowed(&quot;CONNECT&quot;),
+ vec![server.clone(), Owned(format!(&quot;{}&quot;, port))], remote.clone(), MsgType::Irc),
+ &amp;TRACE(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;TRACE&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;ADMIN(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;ADMIN&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;INFO(ref target) =&gt;
+ Message::format(None, Borrowed(&quot;INFO&quot;), vec![], target.clone(), MsgType::Irc),
+ &amp;SERVLIST(ref sl) =&gt;
+ Message::format(None, Borrowed(&quot;SERVLIST&quot;),
+ sl.as_ref().map(|&amp;(ref mask, ref target)| target.as_ref()
+ .map(|t| vec![mask.clone(), t.clone()])
+ .unwrap_or_else(|| vec![mask.clone()]))
+ .unwrap_or(vec![]), None, MsgType::Irc),
+ &amp;SQUERY(ref name, ref text) =&gt;
+ Message::format(None, Borrowed(&quot;SQUERY&quot;),
+ vec![name.clone()], Some(text.clone()), MsgType::Irc),
+ &amp;WHO(ref mask, o) =&gt;
+ Message::format(None, Borrowed(&quot;WHO&quot;),
+ match (mask, o) {
+ (&amp;Some(ref m), true) =&gt; vec![m.clone(), Borrowed(&quot;o&quot;)],
+ (&amp;Some(ref m), false) =&gt; vec![m.clone()],
+ (&amp;None, _) =&gt; vec![]
+ }, None, MsgType::Irc),
+ &amp;WHOIS(ref target, ref masks) =&gt;
+ Message::format(None, Borrowed(&quot;WHOIS&quot;),
+ target.as_ref().map(|t| vec![t.clone(), Owned(masks.connect(&quot;,&quot;))])
+ .unwrap_or_else(|| vec![Owned(masks.connect(&quot;,&quot;))]), None, MsgType::Irc),
+ &amp;WHOWAS(ref nick, ref count) =&gt;
+ Message::format(None, Borrowed(&quot;WHOWAS&quot;), match count {
+ &amp;Some((ref c, Some(ref t))) =&gt; vec![Owned(nick.connect(&quot;,&quot;)), c.clone(), t.clone()],
+ &amp;Some((ref c, None)) =&gt; vec![Owned(nick.connect(&quot;,&quot;)), c.clone()],
+ &amp;None =&gt; vec![Owned(nick.connect(&quot;,&quot;))]
+ }, None, MsgType::Irc),
+ &amp;PING(ref s1, ref s2) =&gt;
+ Message::format(None, Borrowed(&quot;PING&quot;), vec![s1.clone()], s2.clone(), MsgType::Irc),
+ &amp;PONG(ref s1, ref s2) =&gt;
+ Message::format(None, Borrowed(&quot;PONG&quot;), vec![s1.clone()], s2.clone(), MsgType::Irc),
+ */ /*&amp;Command::PING(ref server1, ref server2) =&gt; {
+ let mut c = Vec::new();
+ c.push(server1.clone());
+ if let &amp;Some(ref s) = server2 { c.push(s.clone()) }
+ Message::format(None, &quot;PING&quot;, c, None, MsgType::Irc)
+ },
+ &amp;Command::PONG(ref server1, ref server2) =&gt; {
+ let mut c = Vec::new();
+ c.push(server1.clone());
+ if let &amp;Some(ref s) = server2 { c.push(s.clone()) }
+ Message::format(None, &quot;PONG&quot;, c, None, MsgType::Irc)
+ },*/
+ _ =&gt; unimplemented!()
+ }
+
+ }
+}*/</span>
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_message</span>(<span class='ident'>msg</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Message</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Command</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='ident'>msg</span>.<span class='ident'>command</span>() {
+ <span class='string'>&quot;PASS&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>m</span><span class='op'>|</span> <span class='ident'>m</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>).<span class='ident'>map</span>(<span class='ident'>PASS</span>),
+ <span class='string'>&quot;NICK&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>suffix</span>().<span class='ident'>or_else</span>(<span class='op'>||</span> <span class='ident'>msg</span>.<span class='ident'>content</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>m</span><span class='op'>|</span> <span class='ident'>m</span>))
+ .<span class='ident'>map</span>(<span class='ident'>Borrowed</span>).<span class='ident'>map</span>(<span class='ident'>NICK</span>),
+ <span class='string'>&quot;USER&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>user</span>, <span class='ident'>mode</span>, <span class='ident'>unused</span>, <span class='ident'>realname</span>, ..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>USER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>user</span>), <span class='ident'>Borrowed</span>(<span class='ident'>mode</span>),
+ <span class='ident'>Borrowed</span>(<span class='ident'>unused</span>), <span class='ident'>Borrowed</span>(<span class='ident'>realname</span>)))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ <span class='string'>&quot;OPER&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>name</span>, <span class='ident'>pw</span>, ..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>OPER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>name</span>), <span class='ident'>Borrowed</span>(<span class='ident'>pw</span>)))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ <span class='string'>&quot;PING&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>();
+ <span class='ident'>e</span>.<span class='ident'>first</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s1</span><span class='op'>|</span> <span class='ident'>PING</span>(<span class='ident'>Borrowed</span>(<span class='ident'>s1</span>), <span class='ident'>e</span>.<span class='ident'>get</span>(<span class='number'>1</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>m</span><span class='op'>|</span> <span class='ident'>m</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>)))
+ },
+ <span class='string'>&quot;PONG&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>();
+ <span class='ident'>e</span>.<span class='ident'>first</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s1</span><span class='op'>|</span> <span class='ident'>PONG</span>(<span class='ident'>Borrowed</span>(<span class='ident'>s1</span>), <span class='ident'>e</span>.<span class='ident'>get</span>(<span class='number'>1</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>m</span><span class='op'>|</span> <span class='ident'>m</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>)))
+ },
+ <span class='string'>&quot;JOIN&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>ch</span>, <span class='ident'>pw</span>, ..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>JOIN</span>(<span class='ident'>ch</span>.<span class='ident'>split</span>(<span class='string'>&quot;,&quot;</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>).<span class='ident'>collect</span>(),
+ <span class='ident'>pw</span>.<span class='ident'>split</span>(<span class='string'>&quot;,&quot;</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>).<span class='ident'>collect</span>()))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ <span class='string'>&quot;PART&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>ch</span>, <span class='ident'>reason</span>..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>PART</span>(<span class='ident'>ch</span>.<span class='ident'>split</span>(<span class='string'>&quot;,&quot;</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>).<span class='ident'>collect</span>(),
+ <span class='ident'>reason</span>.<span class='ident'>first</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>m</span><span class='op'>|</span> <span class='ident'>m</span>).<span class='ident'>map</span>(<span class='ident'>Borrowed</span>)))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ <span class='string'>&quot;PRIVMSG&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>target</span>, <span class='ident'>msg</span>, ..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>PRIVMSG</span>(<span class='ident'>Borrowed</span>(<span class='ident'>target</span>), <span class='ident'>Borrowed</span>(<span class='ident'>msg</span>)))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ <span class='string'>&quot;NOTICE&quot;</span> <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='kw'>let</span> [<span class='ident'>target</span>, <span class='ident'>msg</span>, ..] <span class='op'>=</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>as_ref</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>NOTICE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>target</span>), <span class='ident'>Borrowed</span>(<span class='ident'>msg</span>)))
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> },
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+
+ <span class='doccomment'>/// It started out pretty, but was quickly infested with `ref` and cloning.</span>
+ <span class='doccomment'>/// I&#39;m sorry, this one might not make it.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_message</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Message</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Command</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>PASS</span>(<span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;PASS&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>pw</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>NICK</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;NICK&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>nick</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>USER</span>(<span class='kw-2'>ref</span> <span class='ident'>user</span>, <span class='kw-2'>ref</span> <span class='ident'>mode</span>, <span class='kw-2'>ref</span> <span class='ident'>unused</span>, <span class='kw-2'>ref</span> <span class='ident'>realname</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;USER&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>user</span>.<span class='ident'>clone</span>(), <span class='ident'>mode</span>.<span class='ident'>clone</span>(), <span class='ident'>unused</span>.<span class='ident'>clone</span>()],
+ <span class='prelude-val'>Some</span>(<span class='ident'>realname</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>OPER</span>(<span class='kw-2'>ref</span> <span class='ident'>name</span>, <span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;OPER&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>name</span>.<span class='ident'>clone</span>(), <span class='ident'>pw</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>UMODE</span>(<span class='kw-2'>ref</span> <span class='ident'>mode</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;MODE&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>mode</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>SERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>reserved</span>, <span class='kw-2'>ref</span> <span class='ident'>distribution</span>, <span class='kw-2'>ref</span> <span class='ident'>type_</span>, <span class='kw-2'>ref</span> <span class='ident'>reserved2</span>, <span class='kw-2'>ref</span> <span class='ident'>info</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;SERVICE&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>nick</span>.<span class='ident'>clone</span>(), <span class='ident'>reserved</span>.<span class='ident'>clone</span>(), <span class='ident'>distribution</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>type_</span>.<span class='ident'>clone</span>(), <span class='ident'>reserved2</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>info</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>QUIT</span>(<span class='kw-2'>ref</span> <span class='ident'>msg</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;QUIT&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>msg</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>SQUIT</span>(<span class='kw-2'>ref</span> <span class='ident'>server</span>, <span class='kw-2'>ref</span> <span class='ident'>comment</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;SQUIT&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>server</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>comment</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>JOIN</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;JOIN&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>ch</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>)), <span class='ident'>Owned</span>(<span class='ident'>pw</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))], <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>PART</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>reason</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;PART&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>ch</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))], <span class='ident'>reason</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>MODE</span>(<span class='kw-2'>ref</span> <span class='ident'>channel</span>, <span class='kw-2'>ref</span> <span class='ident'>modes</span>) <span class='op'>=&gt;</span>
+ <span class='comment'>// Screw this, folding will have to do.</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;MODE&quot;</span>),
+ <span class='ident'>modes</span>.<span class='ident'>iter</span>().<span class='ident'>fold</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>channel</span>.<span class='ident'>clone</span>()], <span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>v</span>, <span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> {
+ <span class='ident'>v</span>.<span class='ident'>push</span>(<span class='ident'>a</span>.<span class='ident'>clone</span>());
+ <span class='ident'>v</span>.<span class='ident'>push</span>(<span class='ident'>b</span>.<span class='ident'>clone</span>());
+ <span class='ident'>v</span>
+ }), <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>TOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>channel</span>, <span class='kw-2'>ref</span> <span class='ident'>topic</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;TOPIC&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>channel</span>.<span class='ident'>clone</span>()], <span class='ident'>topic</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>NAMES</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;NAMES&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>ch</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>LIST</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;LIST&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>ch</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>INVITE</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>channel</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;INVITE&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>nick</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>channel</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>KICK</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>users</span>, <span class='kw-2'>ref</span> <span class='ident'>comment</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;KICK&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>ch</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>)), <span class='ident'>Owned</span>(<span class='ident'>users</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))],
+ <span class='ident'>comment</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>PRIVMSG</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>msg</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;PRIVMSG&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>target</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>msg</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>NOTICE</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>text</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;NOTICE&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>target</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>text</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>MOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;MOTD&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>LUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>lu</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;LUSERS&quot;</span>),
+ <span class='ident'>lu</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>mask</span>, _)<span class='op'>|</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>mask</span>.<span class='ident'>clone</span>()]).<span class='ident'>unwrap_or</span>(<span class='macro'>vec</span><span class='macro'>!</span>[]),
+ <span class='ident'>lu</span>.<span class='ident'>as_ref</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(_, <span class='kw-2'>ref</span> <span class='ident'>target</span>)<span class='op'>|</span> <span class='ident'>target</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>VERSION</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;VERSION&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>STATS</span>(<span class='kw-2'>ref</span> <span class='ident'>st</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;STATS&quot;</span>),
+ <span class='ident'>st</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>query</span>, _)<span class='op'>|</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>query</span>.<span class='ident'>clone</span>()]).<span class='ident'>unwrap_or</span>(<span class='macro'>vec</span><span class='macro'>!</span>[]),
+ <span class='ident'>st</span>.<span class='ident'>as_ref</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(_, <span class='kw-2'>ref</span> <span class='ident'>target</span>)<span class='op'>|</span> <span class='ident'>target</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>LINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>l</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;LINKS&quot;</span>),
+ <span class='ident'>l</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>remote</span>, <span class='kw-2'>ref</span> <span class='ident'>mask</span>)<span class='op'>|</span> <span class='kw'>if</span> <span class='ident'>remote</span>.<span class='ident'>is_some</span>() {
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>remote</span>.<span class='ident'>clone</span>().<span class='ident'>unwrap</span>(), <span class='ident'>mask</span>.<span class='ident'>clone</span>()] } <span class='kw'>else</span> { <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>mask</span>.<span class='ident'>clone</span>()] }).<span class='ident'>unwrap_or</span>(<span class='macro'>vec</span><span class='macro'>!</span>[]),
+ <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>TIME</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;TIME&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>CONNECT</span>(<span class='kw-2'>ref</span> <span class='ident'>server</span>, <span class='kw-2'>ref</span> <span class='ident'>port</span>, <span class='kw-2'>ref</span> <span class='ident'>remote</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;CONNECT&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>server</span>.<span class='ident'>clone</span>(), <span class='ident'>Owned</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}&quot;</span>, <span class='ident'>port</span>))], <span class='ident'>remote</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>TRACE</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;TRACE&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ADMIN</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;ADMIN&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>INFO</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;INFO&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='ident'>target</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>SERVLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>sl</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;SERVLIST&quot;</span>),
+ <span class='ident'>sl</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>mask</span>, <span class='kw-2'>ref</span> <span class='ident'>target</span>)<span class='op'>|</span> <span class='ident'>target</span>.<span class='ident'>as_ref</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>t</span><span class='op'>|</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>mask</span>.<span class='ident'>clone</span>(), <span class='ident'>t</span>.<span class='ident'>clone</span>()])
+ .<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>mask</span>.<span class='ident'>clone</span>()]))
+ .<span class='ident'>unwrap_or</span>(<span class='macro'>vec</span><span class='macro'>!</span>[]), <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>SQUERY</span>(<span class='kw-2'>ref</span> <span class='ident'>name</span>, <span class='kw-2'>ref</span> <span class='ident'>text</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;SQUERY&quot;</span>),
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>name</span>.<span class='ident'>clone</span>()], <span class='prelude-val'>Some</span>(<span class='ident'>text</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHO</span>(<span class='kw-2'>ref</span> <span class='ident'>mask</span>, <span class='ident'>o</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;WHO&quot;</span>),
+ <span class='kw'>match</span> (<span class='ident'>mask</span>, <span class='ident'>o</span>) {
+ (<span class='kw-2'>&amp;</span><span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>m</span>), <span class='boolval'>true</span>) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>m</span>.<span class='ident'>clone</span>(), <span class='ident'>Borrowed</span>(<span class='string'>&quot;o&quot;</span>)],
+ (<span class='kw-2'>&amp;</span><span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>m</span>), <span class='boolval'>false</span>) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>m</span>.<span class='ident'>clone</span>()],
+ (<span class='kw-2'>&amp;</span><span class='prelude-val'>None</span>, _) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[]
+ }, <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHOIS</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>masks</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;WHOIS&quot;</span>),
+ <span class='ident'>target</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>t</span><span class='op'>|</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>t</span>.<span class='ident'>clone</span>(), <span class='ident'>Owned</span>(<span class='ident'>masks</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))])
+ .<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>masks</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))]), <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHOWAS</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>count</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;WHOWAS&quot;</span>), <span class='kw'>match</span> <span class='ident'>count</span> {
+ <span class='kw-2'>&amp;</span><span class='prelude-val'>Some</span>((<span class='kw-2'>ref</span> <span class='ident'>c</span>, <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>t</span>))) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>nick</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>)), <span class='ident'>c</span>.<span class='ident'>clone</span>(), <span class='ident'>t</span>.<span class='ident'>clone</span>()],
+ <span class='kw-2'>&amp;</span><span class='prelude-val'>Some</span>((<span class='kw-2'>ref</span> <span class='ident'>c</span>, <span class='prelude-val'>None</span>)) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>nick</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>)), <span class='ident'>c</span>.<span class='ident'>clone</span>()],
+ <span class='kw-2'>&amp;</span><span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>Owned</span>(<span class='ident'>nick</span>.<span class='ident'>connect</span>(<span class='string'>&quot;,&quot;</span>))]
+ }, <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>PING</span>(<span class='kw-2'>ref</span> <span class='ident'>s1</span>, <span class='kw-2'>ref</span> <span class='ident'>s2</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;PING&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>s1</span>.<span class='ident'>clone</span>()], <span class='ident'>s2</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>PONG</span>(<span class='kw-2'>ref</span> <span class='ident'>s1</span>, <span class='kw-2'>ref</span> <span class='ident'>s2</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;PONG&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>s1</span>.<span class='ident'>clone</span>()], <span class='ident'>s2</span>.<span class='ident'>clone</span>(), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ _ <span class='op'>=&gt;</span> <span class='macro'>unimplemented</span><span class='macro'>!</span>()
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_static</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>s</span>(<span class='ident'>c</span>: <span class='kw-2'>&amp;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='ident'>str</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span>, <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>c</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())
+ }
+ <span class='kw'>fn</span> <span class='ident'>so</span>(<span class='ident'>c</span>: <span class='kw-2'>&amp;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='ident'>str</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span>, <span class='ident'>str</span><span class='op'>&gt;&gt;</span> {
+ <span class='ident'>c</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='ident'>s</span>)
+ }
+ <span class='kw'>fn</span> <span class='ident'>sv</span>(<span class='ident'>c</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='ident'>str</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span>, <span class='ident'>str</span><span class='op'>&gt;&gt;</span> {
+ <span class='ident'>c</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='ident'>s</span>).<span class='ident'>collect</span>()
+ }
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Command</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>PASS</span>(<span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span> <span class='ident'>PASS</span>(<span class='ident'>s</span>(<span class='ident'>pw</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>NICK</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>) <span class='op'>=&gt;</span> <span class='ident'>NICK</span>(<span class='ident'>s</span>(<span class='ident'>nick</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>USER</span>(<span class='kw-2'>ref</span> <span class='ident'>user</span>, <span class='kw-2'>ref</span> <span class='ident'>mode</span>, <span class='kw-2'>ref</span> <span class='ident'>unused</span>, <span class='kw-2'>ref</span> <span class='ident'>realname</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>USER</span>(<span class='ident'>s</span>(<span class='ident'>user</span>), <span class='ident'>s</span>(<span class='ident'>mode</span>), <span class='ident'>s</span>(<span class='ident'>unused</span>), <span class='ident'>s</span>(<span class='ident'>realname</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>OPER</span>(<span class='kw-2'>ref</span> <span class='ident'>name</span>, <span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span> <span class='ident'>OPER</span>(<span class='ident'>s</span>(<span class='ident'>name</span>), <span class='ident'>s</span>(<span class='ident'>pw</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>UMODE</span>(<span class='kw-2'>ref</span> <span class='ident'>mode</span>) <span class='op'>=&gt;</span> <span class='ident'>UMODE</span>(<span class='ident'>s</span>(<span class='ident'>mode</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>SERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>reserved</span>, <span class='kw-2'>ref</span> <span class='ident'>distribution</span>, <span class='kw-2'>ref</span> <span class='ident'>type_</span>, <span class='kw-2'>ref</span> <span class='ident'>reserved2</span>, <span class='kw-2'>ref</span> <span class='ident'>info</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>SERVICE</span>(<span class='ident'>s</span>(<span class='ident'>nick</span>), <span class='ident'>s</span>(<span class='ident'>reserved</span>), <span class='ident'>s</span>(<span class='ident'>distribution</span>), <span class='ident'>s</span>(<span class='ident'>type_</span>), <span class='ident'>s</span>(<span class='ident'>reserved2</span>), <span class='ident'>s</span>(<span class='ident'>info</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>QUIT</span>(<span class='kw-2'>ref</span> <span class='ident'>msg</span>) <span class='op'>=&gt;</span> <span class='ident'>QUIT</span>(<span class='ident'>so</span>(<span class='ident'>msg</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>SQUIT</span>(<span class='kw-2'>ref</span> <span class='ident'>server</span>, <span class='kw-2'>ref</span> <span class='ident'>comment</span>) <span class='op'>=&gt;</span> <span class='ident'>SQUIT</span>(<span class='ident'>s</span>(<span class='ident'>server</span>), <span class='ident'>s</span>(<span class='ident'>comment</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>JOIN</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>pw</span>) <span class='op'>=&gt;</span> <span class='ident'>JOIN</span>(<span class='ident'>sv</span>(<span class='ident'>ch</span>), <span class='ident'>sv</span>(<span class='ident'>pw</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>PART</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>reason</span>) <span class='op'>=&gt;</span> <span class='ident'>PART</span>(<span class='ident'>sv</span>(<span class='ident'>ch</span>), <span class='ident'>so</span>(<span class='ident'>reason</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>MODE</span>(<span class='kw-2'>ref</span> <span class='ident'>channel</span>, <span class='kw-2'>ref</span> <span class='ident'>modes</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>MODE</span>(<span class='ident'>s</span>(<span class='ident'>channel</span>), <span class='ident'>modes</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>s</span>(<span class='ident'>a</span>), <span class='ident'>s</span>(<span class='ident'>b</span>))).<span class='ident'>collect</span>()),
+ <span class='kw-2'>&amp;</span><span class='ident'>TOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>channel</span>, <span class='kw-2'>ref</span> <span class='ident'>topic</span>) <span class='op'>=&gt;</span> <span class='ident'>TOPIC</span>(<span class='ident'>s</span>(<span class='ident'>channel</span>), <span class='ident'>so</span>(<span class='ident'>topic</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>NAMES</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>NAMES</span>(<span class='ident'>sv</span>(<span class='ident'>ch</span>), <span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>LIST</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>LIST</span>(<span class='ident'>sv</span>(<span class='ident'>ch</span>), <span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>INVITE</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>channel</span>) <span class='op'>=&gt;</span> <span class='ident'>INVITE</span>(<span class='ident'>s</span>(<span class='ident'>nick</span>), <span class='ident'>s</span>(<span class='ident'>channel</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>KICK</span>(<span class='kw-2'>ref</span> <span class='ident'>ch</span>, <span class='kw-2'>ref</span> <span class='ident'>users</span>, <span class='kw-2'>ref</span> <span class='ident'>comment</span>) <span class='op'>=&gt;</span> <span class='ident'>KICK</span>(<span class='ident'>sv</span>(<span class='ident'>ch</span>), <span class='ident'>sv</span>(<span class='ident'>users</span>), <span class='ident'>so</span>(<span class='ident'>comment</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>PRIVMSG</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>msg</span>) <span class='op'>=&gt;</span> <span class='ident'>PRIVMSG</span>(<span class='ident'>s</span>(<span class='ident'>target</span>), <span class='ident'>s</span>(<span class='ident'>msg</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>NOTICE</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>text</span>) <span class='op'>=&gt;</span> <span class='ident'>NOTICE</span>(<span class='ident'>s</span>(<span class='ident'>target</span>), <span class='ident'>s</span>(<span class='ident'>text</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>MOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>MOTD</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>LUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>lu</span>) <span class='op'>=&gt;</span> <span class='ident'>LUSERS</span>(<span class='ident'>lu</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>s</span>(<span class='ident'>a</span>), <span class='ident'>so</span>(<span class='ident'>b</span>)))),
+ <span class='kw-2'>&amp;</span><span class='ident'>VERSION</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>VERSION</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>STATS</span>(<span class='kw-2'>ref</span> <span class='ident'>st</span>) <span class='op'>=&gt;</span> <span class='ident'>STATS</span>(<span class='ident'>st</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>s</span>(<span class='ident'>a</span>), <span class='ident'>so</span>(<span class='ident'>b</span>)))),
+ <span class='kw-2'>&amp;</span><span class='ident'>LINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>l</span>) <span class='op'>=&gt;</span> <span class='ident'>LINKS</span>(<span class='ident'>l</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>so</span>(<span class='ident'>a</span>), <span class='ident'>s</span>(<span class='ident'>b</span>)))),
+ <span class='kw-2'>&amp;</span><span class='ident'>TIME</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>TIME</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>CONNECT</span>(<span class='kw-2'>ref</span> <span class='ident'>server</span>, <span class='ident'>port</span>, <span class='kw-2'>ref</span> <span class='ident'>remote</span>) <span class='op'>=&gt;</span> <span class='ident'>CONNECT</span>(<span class='ident'>s</span>(<span class='ident'>server</span>), <span class='ident'>port</span>, <span class='ident'>so</span>(<span class='ident'>remote</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>TRACE</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>TRACE</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>ADMIN</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>ADMIN</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>INFO</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>) <span class='op'>=&gt;</span> <span class='ident'>INFO</span>(<span class='ident'>so</span>(<span class='ident'>target</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>SERVLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>sl</span>) <span class='op'>=&gt;</span> <span class='ident'>SERVLIST</span>(<span class='ident'>sl</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>s</span>(<span class='ident'>a</span>), <span class='ident'>so</span>(<span class='ident'>b</span>)))),
+ <span class='kw-2'>&amp;</span><span class='ident'>SQUERY</span>(<span class='kw-2'>ref</span> <span class='ident'>name</span>, <span class='kw-2'>ref</span> <span class='ident'>text</span>) <span class='op'>=&gt;</span> <span class='ident'>SQUERY</span>(<span class='ident'>s</span>(<span class='ident'>name</span>), <span class='ident'>s</span>(<span class='ident'>text</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHO</span>(<span class='kw-2'>ref</span> <span class='ident'>mask</span>, <span class='ident'>o</span>) <span class='op'>=&gt;</span> <span class='ident'>WHO</span>(<span class='ident'>so</span>(<span class='ident'>mask</span>), <span class='ident'>o</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHOIS</span>(<span class='kw-2'>ref</span> <span class='ident'>target</span>, <span class='kw-2'>ref</span> <span class='ident'>masks</span>) <span class='op'>=&gt;</span> <span class='ident'>WHOIS</span>(<span class='ident'>so</span>(<span class='ident'>target</span>), <span class='ident'>sv</span>(<span class='ident'>masks</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>WHOWAS</span>(<span class='kw-2'>ref</span> <span class='ident'>nick</span>, <span class='kw-2'>ref</span> <span class='ident'>count</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>WHOWAS</span>(<span class='ident'>sv</span>(<span class='ident'>nick</span>), <span class='ident'>count</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>a</span>, <span class='kw-2'>ref</span> <span class='ident'>b</span>)<span class='op'>|</span> (<span class='ident'>s</span>(<span class='ident'>a</span>), <span class='ident'>so</span>(<span class='ident'>b</span>)))),
+ <span class='kw-2'>&amp;</span><span class='ident'>PING</span>(<span class='kw-2'>ref</span> <span class='ident'>s1</span>, <span class='kw-2'>ref</span> <span class='ident'>s2</span>) <span class='op'>=&gt;</span> <span class='ident'>PING</span>(<span class='ident'>s</span>(<span class='ident'>s1</span>), <span class='ident'>so</span>(<span class='ident'>s2</span>)),
+ <span class='kw-2'>&amp;</span><span class='ident'>PONG</span>(<span class='kw-2'>ref</span> <span class='ident'>s1</span>, <span class='kw-2'>ref</span> <span class='ident'>s2</span>) <span class='op'>=&gt;</span> <span class='ident'>PONG</span>(<span class='ident'>s</span>(<span class='ident'>s1</span>), <span class='ident'>so</span>(<span class='ident'>s2</span>)),
+ _ <span class='op'>=&gt;</span> <span class='macro'>unimplemented</span><span class='macro'>!</span>()
+ }
+ }
+}
+
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/event.rs.html b/src/irsc/event.rs.html
new file mode 100644
index 0000000..c2e6ef1
--- /dev/null
+++ b/src/irsc/event.rs.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/event.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>event.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::{ <span class='ident'>Borrow</span>, <span class='ident'>ToOwned</span> };
+
+<span class='kw'>use</span> <span class='ident'>command</span>;
+<span class='kw'>use</span> <span class='ident'>reply</span>;
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Event</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>Command</span>(<span class='ident'>command</span>::<span class='ident'>Command</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+ <span class='ident'>Reply</span>(<span class='ident'>reply</span>::<span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+ <span class='ident'>Connected</span>,
+ <span class='ident'>Disconnected</span>
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Event</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_static</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Event</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='ident'>Event</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>Command</span>(<span class='kw-2'>ref</span> <span class='ident'>c</span>) <span class='op'>=&gt;</span> <span class='ident'>Command</span>(<span class='ident'>c</span>.<span class='ident'>to_static</span>()),
+ <span class='kw-2'>&amp;</span><span class='ident'>Reply</span>(<span class='kw-2'>ref</span> <span class='ident'>r</span>) <span class='op'>=&gt;</span> <span class='ident'>Reply</span>(<span class='ident'>r</span>.<span class='ident'>to_static</span>()),
+ <span class='kw-2'>&amp;</span><span class='ident'>Connected</span> <span class='op'>=&gt;</span> <span class='ident'>Connected</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>Disconnected</span> <span class='op'>=&gt;</span> <span class='ident'>Disconnected</span>
+ }
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/ident.rs.html b/src/irsc/ident.rs.html
new file mode 100644
index 0000000..6fea734
--- /dev/null
+++ b/src/irsc/ident.rs.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/ident.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>ident.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>regex</span>::<span class='ident'>Regex</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::<span class='ident'>ToOwned</span>;
+
+<span class='kw'>static</span> <span class='ident'>PATTERN</span>: <span class='ident'>Regex</span> <span class='op'>=</span> <span class='macro'>regex</span><span class='macro'>!</span>(<span class='string'>&quot;(.*)!(.*)@(.*)&quot;</span>);
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Ident</span> {
+ <span class='kw'>pub</span> <span class='ident'>nickname</span>: <span class='ident'>String</span>,
+ <span class='kw'>pub</span> <span class='ident'>user</span>: <span class='ident'>String</span>,
+ <span class='kw'>pub</span> <span class='ident'>host</span>: <span class='ident'>String</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Ident</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>parse</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ident</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>PATTERN</span>.<span class='ident'>captures</span>(<span class='ident'>s</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span> <span class='ident'>c</span>,
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ };
+ <span class='prelude-val'>Some</span>(<span class='ident'>Ident</span> {
+ <span class='ident'>nickname</span>: <span class='ident'>c</span>.<span class='ident'>at</span>(<span class='number'>1</span>).<span class='ident'>unwrap</span>().<span class='ident'>to_owned</span>(),
+ <span class='ident'>user</span>: <span class='ident'>c</span>.<span class='ident'>at</span>(<span class='number'>2</span>).<span class='ident'>unwrap</span>().<span class='ident'>to_owned</span>(),
+ <span class='ident'>host</span>: <span class='ident'>c</span>.<span class='ident'>at</span>(<span class='number'>3</span>).<span class='ident'>unwrap</span>().<span class='ident'>to_owned</span>()
+ })
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/lib.rs.html b/src/irsc/lib.rs.html
new file mode 100644
index 0000000..9571fda
--- /dev/null
+++ b/src/irsc/lib.rs.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+<span id="47">47</span>
+<span id="48">48</span>
+<span id="49">49</span>
+<span id="50">50</span>
+<span id="51">51</span>
+<span id="52">52</span>
+<span id="53">53</span>
+<span id="54">54</span>
+<span id="55">55</span>
+<span id="56">56</span>
+<span id="57">57</span>
+<span id="58">58</span>
+<span id="59">59</span>
+<span id="60">60</span>
+<span id="61">61</span>
+<span id="62">62</span>
+</pre><pre class='rust '>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>feature</span>(<span class='ident'>plugin</span>, <span class='ident'>custom_derive</span>, <span class='ident'>slice_patterns</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>plugin</span>(<span class='ident'>regex_macros</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;lints&quot;</span>, <span class='ident'>plugin</span>(<span class='ident'>clippy</span>))]</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(<span class='ident'>warnings</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unused_imports</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>regex</span>;
+<span class='attribute'>#[<span class='ident'>macro_use</span>]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>log</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>openssl</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>carboxyl</span>;
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>client</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>color</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>ident</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>callback</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>message</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>command</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>reply</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>event</span>;
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>result</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::{ <span class='ident'>Deref</span>, <span class='ident'>DerefMut</span> };
+
+<span class='kw'>use</span> <span class='ident'>openssl</span>::<span class='ident'>ssl</span>::<span class='ident'>error</span>::<span class='ident'>SslError</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>ident</span>::<span class='ident'>Ident</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>message</span>::{ <span class='ident'>Message</span>, <span class='ident'>MsgType</span> };
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>command</span>::<span class='ident'>Command</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>reply</span>::<span class='ident'>Reply</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>event</span>::<span class='ident'>Event</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>client</span>::{ <span class='ident'>Client</span>, <span class='ident'>OwnedClient</span>, <span class='ident'>SharedClient</span> };
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>IrscError</span> {
+ <span class='ident'>Io</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>),
+ <span class='ident'>AlreadyConnected</span>,
+ <span class='ident'>NotConnected</span>,
+ <span class='ident'>NotFound</span>,
+ <span class='ident'>Ssl</span>(<span class='ident'>SslError</span>)
+}
+
+<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>IrscError</span> {
+ <span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>e</span>: <span class='ident'>SslError</span>) <span class='op'>-&gt;</span> <span class='ident'>IrscError</span> { <span class='ident'>IrscError</span>::<span class='ident'>Ssl</span>(<span class='ident'>e</span>) }
+}
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span>);
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span> { <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='number'>0</span> }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>DerefMut</span> <span class='kw'>for</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>deref_mut</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span> { <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='number'>0</span> }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> { <span class='kw'>fn</span> <span class='ident'>inner</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='number'>0</span> } }
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>DEBUG</span>: <span class='ident'>bool</span> <span class='op'>=</span> <span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>debug_assertions</span>);
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/message.rs.html b/src/irsc/message.rs.html
new file mode 100644
index 0000000..cdc6033
--- /dev/null
+++ b/src/irsc/message.rs.html
@@ -0,0 +1,567 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/message.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>message.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+</pre><pre class='rust '>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>::<span class='ident'>FromStr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>string</span>::{ <span class='ident'>ToString</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::{ <span class='ident'>ToOwned</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::{ <span class='ident'>Deref</span>, <span class='ident'>Range</span> };
+
+<span class='kw'>use</span> ::<span class='ident'>IrscError</span>;
+<span class='kw'>use</span> <span class='ident'>ident</span>::<span class='ident'>Ident</span>;
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Hash</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>MsgType</span> {
+ <span class='doccomment'>/// Plain old IRC messages, as defined in [rfc2812][rfc]</span>
+ <span class='doccomment'>/// rfc: http://tools.ietf.org/html/rfc2812</span>
+ <span class='ident'>Irc</span>,
+ <span class='doccomment'>/// Ctcp messages, wrapped in \u{1}</span>
+ <span class='ident'>Ctcp</span>
+}
+
+<span class='doccomment'>/// Byte indices, be careful.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Message</span> {
+ <span class='kw'>pub</span> <span class='ident'>source</span>: <span class='ident'>String</span>,
+ <span class='ident'>prefix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>command</span>: <span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;</span>,
+ <span class='ident'>content</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>suffix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>msg_type</span>: <span class='ident'>MsgType</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Message</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>source</span>: <span class='ident'>String</span>, <span class='ident'>prefix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>, <span class='ident'>command</span>: <span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;</span>, <span class='ident'>content</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>, <span class='ident'>suffix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;&gt;</span>, <span class='ident'>msg_type</span>: <span class='ident'>MsgType</span>) <span class='op'>-&gt;</span> <span class='ident'>Message</span> {
+ <span class='ident'>Message</span> {
+ <span class='ident'>source</span>: <span class='ident'>source</span>,
+ <span class='ident'>prefix</span>: <span class='ident'>prefix</span>,
+ <span class='ident'>command</span>: <span class='ident'>command</span>,
+ <span class='ident'>content</span>: <span class='ident'>content</span>,
+ <span class='ident'>suffix</span>: <span class='ident'>suffix</span>,
+ <span class='ident'>msg_type</span>: <span class='ident'>msg_type</span>
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>unused_assignments</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>format</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Deref</span><span class='op'>&lt;</span><span class='ident'>Target</span><span class='op'>=</span><span class='ident'>str</span><span class='op'>&gt;&gt;</span>(<span class='ident'>prefix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>command</span>: <span class='ident'>T</span>, <span class='ident'>content</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>suffix</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>msg_type</span>: <span class='ident'>MsgType</span>) <span class='op'>-&gt;</span> <span class='ident'>Message</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>with_capacity</span>(<span class='number'>512</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i_prefix</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>p</span>) <span class='op'>=</span> <span class='ident'>prefix</span> {
+ <span class='ident'>i_prefix</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>((<span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>) <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>i</span> <span class='op'>+</span> <span class='number'>2</span> <span class='op'>+</span> <span class='ident'>p</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>u16</span>);
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39;:&#39;</span>);
+ <span class='ident'>s</span>.<span class='ident'>push_str</span>(<span class='ident'>p</span>);
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39; &#39;</span>);
+ <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>2</span> <span class='op'>+</span> <span class='ident'>p</span>.<span class='ident'>len</span>();
+ }
+
+ <span class='kw'>let</span> <span class='ident'>i_command</span> <span class='op'>=</span> <span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>i</span> <span class='op'>+</span> <span class='ident'>command</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>u16</span>;
+ <span class='ident'>s</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>command</span>);
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39; &#39;</span>);
+ <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span> <span class='op'>+</span> <span class='ident'>command</span>.<span class='ident'>len</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i_content</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>part</span> <span class='kw'>in</span> <span class='ident'>content</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>i_content</span>.<span class='ident'>push</span>(<span class='ident'>i</span> <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>i</span> <span class='op'>+</span> <span class='ident'>part</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>u16</span>);
+ <span class='ident'>s</span>.<span class='ident'>push_str</span>(<span class='ident'>part</span>);
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39; &#39;</span>);
+ <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span> <span class='op'>+</span> <span class='ident'>part</span>.<span class='ident'>len</span>();
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i_suffix</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>p</span>) <span class='op'>=</span> <span class='ident'>suffix</span> {
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39;:&#39;</span>);
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='ident'>MsgType</span>::<span class='ident'>Ctcp</span> <span class='op'>=</span> <span class='ident'>msg_type</span> { <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39;\u{1}&#39;</span>); <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span>; }
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>i</span>;
+ <span class='ident'>s</span>.<span class='ident'>push_str</span>(<span class='ident'>p</span>);
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='ident'>MsgType</span>::<span class='ident'>Ctcp</span> <span class='op'>=</span> <span class='ident'>msg_type</span> { <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39;\u{1}&#39;</span>); <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span>; }
+ <span class='ident'>i_suffix</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>n</span> <span class='op'>+</span> <span class='ident'>p</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>u16</span>);
+ <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span> <span class='op'>+</span> <span class='ident'>p</span>.<span class='ident'>len</span>();
+ }
+
+ <span class='ident'>s</span>.<span class='ident'>push_str</span>(<span class='string'>&quot;\r\n&quot;</span>);
+ <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>2</span>;
+
+ <span class='ident'>Message</span>::<span class='ident'>new</span>(<span class='ident'>s</span>, <span class='ident'>i_prefix</span>, <span class='ident'>i_command</span>, <span class='ident'>i_content</span>, <span class='ident'>i_suffix</span>, <span class='ident'>msg_type</span>)
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>range</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>r</span>: <span class='kw-2'>&amp;</span><span class='ident'>Range</span><span class='op'>&lt;</span><span class='ident'>u16</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>source</span>[<span class='ident'>r</span>.<span class='ident'>start</span> <span class='kw'>as</span> <span class='ident'>usize</span>..<span class='ident'>r</span>.<span class='ident'>end</span> <span class='kw'>as</span> <span class='ident'>usize</span>]
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>prefix</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>prefix</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>range</span>(<span class='ident'>r</span>)) }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>command</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> { <span class='self'>self</span>.<span class='ident'>range</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>command</span>) }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>content</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>content</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>range</span>(<span class='kw-2'>&amp;</span><span class='ident'>r</span>)).<span class='ident'>collect</span>() }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>suffix</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>suffix</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>range</span>(<span class='ident'>r</span>)) }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>elements</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>str</span><span class='op'>&gt;</span> { <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>content</span>(); <span class='self'>self</span>.<span class='ident'>suffix</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>f</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='ident'>f</span>)); <span class='ident'>s</span> }
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ident</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ident</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>prefix</span>().<span class='ident'>and_then</span>(<span class='ident'>Ident</span>::<span class='ident'>parse</span>) }
+}
+
+<span class='kw'>impl</span> <span class='ident'>FromStr</span> <span class='kw'>for</span> <span class='ident'>Message</span> {
+ <span class='kw'>type</span> <span class='prelude-val'>Err</span> <span class='op'>=</span> <span class='ident'>IrscError</span>;
+ <span class='kw'>fn</span> <span class='ident'>from_str</span>(<span class='ident'>i</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Message</span>, <span class='ident'>IrscError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>i</span>.<span class='ident'>len</span>();
+ <span class='comment'>// remember, bytes, not chars</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>let</span> <span class='ident'>prefix</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>len</span> <span class='op'>&gt;=</span> <span class='number'>1</span> <span class='op'>&amp;&amp;</span> <span class='ident'>i</span>[<span class='ident'>s</span>..].<span class='ident'>as_bytes</span>()[<span class='number'>0</span>] <span class='op'>==</span> <span class='string'>&#39;:&#39;</span> <span class='kw'>as</span> <span class='ident'>u8</span> {
+ <span class='ident'>i</span>[<span class='ident'>s</span>..].<span class='ident'>find</span>(<span class='string'>&#39; &#39;</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>i</span><span class='op'>|</span> { <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='number'>1u16</span>..(<span class='ident'>s</span> <span class='op'>+</span> <span class='ident'>i</span>) <span class='kw'>as</span> <span class='ident'>u16</span>; <span class='ident'>s</span> <span class='op'>+=</span> <span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>; <span class='ident'>n</span> })
+ } <span class='kw'>else</span> { <span class='prelude-val'>None</span> };
+
+ <span class='kw'>let</span> <span class='ident'>command</span> <span class='op'>=</span> <span class='ident'>i</span>[<span class='ident'>s</span>..].<span class='ident'>find</span>(<span class='string'>&#39; &#39;</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>s</span> <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>s</span> <span class='op'>+</span> <span class='ident'>n</span>) <span class='kw'>as</span> <span class='ident'>u16</span>;
+ <span class='ident'>s</span> <span class='op'>+=</span> <span class='ident'>n</span>;
+ <span class='ident'>p</span>
+ });
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>content</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='number'>15</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>suffix</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='kw'>while</span> <span class='ident'>s</span> <span class='op'>&lt;</span> <span class='ident'>len</span> <span class='op'>-</span> <span class='number'>3</span> {
+ <span class='kw'>if</span> <span class='ident'>i</span>[<span class='ident'>s</span>..].<span class='ident'>as_bytes</span>()[<span class='number'>0</span>] <span class='op'>==</span> <span class='string'>&#39;:&#39;</span> <span class='kw'>as</span> <span class='ident'>u8</span> {
+ <span class='ident'>suffix</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>s</span> <span class='kw'>as</span> <span class='ident'>u16</span> <span class='op'>+</span> <span class='number'>1</span> <span class='kw'>as</span> <span class='ident'>u16</span>..<span class='ident'>i</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>u16</span>);
+ <span class='kw'>break</span>
+ }
+ <span class='ident'>i</span>[<span class='ident'>s</span>..].<span class='ident'>find</span>(<span class='string'>&#39; &#39;</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>i</span><span class='op'>|</span> {
+ <span class='kw'>if</span> <span class='ident'>i</span> <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='ident'>content</span>.<span class='ident'>push</span>(<span class='ident'>s</span> <span class='kw'>as</span> <span class='ident'>u16</span>..(<span class='ident'>s</span> <span class='op'>+</span> <span class='ident'>i</span>) <span class='kw'>as</span> <span class='ident'>u16</span>);
+ <span class='ident'>s</span> <span class='op'>+=</span> <span class='ident'>i</span>;
+ }
+ });
+ <span class='comment'>// if s.chars().next() == Some(&#39; &#39;) { s = &amp;s[1..] };</span>
+ <span class='ident'>s</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+
+ <span class='kw'>let</span> <span class='ident'>msg_type</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>suffix</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>i</span>[<span class='ident'>s</span>.<span class='ident'>start</span> <span class='kw'>as</span> <span class='ident'>usize</span>..].<span class='ident'>as_bytes</span>()[<span class='number'>0</span>] <span class='op'>==</span> <span class='number'>1</span>
+ <span class='op'>&amp;&amp;</span> <span class='ident'>i</span>[(<span class='ident'>s</span>.<span class='ident'>end</span> <span class='op'>-</span> <span class='number'>3</span>) <span class='kw'>as</span> <span class='ident'>usize</span>..].<span class='ident'>as_bytes</span>()[<span class='number'>0</span>] <span class='op'>==</span> <span class='number'>1</span>)
+ <span class='op'>==</span> <span class='prelude-val'>Some</span>(<span class='boolval'>true</span>) { <span class='ident'>MsgType</span>::<span class='ident'>Ctcp</span> } <span class='kw'>else</span> { <span class='ident'>MsgType</span>::<span class='ident'>Irc</span> };
+
+ <span class='ident'>command</span>.<span class='ident'>map</span>(<span class='kw'>move</span> <span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span>
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Message</span>::<span class='ident'>new</span>(
+ <span class='ident'>i</span>.<span class='ident'>to_owned</span>(),
+ <span class='ident'>prefix</span>,
+ <span class='ident'>c</span>,
+ <span class='ident'>content</span>,
+ <span class='comment'>// strip \{1} if CTCP message</span>
+ <span class='comment'>// strip \r\n for each line, relying on their existence</span>
+ <span class='kw'>match</span> <span class='ident'>msg_type</span> {
+ <span class='ident'>MsgType</span>::<span class='ident'>Irc</span> <span class='op'>=&gt;</span> <span class='ident'>suffix</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>start</span>..<span class='ident'>s</span>.<span class='ident'>end</span> <span class='op'>-</span> <span class='number'>1</span>),
+ <span class='ident'>MsgType</span>::<span class='ident'>Ctcp</span> <span class='op'>=&gt;</span> <span class='ident'>suffix</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>start</span> <span class='op'>+</span> <span class='number'>1</span>..<span class='ident'>s</span>.<span class='ident'>end</span> <span class='op'>-</span> <span class='number'>2</span>)
+ },
+ <span class='ident'>msg_type</span>
+ ))
+ ).<span class='ident'>unwrap</span>()
+
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>ToString</span> <span class='kw'>for</span> <span class='ident'>Message</span> {
+ <span class='kw'>fn</span> <span class='ident'>to_string</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='self'>self</span>.<span class='ident'>source</span>.<span class='ident'>clone</span>()
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Hash</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Mode</span> {
+ <span class='ident'>Away</span>,
+ <span class='ident'>Invisible</span>,
+ <span class='ident'>Wallops</span>,
+ <span class='ident'>Restricted</span>,
+ <span class='ident'>Operator</span>,
+ <span class='ident'>LocalOperator</span>,
+ <span class='ident'>ServerNotices</span>,
+ <span class='ident'>Custom</span>(<span class='ident'>String</span>)
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>Hash</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>SetMode</span> {
+ <span class='ident'>Plus</span>,
+ <span class='ident'>Minus</span>
+}
+
+<span class='doccomment'>/// If you hoped it couldn&#39;t get any uglier... I&#39;m sorry, it does.</span>
+<span class='doccomment'>/// Why a giant match? API.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// I tried structuring it as a bunch of structs that impl a `Command` trait,</span>
+<span class='doccomment'>/// but the user would have to use Any and lots of cats. Also, extensibility isn&#39;t</span>
+<span class='doccomment'>/// really a goal; the IRC protocol doesn&#39;t seem to evolve very fast.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Granted, I *could* have used a phf-map to map to functions to parse this, which</span>
+<span class='doccomment'>/// - while more readable - shouldn&#39;t have resulted in performance gains.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Please don&#39;t cry.</span>
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>test</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::{ <span class='ident'>ToOwned</span> };
+ <span class='kw'>use</span> <span class='ident'>message</span>::{ <span class='ident'>Message</span>, <span class='ident'>MsgType</span> };
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_message1</span>() {
+ <span class='kw'>let</span> <span class='ident'>b</span> <span class='op'>=</span> <span class='string'>&quot;:d PRIVMSG You :\u{1}ACTION sends you funny pictures of cats!\u{1}\r\n&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>b2</span> <span class='op'>=</span> <span class='ident'>Message</span>::<span class='ident'>new</span>(
+ <span class='ident'>b</span>.<span class='ident'>to_owned</span>(),
+ <span class='prelude-val'>Some</span>(<span class='number'>1</span>..<span class='number'>2</span>),
+ <span class='number'>3</span>..<span class='number'>10</span>,
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>11</span>..<span class='number'>14</span>],
+ <span class='prelude-val'>Some</span>(<span class='number'>17</span>..<span class='number'>58</span>),
+ <span class='ident'>MsgType</span>::<span class='ident'>Ctcp</span>
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>b</span>.<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>Message</span><span class='op'>&gt;</span>().<span class='ident'>unwrap</span>(), <span class='ident'>b2</span>.<span class='ident'>clone</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>b2</span>.<span class='ident'>to_string</span>(), <span class='ident'>b</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_message2</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='string'>&quot;:a.b.c NOTICE AUTH :*** Looking up your hostname...\r\n&quot;</span>;
+ <span class='comment'>// I&#39;m not even kidding...</span>
+ <span class='kw'>let</span> <span class='ident'>a2</span> <span class='op'>=</span> <span class='ident'>Message</span>::<span class='ident'>new</span>(
+ <span class='ident'>a</span>.<span class='ident'>to_owned</span>(),
+ <span class='prelude-val'>Some</span>(<span class='number'>1</span>..<span class='number'>6</span>),
+ <span class='number'>7</span>..<span class='number'>13</span>,
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='number'>14</span>..<span class='number'>18</span>],
+ <span class='prelude-val'>Some</span>(<span class='number'>20</span>..<span class='number'>52</span>),
+ <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>
+ );
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>a</span>.<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>Message</span><span class='op'>&gt;</span>().<span class='ident'>unwrap</span>(), <span class='ident'>a2</span>.<span class='ident'>clone</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>a2</span>.<span class='ident'>to_string</span>(), <span class='ident'>a</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>format_message</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>Some</span>(<span class='string'>&quot;a.b.c&quot;</span>), <span class='string'>&quot;NOTICE&quot;</span>, <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&quot;AUTH&quot;</span>], <span class='prelude-val'>Some</span>(<span class='string'>&quot;*** Looking up your hostname...&quot;</span>), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>);
+ <span class='kw'>let</span> <span class='ident'>a2</span> <span class='op'>=</span> <span class='string'>&quot;:a.b.c NOTICE AUTH :*** Looking up your hostname...\r\n&quot;</span>;
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>a</span>.<span class='ident'>to_string</span>(), <span class='ident'>a2</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/irsc/reply.rs.html b/src/irsc/reply.rs.html
new file mode 100644
index 0000000..5d77d38
--- /dev/null
+++ b/src/irsc/reply.rs.html
@@ -0,0 +1,3053 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `src/reply.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>reply.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+<span id="1149">1149</span>
+<span id="1150">1150</span>
+<span id="1151">1151</span>
+<span id="1152">1152</span>
+<span id="1153">1153</span>
+<span id="1154">1154</span>
+<span id="1155">1155</span>
+<span id="1156">1156</span>
+<span id="1157">1157</span>
+<span id="1158">1158</span>
+<span id="1159">1159</span>
+<span id="1160">1160</span>
+<span id="1161">1161</span>
+<span id="1162">1162</span>
+<span id="1163">1163</span>
+<span id="1164">1164</span>
+<span id="1165">1165</span>
+<span id="1166">1166</span>
+<span id="1167">1167</span>
+<span id="1168">1168</span>
+<span id="1169">1169</span>
+<span id="1170">1170</span>
+<span id="1171">1171</span>
+<span id="1172">1172</span>
+<span id="1173">1173</span>
+<span id="1174">1174</span>
+<span id="1175">1175</span>
+<span id="1176">1176</span>
+<span id="1177">1177</span>
+<span id="1178">1178</span>
+<span id="1179">1179</span>
+<span id="1180">1180</span>
+<span id="1181">1181</span>
+<span id="1182">1182</span>
+<span id="1183">1183</span>
+<span id="1184">1184</span>
+<span id="1185">1185</span>
+<span id="1186">1186</span>
+<span id="1187">1187</span>
+<span id="1188">1188</span>
+<span id="1189">1189</span>
+<span id="1190">1190</span>
+<span id="1191">1191</span>
+<span id="1192">1192</span>
+<span id="1193">1193</span>
+<span id="1194">1194</span>
+<span id="1195">1195</span>
+<span id="1196">1196</span>
+<span id="1197">1197</span>
+<span id="1198">1198</span>
+<span id="1199">1199</span>
+<span id="1200">1200</span>
+<span id="1201">1201</span>
+<span id="1202">1202</span>
+<span id="1203">1203</span>
+<span id="1204">1204</span>
+<span id="1205">1205</span>
+<span id="1206">1206</span>
+<span id="1207">1207</span>
+<span id="1208">1208</span>
+<span id="1209">1209</span>
+<span id="1210">1210</span>
+<span id="1211">1211</span>
+<span id="1212">1212</span>
+<span id="1213">1213</span>
+<span id="1214">1214</span>
+<span id="1215">1215</span>
+<span id="1216">1216</span>
+<span id="1217">1217</span>
+<span id="1218">1218</span>
+<span id="1219">1219</span>
+<span id="1220">1220</span>
+<span id="1221">1221</span>
+<span id="1222">1222</span>
+<span id="1223">1223</span>
+<span id="1224">1224</span>
+<span id="1225">1225</span>
+<span id="1226">1226</span>
+<span id="1227">1227</span>
+<span id="1228">1228</span>
+<span id="1229">1229</span>
+<span id="1230">1230</span>
+<span id="1231">1231</span>
+<span id="1232">1232</span>
+<span id="1233">1233</span>
+<span id="1234">1234</span>
+<span id="1235">1235</span>
+<span id="1236">1236</span>
+<span id="1237">1237</span>
+<span id="1238">1238</span>
+<span id="1239">1239</span>
+<span id="1240">1240</span>
+<span id="1241">1241</span>
+<span id="1242">1242</span>
+<span id="1243">1243</span>
+<span id="1244">1244</span>
+<span id="1245">1245</span>
+<span id="1246">1246</span>
+<span id="1247">1247</span>
+<span id="1248">1248</span>
+<span id="1249">1249</span>
+<span id="1250">1250</span>
+<span id="1251">1251</span>
+<span id="1252">1252</span>
+<span id="1253">1253</span>
+<span id="1254">1254</span>
+<span id="1255">1255</span>
+<span id="1256">1256</span>
+<span id="1257">1257</span>
+<span id="1258">1258</span>
+<span id="1259">1259</span>
+<span id="1260">1260</span>
+<span id="1261">1261</span>
+<span id="1262">1262</span>
+<span id="1263">1263</span>
+<span id="1264">1264</span>
+<span id="1265">1265</span>
+<span id="1266">1266</span>
+<span id="1267">1267</span>
+<span id="1268">1268</span>
+<span id="1269">1269</span>
+<span id="1270">1270</span>
+<span id="1271">1271</span>
+<span id="1272">1272</span>
+<span id="1273">1273</span>
+<span id="1274">1274</span>
+<span id="1275">1275</span>
+<span id="1276">1276</span>
+<span id="1277">1277</span>
+<span id="1278">1278</span>
+<span id="1279">1279</span>
+<span id="1280">1280</span>
+<span id="1281">1281</span>
+<span id="1282">1282</span>
+<span id="1283">1283</span>
+<span id="1284">1284</span>
+<span id="1285">1285</span>
+<span id="1286">1286</span>
+<span id="1287">1287</span>
+<span id="1288">1288</span>
+<span id="1289">1289</span>
+<span id="1290">1290</span>
+<span id="1291">1291</span>
+<span id="1292">1292</span>
+<span id="1293">1293</span>
+<span id="1294">1294</span>
+<span id="1295">1295</span>
+<span id="1296">1296</span>
+<span id="1297">1297</span>
+<span id="1298">1298</span>
+<span id="1299">1299</span>
+<span id="1300">1300</span>
+<span id="1301">1301</span>
+<span id="1302">1302</span>
+<span id="1303">1303</span>
+<span id="1304">1304</span>
+<span id="1305">1305</span>
+<span id="1306">1306</span>
+<span id="1307">1307</span>
+<span id="1308">1308</span>
+<span id="1309">1309</span>
+<span id="1310">1310</span>
+<span id="1311">1311</span>
+<span id="1312">1312</span>
+<span id="1313">1313</span>
+<span id="1314">1314</span>
+<span id="1315">1315</span>
+<span id="1316">1316</span>
+<span id="1317">1317</span>
+<span id="1318">1318</span>
+<span id="1319">1319</span>
+<span id="1320">1320</span>
+<span id="1321">1321</span>
+<span id="1322">1322</span>
+<span id="1323">1323</span>
+<span id="1324">1324</span>
+<span id="1325">1325</span>
+<span id="1326">1326</span>
+<span id="1327">1327</span>
+<span id="1328">1328</span>
+<span id="1329">1329</span>
+<span id="1330">1330</span>
+<span id="1331">1331</span>
+<span id="1332">1332</span>
+<span id="1333">1333</span>
+<span id="1334">1334</span>
+<span id="1335">1335</span>
+<span id="1336">1336</span>
+<span id="1337">1337</span>
+<span id="1338">1338</span>
+<span id="1339">1339</span>
+<span id="1340">1340</span>
+<span id="1341">1341</span>
+<span id="1342">1342</span>
+<span id="1343">1343</span>
+<span id="1344">1344</span>
+<span id="1345">1345</span>
+<span id="1346">1346</span>
+<span id="1347">1347</span>
+<span id="1348">1348</span>
+<span id="1349">1349</span>
+<span id="1350">1350</span>
+<span id="1351">1351</span>
+<span id="1352">1352</span>
+<span id="1353">1353</span>
+<span id="1354">1354</span>
+<span id="1355">1355</span>
+<span id="1356">1356</span>
+<span id="1357">1357</span>
+<span id="1358">1358</span>
+<span id="1359">1359</span>
+<span id="1360">1360</span>
+<span id="1361">1361</span>
+<span id="1362">1362</span>
+<span id="1363">1363</span>
+<span id="1364">1364</span>
+<span id="1365">1365</span>
+<span id="1366">1366</span>
+<span id="1367">1367</span>
+<span id="1368">1368</span>
+<span id="1369">1369</span>
+<span id="1370">1370</span>
+<span id="1371">1371</span>
+<span id="1372">1372</span>
+<span id="1373">1373</span>
+<span id="1374">1374</span>
+<span id="1375">1375</span>
+<span id="1376">1376</span>
+<span id="1377">1377</span>
+<span id="1378">1378</span>
+<span id="1379">1379</span>
+<span id="1380">1380</span>
+<span id="1381">1381</span>
+<span id="1382">1382</span>
+<span id="1383">1383</span>
+<span id="1384">1384</span>
+<span id="1385">1385</span>
+<span id="1386">1386</span>
+<span id="1387">1387</span>
+<span id="1388">1388</span>
+<span id="1389">1389</span>
+<span id="1390">1390</span>
+<span id="1391">1391</span>
+<span id="1392">1392</span>
+<span id="1393">1393</span>
+<span id="1394">1394</span>
+<span id="1395">1395</span>
+<span id="1396">1396</span>
+<span id="1397">1397</span>
+<span id="1398">1398</span>
+<span id="1399">1399</span>
+<span id="1400">1400</span>
+<span id="1401">1401</span>
+<span id="1402">1402</span>
+<span id="1403">1403</span>
+<span id="1404">1404</span>
+<span id="1405">1405</span>
+<span id="1406">1406</span>
+<span id="1407">1407</span>
+<span id="1408">1408</span>
+<span id="1409">1409</span>
+<span id="1410">1410</span>
+<span id="1411">1411</span>
+<span id="1412">1412</span>
+<span id="1413">1413</span>
+<span id="1414">1414</span>
+<span id="1415">1415</span>
+<span id="1416">1416</span>
+<span id="1417">1417</span>
+<span id="1418">1418</span>
+<span id="1419">1419</span>
+<span id="1420">1420</span>
+<span id="1421">1421</span>
+<span id="1422">1422</span>
+<span id="1423">1423</span>
+<span id="1424">1424</span>
+<span id="1425">1425</span>
+<span id="1426">1426</span>
+<span id="1427">1427</span>
+<span id="1428">1428</span>
+<span id="1429">1429</span>
+<span id="1430">1430</span>
+<span id="1431">1431</span>
+<span id="1432">1432</span>
+<span id="1433">1433</span>
+<span id="1434">1434</span>
+<span id="1435">1435</span>
+<span id="1436">1436</span>
+<span id="1437">1437</span>
+<span id="1438">1438</span>
+<span id="1439">1439</span>
+<span id="1440">1440</span>
+<span id="1441">1441</span>
+<span id="1442">1442</span>
+<span id="1443">1443</span>
+<span id="1444">1444</span>
+<span id="1445">1445</span>
+<span id="1446">1446</span>
+<span id="1447">1447</span>
+<span id="1448">1448</span>
+<span id="1449">1449</span>
+<span id="1450">1450</span>
+<span id="1451">1451</span>
+<span id="1452">1452</span>
+<span id="1453">1453</span>
+<span id="1454">1454</span>
+<span id="1455">1455</span>
+<span id="1456">1456</span>
+<span id="1457">1457</span>
+<span id="1458">1458</span>
+<span id="1459">1459</span>
+<span id="1460">1460</span>
+<span id="1461">1461</span>
+<span id="1462">1462</span>
+<span id="1463">1463</span>
+<span id="1464">1464</span>
+<span id="1465">1465</span>
+<span id="1466">1466</span>
+<span id="1467">1467</span>
+<span id="1468">1468</span>
+<span id="1469">1469</span>
+<span id="1470">1470</span>
+<span id="1471">1471</span>
+<span id="1472">1472</span>
+<span id="1473">1473</span>
+<span id="1474">1474</span>
+<span id="1475">1475</span>
+<span id="1476">1476</span>
+<span id="1477">1477</span>
+<span id="1478">1478</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>::<span class='ident'>FromStr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::{ <span class='ident'>Cow</span>, <span class='ident'>ToOwned</span> };
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::<span class='ident'>Cow</span>::<span class='op'>*</span>;
+
+<span class='kw'>use</span> ::{ <span class='prelude-ty'>Result</span>, <span class='ident'>IrscError</span> };
+<span class='kw'>use</span> ::<span class='ident'>message</span>::{ <span class='ident'>MsgType</span>, <span class='ident'>Message</span> };
+
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span>;
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>Hash</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// 001 RPL_WELCOME</span>
+ <span class='doccomment'>/// &quot;Welcome to the Internet Relay Network</span>
+ <span class='doccomment'>/// &lt;nick&gt;!&lt;user&gt;@&lt;host&gt;&quot;</span>
+ <span class='ident'>RPL_WELCOME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 002 RPL_YOURHOST</span>
+ <span class='doccomment'>/// &quot;Your host is &lt;servername&gt;, running version &lt;ver&gt;&quot;</span>
+ <span class='ident'>RPL_YOURHOST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 003 RPL_CREATED</span>
+ <span class='doccomment'>/// &quot;This server was created &lt;date&gt;&quot;</span>
+ <span class='ident'>RPL_CREATED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 004 RPL_MYINFO</span>
+ <span class='doccomment'>/// &quot;&lt;servername&gt; &lt;version&gt; &lt;available user modes&gt;</span>
+ <span class='doccomment'>/// &lt;available channel modes&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - The server sends Replies 001 to 004 to a user upon</span>
+ <span class='doccomment'>/// successful registration.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_MYINFO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 005 RPL_BOUNCE</span>
+ <span class='doccomment'>/// &quot;Try server &lt;server name&gt;, port &lt;port number&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent by the server to a user to suggest an alternative</span>
+ <span class='doccomment'>/// server. This is often used when the connection is</span>
+ <span class='doccomment'>/// refused because the server is already full.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_BOUNCE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 302 RPL_USERHOST</span>
+ <span class='doccomment'>/// &quot;:*1&lt;reply&gt; *( &quot; &quot; &lt;reply&gt; )&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Reply format used by USERHOST to list replies to</span>
+ <span class='doccomment'>/// the query list. The reply string is composed as</span>
+ <span class='doccomment'>/// follows:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// reply = nickname [ &quot;*&quot; ] &quot;=&quot; ( &quot;+&quot; / &quot;-&quot; ) hostname</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &#39;*&#39; indicates whether the client has registered</span>
+ <span class='doccomment'>/// as an Operator. The &#39;-&#39; or &#39;+&#39; characters represent</span>
+ <span class='doccomment'>/// whether the client has set an AWAY message or not</span>
+ <span class='doccomment'>/// respectively.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_USERHOST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 303 RPL_ISON</span>
+ <span class='doccomment'>/// &quot;:*1&lt;nick&gt; *( &quot; &quot; &lt;nick&gt; )&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Reply format used by ISON to list replies to the</span>
+ <span class='doccomment'>/// query list.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ISON</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 301 RPL_AWAY</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :&lt;away message&gt;&quot;</span>
+ <span class='ident'>RPL_AWAY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 305 RPL_UNAWAY</span>
+ <span class='doccomment'>/// &quot;:You are no longer marked as being away&quot;</span>
+ <span class='ident'>RPL_UNAWAY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 306 RPL_NOWAWAY</span>
+ <span class='doccomment'>/// &quot;:You have been marked as being away&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - These replies are used with the AWAY command (if</span>
+ <span class='doccomment'>/// allowed). RPL_AWAY is sent to any client sending a</span>
+ <span class='doccomment'>/// PRIVMSG to a client which is away. RPL_AWAY is only</span>
+ <span class='doccomment'>/// sent by the server to which the client is connected.</span>
+ <span class='doccomment'>/// Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the</span>
+ <span class='doccomment'>/// client removes and sets an AWAY message.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_NOWAWAY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 311 RPL_WHOISUSER</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; &lt;user&gt; &lt;host&gt; * :&lt;real name&gt;&quot;</span>
+ <span class='ident'>RPL_WHOISUSER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 312 RPL_WHOISSERVER</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; &lt;server&gt; :&lt;server info&gt;&quot;</span>
+ <span class='ident'>RPL_WHOISSERVER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 313 RPL_WHOISOPERATOR</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :is an IRC operator&quot;</span>
+ <span class='ident'>RPL_WHOISOPERATOR</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 317 RPL_WHOISIDLE</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; &lt;integer&gt; :seconds idle&quot;</span>
+ <span class='ident'>RPL_WHOISIDLE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 318 RPL_ENDOFWHOIS</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :End of WHOIS list&quot;</span>
+ <span class='ident'>RPL_ENDOFWHOIS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 319 RPL_WHOISCHANNELS</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :*( ( &quot;@&quot; / &quot;+&quot; ) &lt;channel&gt; &quot; &quot; )&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Replies 311 - 313, 317 - 319 are all replies</span>
+ <span class='doccomment'>/// generated in response to a WHOIS message. Given that</span>
+ <span class='doccomment'>/// there are enough parameters present, the answering</span>
+ <span class='doccomment'>/// server MUST either formulate a reply out of the above</span>
+ <span class='doccomment'>/// numerics (if the query nick is found) or return an</span>
+ <span class='doccomment'>/// error reply. The &#39;*&#39; in RPL_WHOISUSER is there as</span>
+ <span class='doccomment'>/// the literal character and not as a wild card. For</span>
+ <span class='doccomment'>/// each reply set, only RPL_WHOISCHANNELS may appear</span>
+ <span class='doccomment'>/// more than once (for long lists of channel names).</span>
+ <span class='doccomment'>/// The &#39;@&#39; and &#39;+&#39; characters next to the channel name</span>
+ <span class='doccomment'>/// indicate whether a client is a channel operator or</span>
+ <span class='doccomment'>/// has been granted permission to speak on a moderated</span>
+ <span class='doccomment'>/// channel. The RPL_ENDOFWHOIS reply is used to mark</span>
+ <span class='doccomment'>/// the end of processing a WHOIS message.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_WHOISCHANNELS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 314 RPL_WHOWASUSER</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; &lt;user&gt; &lt;host&gt; * :&lt;real name&gt;&quot;</span>
+ <span class='ident'>RPL_WHOWASUSER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 369 RPL_ENDOFWHOWAS</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :End of WHOWAS&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When replying to a WHOWAS message, a server MUST use</span>
+ <span class='doccomment'>/// the replies RPL_WHOWASUSER, RPL_WHOISSERVER or</span>
+ <span class='doccomment'>/// ERR_WASNOSUCHNICK for each nickname in the presented</span>
+ <span class='doccomment'>/// list. At the end of all reply batches, there MUST</span>
+ <span class='doccomment'>/// be RPL_ENDOFWHOWAS (even if there was only one reply</span>
+ <span class='doccomment'>/// and it was an error).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFWHOWAS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 321 RPL_LISTSTART</span>
+ <span class='doccomment'>/// Obsolete. Not used.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_LISTSTART</span>,
+
+ <span class='doccomment'>/// 322 RPL_LIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;# visible&gt; :&lt;topic&gt;&quot;</span>
+ <span class='ident'>RPL_LIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 323 RPL_LISTEND</span>
+ <span class='doccomment'>/// &quot;:End of LIST&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Replies RPL_LIST, RPL_LISTEND mark the actual replies</span>
+ <span class='doccomment'>/// with data and end of the server&#39;s response to a LIST</span>
+ <span class='doccomment'>/// command. If there are no channels available to return,</span>
+ <span class='doccomment'>/// only the end reply MUST be sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_LISTEND</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 325 RPL_UNIQOPIS</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;nickname&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_UNIQOPIS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 324 RPL_CHANNELMODEIS</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;mode&gt; &lt;mode params&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_CHANNELMODEIS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 331 RPL_NOTOPIC</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :No topic is set&quot;</span>
+ <span class='ident'>RPL_NOTOPIC</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 332 RPL_TOPIC</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :&lt;topic&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When sending a TOPIC message to determine the</span>
+ <span class='doccomment'>/// channel topic, one of two replies is sent. If</span>
+ <span class='doccomment'>/// the topic is set, RPL_TOPIC is sent back else</span>
+ <span class='doccomment'>/// RPL_NOTOPIC.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_TOPIC</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 341 RPL_INVITING</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;nick&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server to indicate that the</span>
+ <span class='doccomment'>/// attempted INVITE message was successful and is</span>
+ <span class='doccomment'>/// being passed onto the end client.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_INVITING</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 342 RPL_SUMMONING</span>
+ <span class='doccomment'>/// &quot;&lt;user&gt; :Summoning user to IRC&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by a server answering a SUMMON message to</span>
+ <span class='doccomment'>/// indicate that it is summoning that user.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_SUMMONING</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 346 RPL_INVITELIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;invitemask&gt;&quot;</span>
+ <span class='ident'>RPL_INVITELIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 347 RPL_ENDOFINVITELIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :End of channel invite list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When listing the &#39;invitations masks&#39; for a given channel,</span>
+ <span class='doccomment'>/// a server is required to send the list back using the</span>
+ <span class='doccomment'>/// RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A</span>
+ <span class='doccomment'>/// separate RPL_INVITELIST is sent for each active mask.</span>
+ <span class='doccomment'>/// After the masks have been listed (or if none present) a</span>
+ <span class='doccomment'>/// RPL_ENDOFINVITELIST MUST be sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFINVITELIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 348 RPL_EXCEPTLIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;exceptionmask&gt;&quot;</span>
+ <span class='ident'>RPL_EXCEPTLIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 349 RPL_ENDOFEXCEPTLIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :End of channel exception list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When listing the &#39;exception masks&#39; for a given channel,</span>
+ <span class='doccomment'>/// a server is required to send the list back using the</span>
+ <span class='doccomment'>/// RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A</span>
+ <span class='doccomment'>/// separate RPL_EXCEPTLIST is sent for each active mask.</span>
+ <span class='doccomment'>/// After the masks have been listed (or if none present)</span>
+ <span class='doccomment'>/// a RPL_ENDOFEXCEPTLIST MUST be sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFEXCEPTLIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 351 RPL_VERSION</span>
+ <span class='doccomment'>/// &quot;&lt;version&gt;.&lt;debuglevel&gt; &lt;server&gt; :&lt;comments&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Reply by the server showing its version details.</span>
+ <span class='doccomment'>/// The &lt;version&gt; is the version of the software being</span>
+ <span class='doccomment'>/// used (including any patchlevel revisions) and the</span>
+ <span class='doccomment'>/// &lt;debuglevel&gt; is used to indicate if the server is</span>
+ <span class='doccomment'>/// running in &quot;debug mode&quot;.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The &quot;comments&quot; field may contain any comments about</span>
+ <span class='doccomment'>/// the version or further version details.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_VERSION</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 352 RPL_WHOREPLY</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;user&gt; &lt;host&gt; &lt;server&gt; &lt;nick&gt;</span>
+ <span class='doccomment'>/// ( &quot;H&quot; / &quot;G&quot; &gt; [&quot;*&quot;] [ ( &quot;@&quot; / &quot;+&quot; ) ]</span>
+ <span class='doccomment'>/// :&lt;hopcount&gt; &lt;real name&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_WHOREPLY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 315 RPL_ENDOFWHO</span>
+ <span class='doccomment'>/// &quot;&lt;name&gt; :End of WHO list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used</span>
+ <span class='doccomment'>/// to answer a WHO message. The RPL_WHOREPLY is only</span>
+ <span class='doccomment'>/// sent if there is an appropriate match to the WHO</span>
+ <span class='doccomment'>/// query. If there is a list of parameters supplied</span>
+ <span class='doccomment'>/// with a WHO message, a RPL_ENDOFWHO MUST be sent</span>
+ <span class='doccomment'>/// after processing each list item with &lt;name&gt; being</span>
+ <span class='doccomment'>/// the item.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFWHO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 353 RPL_NAMREPLY</span>
+ <span class='doccomment'>/// &quot;( &quot;=&quot; / &quot;*&quot; / &quot;@&quot; ) &lt;channel&gt;</span>
+ <span class='doccomment'>/// :[ &quot;@&quot; / &quot;+&quot; ] &lt;nick&gt; *( &quot; &quot; [ &quot;@&quot; / &quot;+&quot; ] &lt;nick&gt; )</span>
+ <span class='doccomment'>/// - &quot;@&quot; is used for secret channels, &quot;*&quot; for private</span>
+ <span class='doccomment'>/// channels, and &quot;=&quot; for others (public channels).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_NAMREPLY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 366 RPL_ENDOFNAMES</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :End of NAMES list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - To reply to a NAMES message, a reply pair consisting</span>
+ <span class='doccomment'>/// of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the</span>
+ <span class='doccomment'>/// server back to the client. If there is no channel</span>
+ <span class='doccomment'>/// found as in the query, then only RPL_ENDOFNAMES is</span>
+ <span class='doccomment'>/// returned. The exception to this is when a NAMES</span>
+ <span class='doccomment'>/// message is sent with no parameters and all visible</span>
+ <span class='doccomment'>/// channels and contents are sent back in a series of</span>
+ <span class='doccomment'>/// RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark</span>
+ <span class='doccomment'>/// the end.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFNAMES</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 364 RPL_LINKS</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; &lt;server&gt; :&lt;hopcount&gt; &lt;server info&gt;&quot;</span>
+ <span class='ident'>RPL_LINKS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 365 RPL_ENDOFLINKS</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; :End of LINKS list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - In replying to the LINKS message, a server MUST send</span>
+ <span class='doccomment'>/// replies back using the RPL_LINKS numeric and mark the</span>
+ <span class='doccomment'>/// end of the list using an RPL_ENDOFLINKS reply.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFLINKS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 367 RPL_BANLIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;banmask&gt;&quot;</span>
+ <span class='ident'>RPL_BANLIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 368 RPL_ENDOFBANLIST</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :End of channel ban list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When listing the active &#39;bans&#39; for a given channel,</span>
+ <span class='doccomment'>/// a server is required to send the list back using the</span>
+ <span class='doccomment'>/// RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate</span>
+ <span class='doccomment'>/// RPL_BANLIST is sent for each active banmask. After the</span>
+ <span class='doccomment'>/// banmasks have been listed (or if none present) a</span>
+ <span class='doccomment'>/// RPL_ENDOFBANLIST MUST be sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFBANLIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 371 RPL_INFO</span>
+ <span class='doccomment'>/// &quot;:&lt;string&gt;&quot;</span>
+ <span class='ident'>RPL_INFO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 374 RPL_ENDOFINFO</span>
+ <span class='doccomment'>/// &quot;:End of INFO list&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - A server responding to an INFO message is required to</span>
+ <span class='doccomment'>/// send all its &#39;info&#39; in a series of RPL_INFO messages</span>
+ <span class='doccomment'>/// with a RPL_ENDOFINFO reply to indicate the end of the</span>
+ <span class='doccomment'>/// replies.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFINFO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 375 RPL_MOTDSTART</span>
+ <span class='doccomment'>/// &quot;:- &lt;server&gt; Message of the day - &quot;</span>
+ <span class='ident'>RPL_MOTDSTART</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 372 RPL_MOTD</span>
+ <span class='doccomment'>/// &quot;:- &lt;text&gt;&quot;</span>
+ <span class='ident'>RPL_MOTD</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 376 RPL_ENDOFMOTD</span>
+ <span class='doccomment'>/// &quot;:End of MOTD command&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When responding to the MOTD message and the MOTD file</span>
+ <span class='doccomment'>/// is found, the file is displayed line by line, with</span>
+ <span class='doccomment'>/// each line no longer than 80 characters, using</span>
+ <span class='doccomment'>/// RPL_MOTD format replies. These MUST be surrounded</span>
+ <span class='doccomment'>/// by a RPL_MOTDSTART (before the RPL_MOTDs) and an</span>
+ <span class='doccomment'>/// RPL_ENDOFMOTD (after).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFMOTD</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 381 RPL_YOUREOPER</span>
+ <span class='doccomment'>/// &quot;:You are now an IRC operator&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - RPL_YOUREOPER is sent back to a client which has</span>
+ <span class='doccomment'>/// just successfully issued an OPER message and gained</span>
+ <span class='doccomment'>/// operator status.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_YOUREOPER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 382 RPL_REHASHING</span>
+ <span class='doccomment'>/// &quot;&lt;config file&gt; :Rehashing&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - If the REHASH option is used and an operator sends</span>
+ <span class='doccomment'>/// a REHASH message, an RPL_REHASHING is sent back to</span>
+ <span class='doccomment'>/// the operator.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_REHASHING</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 383 RPL_YOURESERVICE</span>
+ <span class='doccomment'>/// &quot;You are service &lt;servicename&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent by the server to a service upon successful</span>
+ <span class='doccomment'>/// registration.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_YOURESERVICE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 391 RPL_TIME</span>
+ <span class='doccomment'>/// &quot;&lt;server&gt; :&lt;string showing server&#39;s local time&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When replying to the TIME message, a server MUST send</span>
+ <span class='doccomment'>/// the reply using the RPL_TIME format above. The string</span>
+ <span class='doccomment'>/// showing the time need only contain the correct day and</span>
+ <span class='doccomment'>/// time there. There is no further requirement for the</span>
+ <span class='doccomment'>/// time string.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_TIME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 392 RPL_USERSSTART</span>
+ <span class='doccomment'>/// &quot;:UserID Terminal Host&quot;</span>
+ <span class='ident'>RPL_USERSSTART</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 393 RPL_USERS</span>
+ <span class='doccomment'>/// &quot;:&lt;username&gt; &lt;ttyline&gt; &lt;hostname&gt;&quot;</span>
+ <span class='ident'>RPL_USERS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 394 RPL_ENDOFUSERS</span>
+ <span class='doccomment'>/// &quot;:End of users&quot;</span>
+ <span class='ident'>RPL_ENDOFUSERS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 395 RPL_NOUSERS</span>
+ <span class='doccomment'>/// &quot;:Nobody logged in&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - If the USERS message is handled by a server, the</span>
+ <span class='doccomment'>/// replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and</span>
+ <span class='doccomment'>/// RPL_NOUSERS are used. RPL_USERSSTART MUST be sent</span>
+ <span class='doccomment'>/// first, following by either a sequence of RPL_USERS</span>
+ <span class='doccomment'>/// or a single RPL_NOUSER. Following this is</span>
+ <span class='doccomment'>/// RPL_ENDOFUSERS.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_NOUSERS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 200 RPL_TRACELINK</span>
+ <span class='doccomment'>/// &quot;Link &lt;version &amp; debug level&gt; &lt;destination&gt;</span>
+ <span class='doccomment'>/// &lt;next server&gt; V&lt;protocol version&gt;</span>
+ <span class='doccomment'>/// &lt;link uptime in seconds&gt; &lt;backstream sendq&gt;</span>
+ <span class='doccomment'>/// &lt;upstream sendq&gt;&quot;</span>
+ <span class='ident'>RPL_TRACELINK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 201 RPL_TRACECONNECTING</span>
+ <span class='doccomment'>/// &quot;Try. &lt;class&gt; &lt;server&gt;&quot;</span>
+ <span class='ident'>RPL_TRACECONNECTING</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 202 RPL_TRACEHANDSHAKE</span>
+ <span class='doccomment'>/// &quot;H.S. &lt;class&gt; &lt;server&gt;&quot;</span>
+ <span class='ident'>RPL_TRACEHANDSHAKE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 203 RPL_TRACEUNKNOWN</span>
+ <span class='doccomment'>/// &quot;???? &lt;class&gt; [&lt;client IP address in dot form&gt;]&quot;</span>
+ <span class='ident'>RPL_TRACEUNKNOWN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 204 RPL_TRACEOPERATOR</span>
+ <span class='doccomment'>/// &quot;Oper &lt;class&gt; &lt;nick&gt;&quot;</span>
+ <span class='ident'>RPL_TRACEOPERATOR</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 205 RPL_TRACEUSER</span>
+ <span class='doccomment'>/// &quot;User &lt;class&gt; &lt;nick&gt;&quot;</span>
+ <span class='ident'>RPL_TRACEUSER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 206 RPL_TRACESERVER</span>
+ <span class='doccomment'>/// &quot;Serv &lt;class&gt; &lt;int&gt;S &lt;int&gt;C &lt;server&gt;</span>
+ <span class='doccomment'>/// &lt;nick!user|*!*&gt;@&lt;host|server&gt; V&lt;protocol version&gt;&quot;</span>
+ <span class='ident'>RPL_TRACESERVER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 207 RPL_TRACESERVICE</span>
+ <span class='doccomment'>/// &quot;Service &lt;class&gt; &lt;name&gt; &lt;type&gt; &lt;active type&gt;&quot;</span>
+ <span class='ident'>RPL_TRACESERVICE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 208 RPL_TRACENEWTYPE</span>
+ <span class='doccomment'>/// &quot;&lt;newtype&gt; 0 &lt;client name&gt;&quot;</span>
+ <span class='ident'>RPL_TRACENEWTYPE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 209 RPL_TRACECLASS</span>
+ <span class='doccomment'>/// &quot;Class &lt;class&gt; &lt;count&gt;&quot;</span>
+ <span class='ident'>RPL_TRACECLASS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 210 RPL_TRACERECONNECT</span>
+ <span class='doccomment'>/// Unused.</span>
+ <span class='ident'>RPL_TRACERECONNECT</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 261 RPL_TRACELOG</span>
+ <span class='doccomment'>/// &quot;File &lt;logfile&gt; &lt;debug level&gt;&quot;</span>
+ <span class='ident'>RPL_TRACELOG</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 262 RPL_TRACEEND</span>
+ <span class='doccomment'>/// &quot;&lt;server name&gt; &lt;version &amp; debug level&gt; :End of TRACE&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - The RPL_TRACE* are all returned by the server in</span>
+ <span class='doccomment'>/// response to the TRACE message. How many are</span>
+ <span class='doccomment'>/// returned is dependent on the TRACE message and</span>
+ <span class='doccomment'>/// whether it was sent by an operator or not. There</span>
+ <span class='doccomment'>/// is no predefined order for which occurs first.</span>
+ <span class='doccomment'>/// Replies RPL_TRACEUNKNOWN, RPL_TRACECONNECTING and</span>
+ <span class='doccomment'>/// RPL_TRACEHANDSHAKE are all used for connections</span>
+ <span class='doccomment'>/// which have not been fully established and are either</span>
+ <span class='doccomment'>/// unknown, still attempting to connect or in the</span>
+ <span class='doccomment'>/// process of completing the &#39;server handshake&#39;.</span>
+ <span class='doccomment'>/// RPL_TRACELINK is sent by any server which handles</span>
+ <span class='doccomment'>/// a TRACE message and has to pass it on to another</span>
+ <span class='doccomment'>/// server. The list of RPL_TRACELINKs sent in</span>
+ <span class='doccomment'>/// response to a TRACE command traversing the IRC</span>
+ <span class='doccomment'>/// network should reflect the actual connectivity of</span>
+ <span class='doccomment'>/// the servers themselves along that path.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// RPL_TRACENEWTYPE is to be used for any connection</span>
+ <span class='doccomment'>/// which does not fit in the other categories but is</span>
+ <span class='doccomment'>/// being displayed anyway.</span>
+ <span class='doccomment'>/// RPL_TRACEEND is sent to indicate the end of the list.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_TRACEEND</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 211 RPL_STATSLINKINFO</span>
+ <span class='doccomment'>/// &quot;&lt;linkname&gt; &lt;sendq&gt; &lt;sent messages&gt;</span>
+ <span class='doccomment'>/// &lt;sent Kbytes&gt; &lt;received messages&gt;</span>
+ <span class='doccomment'>/// &lt;received Kbytes&gt; &lt;time open&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - reports statistics on a connection. &lt;linkname&gt;</span>
+ <span class='doccomment'>/// identifies the particular connection, &lt;sendq&gt; is</span>
+ <span class='doccomment'>/// the amount of data that is queued and waiting to be</span>
+ <span class='doccomment'>/// sent &lt;sent messages&gt; the number of messages sent,</span>
+ <span class='doccomment'>/// and &lt;sent Kbytes&gt; the amount of data sent, in</span>
+ <span class='doccomment'>/// Kbytes. &lt;received messages&gt; and &lt;received Kbytes&gt;</span>
+ <span class='doccomment'>/// are the equivalent of &lt;sent messages&gt; and &lt;sent</span>
+ <span class='doccomment'>/// Kbytes&gt; for received data, respectively. &lt;time</span>
+ <span class='doccomment'>/// open&gt; indicates how long ago the connection was</span>
+ <span class='doccomment'>/// opened, in seconds.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_STATSLINKINFO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 212 RPL_STATSCOMMANDS</span>
+ <span class='doccomment'>/// &quot;&lt;command&gt; &lt;count&gt; &lt;byte count&gt; &lt;remote count&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - reports statistics on commands usage.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_STATSCOMMANDS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 219 RPL_ENDOFSTATS</span>
+ <span class='doccomment'>/// &quot;&lt;stats letter&gt; :End of STATS report&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ENDOFSTATS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 242 RPL_STATSUPTIME</span>
+ <span class='doccomment'>/// &quot;:Server Up %d days %d:%02d:%02d&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - reports the server uptime.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_STATSUPTIME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 243 RPL_STATSOLINE</span>
+ <span class='doccomment'>/// &quot;O &lt;hostmask&gt; * &lt;name&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - reports the allowed hosts from where user may become IRC</span>
+ <span class='doccomment'>/// operators.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_STATSOLINE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 221 RPL_UMODEIS</span>
+ <span class='doccomment'>/// &quot;&lt;user mode string&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - To answer a query about a client&#39;s own mode,</span>
+ <span class='doccomment'>/// RPL_UMODEIS is sent back.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_UMODEIS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 234 RPL_SERVLIST</span>
+ <span class='doccomment'>/// &quot;&lt;name&gt; &lt;server&gt; &lt;mask&gt; &lt;type&gt; &lt;hopcount&gt; &lt;info&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_SERVLIST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 235 RPL_SERVLISTEND</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; &lt;type&gt; :End of service listing&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When listing services in reply to a SERVLIST message,</span>
+ <span class='doccomment'>/// a server is required to send the list back using the</span>
+ <span class='doccomment'>/// RPL_SERVLIST and RPL_SERVLISTEND messages. A separate</span>
+ <span class='doccomment'>/// RPL_SERVLIST is sent for each service. After the</span>
+ <span class='doccomment'>/// services have been listed (or if none present) a</span>
+ <span class='doccomment'>/// RPL_SERVLISTEND MUST be sent.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_SERVLISTEND</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 251 RPL_LUSERCLIENT</span>
+ <span class='doccomment'>/// &quot;:There are &lt;integer&gt; users and &lt;integer&gt;</span>
+ <span class='doccomment'>/// services on &lt;integer&gt; servers&quot;</span>
+ <span class='ident'>RPL_LUSERCLIENT</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 252 RPL_LUSEROP</span>
+ <span class='doccomment'>/// &quot;&lt;integer&gt; :operator(s) online&quot;</span>
+ <span class='ident'>RPL_LUSEROP</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 253 RPL_LUSERUNKNOWN</span>
+ <span class='doccomment'>/// &quot;&lt;integer&gt; :unknown connection(s)&quot;</span>
+ <span class='ident'>RPL_LUSERUNKNOWN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 254 RPL_LUSERCHANNELS</span>
+ <span class='doccomment'>/// &quot;&lt;integer&gt; :channels formed&quot;</span>
+ <span class='ident'>RPL_LUSERCHANNELS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 255 RPL_LUSERME</span>
+ <span class='doccomment'>/// &quot;:I have &lt;integer&gt; clients and &lt;integer&gt;</span>
+ <span class='doccomment'>/// servers&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - In processing an LUSERS message, the server</span>
+ <span class='doccomment'>/// sends a set of replies from RPL_LUSERCLIENT,</span>
+ <span class='doccomment'>/// RPL_LUSEROP, RPL_USERUNKNOWN,</span>
+ <span class='doccomment'>/// RPL_LUSERCHANNELS and RPL_LUSERME. When</span>
+ <span class='doccomment'>/// replying, a server MUST send back</span>
+ <span class='doccomment'>/// RPL_LUSERCLIENT and RPL_LUSERME. The other</span>
+ <span class='doccomment'>/// replies are only sent back if a non-zero count</span>
+ <span class='doccomment'>/// is found for them.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_LUSERME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 256 RPL_ADMINME</span>
+ <span class='doccomment'>/// &quot;&lt;server&gt; :Administrative info&quot;</span>
+ <span class='ident'>RPL_ADMINME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 257 RPL_ADMINLOC1</span>
+ <span class='doccomment'>/// &quot;:&lt;admin info&gt;&quot;</span>
+ <span class='ident'>RPL_ADMINLOC1</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 258 RPL_ADMINLOC2</span>
+ <span class='doccomment'>/// &quot;:&lt;admin info&gt;&quot;</span>
+ <span class='ident'>RPL_ADMINLOC2</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 259 RPL_ADMINEMAIL</span>
+ <span class='doccomment'>/// &quot;:&lt;admin info&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When replying to an ADMIN message, a server</span>
+ <span class='doccomment'>/// is expected to use replies RPL_ADMINME</span>
+ <span class='doccomment'>/// through to RPL_ADMINEMAIL and provide a text</span>
+ <span class='doccomment'>/// message with each. For RPL_ADMINLOC1 a</span>
+ <span class='doccomment'>/// description of what city, state and country</span>
+ <span class='doccomment'>/// the server is in is expected, followed by</span>
+ <span class='doccomment'>/// details of the institution (RPL_ADMINLOC2)</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// and finally the administrative contact for the</span>
+ <span class='doccomment'>/// server (an email address here is REQUIRED)</span>
+ <span class='doccomment'>/// in RPL_ADMINEMAIL.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_ADMINEMAIL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 263 RPL_TRYAGAIN</span>
+ <span class='doccomment'>/// &quot;&lt;command&gt; :Please wait a while and try again.&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - When a server drops a command without processing it,</span>
+ <span class='doccomment'>/// it MUST use the reply RPL_TRYAGAIN to inform the</span>
+ <span class='doccomment'>/// originating client.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>RPL_TRYAGAIN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 401 ERR_NOSUCHNICK</span>
+ <span class='doccomment'>/// &quot;&lt;nickname&gt; :No such nick/channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Used to indicate the nickname parameter supplied to a</span>
+ <span class='doccomment'>/// command is currently unused.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOSUCHNICK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 402 ERR_NOSUCHSERVER</span>
+ <span class='doccomment'>/// &quot;&lt;server name&gt; :No such server&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Used to indicate the server name given currently</span>
+ <span class='doccomment'>/// does not exist.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOSUCHSERVER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 403 ERR_NOSUCHCHANNEL</span>
+ <span class='doccomment'>/// &quot;&lt;channel name&gt; :No such channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Used to indicate the given channel name is invalid.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOSUCHCHANNEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 404 ERR_CANNOTSENDTOCHAN</span>
+ <span class='doccomment'>/// &quot;&lt;channel name&gt; :Cannot send to channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent to a user who is either (a) not on a channel</span>
+ <span class='doccomment'>/// which is mode +n or (b) not a chanop (or mode +v) on</span>
+ <span class='doccomment'>/// a channel which has mode +m set or where the user is</span>
+ <span class='doccomment'>/// banned and is trying to send a PRIVMSG message to</span>
+ <span class='doccomment'>/// that channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_CANNOTSENDTOCHAN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 405 ERR_TOOMANYCHANNELS</span>
+ <span class='doccomment'>/// &quot;&lt;channel name&gt; :You have joined too many channels&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent to a user when they have joined the maximum</span>
+ <span class='doccomment'>/// number of allowed channels and they try to join</span>
+ <span class='doccomment'>/// another channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_TOOMANYCHANNELS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 406 ERR_WASNOSUCHNICK</span>
+ <span class='doccomment'>/// &quot;&lt;nickname&gt; :There was no such nickname&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by WHOWAS to indicate there is no history</span>
+ <span class='doccomment'>/// information for that nickname.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_WASNOSUCHNICK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 407 ERR_TOOMANYTARGETS</span>
+ <span class='doccomment'>/// &quot;&lt;target&gt; :&lt;error code&gt; recipients. &lt;abort message&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a client which is attempting to send a</span>
+ <span class='doccomment'>/// PRIVMSG/NOTICE using the user@host destination format</span>
+ <span class='doccomment'>/// and for a user@host which has several occurrences.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a client which trying to send a</span>
+ <span class='doccomment'>/// PRIVMSG/NOTICE to too many recipients.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a client which is attempting to JOIN a safe</span>
+ <span class='doccomment'>/// channel using the shortname when there are more than one</span>
+ <span class='doccomment'>/// such channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_TOOMANYTARGETS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 408 ERR_NOSUCHSERVICE</span>
+ <span class='doccomment'>/// &quot;&lt;service name&gt; :No such service&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a client which is attempting to send a SQUERY</span>
+ <span class='doccomment'>/// to a service which does not exist.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOSUCHSERVICE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 409 ERR_NOORIGIN</span>
+ <span class='doccomment'>/// &quot;:No origin specified&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - PING or PONG message missing the originator parameter.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOORIGIN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 411 ERR_NORECIPIENT</span>
+ <span class='doccomment'>/// &quot;:No recipient given (&lt;command&gt;)&quot;</span>
+ <span class='ident'>ERR_NORECIPIENT</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 412 ERR_NOTEXTTOSEND</span>
+ <span class='doccomment'>/// &quot;:No text to send&quot;</span>
+ <span class='ident'>ERR_NOTEXTTOSEND</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 413 ERR_NOTOPLEVEL</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; :No toplevel domain specified&quot;</span>
+ <span class='ident'>ERR_NOTOPLEVEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 414 ERR_WILDTOPLEVEL</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; :Wildcard in toplevel domain&quot;</span>
+ <span class='ident'>ERR_WILDTOPLEVEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 415 ERR_BADMASK</span>
+ <span class='doccomment'>/// &quot;&lt;mask&gt; :Bad Server/host mask&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - 412 - 415 are returned by PRIVMSG to indicate that</span>
+ <span class='doccomment'>/// the message wasn&#39;t delivered for some reason.</span>
+ <span class='doccomment'>/// ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that</span>
+ <span class='doccomment'>/// are returned when an invalid use of</span>
+ <span class='doccomment'>/// &quot;PRIVMSG $&lt;server&gt;&quot; or &quot;PRIVMSG #&lt;host&gt;&quot; is attempted.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_BADMASK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 421 ERR_UNKNOWNCOMMAND</span>
+ <span class='doccomment'>/// &quot;&lt;command&gt; :Unknown command&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a registered client to indicate that the</span>
+ <span class='doccomment'>/// command sent is unknown by the server.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_UNKNOWNCOMMAND</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 422 ERR_NOMOTD</span>
+ <span class='doccomment'>/// &quot;:MOTD File is missing&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Server&#39;s MOTD file could not be opened by the server.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOMOTD</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 423 ERR_NOADMININFO</span>
+ <span class='doccomment'>/// &quot;&lt;server&gt; :No administrative info available&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by a server in response to an ADMIN message</span>
+ <span class='doccomment'>/// when there is an error in finding the appropriate</span>
+ <span class='doccomment'>/// information.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOADMININFO</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 424 ERR_FILEERROR</span>
+ <span class='doccomment'>/// &quot;:File error doing &lt;file op&gt; on &lt;file&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Generic error message used to report a failed file</span>
+ <span class='doccomment'>/// operation during the processing of a message.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_FILEERROR</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 431 ERR_NONICKNAMEGIVEN</span>
+ <span class='doccomment'>/// &quot;:No nickname given&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned when a nickname parameter expected for a</span>
+ <span class='doccomment'>/// command and isn&#39;t found.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NONICKNAMEGIVEN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 432 ERR_ERRONEUSNICKNAME</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :Erroneous nickname&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned after receiving a NICK message which contains</span>
+ <span class='doccomment'>/// characters which do not fall in the defined set. See</span>
+ <span class='doccomment'>/// section 2.3.1 for details on valid nicknames.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_ERRONEUSNICKNAME</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 433 ERR_NICKNAMEINUSE</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :Nickname is already in use&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned when a NICK message is processed that results</span>
+ <span class='doccomment'>/// in an attempt to change to a currently existing</span>
+ <span class='doccomment'>/// nickname.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NICKNAMEINUSE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 436 ERR_NICKCOLLISION</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; :Nickname collision KILL from &lt;user&gt;@&lt;host&gt;&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by a server to a client when it detects a</span>
+ <span class='doccomment'>/// nickname collision (registered of a NICK that</span>
+ <span class='doccomment'>/// already exists by another server).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NICKCOLLISION</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 437 ERR_UNAVAILRESOURCE</span>
+ <span class='doccomment'>/// &quot;&lt;nick/channel&gt; :Nick/channel is temporarily unavailable&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by a server to a user trying to join a channel</span>
+ <span class='doccomment'>/// currently blocked by the channel delay mechanism.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by a server to a user trying to change nickname</span>
+ <span class='doccomment'>/// when the desired nickname is blocked by the nick delay</span>
+ <span class='doccomment'>/// mechanism.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_UNAVAILRESOURCE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 441 ERR_USERNOTINCHANNEL</span>
+ <span class='doccomment'>/// &quot;&lt;nick&gt; &lt;channel&gt; :They aren&#39;t on that channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server to indicate that the target</span>
+ <span class='doccomment'>/// user of the command is not on the given channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_USERNOTINCHANNEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 442 ERR_NOTONCHANNEL</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :You&#39;re not on that channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server whenever a client tries to</span>
+ <span class='doccomment'>/// perform a channel affecting command for which the</span>
+ <span class='doccomment'>/// client isn&#39;t a member.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOTONCHANNEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 443 ERR_USERONCHANNEL</span>
+ <span class='doccomment'>/// &quot;&lt;user&gt; &lt;channel&gt; :is already on channel&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned when a client tries to invite a user to a</span>
+ <span class='doccomment'>/// channel they are already on.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_USERONCHANNEL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 444 ERR_NOLOGIN</span>
+ <span class='doccomment'>/// &quot;&lt;user&gt; :User not logged in&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the summon after a SUMMON command for a</span>
+ <span class='doccomment'>/// user was unable to be performed since they were not</span>
+ <span class='doccomment'>/// logged in.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOLOGIN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 445 ERR_SUMMONDISABLED</span>
+ <span class='doccomment'>/// &quot;:SUMMON has been disabled&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned as a response to the SUMMON command. MUST be</span>
+ <span class='doccomment'>/// returned by any server which doesn&#39;t implement it.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_SUMMONDISABLED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 446 ERR_USERSDISABLED</span>
+ <span class='doccomment'>/// &quot;:USERS has been disabled&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned as a response to the USERS command. MUST be</span>
+ <span class='doccomment'>/// returned by any server which does not implement it.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_USERSDISABLED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 451 ERR_NOTREGISTERED</span>
+ <span class='doccomment'>/// &quot;:You have not registered&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server to indicate that the client</span>
+ <span class='doccomment'>/// MUST be registered before the server will allow it</span>
+ <span class='doccomment'>/// to be parsed in detail.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOTREGISTERED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 461 ERR_NEEDMOREPARAMS</span>
+ <span class='doccomment'>/// &quot;&lt;command&gt; :Not enough parameters&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server by numerous commands to</span>
+ <span class='doccomment'>/// indicate to the client that it didn&#39;t supply enough</span>
+ <span class='doccomment'>/// parameters.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NEEDMOREPARAMS</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 462 ERR_ALREADYREGISTRED</span>
+ <span class='doccomment'>/// &quot;:Unauthorized command (already registered)&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server to any link which tries to</span>
+ <span class='doccomment'>/// change part of the registered details (such as</span>
+ <span class='doccomment'>/// password or user details from second USER message).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_ALREADYREGISTRED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 463 ERR_NOPERMFORHOST</span>
+ <span class='doccomment'>/// &quot;:Your host isn&#39;t among the privileged&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to a client which attempts to register with</span>
+ <span class='doccomment'>/// a server which does not been setup to allow</span>
+ <span class='doccomment'>/// connections from the host the attempted connection</span>
+ <span class='doccomment'>/// is tried.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOPERMFORHOST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 464 ERR_PASSWDMISMATCH</span>
+ <span class='doccomment'>/// &quot;:Password incorrect&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned to indicate a failed attempt at registering</span>
+ <span class='doccomment'>/// a connection for which a password was required and</span>
+ <span class='doccomment'>/// was either not given or incorrect.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_PASSWDMISMATCH</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 465 ERR_YOUREBANNEDCREEP</span>
+ <span class='doccomment'>/// &quot;:You are banned from this server&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned after an attempt to connect and register</span>
+ <span class='doccomment'>/// yourself with a server which has been setup to</span>
+ <span class='doccomment'>/// explicitly deny connections to you.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_YOUREBANNEDCREEP</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 466 ERR_YOUWILLBEBANNED</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent by a server to a user to inform that access to the</span>
+ <span class='doccomment'>/// server will soon be denied.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_YOUWILLBEBANNED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 467 ERR_KEYSET</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Channel key already set&quot;</span>
+ <span class='ident'>ERR_KEYSET</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 471 ERR_CHANNELISFULL</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Cannot join channel (+l)&quot;</span>
+ <span class='ident'>ERR_CHANNELISFULL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 472 ERR_UNKNOWNMODE</span>
+ <span class='doccomment'>/// &quot;&lt;char&gt; :is unknown mode char to me for &lt;channel&gt;&quot;</span>
+ <span class='ident'>ERR_UNKNOWNMODE</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 473 ERR_INVITEONLYCHAN</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Cannot join channel (+i)&quot;</span>
+ <span class='ident'>ERR_INVITEONLYCHAN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 474 ERR_BANNEDFROMCHAN</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Cannot join channel (+b)&quot;</span>
+ <span class='ident'>ERR_BANNEDFROMCHAN</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 475 ERR_BADCHANNELKEY</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Cannot join channel (+k)&quot;</span>
+ <span class='ident'>ERR_BADCHANNELKEY</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 476 ERR_BADCHANMASK</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Bad Channel Mask&quot;</span>
+ <span class='ident'>ERR_BADCHANMASK</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 477 ERR_NOCHANMODES</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :Channel doesn&#39;t support modes&quot;</span>
+ <span class='ident'>ERR_NOCHANMODES</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 478 ERR_BANLISTFULL</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; &lt;char&gt; :Channel list is full&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_BANLISTFULL</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 481 ERR_NOPRIVILEGES</span>
+ <span class='doccomment'>/// &quot;:Permission Denied- You&#39;re not an IRC operator&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Any command requiring operator privileges to operate</span>
+ <span class='doccomment'>/// MUST return this error to indicate the attempt was</span>
+ <span class='doccomment'>/// unsuccessful.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOPRIVILEGES</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 482 ERR_CHANOPRIVSNEEDED</span>
+ <span class='doccomment'>/// &quot;&lt;channel&gt; :You&#39;re not channel operator&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Any command requiring &#39;chanop&#39; privileges (such as</span>
+ <span class='doccomment'>/// MODE messages) MUST return this error if the client</span>
+ <span class='doccomment'>/// making the attempt is not a chanop on the specified</span>
+ <span class='doccomment'>/// channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_CHANOPRIVSNEEDED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 483 ERR_CANTKILLSERVER</span>
+ <span class='doccomment'>/// &quot;:You can&#39;t kill a server!&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Any attempts to use the KILL command on a server</span>
+ <span class='doccomment'>/// are to be refused and this error returned directly</span>
+ <span class='doccomment'>/// to the client.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_CANTKILLSERVER</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 484 ERR_RESTRICTED</span>
+ <span class='doccomment'>/// &quot;:Your connection is restricted!&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Sent by the server to a user upon connection to indicate</span>
+ <span class='doccomment'>/// the restricted nature of the connection (user mode &quot;+r&quot;).</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_RESTRICTED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 485 ERR_UNIQOPPRIVSNEEDED</span>
+ <span class='doccomment'>/// &quot;:You&#39;re not the original channel operator&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Any MODE requiring &quot;channel creator&quot; privileges MUST</span>
+ <span class='doccomment'>/// return this error if the client making the attempt is not</span>
+ <span class='doccomment'>/// a chanop on the specified channel.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_UNIQOPPRIVSNEEDED</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 491 ERR_NOOPERHOST</span>
+ <span class='doccomment'>/// &quot;:No O-lines for your host&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - If a client sends an OPER message and the server has</span>
+ <span class='doccomment'>/// not been configured to allow connections from the</span>
+ <span class='doccomment'>/// client&#39;s host as an operator, this error MUST be</span>
+ <span class='doccomment'>/// returned.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_NOOPERHOST</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 501 ERR_UMODEUNKNOWNFLAG</span>
+ <span class='doccomment'>/// &quot;:Unknown MODE flag&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Returned by the server to indicate that a MODE</span>
+ <span class='doccomment'>/// message was sent with a nickname parameter and that</span>
+ <span class='doccomment'>/// the a mode flag sent was not recognized.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_UMODEUNKNOWNFLAG</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+ <span class='doccomment'>/// 502 ERR_USERSDONTMATCH</span>
+ <span class='doccomment'>/// &quot;:Cannot change mode for other users&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// - Error sent to any user trying to view or change the</span>
+ <span class='doccomment'>/// user mode for a user other than themselves.</span>
+ <span class='doccomment'>///</span>
+ <span class='ident'>ERR_USERSDONTMATCH</span>(<span class='ident'>CS</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>),
+
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_message</span>(<span class='ident'>msg</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Message</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Reply</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='ident'>msg</span>.<span class='ident'>command</span>() {
+ <span class='string'>&quot;001&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WELCOME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;002&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_YOURHOST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;003&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_CREATED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;004&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_MYINFO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;005&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_BOUNCE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;302&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_USERHOST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;303&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ISON</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;301&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_AWAY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;305&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_UNAWAY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;306&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_NOWAWAY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;311&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOISUSER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;312&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOISSERVER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;313&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOISOPERATOR</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;317&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOISIDLE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;318&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFWHOIS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;319&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOISCHANNELS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;314&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOWASUSER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;369&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFWHOWAS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;321&quot;</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>RPL_LISTSTART</span>),
+ <span class='string'>&quot;322&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;323&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LISTEND</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;325&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_UNIQOPIS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;324&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_CHANNELMODEIS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;331&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_NOTOPIC</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;332&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TOPIC</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;341&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_INVITING</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;342&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_SUMMONING</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;346&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_INVITELIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;347&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFINVITELIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;348&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_EXCEPTLIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;349&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFEXCEPTLIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;351&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_VERSION</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;352&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_WHOREPLY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;315&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFWHO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;353&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_NAMREPLY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;366&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFNAMES</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;364&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LINKS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;365&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFLINKS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;367&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_BANLIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;368&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFBANLIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;371&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_INFO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;374&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFINFO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;375&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_MOTDSTART</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;372&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_MOTD</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;376&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFMOTD</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;381&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_YOUREOPER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;382&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_REHASHING</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;383&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_YOURESERVICE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;391&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TIME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;392&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_USERSSTART</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;393&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_USERS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;394&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFUSERS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;395&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_NOUSERS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;200&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACELINK</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;201&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACECONNECTING</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;202&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACEHANDSHAKE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;203&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACEUNKNOWN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;204&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACEOPERATOR</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;205&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACEUSER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;206&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACESERVER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;207&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACESERVICE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;208&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACENEWTYPE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;209&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACECLASS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;210&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACERECONNECT</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;261&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACELOG</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;262&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRACEEND</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;211&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_STATSLINKINFO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;212&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_STATSCOMMANDS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;219&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ENDOFSTATS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;242&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_STATSUPTIME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;243&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_STATSOLINE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;221&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_UMODEIS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;234&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_SERVLIST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;235&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_SERVLISTEND</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;251&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LUSERCLIENT</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;252&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LUSEROP</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;253&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LUSERUNKNOWN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;254&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LUSERCHANNELS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;255&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_LUSERME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;256&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ADMINME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;257&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ADMINLOC1</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;258&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ADMINLOC2</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;259&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_ADMINEMAIL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;263&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>RPL_TRYAGAIN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;401&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOSUCHNICK</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;402&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOSUCHSERVER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;403&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOSUCHCHANNEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;404&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_CANNOTSENDTOCHAN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;405&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_TOOMANYCHANNELS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;406&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_WASNOSUCHNICK</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;407&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_TOOMANYTARGETS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;408&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOSUCHSERVICE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;409&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOORIGIN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;411&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NORECIPIENT</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;412&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOTEXTTOSEND</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;413&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOTOPLEVEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;414&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_WILDTOPLEVEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;415&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_BADMASK</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;421&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_UNKNOWNCOMMAND</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;422&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOMOTD</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;423&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOADMININFO</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;424&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_FILEERROR</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;431&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NONICKNAMEGIVEN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;432&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_ERRONEUSNICKNAME</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;433&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NICKNAMEINUSE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;436&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NICKCOLLISION</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;437&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_UNAVAILRESOURCE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;441&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_USERNOTINCHANNEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;442&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOTONCHANNEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;443&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_USERONCHANNEL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;444&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOLOGIN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;445&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_SUMMONDISABLED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;446&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_USERSDISABLED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;451&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOTREGISTERED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;461&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NEEDMOREPARAMS</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;462&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_ALREADYREGISTRED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;463&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOPERMFORHOST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;464&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_PASSWDMISMATCH</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;465&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_YOUREBANNEDCREEP</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;466&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_YOUWILLBEBANNED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;467&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_KEYSET</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;471&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_CHANNELISFULL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;472&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_UNKNOWNMODE</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;473&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_INVITEONLYCHAN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;474&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_BANNEDFROMCHAN</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;475&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_BADCHANNELKEY</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;476&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_BADCHANMASK</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;477&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOCHANMODES</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;478&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_BANLISTFULL</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;481&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOPRIVILEGES</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;482&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_CHANOPRIVSNEEDED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;483&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_CANTKILLSERVER</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;484&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_RESTRICTED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;485&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_UNIQOPPRIVSNEEDED</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;491&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_NOOPERHOST</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;501&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_UMODEUNKNOWNFLAG</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ <span class='string'>&quot;502&quot;</span> <span class='op'>=&gt;</span> <span class='ident'>msg</span>.<span class='ident'>elements</span>().<span class='ident'>last</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>ERR_USERSDONTMATCH</span>(<span class='ident'>Borrowed</span>(<span class='ident'>e</span>))),
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_message</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Message</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Reply</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WELCOME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;001&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOURHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;002&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_CREATED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;003&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MYINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;004&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_BOUNCE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;005&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;302&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ISON</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;303&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_AWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;301&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UNAWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;305&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOWAWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;306&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;311&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;312&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISOPERATOR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;313&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISIDLE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;317&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHOIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;318&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;319&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOWASUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;314&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHOWAS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;369&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LISTSTART</span> <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;321&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>None</span>, <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;322&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LISTEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;323&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UNIQOPIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;325&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_CHANNELMODEIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;324&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOTOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;331&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;332&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INVITING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;341&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SUMMONING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;342&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INVITELIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;346&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFINVITELIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;347&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_EXCEPTLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;348&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFEXCEPTLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;349&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_VERSION</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;351&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOREPLY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;352&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;315&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NAMREPLY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;353&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFNAMES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;366&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;364&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFLINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;365&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_BANLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;367&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFBANLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;368&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;371&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;374&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MOTDSTART</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;375&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;372&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFMOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;376&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOUREOPER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;381&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_REHASHING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;382&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOURESERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;383&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TIME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;391&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERSSTART</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;392&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;393&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;394&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;395&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACELINK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;200&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACECONNECTING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;201&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEHANDSHAKE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;202&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEUNKNOWN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;203&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEOPERATOR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;204&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;205&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACESERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;206&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACESERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;207&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACENEWTYPE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;208&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACECLASS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;209&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACERECONNECT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;210&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACELOG</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;261&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;262&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSLINKINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;211&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSCOMMANDS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;212&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFSTATS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;219&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSUPTIME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;242&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSOLINE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;243&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UMODEIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;221&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SERVLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;234&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SERVLISTEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;235&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERCLIENT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;251&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSEROP</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;252&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERUNKNOWN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;253&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;254&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;255&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;256&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINLOC1</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;257&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINLOC2</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;258&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINEMAIL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;259&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRYAGAIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;263&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHNICK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;401&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;402&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;403&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CANNOTSENDTOCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;404&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_TOOMANYCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;405&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_WASNOSUCHNICK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;406&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_TOOMANYTARGETS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;407&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHSERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;408&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOORIGIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;409&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NORECIPIENT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;411&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTEXTTOSEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;412&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTOPLEVEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;413&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_WILDTOPLEVEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;414&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADMASK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;415&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNKNOWNCOMMAND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;421&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOMOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;422&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOADMININFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;423&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_FILEERROR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;424&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NONICKNAMEGIVEN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;431&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_ERRONEUSNICKNAME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;432&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NICKNAMEINUSE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;433&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NICKCOLLISION</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;436&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNAVAILRESOURCE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;437&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERNOTINCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;441&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTONCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;442&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERONCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;443&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOLOGIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;444&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_SUMMONDISABLED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;445&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERSDISABLED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;446&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTREGISTERED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;451&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NEEDMOREPARAMS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;461&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_ALREADYREGISTRED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;462&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOPERMFORHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;463&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_PASSWDMISMATCH</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;464&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_YOUREBANNEDCREEP</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;465&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_YOUWILLBEBANNED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;466&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_KEYSET</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;467&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CHANNELISFULL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;471&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNKNOWNMODE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;472&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_INVITEONLYCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;473&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BANNEDFROMCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;474&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADCHANNELKEY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;475&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADCHANMASK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;476&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOCHANMODES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;477&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BANLISTFULL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;478&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOPRIVILEGES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;481&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CHANOPRIVSNEEDED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;482&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CANTKILLSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;483&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_RESTRICTED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;484&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNIQOPPRIVSNEEDED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;485&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOOPERHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;491&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UMODEUNKNOWNFLAG</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;501&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERSDONTMATCH</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>Message</span>::<span class='ident'>format</span>(<span class='prelude-val'>None</span>, <span class='ident'>Borrowed</span>(<span class='string'>&quot;502&quot;</span>), <span class='macro'>vec</span><span class='macro'>!</span>[], <span class='prelude-val'>Some</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>()), <span class='ident'>MsgType</span>::<span class='ident'>Irc</span>),
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_static</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Reply</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Reply</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WELCOME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WELCOME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOURHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_YOURHOST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_CREATED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_CREATED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MYINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_MYINFO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_BOUNCE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_BOUNCE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_USERHOST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ISON</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ISON</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_AWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_AWAY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UNAWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_UNAWAY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOWAWAY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_NOWAWAY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOISUSER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOISSERVER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISOPERATOR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOISOPERATOR</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISIDLE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOISIDLE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHOIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFWHOIS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOISCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOISCHANNELS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOWASUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOWASUSER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHOWAS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFWHOWAS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LISTSTART</span> <span class='op'>=&gt;</span> <span class='ident'>RPL_LISTSTART</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LISTEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LISTEND</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UNIQOPIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_UNIQOPIS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_CHANNELMODEIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_CHANNELMODEIS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOTOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_NOTOPIC</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TOPIC</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TOPIC</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INVITING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_INVITING</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SUMMONING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_SUMMONING</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INVITELIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_INVITELIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFINVITELIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFINVITELIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_EXCEPTLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_EXCEPTLIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFEXCEPTLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFEXCEPTLIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_VERSION</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_VERSION</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_WHOREPLY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_WHOREPLY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFWHO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFWHO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NAMREPLY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_NAMREPLY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFNAMES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFNAMES</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LINKS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFLINKS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFLINKS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_BANLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_BANLIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFBANLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFBANLIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_INFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_INFO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFINFO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MOTDSTART</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_MOTDSTART</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_MOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_MOTD</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFMOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFMOTD</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOUREOPER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_YOUREOPER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_REHASHING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_REHASHING</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_YOURESERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_YOURESERVICE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TIME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TIME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERSSTART</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_USERSSTART</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_USERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_USERS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFUSERS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_NOUSERS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_NOUSERS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACELINK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACELINK</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACECONNECTING</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACECONNECTING</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEHANDSHAKE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACEHANDSHAKE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEUNKNOWN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACEUNKNOWN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEOPERATOR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACEOPERATOR</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEUSER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACEUSER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACESERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACESERVER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACESERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACESERVICE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACENEWTYPE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACENEWTYPE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACECLASS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACECLASS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACERECONNECT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACERECONNECT</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACELOG</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACELOG</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRACEEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRACEEND</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSLINKINFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_STATSLINKINFO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSCOMMANDS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_STATSCOMMANDS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ENDOFSTATS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ENDOFSTATS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSUPTIME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_STATSUPTIME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_STATSOLINE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_STATSOLINE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_UMODEIS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_UMODEIS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SERVLIST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_SERVLIST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_SERVLISTEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_SERVLISTEND</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERCLIENT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LUSERCLIENT</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSEROP</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LUSEROP</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERUNKNOWN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LUSERUNKNOWN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LUSERCHANNELS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_LUSERME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_LUSERME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ADMINME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINLOC1</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ADMINLOC1</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINLOC2</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ADMINLOC2</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_ADMINEMAIL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_ADMINEMAIL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>RPL_TRYAGAIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>RPL_TRYAGAIN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHNICK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOSUCHNICK</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOSUCHSERVER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOSUCHCHANNEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CANNOTSENDTOCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_CANNOTSENDTOCHAN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_TOOMANYCHANNELS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_TOOMANYCHANNELS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_WASNOSUCHNICK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_WASNOSUCHNICK</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_TOOMANYTARGETS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_TOOMANYTARGETS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOSUCHSERVICE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOSUCHSERVICE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOORIGIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOORIGIN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NORECIPIENT</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NORECIPIENT</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTEXTTOSEND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOTEXTTOSEND</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTOPLEVEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOTOPLEVEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_WILDTOPLEVEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_WILDTOPLEVEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADMASK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_BADMASK</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNKNOWNCOMMAND</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_UNKNOWNCOMMAND</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOMOTD</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOMOTD</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOADMININFO</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOADMININFO</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_FILEERROR</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_FILEERROR</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NONICKNAMEGIVEN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NONICKNAMEGIVEN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_ERRONEUSNICKNAME</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_ERRONEUSNICKNAME</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NICKNAMEINUSE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NICKNAMEINUSE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NICKCOLLISION</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NICKCOLLISION</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNAVAILRESOURCE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_UNAVAILRESOURCE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERNOTINCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_USERNOTINCHANNEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTONCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOTONCHANNEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERONCHANNEL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_USERONCHANNEL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOLOGIN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOLOGIN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_SUMMONDISABLED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_SUMMONDISABLED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERSDISABLED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_USERSDISABLED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOTREGISTERED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOTREGISTERED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NEEDMOREPARAMS</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NEEDMOREPARAMS</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_ALREADYREGISTRED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_ALREADYREGISTRED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOPERMFORHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOPERMFORHOST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_PASSWDMISMATCH</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_PASSWDMISMATCH</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_YOUREBANNEDCREEP</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_YOUREBANNEDCREEP</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_YOUWILLBEBANNED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_YOUWILLBEBANNED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_KEYSET</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_KEYSET</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CHANNELISFULL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_CHANNELISFULL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNKNOWNMODE</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_UNKNOWNMODE</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_INVITEONLYCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_INVITEONLYCHAN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BANNEDFROMCHAN</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_BANNEDFROMCHAN</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADCHANNELKEY</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_BADCHANNELKEY</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BADCHANMASK</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_BADCHANMASK</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOCHANMODES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOCHANMODES</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_BANLISTFULL</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_BANLISTFULL</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOPRIVILEGES</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOPRIVILEGES</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CHANOPRIVSNEEDED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_CHANOPRIVSNEEDED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_CANTKILLSERVER</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_CANTKILLSERVER</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_RESTRICTED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_RESTRICTED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UNIQOPPRIVSNEEDED</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_UNIQOPPRIVSNEEDED</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_NOOPERHOST</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_NOOPERHOST</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_UMODEUNKNOWNFLAG</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_UMODEUNKNOWNFLAG</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ <span class='kw-2'>&amp;</span><span class='ident'>ERR_USERSDONTMATCH</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>ERR_USERSDONTMATCH</span>(<span class='ident'>Cow</span>::<span class='ident'>Owned</span>(<span class='ident'>s</span>.<span class='ident'>clone</span>().<span class='ident'>into_owned</span>())),
+ }
+
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "irsc";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/lazy_static/lib.rs.html b/src/lazy_static/lib.rs.html
new file mode 100644
index 0000000..b6e5e1e
--- /dev/null
+++ b/src/lazy_static/lib.rs.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/lazy_static-0.1.11/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+</pre><pre class='rust '>
+<span class='doccomment'>/*!
+A macro for declaring lazily evaluated statics.
+
+Using this macro, it is possible to have `static`s that require code to be
+executed at runtime in order to be initialized.
+This includes anything requiring heap allocations, like vectors or hash maps,
+as well as anything that requires function calls to be computed.
+
+# Syntax
+
+```ignore
+lazy_static! {
+ [pub] static ref NAME_1: TYPE_1 = EXPR_1;
+ [pub] static ref NAME_2: TYPE_2 = EXPR_2;
+ ...
+ [pub] static ref NAME_N: TYPE_N = EXPR_N;
+}
+```
+
+# Semantic
+
+For a given `static ref NAME: TYPE = EXPR;`, the macro generates a
+unique type that implements `Deref&lt;TYPE&gt;` and stores it in a static with name `NAME`.
+
+On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
+can return a reference to the same object.
+
+Like regular `static mut`s, this macro only works for types that fulfill the `Sync`
+trait.
+
+# Example
+
+Using the macro:
+
+```rust
+#[macro_use]
+extern crate lazy_static;
+
+use std::collections::HashMap;
+
+lazy_static! {
+ static ref HASHMAP: HashMap&lt;u32, &amp;&#39;static str&gt; = {
+ let mut m = HashMap::new();
+ m.insert(0, &quot;foo&quot;);
+ m.insert(1, &quot;bar&quot;);
+ m.insert(2, &quot;baz&quot;);
+ m
+ };
+ static ref COUNT: usize = HASHMAP.len();
+ static ref NUMBER: u32 = times_two(21);
+}
+
+fn times_two(n: u32) -&gt; u32 { n * 2 }
+
+fn main() {
+ println!(&quot;The map has {} entries.&quot;, *COUNT);
+ println!(&quot;The entry for `0` is \&quot;{}\&quot;.&quot;, HASHMAP.get(&amp;0).unwrap());
+ println!(&quot;A expensive calculation on a static results in: {}.&quot;, *NUMBER);
+}
+```
+
+# Implementation details
+
+The `Deref` implementation uses a hidden `static mut` that is guarded by a atomic check
+using the `sync::Once` abstraction. All lazily evaluated values are currently
+put in a heap allocated box, due to the Rust language currently not providing any way to
+define uninitialized `static mut` values.
+
+*/</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>crate_type</span> <span class='op'>=</span> <span class='string'>&quot;dylib&quot;</span>]</span>
+
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>lazy_static</span> {
+ (<span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>:<span class='ident'>ident</span> : <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>:<span class='ident'>ty</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>:<span class='ident'>expr</span>; $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>lazy_static</span><span class='macro'>!</span>(<span class='ident'>PRIV</span> <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> : <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>; $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>)<span class='op'>*</span>);
+ };
+ (<span class='kw'>pub</span> <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>:<span class='ident'>ident</span> : <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>:<span class='ident'>ty</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>:<span class='ident'>expr</span>; $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>lazy_static</span><span class='macro'>!</span>(<span class='ident'>PUB</span> <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> : <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>; $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>)<span class='op'>*</span>);
+ };
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>VIS</span>:<span class='ident'>ident</span> <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>:<span class='ident'>ident</span> : <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>:<span class='ident'>ty</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>:<span class='ident'>expr</span>; $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>lazy_static</span><span class='macro'>!</span>(<span class='ident'>MAKE</span> <span class='ident'>TY</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>VIS</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>);
+ <span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span> <span class='kw'>for</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>__static_ref_initialize</span>() <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span><span class='op'>&gt;</span> { <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>e</span>) }
+
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{<span class='ident'>Once</span>, <span class='ident'>ONCE_INIT</span>};
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>transmute</span>;
+
+ <span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>require_sync</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Sync</span><span class='op'>&gt;</span>(_: <span class='kw-2'>&amp;</span><span class='ident'>T</span>) { }
+
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>DATA</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span> <span class='op'>=</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span>;
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>ONCE</span>: <span class='ident'>Once</span> <span class='op'>=</span> <span class='ident'>ONCE_INIT</span>;
+ <span class='ident'>ONCE</span>.<span class='ident'>call_once</span>(<span class='op'>||</span> {
+ <span class='ident'>DATA</span> <span class='op'>=</span> <span class='ident'>transmute</span>::<span class='op'>&lt;</span><span class='ident'>Box</span><span class='op'>&lt;</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span><span class='op'>&gt;</span>, <span class='op'>*</span><span class='kw'>const</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>T</span><span class='op'>&gt;</span>(<span class='ident'>__static_ref_initialize</span>());
+ });
+ <span class='kw'>let</span> <span class='ident'>static_ref</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>DATA</span>;
+ <span class='ident'>require_sync</span>(<span class='ident'>static_ref</span>);
+ <span class='ident'>static_ref</span>
+ }
+ }
+ }
+ <span class='macro'>lazy_static</span><span class='macro'>!</span>($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>t</span>)<span class='op'>*</span>);
+ };
+ (<span class='ident'>MAKE</span> <span class='ident'>TY</span> <span class='ident'>PUB</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>:<span class='ident'>ident</span>) <span class='op'>=&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>missing_copy_implementations</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> {<span class='ident'>__private_field</span>: ()}
+ <span class='kw'>pub</span> <span class='kw'>static</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> {<span class='ident'>__private_field</span>: ()};
+ };
+ (<span class='ident'>MAKE</span> <span class='ident'>TY</span> <span class='ident'>PRIV</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>:<span class='ident'>ident</span>) <span class='op'>=&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>missing_copy_implementations</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+ <span class='kw'>struct</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> {<span class='ident'>__private_field</span>: ()}
+ <span class='kw'>static</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>N</span> {<span class='ident'>__private_field</span>: ()};
+ };
+ () <span class='op'>=&gt;</span> ()
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "lazy_static";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/libc/lib.rs.html b/src/libc/lib.rs.html
new file mode 100644
index 0000000..ac022cd
--- /dev/null
+++ b/src/libc/lib.rs.html
@@ -0,0 +1,12869 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/libc-0.1.8/rust/src/liblibc/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="https://doc.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../libc/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+<span id="1149">1149</span>
+<span id="1150">1150</span>
+<span id="1151">1151</span>
+<span id="1152">1152</span>
+<span id="1153">1153</span>
+<span id="1154">1154</span>
+<span id="1155">1155</span>
+<span id="1156">1156</span>
+<span id="1157">1157</span>
+<span id="1158">1158</span>
+<span id="1159">1159</span>
+<span id="1160">1160</span>
+<span id="1161">1161</span>
+<span id="1162">1162</span>
+<span id="1163">1163</span>
+<span id="1164">1164</span>
+<span id="1165">1165</span>
+<span id="1166">1166</span>
+<span id="1167">1167</span>
+<span id="1168">1168</span>
+<span id="1169">1169</span>
+<span id="1170">1170</span>
+<span id="1171">1171</span>
+<span id="1172">1172</span>
+<span id="1173">1173</span>
+<span id="1174">1174</span>
+<span id="1175">1175</span>
+<span id="1176">1176</span>
+<span id="1177">1177</span>
+<span id="1178">1178</span>
+<span id="1179">1179</span>
+<span id="1180">1180</span>
+<span id="1181">1181</span>
+<span id="1182">1182</span>
+<span id="1183">1183</span>
+<span id="1184">1184</span>
+<span id="1185">1185</span>
+<span id="1186">1186</span>
+<span id="1187">1187</span>
+<span id="1188">1188</span>
+<span id="1189">1189</span>
+<span id="1190">1190</span>
+<span id="1191">1191</span>
+<span id="1192">1192</span>
+<span id="1193">1193</span>
+<span id="1194">1194</span>
+<span id="1195">1195</span>
+<span id="1196">1196</span>
+<span id="1197">1197</span>
+<span id="1198">1198</span>
+<span id="1199">1199</span>
+<span id="1200">1200</span>
+<span id="1201">1201</span>
+<span id="1202">1202</span>
+<span id="1203">1203</span>
+<span id="1204">1204</span>
+<span id="1205">1205</span>
+<span id="1206">1206</span>
+<span id="1207">1207</span>
+<span id="1208">1208</span>
+<span id="1209">1209</span>
+<span id="1210">1210</span>
+<span id="1211">1211</span>
+<span id="1212">1212</span>
+<span id="1213">1213</span>
+<span id="1214">1214</span>
+<span id="1215">1215</span>
+<span id="1216">1216</span>
+<span id="1217">1217</span>
+<span id="1218">1218</span>
+<span id="1219">1219</span>
+<span id="1220">1220</span>
+<span id="1221">1221</span>
+<span id="1222">1222</span>
+<span id="1223">1223</span>
+<span id="1224">1224</span>
+<span id="1225">1225</span>
+<span id="1226">1226</span>
+<span id="1227">1227</span>
+<span id="1228">1228</span>
+<span id="1229">1229</span>
+<span id="1230">1230</span>
+<span id="1231">1231</span>
+<span id="1232">1232</span>
+<span id="1233">1233</span>
+<span id="1234">1234</span>
+<span id="1235">1235</span>
+<span id="1236">1236</span>
+<span id="1237">1237</span>
+<span id="1238">1238</span>
+<span id="1239">1239</span>
+<span id="1240">1240</span>
+<span id="1241">1241</span>
+<span id="1242">1242</span>
+<span id="1243">1243</span>
+<span id="1244">1244</span>
+<span id="1245">1245</span>
+<span id="1246">1246</span>
+<span id="1247">1247</span>
+<span id="1248">1248</span>
+<span id="1249">1249</span>
+<span id="1250">1250</span>
+<span id="1251">1251</span>
+<span id="1252">1252</span>
+<span id="1253">1253</span>
+<span id="1254">1254</span>
+<span id="1255">1255</span>
+<span id="1256">1256</span>
+<span id="1257">1257</span>
+<span id="1258">1258</span>
+<span id="1259">1259</span>
+<span id="1260">1260</span>
+<span id="1261">1261</span>
+<span id="1262">1262</span>
+<span id="1263">1263</span>
+<span id="1264">1264</span>
+<span id="1265">1265</span>
+<span id="1266">1266</span>
+<span id="1267">1267</span>
+<span id="1268">1268</span>
+<span id="1269">1269</span>
+<span id="1270">1270</span>
+<span id="1271">1271</span>
+<span id="1272">1272</span>
+<span id="1273">1273</span>
+<span id="1274">1274</span>
+<span id="1275">1275</span>
+<span id="1276">1276</span>
+<span id="1277">1277</span>
+<span id="1278">1278</span>
+<span id="1279">1279</span>
+<span id="1280">1280</span>
+<span id="1281">1281</span>
+<span id="1282">1282</span>
+<span id="1283">1283</span>
+<span id="1284">1284</span>
+<span id="1285">1285</span>
+<span id="1286">1286</span>
+<span id="1287">1287</span>
+<span id="1288">1288</span>
+<span id="1289">1289</span>
+<span id="1290">1290</span>
+<span id="1291">1291</span>
+<span id="1292">1292</span>
+<span id="1293">1293</span>
+<span id="1294">1294</span>
+<span id="1295">1295</span>
+<span id="1296">1296</span>
+<span id="1297">1297</span>
+<span id="1298">1298</span>
+<span id="1299">1299</span>
+<span id="1300">1300</span>
+<span id="1301">1301</span>
+<span id="1302">1302</span>
+<span id="1303">1303</span>
+<span id="1304">1304</span>
+<span id="1305">1305</span>
+<span id="1306">1306</span>
+<span id="1307">1307</span>
+<span id="1308">1308</span>
+<span id="1309">1309</span>
+<span id="1310">1310</span>
+<span id="1311">1311</span>
+<span id="1312">1312</span>
+<span id="1313">1313</span>
+<span id="1314">1314</span>
+<span id="1315">1315</span>
+<span id="1316">1316</span>
+<span id="1317">1317</span>
+<span id="1318">1318</span>
+<span id="1319">1319</span>
+<span id="1320">1320</span>
+<span id="1321">1321</span>
+<span id="1322">1322</span>
+<span id="1323">1323</span>
+<span id="1324">1324</span>
+<span id="1325">1325</span>
+<span id="1326">1326</span>
+<span id="1327">1327</span>
+<span id="1328">1328</span>
+<span id="1329">1329</span>
+<span id="1330">1330</span>
+<span id="1331">1331</span>
+<span id="1332">1332</span>
+<span id="1333">1333</span>
+<span id="1334">1334</span>
+<span id="1335">1335</span>
+<span id="1336">1336</span>
+<span id="1337">1337</span>
+<span id="1338">1338</span>
+<span id="1339">1339</span>
+<span id="1340">1340</span>
+<span id="1341">1341</span>
+<span id="1342">1342</span>
+<span id="1343">1343</span>
+<span id="1344">1344</span>
+<span id="1345">1345</span>
+<span id="1346">1346</span>
+<span id="1347">1347</span>
+<span id="1348">1348</span>
+<span id="1349">1349</span>
+<span id="1350">1350</span>
+<span id="1351">1351</span>
+<span id="1352">1352</span>
+<span id="1353">1353</span>
+<span id="1354">1354</span>
+<span id="1355">1355</span>
+<span id="1356">1356</span>
+<span id="1357">1357</span>
+<span id="1358">1358</span>
+<span id="1359">1359</span>
+<span id="1360">1360</span>
+<span id="1361">1361</span>
+<span id="1362">1362</span>
+<span id="1363">1363</span>
+<span id="1364">1364</span>
+<span id="1365">1365</span>
+<span id="1366">1366</span>
+<span id="1367">1367</span>
+<span id="1368">1368</span>
+<span id="1369">1369</span>
+<span id="1370">1370</span>
+<span id="1371">1371</span>
+<span id="1372">1372</span>
+<span id="1373">1373</span>
+<span id="1374">1374</span>
+<span id="1375">1375</span>
+<span id="1376">1376</span>
+<span id="1377">1377</span>
+<span id="1378">1378</span>
+<span id="1379">1379</span>
+<span id="1380">1380</span>
+<span id="1381">1381</span>
+<span id="1382">1382</span>
+<span id="1383">1383</span>
+<span id="1384">1384</span>
+<span id="1385">1385</span>
+<span id="1386">1386</span>
+<span id="1387">1387</span>
+<span id="1388">1388</span>
+<span id="1389">1389</span>
+<span id="1390">1390</span>
+<span id="1391">1391</span>
+<span id="1392">1392</span>
+<span id="1393">1393</span>
+<span id="1394">1394</span>
+<span id="1395">1395</span>
+<span id="1396">1396</span>
+<span id="1397">1397</span>
+<span id="1398">1398</span>
+<span id="1399">1399</span>
+<span id="1400">1400</span>
+<span id="1401">1401</span>
+<span id="1402">1402</span>
+<span id="1403">1403</span>
+<span id="1404">1404</span>
+<span id="1405">1405</span>
+<span id="1406">1406</span>
+<span id="1407">1407</span>
+<span id="1408">1408</span>
+<span id="1409">1409</span>
+<span id="1410">1410</span>
+<span id="1411">1411</span>
+<span id="1412">1412</span>
+<span id="1413">1413</span>
+<span id="1414">1414</span>
+<span id="1415">1415</span>
+<span id="1416">1416</span>
+<span id="1417">1417</span>
+<span id="1418">1418</span>
+<span id="1419">1419</span>
+<span id="1420">1420</span>
+<span id="1421">1421</span>
+<span id="1422">1422</span>
+<span id="1423">1423</span>
+<span id="1424">1424</span>
+<span id="1425">1425</span>
+<span id="1426">1426</span>
+<span id="1427">1427</span>
+<span id="1428">1428</span>
+<span id="1429">1429</span>
+<span id="1430">1430</span>
+<span id="1431">1431</span>
+<span id="1432">1432</span>
+<span id="1433">1433</span>
+<span id="1434">1434</span>
+<span id="1435">1435</span>
+<span id="1436">1436</span>
+<span id="1437">1437</span>
+<span id="1438">1438</span>
+<span id="1439">1439</span>
+<span id="1440">1440</span>
+<span id="1441">1441</span>
+<span id="1442">1442</span>
+<span id="1443">1443</span>
+<span id="1444">1444</span>
+<span id="1445">1445</span>
+<span id="1446">1446</span>
+<span id="1447">1447</span>
+<span id="1448">1448</span>
+<span id="1449">1449</span>
+<span id="1450">1450</span>
+<span id="1451">1451</span>
+<span id="1452">1452</span>
+<span id="1453">1453</span>
+<span id="1454">1454</span>
+<span id="1455">1455</span>
+<span id="1456">1456</span>
+<span id="1457">1457</span>
+<span id="1458">1458</span>
+<span id="1459">1459</span>
+<span id="1460">1460</span>
+<span id="1461">1461</span>
+<span id="1462">1462</span>
+<span id="1463">1463</span>
+<span id="1464">1464</span>
+<span id="1465">1465</span>
+<span id="1466">1466</span>
+<span id="1467">1467</span>
+<span id="1468">1468</span>
+<span id="1469">1469</span>
+<span id="1470">1470</span>
+<span id="1471">1471</span>
+<span id="1472">1472</span>
+<span id="1473">1473</span>
+<span id="1474">1474</span>
+<span id="1475">1475</span>
+<span id="1476">1476</span>
+<span id="1477">1477</span>
+<span id="1478">1478</span>
+<span id="1479">1479</span>
+<span id="1480">1480</span>
+<span id="1481">1481</span>
+<span id="1482">1482</span>
+<span id="1483">1483</span>
+<span id="1484">1484</span>
+<span id="1485">1485</span>
+<span id="1486">1486</span>
+<span id="1487">1487</span>
+<span id="1488">1488</span>
+<span id="1489">1489</span>
+<span id="1490">1490</span>
+<span id="1491">1491</span>
+<span id="1492">1492</span>
+<span id="1493">1493</span>
+<span id="1494">1494</span>
+<span id="1495">1495</span>
+<span id="1496">1496</span>
+<span id="1497">1497</span>
+<span id="1498">1498</span>
+<span id="1499">1499</span>
+<span id="1500">1500</span>
+<span id="1501">1501</span>
+<span id="1502">1502</span>
+<span id="1503">1503</span>
+<span id="1504">1504</span>
+<span id="1505">1505</span>
+<span id="1506">1506</span>
+<span id="1507">1507</span>
+<span id="1508">1508</span>
+<span id="1509">1509</span>
+<span id="1510">1510</span>
+<span id="1511">1511</span>
+<span id="1512">1512</span>
+<span id="1513">1513</span>
+<span id="1514">1514</span>
+<span id="1515">1515</span>
+<span id="1516">1516</span>
+<span id="1517">1517</span>
+<span id="1518">1518</span>
+<span id="1519">1519</span>
+<span id="1520">1520</span>
+<span id="1521">1521</span>
+<span id="1522">1522</span>
+<span id="1523">1523</span>
+<span id="1524">1524</span>
+<span id="1525">1525</span>
+<span id="1526">1526</span>
+<span id="1527">1527</span>
+<span id="1528">1528</span>
+<span id="1529">1529</span>
+<span id="1530">1530</span>
+<span id="1531">1531</span>
+<span id="1532">1532</span>
+<span id="1533">1533</span>
+<span id="1534">1534</span>
+<span id="1535">1535</span>
+<span id="1536">1536</span>
+<span id="1537">1537</span>
+<span id="1538">1538</span>
+<span id="1539">1539</span>
+<span id="1540">1540</span>
+<span id="1541">1541</span>
+<span id="1542">1542</span>
+<span id="1543">1543</span>
+<span id="1544">1544</span>
+<span id="1545">1545</span>
+<span id="1546">1546</span>
+<span id="1547">1547</span>
+<span id="1548">1548</span>
+<span id="1549">1549</span>
+<span id="1550">1550</span>
+<span id="1551">1551</span>
+<span id="1552">1552</span>
+<span id="1553">1553</span>
+<span id="1554">1554</span>
+<span id="1555">1555</span>
+<span id="1556">1556</span>
+<span id="1557">1557</span>
+<span id="1558">1558</span>
+<span id="1559">1559</span>
+<span id="1560">1560</span>
+<span id="1561">1561</span>
+<span id="1562">1562</span>
+<span id="1563">1563</span>
+<span id="1564">1564</span>
+<span id="1565">1565</span>
+<span id="1566">1566</span>
+<span id="1567">1567</span>
+<span id="1568">1568</span>
+<span id="1569">1569</span>
+<span id="1570">1570</span>
+<span id="1571">1571</span>
+<span id="1572">1572</span>
+<span id="1573">1573</span>
+<span id="1574">1574</span>
+<span id="1575">1575</span>
+<span id="1576">1576</span>
+<span id="1577">1577</span>
+<span id="1578">1578</span>
+<span id="1579">1579</span>
+<span id="1580">1580</span>
+<span id="1581">1581</span>
+<span id="1582">1582</span>
+<span id="1583">1583</span>
+<span id="1584">1584</span>
+<span id="1585">1585</span>
+<span id="1586">1586</span>
+<span id="1587">1587</span>
+<span id="1588">1588</span>
+<span id="1589">1589</span>
+<span id="1590">1590</span>
+<span id="1591">1591</span>
+<span id="1592">1592</span>
+<span id="1593">1593</span>
+<span id="1594">1594</span>
+<span id="1595">1595</span>
+<span id="1596">1596</span>
+<span id="1597">1597</span>
+<span id="1598">1598</span>
+<span id="1599">1599</span>
+<span id="1600">1600</span>
+<span id="1601">1601</span>
+<span id="1602">1602</span>
+<span id="1603">1603</span>
+<span id="1604">1604</span>
+<span id="1605">1605</span>
+<span id="1606">1606</span>
+<span id="1607">1607</span>
+<span id="1608">1608</span>
+<span id="1609">1609</span>
+<span id="1610">1610</span>
+<span id="1611">1611</span>
+<span id="1612">1612</span>
+<span id="1613">1613</span>
+<span id="1614">1614</span>
+<span id="1615">1615</span>
+<span id="1616">1616</span>
+<span id="1617">1617</span>
+<span id="1618">1618</span>
+<span id="1619">1619</span>
+<span id="1620">1620</span>
+<span id="1621">1621</span>
+<span id="1622">1622</span>
+<span id="1623">1623</span>
+<span id="1624">1624</span>
+<span id="1625">1625</span>
+<span id="1626">1626</span>
+<span id="1627">1627</span>
+<span id="1628">1628</span>
+<span id="1629">1629</span>
+<span id="1630">1630</span>
+<span id="1631">1631</span>
+<span id="1632">1632</span>
+<span id="1633">1633</span>
+<span id="1634">1634</span>
+<span id="1635">1635</span>
+<span id="1636">1636</span>
+<span id="1637">1637</span>
+<span id="1638">1638</span>
+<span id="1639">1639</span>
+<span id="1640">1640</span>
+<span id="1641">1641</span>
+<span id="1642">1642</span>
+<span id="1643">1643</span>
+<span id="1644">1644</span>
+<span id="1645">1645</span>
+<span id="1646">1646</span>
+<span id="1647">1647</span>
+<span id="1648">1648</span>
+<span id="1649">1649</span>
+<span id="1650">1650</span>
+<span id="1651">1651</span>
+<span id="1652">1652</span>
+<span id="1653">1653</span>
+<span id="1654">1654</span>
+<span id="1655">1655</span>
+<span id="1656">1656</span>
+<span id="1657">1657</span>
+<span id="1658">1658</span>
+<span id="1659">1659</span>
+<span id="1660">1660</span>
+<span id="1661">1661</span>
+<span id="1662">1662</span>
+<span id="1663">1663</span>
+<span id="1664">1664</span>
+<span id="1665">1665</span>
+<span id="1666">1666</span>
+<span id="1667">1667</span>
+<span id="1668">1668</span>
+<span id="1669">1669</span>
+<span id="1670">1670</span>
+<span id="1671">1671</span>
+<span id="1672">1672</span>
+<span id="1673">1673</span>
+<span id="1674">1674</span>
+<span id="1675">1675</span>
+<span id="1676">1676</span>
+<span id="1677">1677</span>
+<span id="1678">1678</span>
+<span id="1679">1679</span>
+<span id="1680">1680</span>
+<span id="1681">1681</span>
+<span id="1682">1682</span>
+<span id="1683">1683</span>
+<span id="1684">1684</span>
+<span id="1685">1685</span>
+<span id="1686">1686</span>
+<span id="1687">1687</span>
+<span id="1688">1688</span>
+<span id="1689">1689</span>
+<span id="1690">1690</span>
+<span id="1691">1691</span>
+<span id="1692">1692</span>
+<span id="1693">1693</span>
+<span id="1694">1694</span>
+<span id="1695">1695</span>
+<span id="1696">1696</span>
+<span id="1697">1697</span>
+<span id="1698">1698</span>
+<span id="1699">1699</span>
+<span id="1700">1700</span>
+<span id="1701">1701</span>
+<span id="1702">1702</span>
+<span id="1703">1703</span>
+<span id="1704">1704</span>
+<span id="1705">1705</span>
+<span id="1706">1706</span>
+<span id="1707">1707</span>
+<span id="1708">1708</span>
+<span id="1709">1709</span>
+<span id="1710">1710</span>
+<span id="1711">1711</span>
+<span id="1712">1712</span>
+<span id="1713">1713</span>
+<span id="1714">1714</span>
+<span id="1715">1715</span>
+<span id="1716">1716</span>
+<span id="1717">1717</span>
+<span id="1718">1718</span>
+<span id="1719">1719</span>
+<span id="1720">1720</span>
+<span id="1721">1721</span>
+<span id="1722">1722</span>
+<span id="1723">1723</span>
+<span id="1724">1724</span>
+<span id="1725">1725</span>
+<span id="1726">1726</span>
+<span id="1727">1727</span>
+<span id="1728">1728</span>
+<span id="1729">1729</span>
+<span id="1730">1730</span>
+<span id="1731">1731</span>
+<span id="1732">1732</span>
+<span id="1733">1733</span>
+<span id="1734">1734</span>
+<span id="1735">1735</span>
+<span id="1736">1736</span>
+<span id="1737">1737</span>
+<span id="1738">1738</span>
+<span id="1739">1739</span>
+<span id="1740">1740</span>
+<span id="1741">1741</span>
+<span id="1742">1742</span>
+<span id="1743">1743</span>
+<span id="1744">1744</span>
+<span id="1745">1745</span>
+<span id="1746">1746</span>
+<span id="1747">1747</span>
+<span id="1748">1748</span>
+<span id="1749">1749</span>
+<span id="1750">1750</span>
+<span id="1751">1751</span>
+<span id="1752">1752</span>
+<span id="1753">1753</span>
+<span id="1754">1754</span>
+<span id="1755">1755</span>
+<span id="1756">1756</span>
+<span id="1757">1757</span>
+<span id="1758">1758</span>
+<span id="1759">1759</span>
+<span id="1760">1760</span>
+<span id="1761">1761</span>
+<span id="1762">1762</span>
+<span id="1763">1763</span>
+<span id="1764">1764</span>
+<span id="1765">1765</span>
+<span id="1766">1766</span>
+<span id="1767">1767</span>
+<span id="1768">1768</span>
+<span id="1769">1769</span>
+<span id="1770">1770</span>
+<span id="1771">1771</span>
+<span id="1772">1772</span>
+<span id="1773">1773</span>
+<span id="1774">1774</span>
+<span id="1775">1775</span>
+<span id="1776">1776</span>
+<span id="1777">1777</span>
+<span id="1778">1778</span>
+<span id="1779">1779</span>
+<span id="1780">1780</span>
+<span id="1781">1781</span>
+<span id="1782">1782</span>
+<span id="1783">1783</span>
+<span id="1784">1784</span>
+<span id="1785">1785</span>
+<span id="1786">1786</span>
+<span id="1787">1787</span>
+<span id="1788">1788</span>
+<span id="1789">1789</span>
+<span id="1790">1790</span>
+<span id="1791">1791</span>
+<span id="1792">1792</span>
+<span id="1793">1793</span>
+<span id="1794">1794</span>
+<span id="1795">1795</span>
+<span id="1796">1796</span>
+<span id="1797">1797</span>
+<span id="1798">1798</span>
+<span id="1799">1799</span>
+<span id="1800">1800</span>
+<span id="1801">1801</span>
+<span id="1802">1802</span>
+<span id="1803">1803</span>
+<span id="1804">1804</span>
+<span id="1805">1805</span>
+<span id="1806">1806</span>
+<span id="1807">1807</span>
+<span id="1808">1808</span>
+<span id="1809">1809</span>
+<span id="1810">1810</span>
+<span id="1811">1811</span>
+<span id="1812">1812</span>
+<span id="1813">1813</span>
+<span id="1814">1814</span>
+<span id="1815">1815</span>
+<span id="1816">1816</span>
+<span id="1817">1817</span>
+<span id="1818">1818</span>
+<span id="1819">1819</span>
+<span id="1820">1820</span>
+<span id="1821">1821</span>
+<span id="1822">1822</span>
+<span id="1823">1823</span>
+<span id="1824">1824</span>
+<span id="1825">1825</span>
+<span id="1826">1826</span>
+<span id="1827">1827</span>
+<span id="1828">1828</span>
+<span id="1829">1829</span>
+<span id="1830">1830</span>
+<span id="1831">1831</span>
+<span id="1832">1832</span>
+<span id="1833">1833</span>
+<span id="1834">1834</span>
+<span id="1835">1835</span>
+<span id="1836">1836</span>
+<span id="1837">1837</span>
+<span id="1838">1838</span>
+<span id="1839">1839</span>
+<span id="1840">1840</span>
+<span id="1841">1841</span>
+<span id="1842">1842</span>
+<span id="1843">1843</span>
+<span id="1844">1844</span>
+<span id="1845">1845</span>
+<span id="1846">1846</span>
+<span id="1847">1847</span>
+<span id="1848">1848</span>
+<span id="1849">1849</span>
+<span id="1850">1850</span>
+<span id="1851">1851</span>
+<span id="1852">1852</span>
+<span id="1853">1853</span>
+<span id="1854">1854</span>
+<span id="1855">1855</span>
+<span id="1856">1856</span>
+<span id="1857">1857</span>
+<span id="1858">1858</span>
+<span id="1859">1859</span>
+<span id="1860">1860</span>
+<span id="1861">1861</span>
+<span id="1862">1862</span>
+<span id="1863">1863</span>
+<span id="1864">1864</span>
+<span id="1865">1865</span>
+<span id="1866">1866</span>
+<span id="1867">1867</span>
+<span id="1868">1868</span>
+<span id="1869">1869</span>
+<span id="1870">1870</span>
+<span id="1871">1871</span>
+<span id="1872">1872</span>
+<span id="1873">1873</span>
+<span id="1874">1874</span>
+<span id="1875">1875</span>
+<span id="1876">1876</span>
+<span id="1877">1877</span>
+<span id="1878">1878</span>
+<span id="1879">1879</span>
+<span id="1880">1880</span>
+<span id="1881">1881</span>
+<span id="1882">1882</span>
+<span id="1883">1883</span>
+<span id="1884">1884</span>
+<span id="1885">1885</span>
+<span id="1886">1886</span>
+<span id="1887">1887</span>
+<span id="1888">1888</span>
+<span id="1889">1889</span>
+<span id="1890">1890</span>
+<span id="1891">1891</span>
+<span id="1892">1892</span>
+<span id="1893">1893</span>
+<span id="1894">1894</span>
+<span id="1895">1895</span>
+<span id="1896">1896</span>
+<span id="1897">1897</span>
+<span id="1898">1898</span>
+<span id="1899">1899</span>
+<span id="1900">1900</span>
+<span id="1901">1901</span>
+<span id="1902">1902</span>
+<span id="1903">1903</span>
+<span id="1904">1904</span>
+<span id="1905">1905</span>
+<span id="1906">1906</span>
+<span id="1907">1907</span>
+<span id="1908">1908</span>
+<span id="1909">1909</span>
+<span id="1910">1910</span>
+<span id="1911">1911</span>
+<span id="1912">1912</span>
+<span id="1913">1913</span>
+<span id="1914">1914</span>
+<span id="1915">1915</span>
+<span id="1916">1916</span>
+<span id="1917">1917</span>
+<span id="1918">1918</span>
+<span id="1919">1919</span>
+<span id="1920">1920</span>
+<span id="1921">1921</span>
+<span id="1922">1922</span>
+<span id="1923">1923</span>
+<span id="1924">1924</span>
+<span id="1925">1925</span>
+<span id="1926">1926</span>
+<span id="1927">1927</span>
+<span id="1928">1928</span>
+<span id="1929">1929</span>
+<span id="1930">1930</span>
+<span id="1931">1931</span>
+<span id="1932">1932</span>
+<span id="1933">1933</span>
+<span id="1934">1934</span>
+<span id="1935">1935</span>
+<span id="1936">1936</span>
+<span id="1937">1937</span>
+<span id="1938">1938</span>
+<span id="1939">1939</span>
+<span id="1940">1940</span>
+<span id="1941">1941</span>
+<span id="1942">1942</span>
+<span id="1943">1943</span>
+<span id="1944">1944</span>
+<span id="1945">1945</span>
+<span id="1946">1946</span>
+<span id="1947">1947</span>
+<span id="1948">1948</span>
+<span id="1949">1949</span>
+<span id="1950">1950</span>
+<span id="1951">1951</span>
+<span id="1952">1952</span>
+<span id="1953">1953</span>
+<span id="1954">1954</span>
+<span id="1955">1955</span>
+<span id="1956">1956</span>
+<span id="1957">1957</span>
+<span id="1958">1958</span>
+<span id="1959">1959</span>
+<span id="1960">1960</span>
+<span id="1961">1961</span>
+<span id="1962">1962</span>
+<span id="1963">1963</span>
+<span id="1964">1964</span>
+<span id="1965">1965</span>
+<span id="1966">1966</span>
+<span id="1967">1967</span>
+<span id="1968">1968</span>
+<span id="1969">1969</span>
+<span id="1970">1970</span>
+<span id="1971">1971</span>
+<span id="1972">1972</span>
+<span id="1973">1973</span>
+<span id="1974">1974</span>
+<span id="1975">1975</span>
+<span id="1976">1976</span>
+<span id="1977">1977</span>
+<span id="1978">1978</span>
+<span id="1979">1979</span>
+<span id="1980">1980</span>
+<span id="1981">1981</span>
+<span id="1982">1982</span>
+<span id="1983">1983</span>
+<span id="1984">1984</span>
+<span id="1985">1985</span>
+<span id="1986">1986</span>
+<span id="1987">1987</span>
+<span id="1988">1988</span>
+<span id="1989">1989</span>
+<span id="1990">1990</span>
+<span id="1991">1991</span>
+<span id="1992">1992</span>
+<span id="1993">1993</span>
+<span id="1994">1994</span>
+<span id="1995">1995</span>
+<span id="1996">1996</span>
+<span id="1997">1997</span>
+<span id="1998">1998</span>
+<span id="1999">1999</span>
+<span id="2000">2000</span>
+<span id="2001">2001</span>
+<span id="2002">2002</span>
+<span id="2003">2003</span>
+<span id="2004">2004</span>
+<span id="2005">2005</span>
+<span id="2006">2006</span>
+<span id="2007">2007</span>
+<span id="2008">2008</span>
+<span id="2009">2009</span>
+<span id="2010">2010</span>
+<span id="2011">2011</span>
+<span id="2012">2012</span>
+<span id="2013">2013</span>
+<span id="2014">2014</span>
+<span id="2015">2015</span>
+<span id="2016">2016</span>
+<span id="2017">2017</span>
+<span id="2018">2018</span>
+<span id="2019">2019</span>
+<span id="2020">2020</span>
+<span id="2021">2021</span>
+<span id="2022">2022</span>
+<span id="2023">2023</span>
+<span id="2024">2024</span>
+<span id="2025">2025</span>
+<span id="2026">2026</span>
+<span id="2027">2027</span>
+<span id="2028">2028</span>
+<span id="2029">2029</span>
+<span id="2030">2030</span>
+<span id="2031">2031</span>
+<span id="2032">2032</span>
+<span id="2033">2033</span>
+<span id="2034">2034</span>
+<span id="2035">2035</span>
+<span id="2036">2036</span>
+<span id="2037">2037</span>
+<span id="2038">2038</span>
+<span id="2039">2039</span>
+<span id="2040">2040</span>
+<span id="2041">2041</span>
+<span id="2042">2042</span>
+<span id="2043">2043</span>
+<span id="2044">2044</span>
+<span id="2045">2045</span>
+<span id="2046">2046</span>
+<span id="2047">2047</span>
+<span id="2048">2048</span>
+<span id="2049">2049</span>
+<span id="2050">2050</span>
+<span id="2051">2051</span>
+<span id="2052">2052</span>
+<span id="2053">2053</span>
+<span id="2054">2054</span>
+<span id="2055">2055</span>
+<span id="2056">2056</span>
+<span id="2057">2057</span>
+<span id="2058">2058</span>
+<span id="2059">2059</span>
+<span id="2060">2060</span>
+<span id="2061">2061</span>
+<span id="2062">2062</span>
+<span id="2063">2063</span>
+<span id="2064">2064</span>
+<span id="2065">2065</span>
+<span id="2066">2066</span>
+<span id="2067">2067</span>
+<span id="2068">2068</span>
+<span id="2069">2069</span>
+<span id="2070">2070</span>
+<span id="2071">2071</span>
+<span id="2072">2072</span>
+<span id="2073">2073</span>
+<span id="2074">2074</span>
+<span id="2075">2075</span>
+<span id="2076">2076</span>
+<span id="2077">2077</span>
+<span id="2078">2078</span>
+<span id="2079">2079</span>
+<span id="2080">2080</span>
+<span id="2081">2081</span>
+<span id="2082">2082</span>
+<span id="2083">2083</span>
+<span id="2084">2084</span>
+<span id="2085">2085</span>
+<span id="2086">2086</span>
+<span id="2087">2087</span>
+<span id="2088">2088</span>
+<span id="2089">2089</span>
+<span id="2090">2090</span>
+<span id="2091">2091</span>
+<span id="2092">2092</span>
+<span id="2093">2093</span>
+<span id="2094">2094</span>
+<span id="2095">2095</span>
+<span id="2096">2096</span>
+<span id="2097">2097</span>
+<span id="2098">2098</span>
+<span id="2099">2099</span>
+<span id="2100">2100</span>
+<span id="2101">2101</span>
+<span id="2102">2102</span>
+<span id="2103">2103</span>
+<span id="2104">2104</span>
+<span id="2105">2105</span>
+<span id="2106">2106</span>
+<span id="2107">2107</span>
+<span id="2108">2108</span>
+<span id="2109">2109</span>
+<span id="2110">2110</span>
+<span id="2111">2111</span>
+<span id="2112">2112</span>
+<span id="2113">2113</span>
+<span id="2114">2114</span>
+<span id="2115">2115</span>
+<span id="2116">2116</span>
+<span id="2117">2117</span>
+<span id="2118">2118</span>
+<span id="2119">2119</span>
+<span id="2120">2120</span>
+<span id="2121">2121</span>
+<span id="2122">2122</span>
+<span id="2123">2123</span>
+<span id="2124">2124</span>
+<span id="2125">2125</span>
+<span id="2126">2126</span>
+<span id="2127">2127</span>
+<span id="2128">2128</span>
+<span id="2129">2129</span>
+<span id="2130">2130</span>
+<span id="2131">2131</span>
+<span id="2132">2132</span>
+<span id="2133">2133</span>
+<span id="2134">2134</span>
+<span id="2135">2135</span>
+<span id="2136">2136</span>
+<span id="2137">2137</span>
+<span id="2138">2138</span>
+<span id="2139">2139</span>
+<span id="2140">2140</span>
+<span id="2141">2141</span>
+<span id="2142">2142</span>
+<span id="2143">2143</span>
+<span id="2144">2144</span>
+<span id="2145">2145</span>
+<span id="2146">2146</span>
+<span id="2147">2147</span>
+<span id="2148">2148</span>
+<span id="2149">2149</span>
+<span id="2150">2150</span>
+<span id="2151">2151</span>
+<span id="2152">2152</span>
+<span id="2153">2153</span>
+<span id="2154">2154</span>
+<span id="2155">2155</span>
+<span id="2156">2156</span>
+<span id="2157">2157</span>
+<span id="2158">2158</span>
+<span id="2159">2159</span>
+<span id="2160">2160</span>
+<span id="2161">2161</span>
+<span id="2162">2162</span>
+<span id="2163">2163</span>
+<span id="2164">2164</span>
+<span id="2165">2165</span>
+<span id="2166">2166</span>
+<span id="2167">2167</span>
+<span id="2168">2168</span>
+<span id="2169">2169</span>
+<span id="2170">2170</span>
+<span id="2171">2171</span>
+<span id="2172">2172</span>
+<span id="2173">2173</span>
+<span id="2174">2174</span>
+<span id="2175">2175</span>
+<span id="2176">2176</span>
+<span id="2177">2177</span>
+<span id="2178">2178</span>
+<span id="2179">2179</span>
+<span id="2180">2180</span>
+<span id="2181">2181</span>
+<span id="2182">2182</span>
+<span id="2183">2183</span>
+<span id="2184">2184</span>
+<span id="2185">2185</span>
+<span id="2186">2186</span>
+<span id="2187">2187</span>
+<span id="2188">2188</span>
+<span id="2189">2189</span>
+<span id="2190">2190</span>
+<span id="2191">2191</span>
+<span id="2192">2192</span>
+<span id="2193">2193</span>
+<span id="2194">2194</span>
+<span id="2195">2195</span>
+<span id="2196">2196</span>
+<span id="2197">2197</span>
+<span id="2198">2198</span>
+<span id="2199">2199</span>
+<span id="2200">2200</span>
+<span id="2201">2201</span>
+<span id="2202">2202</span>
+<span id="2203">2203</span>
+<span id="2204">2204</span>
+<span id="2205">2205</span>
+<span id="2206">2206</span>
+<span id="2207">2207</span>
+<span id="2208">2208</span>
+<span id="2209">2209</span>
+<span id="2210">2210</span>
+<span id="2211">2211</span>
+<span id="2212">2212</span>
+<span id="2213">2213</span>
+<span id="2214">2214</span>
+<span id="2215">2215</span>
+<span id="2216">2216</span>
+<span id="2217">2217</span>
+<span id="2218">2218</span>
+<span id="2219">2219</span>
+<span id="2220">2220</span>
+<span id="2221">2221</span>
+<span id="2222">2222</span>
+<span id="2223">2223</span>
+<span id="2224">2224</span>
+<span id="2225">2225</span>
+<span id="2226">2226</span>
+<span id="2227">2227</span>
+<span id="2228">2228</span>
+<span id="2229">2229</span>
+<span id="2230">2230</span>
+<span id="2231">2231</span>
+<span id="2232">2232</span>
+<span id="2233">2233</span>
+<span id="2234">2234</span>
+<span id="2235">2235</span>
+<span id="2236">2236</span>
+<span id="2237">2237</span>
+<span id="2238">2238</span>
+<span id="2239">2239</span>
+<span id="2240">2240</span>
+<span id="2241">2241</span>
+<span id="2242">2242</span>
+<span id="2243">2243</span>
+<span id="2244">2244</span>
+<span id="2245">2245</span>
+<span id="2246">2246</span>
+<span id="2247">2247</span>
+<span id="2248">2248</span>
+<span id="2249">2249</span>
+<span id="2250">2250</span>
+<span id="2251">2251</span>
+<span id="2252">2252</span>
+<span id="2253">2253</span>
+<span id="2254">2254</span>
+<span id="2255">2255</span>
+<span id="2256">2256</span>
+<span id="2257">2257</span>
+<span id="2258">2258</span>
+<span id="2259">2259</span>
+<span id="2260">2260</span>
+<span id="2261">2261</span>
+<span id="2262">2262</span>
+<span id="2263">2263</span>
+<span id="2264">2264</span>
+<span id="2265">2265</span>
+<span id="2266">2266</span>
+<span id="2267">2267</span>
+<span id="2268">2268</span>
+<span id="2269">2269</span>
+<span id="2270">2270</span>
+<span id="2271">2271</span>
+<span id="2272">2272</span>
+<span id="2273">2273</span>
+<span id="2274">2274</span>
+<span id="2275">2275</span>
+<span id="2276">2276</span>
+<span id="2277">2277</span>
+<span id="2278">2278</span>
+<span id="2279">2279</span>
+<span id="2280">2280</span>
+<span id="2281">2281</span>
+<span id="2282">2282</span>
+<span id="2283">2283</span>
+<span id="2284">2284</span>
+<span id="2285">2285</span>
+<span id="2286">2286</span>
+<span id="2287">2287</span>
+<span id="2288">2288</span>
+<span id="2289">2289</span>
+<span id="2290">2290</span>
+<span id="2291">2291</span>
+<span id="2292">2292</span>
+<span id="2293">2293</span>
+<span id="2294">2294</span>
+<span id="2295">2295</span>
+<span id="2296">2296</span>
+<span id="2297">2297</span>
+<span id="2298">2298</span>
+<span id="2299">2299</span>
+<span id="2300">2300</span>
+<span id="2301">2301</span>
+<span id="2302">2302</span>
+<span id="2303">2303</span>
+<span id="2304">2304</span>
+<span id="2305">2305</span>
+<span id="2306">2306</span>
+<span id="2307">2307</span>
+<span id="2308">2308</span>
+<span id="2309">2309</span>
+<span id="2310">2310</span>
+<span id="2311">2311</span>
+<span id="2312">2312</span>
+<span id="2313">2313</span>
+<span id="2314">2314</span>
+<span id="2315">2315</span>
+<span id="2316">2316</span>
+<span id="2317">2317</span>
+<span id="2318">2318</span>
+<span id="2319">2319</span>
+<span id="2320">2320</span>
+<span id="2321">2321</span>
+<span id="2322">2322</span>
+<span id="2323">2323</span>
+<span id="2324">2324</span>
+<span id="2325">2325</span>
+<span id="2326">2326</span>
+<span id="2327">2327</span>
+<span id="2328">2328</span>
+<span id="2329">2329</span>
+<span id="2330">2330</span>
+<span id="2331">2331</span>
+<span id="2332">2332</span>
+<span id="2333">2333</span>
+<span id="2334">2334</span>
+<span id="2335">2335</span>
+<span id="2336">2336</span>
+<span id="2337">2337</span>
+<span id="2338">2338</span>
+<span id="2339">2339</span>
+<span id="2340">2340</span>
+<span id="2341">2341</span>
+<span id="2342">2342</span>
+<span id="2343">2343</span>
+<span id="2344">2344</span>
+<span id="2345">2345</span>
+<span id="2346">2346</span>
+<span id="2347">2347</span>
+<span id="2348">2348</span>
+<span id="2349">2349</span>
+<span id="2350">2350</span>
+<span id="2351">2351</span>
+<span id="2352">2352</span>
+<span id="2353">2353</span>
+<span id="2354">2354</span>
+<span id="2355">2355</span>
+<span id="2356">2356</span>
+<span id="2357">2357</span>
+<span id="2358">2358</span>
+<span id="2359">2359</span>
+<span id="2360">2360</span>
+<span id="2361">2361</span>
+<span id="2362">2362</span>
+<span id="2363">2363</span>
+<span id="2364">2364</span>
+<span id="2365">2365</span>
+<span id="2366">2366</span>
+<span id="2367">2367</span>
+<span id="2368">2368</span>
+<span id="2369">2369</span>
+<span id="2370">2370</span>
+<span id="2371">2371</span>
+<span id="2372">2372</span>
+<span id="2373">2373</span>
+<span id="2374">2374</span>
+<span id="2375">2375</span>
+<span id="2376">2376</span>
+<span id="2377">2377</span>
+<span id="2378">2378</span>
+<span id="2379">2379</span>
+<span id="2380">2380</span>
+<span id="2381">2381</span>
+<span id="2382">2382</span>
+<span id="2383">2383</span>
+<span id="2384">2384</span>
+<span id="2385">2385</span>
+<span id="2386">2386</span>
+<span id="2387">2387</span>
+<span id="2388">2388</span>
+<span id="2389">2389</span>
+<span id="2390">2390</span>
+<span id="2391">2391</span>
+<span id="2392">2392</span>
+<span id="2393">2393</span>
+<span id="2394">2394</span>
+<span id="2395">2395</span>
+<span id="2396">2396</span>
+<span id="2397">2397</span>
+<span id="2398">2398</span>
+<span id="2399">2399</span>
+<span id="2400">2400</span>
+<span id="2401">2401</span>
+<span id="2402">2402</span>
+<span id="2403">2403</span>
+<span id="2404">2404</span>
+<span id="2405">2405</span>
+<span id="2406">2406</span>
+<span id="2407">2407</span>
+<span id="2408">2408</span>
+<span id="2409">2409</span>
+<span id="2410">2410</span>
+<span id="2411">2411</span>
+<span id="2412">2412</span>
+<span id="2413">2413</span>
+<span id="2414">2414</span>
+<span id="2415">2415</span>
+<span id="2416">2416</span>
+<span id="2417">2417</span>
+<span id="2418">2418</span>
+<span id="2419">2419</span>
+<span id="2420">2420</span>
+<span id="2421">2421</span>
+<span id="2422">2422</span>
+<span id="2423">2423</span>
+<span id="2424">2424</span>
+<span id="2425">2425</span>
+<span id="2426">2426</span>
+<span id="2427">2427</span>
+<span id="2428">2428</span>
+<span id="2429">2429</span>
+<span id="2430">2430</span>
+<span id="2431">2431</span>
+<span id="2432">2432</span>
+<span id="2433">2433</span>
+<span id="2434">2434</span>
+<span id="2435">2435</span>
+<span id="2436">2436</span>
+<span id="2437">2437</span>
+<span id="2438">2438</span>
+<span id="2439">2439</span>
+<span id="2440">2440</span>
+<span id="2441">2441</span>
+<span id="2442">2442</span>
+<span id="2443">2443</span>
+<span id="2444">2444</span>
+<span id="2445">2445</span>
+<span id="2446">2446</span>
+<span id="2447">2447</span>
+<span id="2448">2448</span>
+<span id="2449">2449</span>
+<span id="2450">2450</span>
+<span id="2451">2451</span>
+<span id="2452">2452</span>
+<span id="2453">2453</span>
+<span id="2454">2454</span>
+<span id="2455">2455</span>
+<span id="2456">2456</span>
+<span id="2457">2457</span>
+<span id="2458">2458</span>
+<span id="2459">2459</span>
+<span id="2460">2460</span>
+<span id="2461">2461</span>
+<span id="2462">2462</span>
+<span id="2463">2463</span>
+<span id="2464">2464</span>
+<span id="2465">2465</span>
+<span id="2466">2466</span>
+<span id="2467">2467</span>
+<span id="2468">2468</span>
+<span id="2469">2469</span>
+<span id="2470">2470</span>
+<span id="2471">2471</span>
+<span id="2472">2472</span>
+<span id="2473">2473</span>
+<span id="2474">2474</span>
+<span id="2475">2475</span>
+<span id="2476">2476</span>
+<span id="2477">2477</span>
+<span id="2478">2478</span>
+<span id="2479">2479</span>
+<span id="2480">2480</span>
+<span id="2481">2481</span>
+<span id="2482">2482</span>
+<span id="2483">2483</span>
+<span id="2484">2484</span>
+<span id="2485">2485</span>
+<span id="2486">2486</span>
+<span id="2487">2487</span>
+<span id="2488">2488</span>
+<span id="2489">2489</span>
+<span id="2490">2490</span>
+<span id="2491">2491</span>
+<span id="2492">2492</span>
+<span id="2493">2493</span>
+<span id="2494">2494</span>
+<span id="2495">2495</span>
+<span id="2496">2496</span>
+<span id="2497">2497</span>
+<span id="2498">2498</span>
+<span id="2499">2499</span>
+<span id="2500">2500</span>
+<span id="2501">2501</span>
+<span id="2502">2502</span>
+<span id="2503">2503</span>
+<span id="2504">2504</span>
+<span id="2505">2505</span>
+<span id="2506">2506</span>
+<span id="2507">2507</span>
+<span id="2508">2508</span>
+<span id="2509">2509</span>
+<span id="2510">2510</span>
+<span id="2511">2511</span>
+<span id="2512">2512</span>
+<span id="2513">2513</span>
+<span id="2514">2514</span>
+<span id="2515">2515</span>
+<span id="2516">2516</span>
+<span id="2517">2517</span>
+<span id="2518">2518</span>
+<span id="2519">2519</span>
+<span id="2520">2520</span>
+<span id="2521">2521</span>
+<span id="2522">2522</span>
+<span id="2523">2523</span>
+<span id="2524">2524</span>
+<span id="2525">2525</span>
+<span id="2526">2526</span>
+<span id="2527">2527</span>
+<span id="2528">2528</span>
+<span id="2529">2529</span>
+<span id="2530">2530</span>
+<span id="2531">2531</span>
+<span id="2532">2532</span>
+<span id="2533">2533</span>
+<span id="2534">2534</span>
+<span id="2535">2535</span>
+<span id="2536">2536</span>
+<span id="2537">2537</span>
+<span id="2538">2538</span>
+<span id="2539">2539</span>
+<span id="2540">2540</span>
+<span id="2541">2541</span>
+<span id="2542">2542</span>
+<span id="2543">2543</span>
+<span id="2544">2544</span>
+<span id="2545">2545</span>
+<span id="2546">2546</span>
+<span id="2547">2547</span>
+<span id="2548">2548</span>
+<span id="2549">2549</span>
+<span id="2550">2550</span>
+<span id="2551">2551</span>
+<span id="2552">2552</span>
+<span id="2553">2553</span>
+<span id="2554">2554</span>
+<span id="2555">2555</span>
+<span id="2556">2556</span>
+<span id="2557">2557</span>
+<span id="2558">2558</span>
+<span id="2559">2559</span>
+<span id="2560">2560</span>
+<span id="2561">2561</span>
+<span id="2562">2562</span>
+<span id="2563">2563</span>
+<span id="2564">2564</span>
+<span id="2565">2565</span>
+<span id="2566">2566</span>
+<span id="2567">2567</span>
+<span id="2568">2568</span>
+<span id="2569">2569</span>
+<span id="2570">2570</span>
+<span id="2571">2571</span>
+<span id="2572">2572</span>
+<span id="2573">2573</span>
+<span id="2574">2574</span>
+<span id="2575">2575</span>
+<span id="2576">2576</span>
+<span id="2577">2577</span>
+<span id="2578">2578</span>
+<span id="2579">2579</span>
+<span id="2580">2580</span>
+<span id="2581">2581</span>
+<span id="2582">2582</span>
+<span id="2583">2583</span>
+<span id="2584">2584</span>
+<span id="2585">2585</span>
+<span id="2586">2586</span>
+<span id="2587">2587</span>
+<span id="2588">2588</span>
+<span id="2589">2589</span>
+<span id="2590">2590</span>
+<span id="2591">2591</span>
+<span id="2592">2592</span>
+<span id="2593">2593</span>
+<span id="2594">2594</span>
+<span id="2595">2595</span>
+<span id="2596">2596</span>
+<span id="2597">2597</span>
+<span id="2598">2598</span>
+<span id="2599">2599</span>
+<span id="2600">2600</span>
+<span id="2601">2601</span>
+<span id="2602">2602</span>
+<span id="2603">2603</span>
+<span id="2604">2604</span>
+<span id="2605">2605</span>
+<span id="2606">2606</span>
+<span id="2607">2607</span>
+<span id="2608">2608</span>
+<span id="2609">2609</span>
+<span id="2610">2610</span>
+<span id="2611">2611</span>
+<span id="2612">2612</span>
+<span id="2613">2613</span>
+<span id="2614">2614</span>
+<span id="2615">2615</span>
+<span id="2616">2616</span>
+<span id="2617">2617</span>
+<span id="2618">2618</span>
+<span id="2619">2619</span>
+<span id="2620">2620</span>
+<span id="2621">2621</span>
+<span id="2622">2622</span>
+<span id="2623">2623</span>
+<span id="2624">2624</span>
+<span id="2625">2625</span>
+<span id="2626">2626</span>
+<span id="2627">2627</span>
+<span id="2628">2628</span>
+<span id="2629">2629</span>
+<span id="2630">2630</span>
+<span id="2631">2631</span>
+<span id="2632">2632</span>
+<span id="2633">2633</span>
+<span id="2634">2634</span>
+<span id="2635">2635</span>
+<span id="2636">2636</span>
+<span id="2637">2637</span>
+<span id="2638">2638</span>
+<span id="2639">2639</span>
+<span id="2640">2640</span>
+<span id="2641">2641</span>
+<span id="2642">2642</span>
+<span id="2643">2643</span>
+<span id="2644">2644</span>
+<span id="2645">2645</span>
+<span id="2646">2646</span>
+<span id="2647">2647</span>
+<span id="2648">2648</span>
+<span id="2649">2649</span>
+<span id="2650">2650</span>
+<span id="2651">2651</span>
+<span id="2652">2652</span>
+<span id="2653">2653</span>
+<span id="2654">2654</span>
+<span id="2655">2655</span>
+<span id="2656">2656</span>
+<span id="2657">2657</span>
+<span id="2658">2658</span>
+<span id="2659">2659</span>
+<span id="2660">2660</span>
+<span id="2661">2661</span>
+<span id="2662">2662</span>
+<span id="2663">2663</span>
+<span id="2664">2664</span>
+<span id="2665">2665</span>
+<span id="2666">2666</span>
+<span id="2667">2667</span>
+<span id="2668">2668</span>
+<span id="2669">2669</span>
+<span id="2670">2670</span>
+<span id="2671">2671</span>
+<span id="2672">2672</span>
+<span id="2673">2673</span>
+<span id="2674">2674</span>
+<span id="2675">2675</span>
+<span id="2676">2676</span>
+<span id="2677">2677</span>
+<span id="2678">2678</span>
+<span id="2679">2679</span>
+<span id="2680">2680</span>
+<span id="2681">2681</span>
+<span id="2682">2682</span>
+<span id="2683">2683</span>
+<span id="2684">2684</span>
+<span id="2685">2685</span>
+<span id="2686">2686</span>
+<span id="2687">2687</span>
+<span id="2688">2688</span>
+<span id="2689">2689</span>
+<span id="2690">2690</span>
+<span id="2691">2691</span>
+<span id="2692">2692</span>
+<span id="2693">2693</span>
+<span id="2694">2694</span>
+<span id="2695">2695</span>
+<span id="2696">2696</span>
+<span id="2697">2697</span>
+<span id="2698">2698</span>
+<span id="2699">2699</span>
+<span id="2700">2700</span>
+<span id="2701">2701</span>
+<span id="2702">2702</span>
+<span id="2703">2703</span>
+<span id="2704">2704</span>
+<span id="2705">2705</span>
+<span id="2706">2706</span>
+<span id="2707">2707</span>
+<span id="2708">2708</span>
+<span id="2709">2709</span>
+<span id="2710">2710</span>
+<span id="2711">2711</span>
+<span id="2712">2712</span>
+<span id="2713">2713</span>
+<span id="2714">2714</span>
+<span id="2715">2715</span>
+<span id="2716">2716</span>
+<span id="2717">2717</span>
+<span id="2718">2718</span>
+<span id="2719">2719</span>
+<span id="2720">2720</span>
+<span id="2721">2721</span>
+<span id="2722">2722</span>
+<span id="2723">2723</span>
+<span id="2724">2724</span>
+<span id="2725">2725</span>
+<span id="2726">2726</span>
+<span id="2727">2727</span>
+<span id="2728">2728</span>
+<span id="2729">2729</span>
+<span id="2730">2730</span>
+<span id="2731">2731</span>
+<span id="2732">2732</span>
+<span id="2733">2733</span>
+<span id="2734">2734</span>
+<span id="2735">2735</span>
+<span id="2736">2736</span>
+<span id="2737">2737</span>
+<span id="2738">2738</span>
+<span id="2739">2739</span>
+<span id="2740">2740</span>
+<span id="2741">2741</span>
+<span id="2742">2742</span>
+<span id="2743">2743</span>
+<span id="2744">2744</span>
+<span id="2745">2745</span>
+<span id="2746">2746</span>
+<span id="2747">2747</span>
+<span id="2748">2748</span>
+<span id="2749">2749</span>
+<span id="2750">2750</span>
+<span id="2751">2751</span>
+<span id="2752">2752</span>
+<span id="2753">2753</span>
+<span id="2754">2754</span>
+<span id="2755">2755</span>
+<span id="2756">2756</span>
+<span id="2757">2757</span>
+<span id="2758">2758</span>
+<span id="2759">2759</span>
+<span id="2760">2760</span>
+<span id="2761">2761</span>
+<span id="2762">2762</span>
+<span id="2763">2763</span>
+<span id="2764">2764</span>
+<span id="2765">2765</span>
+<span id="2766">2766</span>
+<span id="2767">2767</span>
+<span id="2768">2768</span>
+<span id="2769">2769</span>
+<span id="2770">2770</span>
+<span id="2771">2771</span>
+<span id="2772">2772</span>
+<span id="2773">2773</span>
+<span id="2774">2774</span>
+<span id="2775">2775</span>
+<span id="2776">2776</span>
+<span id="2777">2777</span>
+<span id="2778">2778</span>
+<span id="2779">2779</span>
+<span id="2780">2780</span>
+<span id="2781">2781</span>
+<span id="2782">2782</span>
+<span id="2783">2783</span>
+<span id="2784">2784</span>
+<span id="2785">2785</span>
+<span id="2786">2786</span>
+<span id="2787">2787</span>
+<span id="2788">2788</span>
+<span id="2789">2789</span>
+<span id="2790">2790</span>
+<span id="2791">2791</span>
+<span id="2792">2792</span>
+<span id="2793">2793</span>
+<span id="2794">2794</span>
+<span id="2795">2795</span>
+<span id="2796">2796</span>
+<span id="2797">2797</span>
+<span id="2798">2798</span>
+<span id="2799">2799</span>
+<span id="2800">2800</span>
+<span id="2801">2801</span>
+<span id="2802">2802</span>
+<span id="2803">2803</span>
+<span id="2804">2804</span>
+<span id="2805">2805</span>
+<span id="2806">2806</span>
+<span id="2807">2807</span>
+<span id="2808">2808</span>
+<span id="2809">2809</span>
+<span id="2810">2810</span>
+<span id="2811">2811</span>
+<span id="2812">2812</span>
+<span id="2813">2813</span>
+<span id="2814">2814</span>
+<span id="2815">2815</span>
+<span id="2816">2816</span>
+<span id="2817">2817</span>
+<span id="2818">2818</span>
+<span id="2819">2819</span>
+<span id="2820">2820</span>
+<span id="2821">2821</span>
+<span id="2822">2822</span>
+<span id="2823">2823</span>
+<span id="2824">2824</span>
+<span id="2825">2825</span>
+<span id="2826">2826</span>
+<span id="2827">2827</span>
+<span id="2828">2828</span>
+<span id="2829">2829</span>
+<span id="2830">2830</span>
+<span id="2831">2831</span>
+<span id="2832">2832</span>
+<span id="2833">2833</span>
+<span id="2834">2834</span>
+<span id="2835">2835</span>
+<span id="2836">2836</span>
+<span id="2837">2837</span>
+<span id="2838">2838</span>
+<span id="2839">2839</span>
+<span id="2840">2840</span>
+<span id="2841">2841</span>
+<span id="2842">2842</span>
+<span id="2843">2843</span>
+<span id="2844">2844</span>
+<span id="2845">2845</span>
+<span id="2846">2846</span>
+<span id="2847">2847</span>
+<span id="2848">2848</span>
+<span id="2849">2849</span>
+<span id="2850">2850</span>
+<span id="2851">2851</span>
+<span id="2852">2852</span>
+<span id="2853">2853</span>
+<span id="2854">2854</span>
+<span id="2855">2855</span>
+<span id="2856">2856</span>
+<span id="2857">2857</span>
+<span id="2858">2858</span>
+<span id="2859">2859</span>
+<span id="2860">2860</span>
+<span id="2861">2861</span>
+<span id="2862">2862</span>
+<span id="2863">2863</span>
+<span id="2864">2864</span>
+<span id="2865">2865</span>
+<span id="2866">2866</span>
+<span id="2867">2867</span>
+<span id="2868">2868</span>
+<span id="2869">2869</span>
+<span id="2870">2870</span>
+<span id="2871">2871</span>
+<span id="2872">2872</span>
+<span id="2873">2873</span>
+<span id="2874">2874</span>
+<span id="2875">2875</span>
+<span id="2876">2876</span>
+<span id="2877">2877</span>
+<span id="2878">2878</span>
+<span id="2879">2879</span>
+<span id="2880">2880</span>
+<span id="2881">2881</span>
+<span id="2882">2882</span>
+<span id="2883">2883</span>
+<span id="2884">2884</span>
+<span id="2885">2885</span>
+<span id="2886">2886</span>
+<span id="2887">2887</span>
+<span id="2888">2888</span>
+<span id="2889">2889</span>
+<span id="2890">2890</span>
+<span id="2891">2891</span>
+<span id="2892">2892</span>
+<span id="2893">2893</span>
+<span id="2894">2894</span>
+<span id="2895">2895</span>
+<span id="2896">2896</span>
+<span id="2897">2897</span>
+<span id="2898">2898</span>
+<span id="2899">2899</span>
+<span id="2900">2900</span>
+<span id="2901">2901</span>
+<span id="2902">2902</span>
+<span id="2903">2903</span>
+<span id="2904">2904</span>
+<span id="2905">2905</span>
+<span id="2906">2906</span>
+<span id="2907">2907</span>
+<span id="2908">2908</span>
+<span id="2909">2909</span>
+<span id="2910">2910</span>
+<span id="2911">2911</span>
+<span id="2912">2912</span>
+<span id="2913">2913</span>
+<span id="2914">2914</span>
+<span id="2915">2915</span>
+<span id="2916">2916</span>
+<span id="2917">2917</span>
+<span id="2918">2918</span>
+<span id="2919">2919</span>
+<span id="2920">2920</span>
+<span id="2921">2921</span>
+<span id="2922">2922</span>
+<span id="2923">2923</span>
+<span id="2924">2924</span>
+<span id="2925">2925</span>
+<span id="2926">2926</span>
+<span id="2927">2927</span>
+<span id="2928">2928</span>
+<span id="2929">2929</span>
+<span id="2930">2930</span>
+<span id="2931">2931</span>
+<span id="2932">2932</span>
+<span id="2933">2933</span>
+<span id="2934">2934</span>
+<span id="2935">2935</span>
+<span id="2936">2936</span>
+<span id="2937">2937</span>
+<span id="2938">2938</span>
+<span id="2939">2939</span>
+<span id="2940">2940</span>
+<span id="2941">2941</span>
+<span id="2942">2942</span>
+<span id="2943">2943</span>
+<span id="2944">2944</span>
+<span id="2945">2945</span>
+<span id="2946">2946</span>
+<span id="2947">2947</span>
+<span id="2948">2948</span>
+<span id="2949">2949</span>
+<span id="2950">2950</span>
+<span id="2951">2951</span>
+<span id="2952">2952</span>
+<span id="2953">2953</span>
+<span id="2954">2954</span>
+<span id="2955">2955</span>
+<span id="2956">2956</span>
+<span id="2957">2957</span>
+<span id="2958">2958</span>
+<span id="2959">2959</span>
+<span id="2960">2960</span>
+<span id="2961">2961</span>
+<span id="2962">2962</span>
+<span id="2963">2963</span>
+<span id="2964">2964</span>
+<span id="2965">2965</span>
+<span id="2966">2966</span>
+<span id="2967">2967</span>
+<span id="2968">2968</span>
+<span id="2969">2969</span>
+<span id="2970">2970</span>
+<span id="2971">2971</span>
+<span id="2972">2972</span>
+<span id="2973">2973</span>
+<span id="2974">2974</span>
+<span id="2975">2975</span>
+<span id="2976">2976</span>
+<span id="2977">2977</span>
+<span id="2978">2978</span>
+<span id="2979">2979</span>
+<span id="2980">2980</span>
+<span id="2981">2981</span>
+<span id="2982">2982</span>
+<span id="2983">2983</span>
+<span id="2984">2984</span>
+<span id="2985">2985</span>
+<span id="2986">2986</span>
+<span id="2987">2987</span>
+<span id="2988">2988</span>
+<span id="2989">2989</span>
+<span id="2990">2990</span>
+<span id="2991">2991</span>
+<span id="2992">2992</span>
+<span id="2993">2993</span>
+<span id="2994">2994</span>
+<span id="2995">2995</span>
+<span id="2996">2996</span>
+<span id="2997">2997</span>
+<span id="2998">2998</span>
+<span id="2999">2999</span>
+<span id="3000">3000</span>
+<span id="3001">3001</span>
+<span id="3002">3002</span>
+<span id="3003">3003</span>
+<span id="3004">3004</span>
+<span id="3005">3005</span>
+<span id="3006">3006</span>
+<span id="3007">3007</span>
+<span id="3008">3008</span>
+<span id="3009">3009</span>
+<span id="3010">3010</span>
+<span id="3011">3011</span>
+<span id="3012">3012</span>
+<span id="3013">3013</span>
+<span id="3014">3014</span>
+<span id="3015">3015</span>
+<span id="3016">3016</span>
+<span id="3017">3017</span>
+<span id="3018">3018</span>
+<span id="3019">3019</span>
+<span id="3020">3020</span>
+<span id="3021">3021</span>
+<span id="3022">3022</span>
+<span id="3023">3023</span>
+<span id="3024">3024</span>
+<span id="3025">3025</span>
+<span id="3026">3026</span>
+<span id="3027">3027</span>
+<span id="3028">3028</span>
+<span id="3029">3029</span>
+<span id="3030">3030</span>
+<span id="3031">3031</span>
+<span id="3032">3032</span>
+<span id="3033">3033</span>
+<span id="3034">3034</span>
+<span id="3035">3035</span>
+<span id="3036">3036</span>
+<span id="3037">3037</span>
+<span id="3038">3038</span>
+<span id="3039">3039</span>
+<span id="3040">3040</span>
+<span id="3041">3041</span>
+<span id="3042">3042</span>
+<span id="3043">3043</span>
+<span id="3044">3044</span>
+<span id="3045">3045</span>
+<span id="3046">3046</span>
+<span id="3047">3047</span>
+<span id="3048">3048</span>
+<span id="3049">3049</span>
+<span id="3050">3050</span>
+<span id="3051">3051</span>
+<span id="3052">3052</span>
+<span id="3053">3053</span>
+<span id="3054">3054</span>
+<span id="3055">3055</span>
+<span id="3056">3056</span>
+<span id="3057">3057</span>
+<span id="3058">3058</span>
+<span id="3059">3059</span>
+<span id="3060">3060</span>
+<span id="3061">3061</span>
+<span id="3062">3062</span>
+<span id="3063">3063</span>
+<span id="3064">3064</span>
+<span id="3065">3065</span>
+<span id="3066">3066</span>
+<span id="3067">3067</span>
+<span id="3068">3068</span>
+<span id="3069">3069</span>
+<span id="3070">3070</span>
+<span id="3071">3071</span>
+<span id="3072">3072</span>
+<span id="3073">3073</span>
+<span id="3074">3074</span>
+<span id="3075">3075</span>
+<span id="3076">3076</span>
+<span id="3077">3077</span>
+<span id="3078">3078</span>
+<span id="3079">3079</span>
+<span id="3080">3080</span>
+<span id="3081">3081</span>
+<span id="3082">3082</span>
+<span id="3083">3083</span>
+<span id="3084">3084</span>
+<span id="3085">3085</span>
+<span id="3086">3086</span>
+<span id="3087">3087</span>
+<span id="3088">3088</span>
+<span id="3089">3089</span>
+<span id="3090">3090</span>
+<span id="3091">3091</span>
+<span id="3092">3092</span>
+<span id="3093">3093</span>
+<span id="3094">3094</span>
+<span id="3095">3095</span>
+<span id="3096">3096</span>
+<span id="3097">3097</span>
+<span id="3098">3098</span>
+<span id="3099">3099</span>
+<span id="3100">3100</span>
+<span id="3101">3101</span>
+<span id="3102">3102</span>
+<span id="3103">3103</span>
+<span id="3104">3104</span>
+<span id="3105">3105</span>
+<span id="3106">3106</span>
+<span id="3107">3107</span>
+<span id="3108">3108</span>
+<span id="3109">3109</span>
+<span id="3110">3110</span>
+<span id="3111">3111</span>
+<span id="3112">3112</span>
+<span id="3113">3113</span>
+<span id="3114">3114</span>
+<span id="3115">3115</span>
+<span id="3116">3116</span>
+<span id="3117">3117</span>
+<span id="3118">3118</span>
+<span id="3119">3119</span>
+<span id="3120">3120</span>
+<span id="3121">3121</span>
+<span id="3122">3122</span>
+<span id="3123">3123</span>
+<span id="3124">3124</span>
+<span id="3125">3125</span>
+<span id="3126">3126</span>
+<span id="3127">3127</span>
+<span id="3128">3128</span>
+<span id="3129">3129</span>
+<span id="3130">3130</span>
+<span id="3131">3131</span>
+<span id="3132">3132</span>
+<span id="3133">3133</span>
+<span id="3134">3134</span>
+<span id="3135">3135</span>
+<span id="3136">3136</span>
+<span id="3137">3137</span>
+<span id="3138">3138</span>
+<span id="3139">3139</span>
+<span id="3140">3140</span>
+<span id="3141">3141</span>
+<span id="3142">3142</span>
+<span id="3143">3143</span>
+<span id="3144">3144</span>
+<span id="3145">3145</span>
+<span id="3146">3146</span>
+<span id="3147">3147</span>
+<span id="3148">3148</span>
+<span id="3149">3149</span>
+<span id="3150">3150</span>
+<span id="3151">3151</span>
+<span id="3152">3152</span>
+<span id="3153">3153</span>
+<span id="3154">3154</span>
+<span id="3155">3155</span>
+<span id="3156">3156</span>
+<span id="3157">3157</span>
+<span id="3158">3158</span>
+<span id="3159">3159</span>
+<span id="3160">3160</span>
+<span id="3161">3161</span>
+<span id="3162">3162</span>
+<span id="3163">3163</span>
+<span id="3164">3164</span>
+<span id="3165">3165</span>
+<span id="3166">3166</span>
+<span id="3167">3167</span>
+<span id="3168">3168</span>
+<span id="3169">3169</span>
+<span id="3170">3170</span>
+<span id="3171">3171</span>
+<span id="3172">3172</span>
+<span id="3173">3173</span>
+<span id="3174">3174</span>
+<span id="3175">3175</span>
+<span id="3176">3176</span>
+<span id="3177">3177</span>
+<span id="3178">3178</span>
+<span id="3179">3179</span>
+<span id="3180">3180</span>
+<span id="3181">3181</span>
+<span id="3182">3182</span>
+<span id="3183">3183</span>
+<span id="3184">3184</span>
+<span id="3185">3185</span>
+<span id="3186">3186</span>
+<span id="3187">3187</span>
+<span id="3188">3188</span>
+<span id="3189">3189</span>
+<span id="3190">3190</span>
+<span id="3191">3191</span>
+<span id="3192">3192</span>
+<span id="3193">3193</span>
+<span id="3194">3194</span>
+<span id="3195">3195</span>
+<span id="3196">3196</span>
+<span id="3197">3197</span>
+<span id="3198">3198</span>
+<span id="3199">3199</span>
+<span id="3200">3200</span>
+<span id="3201">3201</span>
+<span id="3202">3202</span>
+<span id="3203">3203</span>
+<span id="3204">3204</span>
+<span id="3205">3205</span>
+<span id="3206">3206</span>
+<span id="3207">3207</span>
+<span id="3208">3208</span>
+<span id="3209">3209</span>
+<span id="3210">3210</span>
+<span id="3211">3211</span>
+<span id="3212">3212</span>
+<span id="3213">3213</span>
+<span id="3214">3214</span>
+<span id="3215">3215</span>
+<span id="3216">3216</span>
+<span id="3217">3217</span>
+<span id="3218">3218</span>
+<span id="3219">3219</span>
+<span id="3220">3220</span>
+<span id="3221">3221</span>
+<span id="3222">3222</span>
+<span id="3223">3223</span>
+<span id="3224">3224</span>
+<span id="3225">3225</span>
+<span id="3226">3226</span>
+<span id="3227">3227</span>
+<span id="3228">3228</span>
+<span id="3229">3229</span>
+<span id="3230">3230</span>
+<span id="3231">3231</span>
+<span id="3232">3232</span>
+<span id="3233">3233</span>
+<span id="3234">3234</span>
+<span id="3235">3235</span>
+<span id="3236">3236</span>
+<span id="3237">3237</span>
+<span id="3238">3238</span>
+<span id="3239">3239</span>
+<span id="3240">3240</span>
+<span id="3241">3241</span>
+<span id="3242">3242</span>
+<span id="3243">3243</span>
+<span id="3244">3244</span>
+<span id="3245">3245</span>
+<span id="3246">3246</span>
+<span id="3247">3247</span>
+<span id="3248">3248</span>
+<span id="3249">3249</span>
+<span id="3250">3250</span>
+<span id="3251">3251</span>
+<span id="3252">3252</span>
+<span id="3253">3253</span>
+<span id="3254">3254</span>
+<span id="3255">3255</span>
+<span id="3256">3256</span>
+<span id="3257">3257</span>
+<span id="3258">3258</span>
+<span id="3259">3259</span>
+<span id="3260">3260</span>
+<span id="3261">3261</span>
+<span id="3262">3262</span>
+<span id="3263">3263</span>
+<span id="3264">3264</span>
+<span id="3265">3265</span>
+<span id="3266">3266</span>
+<span id="3267">3267</span>
+<span id="3268">3268</span>
+<span id="3269">3269</span>
+<span id="3270">3270</span>
+<span id="3271">3271</span>
+<span id="3272">3272</span>
+<span id="3273">3273</span>
+<span id="3274">3274</span>
+<span id="3275">3275</span>
+<span id="3276">3276</span>
+<span id="3277">3277</span>
+<span id="3278">3278</span>
+<span id="3279">3279</span>
+<span id="3280">3280</span>
+<span id="3281">3281</span>
+<span id="3282">3282</span>
+<span id="3283">3283</span>
+<span id="3284">3284</span>
+<span id="3285">3285</span>
+<span id="3286">3286</span>
+<span id="3287">3287</span>
+<span id="3288">3288</span>
+<span id="3289">3289</span>
+<span id="3290">3290</span>
+<span id="3291">3291</span>
+<span id="3292">3292</span>
+<span id="3293">3293</span>
+<span id="3294">3294</span>
+<span id="3295">3295</span>
+<span id="3296">3296</span>
+<span id="3297">3297</span>
+<span id="3298">3298</span>
+<span id="3299">3299</span>
+<span id="3300">3300</span>
+<span id="3301">3301</span>
+<span id="3302">3302</span>
+<span id="3303">3303</span>
+<span id="3304">3304</span>
+<span id="3305">3305</span>
+<span id="3306">3306</span>
+<span id="3307">3307</span>
+<span id="3308">3308</span>
+<span id="3309">3309</span>
+<span id="3310">3310</span>
+<span id="3311">3311</span>
+<span id="3312">3312</span>
+<span id="3313">3313</span>
+<span id="3314">3314</span>
+<span id="3315">3315</span>
+<span id="3316">3316</span>
+<span id="3317">3317</span>
+<span id="3318">3318</span>
+<span id="3319">3319</span>
+<span id="3320">3320</span>
+<span id="3321">3321</span>
+<span id="3322">3322</span>
+<span id="3323">3323</span>
+<span id="3324">3324</span>
+<span id="3325">3325</span>
+<span id="3326">3326</span>
+<span id="3327">3327</span>
+<span id="3328">3328</span>
+<span id="3329">3329</span>
+<span id="3330">3330</span>
+<span id="3331">3331</span>
+<span id="3332">3332</span>
+<span id="3333">3333</span>
+<span id="3334">3334</span>
+<span id="3335">3335</span>
+<span id="3336">3336</span>
+<span id="3337">3337</span>
+<span id="3338">3338</span>
+<span id="3339">3339</span>
+<span id="3340">3340</span>
+<span id="3341">3341</span>
+<span id="3342">3342</span>
+<span id="3343">3343</span>
+<span id="3344">3344</span>
+<span id="3345">3345</span>
+<span id="3346">3346</span>
+<span id="3347">3347</span>
+<span id="3348">3348</span>
+<span id="3349">3349</span>
+<span id="3350">3350</span>
+<span id="3351">3351</span>
+<span id="3352">3352</span>
+<span id="3353">3353</span>
+<span id="3354">3354</span>
+<span id="3355">3355</span>
+<span id="3356">3356</span>
+<span id="3357">3357</span>
+<span id="3358">3358</span>
+<span id="3359">3359</span>
+<span id="3360">3360</span>
+<span id="3361">3361</span>
+<span id="3362">3362</span>
+<span id="3363">3363</span>
+<span id="3364">3364</span>
+<span id="3365">3365</span>
+<span id="3366">3366</span>
+<span id="3367">3367</span>
+<span id="3368">3368</span>
+<span id="3369">3369</span>
+<span id="3370">3370</span>
+<span id="3371">3371</span>
+<span id="3372">3372</span>
+<span id="3373">3373</span>
+<span id="3374">3374</span>
+<span id="3375">3375</span>
+<span id="3376">3376</span>
+<span id="3377">3377</span>
+<span id="3378">3378</span>
+<span id="3379">3379</span>
+<span id="3380">3380</span>
+<span id="3381">3381</span>
+<span id="3382">3382</span>
+<span id="3383">3383</span>
+<span id="3384">3384</span>
+<span id="3385">3385</span>
+<span id="3386">3386</span>
+<span id="3387">3387</span>
+<span id="3388">3388</span>
+<span id="3389">3389</span>
+<span id="3390">3390</span>
+<span id="3391">3391</span>
+<span id="3392">3392</span>
+<span id="3393">3393</span>
+<span id="3394">3394</span>
+<span id="3395">3395</span>
+<span id="3396">3396</span>
+<span id="3397">3397</span>
+<span id="3398">3398</span>
+<span id="3399">3399</span>
+<span id="3400">3400</span>
+<span id="3401">3401</span>
+<span id="3402">3402</span>
+<span id="3403">3403</span>
+<span id="3404">3404</span>
+<span id="3405">3405</span>
+<span id="3406">3406</span>
+<span id="3407">3407</span>
+<span id="3408">3408</span>
+<span id="3409">3409</span>
+<span id="3410">3410</span>
+<span id="3411">3411</span>
+<span id="3412">3412</span>
+<span id="3413">3413</span>
+<span id="3414">3414</span>
+<span id="3415">3415</span>
+<span id="3416">3416</span>
+<span id="3417">3417</span>
+<span id="3418">3418</span>
+<span id="3419">3419</span>
+<span id="3420">3420</span>
+<span id="3421">3421</span>
+<span id="3422">3422</span>
+<span id="3423">3423</span>
+<span id="3424">3424</span>
+<span id="3425">3425</span>
+<span id="3426">3426</span>
+<span id="3427">3427</span>
+<span id="3428">3428</span>
+<span id="3429">3429</span>
+<span id="3430">3430</span>
+<span id="3431">3431</span>
+<span id="3432">3432</span>
+<span id="3433">3433</span>
+<span id="3434">3434</span>
+<span id="3435">3435</span>
+<span id="3436">3436</span>
+<span id="3437">3437</span>
+<span id="3438">3438</span>
+<span id="3439">3439</span>
+<span id="3440">3440</span>
+<span id="3441">3441</span>
+<span id="3442">3442</span>
+<span id="3443">3443</span>
+<span id="3444">3444</span>
+<span id="3445">3445</span>
+<span id="3446">3446</span>
+<span id="3447">3447</span>
+<span id="3448">3448</span>
+<span id="3449">3449</span>
+<span id="3450">3450</span>
+<span id="3451">3451</span>
+<span id="3452">3452</span>
+<span id="3453">3453</span>
+<span id="3454">3454</span>
+<span id="3455">3455</span>
+<span id="3456">3456</span>
+<span id="3457">3457</span>
+<span id="3458">3458</span>
+<span id="3459">3459</span>
+<span id="3460">3460</span>
+<span id="3461">3461</span>
+<span id="3462">3462</span>
+<span id="3463">3463</span>
+<span id="3464">3464</span>
+<span id="3465">3465</span>
+<span id="3466">3466</span>
+<span id="3467">3467</span>
+<span id="3468">3468</span>
+<span id="3469">3469</span>
+<span id="3470">3470</span>
+<span id="3471">3471</span>
+<span id="3472">3472</span>
+<span id="3473">3473</span>
+<span id="3474">3474</span>
+<span id="3475">3475</span>
+<span id="3476">3476</span>
+<span id="3477">3477</span>
+<span id="3478">3478</span>
+<span id="3479">3479</span>
+<span id="3480">3480</span>
+<span id="3481">3481</span>
+<span id="3482">3482</span>
+<span id="3483">3483</span>
+<span id="3484">3484</span>
+<span id="3485">3485</span>
+<span id="3486">3486</span>
+<span id="3487">3487</span>
+<span id="3488">3488</span>
+<span id="3489">3489</span>
+<span id="3490">3490</span>
+<span id="3491">3491</span>
+<span id="3492">3492</span>
+<span id="3493">3493</span>
+<span id="3494">3494</span>
+<span id="3495">3495</span>
+<span id="3496">3496</span>
+<span id="3497">3497</span>
+<span id="3498">3498</span>
+<span id="3499">3499</span>
+<span id="3500">3500</span>
+<span id="3501">3501</span>
+<span id="3502">3502</span>
+<span id="3503">3503</span>
+<span id="3504">3504</span>
+<span id="3505">3505</span>
+<span id="3506">3506</span>
+<span id="3507">3507</span>
+<span id="3508">3508</span>
+<span id="3509">3509</span>
+<span id="3510">3510</span>
+<span id="3511">3511</span>
+<span id="3512">3512</span>
+<span id="3513">3513</span>
+<span id="3514">3514</span>
+<span id="3515">3515</span>
+<span id="3516">3516</span>
+<span id="3517">3517</span>
+<span id="3518">3518</span>
+<span id="3519">3519</span>
+<span id="3520">3520</span>
+<span id="3521">3521</span>
+<span id="3522">3522</span>
+<span id="3523">3523</span>
+<span id="3524">3524</span>
+<span id="3525">3525</span>
+<span id="3526">3526</span>
+<span id="3527">3527</span>
+<span id="3528">3528</span>
+<span id="3529">3529</span>
+<span id="3530">3530</span>
+<span id="3531">3531</span>
+<span id="3532">3532</span>
+<span id="3533">3533</span>
+<span id="3534">3534</span>
+<span id="3535">3535</span>
+<span id="3536">3536</span>
+<span id="3537">3537</span>
+<span id="3538">3538</span>
+<span id="3539">3539</span>
+<span id="3540">3540</span>
+<span id="3541">3541</span>
+<span id="3542">3542</span>
+<span id="3543">3543</span>
+<span id="3544">3544</span>
+<span id="3545">3545</span>
+<span id="3546">3546</span>
+<span id="3547">3547</span>
+<span id="3548">3548</span>
+<span id="3549">3549</span>
+<span id="3550">3550</span>
+<span id="3551">3551</span>
+<span id="3552">3552</span>
+<span id="3553">3553</span>
+<span id="3554">3554</span>
+<span id="3555">3555</span>
+<span id="3556">3556</span>
+<span id="3557">3557</span>
+<span id="3558">3558</span>
+<span id="3559">3559</span>
+<span id="3560">3560</span>
+<span id="3561">3561</span>
+<span id="3562">3562</span>
+<span id="3563">3563</span>
+<span id="3564">3564</span>
+<span id="3565">3565</span>
+<span id="3566">3566</span>
+<span id="3567">3567</span>
+<span id="3568">3568</span>
+<span id="3569">3569</span>
+<span id="3570">3570</span>
+<span id="3571">3571</span>
+<span id="3572">3572</span>
+<span id="3573">3573</span>
+<span id="3574">3574</span>
+<span id="3575">3575</span>
+<span id="3576">3576</span>
+<span id="3577">3577</span>
+<span id="3578">3578</span>
+<span id="3579">3579</span>
+<span id="3580">3580</span>
+<span id="3581">3581</span>
+<span id="3582">3582</span>
+<span id="3583">3583</span>
+<span id="3584">3584</span>
+<span id="3585">3585</span>
+<span id="3586">3586</span>
+<span id="3587">3587</span>
+<span id="3588">3588</span>
+<span id="3589">3589</span>
+<span id="3590">3590</span>
+<span id="3591">3591</span>
+<span id="3592">3592</span>
+<span id="3593">3593</span>
+<span id="3594">3594</span>
+<span id="3595">3595</span>
+<span id="3596">3596</span>
+<span id="3597">3597</span>
+<span id="3598">3598</span>
+<span id="3599">3599</span>
+<span id="3600">3600</span>
+<span id="3601">3601</span>
+<span id="3602">3602</span>
+<span id="3603">3603</span>
+<span id="3604">3604</span>
+<span id="3605">3605</span>
+<span id="3606">3606</span>
+<span id="3607">3607</span>
+<span id="3608">3608</span>
+<span id="3609">3609</span>
+<span id="3610">3610</span>
+<span id="3611">3611</span>
+<span id="3612">3612</span>
+<span id="3613">3613</span>
+<span id="3614">3614</span>
+<span id="3615">3615</span>
+<span id="3616">3616</span>
+<span id="3617">3617</span>
+<span id="3618">3618</span>
+<span id="3619">3619</span>
+<span id="3620">3620</span>
+<span id="3621">3621</span>
+<span id="3622">3622</span>
+<span id="3623">3623</span>
+<span id="3624">3624</span>
+<span id="3625">3625</span>
+<span id="3626">3626</span>
+<span id="3627">3627</span>
+<span id="3628">3628</span>
+<span id="3629">3629</span>
+<span id="3630">3630</span>
+<span id="3631">3631</span>
+<span id="3632">3632</span>
+<span id="3633">3633</span>
+<span id="3634">3634</span>
+<span id="3635">3635</span>
+<span id="3636">3636</span>
+<span id="3637">3637</span>
+<span id="3638">3638</span>
+<span id="3639">3639</span>
+<span id="3640">3640</span>
+<span id="3641">3641</span>
+<span id="3642">3642</span>
+<span id="3643">3643</span>
+<span id="3644">3644</span>
+<span id="3645">3645</span>
+<span id="3646">3646</span>
+<span id="3647">3647</span>
+<span id="3648">3648</span>
+<span id="3649">3649</span>
+<span id="3650">3650</span>
+<span id="3651">3651</span>
+<span id="3652">3652</span>
+<span id="3653">3653</span>
+<span id="3654">3654</span>
+<span id="3655">3655</span>
+<span id="3656">3656</span>
+<span id="3657">3657</span>
+<span id="3658">3658</span>
+<span id="3659">3659</span>
+<span id="3660">3660</span>
+<span id="3661">3661</span>
+<span id="3662">3662</span>
+<span id="3663">3663</span>
+<span id="3664">3664</span>
+<span id="3665">3665</span>
+<span id="3666">3666</span>
+<span id="3667">3667</span>
+<span id="3668">3668</span>
+<span id="3669">3669</span>
+<span id="3670">3670</span>
+<span id="3671">3671</span>
+<span id="3672">3672</span>
+<span id="3673">3673</span>
+<span id="3674">3674</span>
+<span id="3675">3675</span>
+<span id="3676">3676</span>
+<span id="3677">3677</span>
+<span id="3678">3678</span>
+<span id="3679">3679</span>
+<span id="3680">3680</span>
+<span id="3681">3681</span>
+<span id="3682">3682</span>
+<span id="3683">3683</span>
+<span id="3684">3684</span>
+<span id="3685">3685</span>
+<span id="3686">3686</span>
+<span id="3687">3687</span>
+<span id="3688">3688</span>
+<span id="3689">3689</span>
+<span id="3690">3690</span>
+<span id="3691">3691</span>
+<span id="3692">3692</span>
+<span id="3693">3693</span>
+<span id="3694">3694</span>
+<span id="3695">3695</span>
+<span id="3696">3696</span>
+<span id="3697">3697</span>
+<span id="3698">3698</span>
+<span id="3699">3699</span>
+<span id="3700">3700</span>
+<span id="3701">3701</span>
+<span id="3702">3702</span>
+<span id="3703">3703</span>
+<span id="3704">3704</span>
+<span id="3705">3705</span>
+<span id="3706">3706</span>
+<span id="3707">3707</span>
+<span id="3708">3708</span>
+<span id="3709">3709</span>
+<span id="3710">3710</span>
+<span id="3711">3711</span>
+<span id="3712">3712</span>
+<span id="3713">3713</span>
+<span id="3714">3714</span>
+<span id="3715">3715</span>
+<span id="3716">3716</span>
+<span id="3717">3717</span>
+<span id="3718">3718</span>
+<span id="3719">3719</span>
+<span id="3720">3720</span>
+<span id="3721">3721</span>
+<span id="3722">3722</span>
+<span id="3723">3723</span>
+<span id="3724">3724</span>
+<span id="3725">3725</span>
+<span id="3726">3726</span>
+<span id="3727">3727</span>
+<span id="3728">3728</span>
+<span id="3729">3729</span>
+<span id="3730">3730</span>
+<span id="3731">3731</span>
+<span id="3732">3732</span>
+<span id="3733">3733</span>
+<span id="3734">3734</span>
+<span id="3735">3735</span>
+<span id="3736">3736</span>
+<span id="3737">3737</span>
+<span id="3738">3738</span>
+<span id="3739">3739</span>
+<span id="3740">3740</span>
+<span id="3741">3741</span>
+<span id="3742">3742</span>
+<span id="3743">3743</span>
+<span id="3744">3744</span>
+<span id="3745">3745</span>
+<span id="3746">3746</span>
+<span id="3747">3747</span>
+<span id="3748">3748</span>
+<span id="3749">3749</span>
+<span id="3750">3750</span>
+<span id="3751">3751</span>
+<span id="3752">3752</span>
+<span id="3753">3753</span>
+<span id="3754">3754</span>
+<span id="3755">3755</span>
+<span id="3756">3756</span>
+<span id="3757">3757</span>
+<span id="3758">3758</span>
+<span id="3759">3759</span>
+<span id="3760">3760</span>
+<span id="3761">3761</span>
+<span id="3762">3762</span>
+<span id="3763">3763</span>
+<span id="3764">3764</span>
+<span id="3765">3765</span>
+<span id="3766">3766</span>
+<span id="3767">3767</span>
+<span id="3768">3768</span>
+<span id="3769">3769</span>
+<span id="3770">3770</span>
+<span id="3771">3771</span>
+<span id="3772">3772</span>
+<span id="3773">3773</span>
+<span id="3774">3774</span>
+<span id="3775">3775</span>
+<span id="3776">3776</span>
+<span id="3777">3777</span>
+<span id="3778">3778</span>
+<span id="3779">3779</span>
+<span id="3780">3780</span>
+<span id="3781">3781</span>
+<span id="3782">3782</span>
+<span id="3783">3783</span>
+<span id="3784">3784</span>
+<span id="3785">3785</span>
+<span id="3786">3786</span>
+<span id="3787">3787</span>
+<span id="3788">3788</span>
+<span id="3789">3789</span>
+<span id="3790">3790</span>
+<span id="3791">3791</span>
+<span id="3792">3792</span>
+<span id="3793">3793</span>
+<span id="3794">3794</span>
+<span id="3795">3795</span>
+<span id="3796">3796</span>
+<span id="3797">3797</span>
+<span id="3798">3798</span>
+<span id="3799">3799</span>
+<span id="3800">3800</span>
+<span id="3801">3801</span>
+<span id="3802">3802</span>
+<span id="3803">3803</span>
+<span id="3804">3804</span>
+<span id="3805">3805</span>
+<span id="3806">3806</span>
+<span id="3807">3807</span>
+<span id="3808">3808</span>
+<span id="3809">3809</span>
+<span id="3810">3810</span>
+<span id="3811">3811</span>
+<span id="3812">3812</span>
+<span id="3813">3813</span>
+<span id="3814">3814</span>
+<span id="3815">3815</span>
+<span id="3816">3816</span>
+<span id="3817">3817</span>
+<span id="3818">3818</span>
+<span id="3819">3819</span>
+<span id="3820">3820</span>
+<span id="3821">3821</span>
+<span id="3822">3822</span>
+<span id="3823">3823</span>
+<span id="3824">3824</span>
+<span id="3825">3825</span>
+<span id="3826">3826</span>
+<span id="3827">3827</span>
+<span id="3828">3828</span>
+<span id="3829">3829</span>
+<span id="3830">3830</span>
+<span id="3831">3831</span>
+<span id="3832">3832</span>
+<span id="3833">3833</span>
+<span id="3834">3834</span>
+<span id="3835">3835</span>
+<span id="3836">3836</span>
+<span id="3837">3837</span>
+<span id="3838">3838</span>
+<span id="3839">3839</span>
+<span id="3840">3840</span>
+<span id="3841">3841</span>
+<span id="3842">3842</span>
+<span id="3843">3843</span>
+<span id="3844">3844</span>
+<span id="3845">3845</span>
+<span id="3846">3846</span>
+<span id="3847">3847</span>
+<span id="3848">3848</span>
+<span id="3849">3849</span>
+<span id="3850">3850</span>
+<span id="3851">3851</span>
+<span id="3852">3852</span>
+<span id="3853">3853</span>
+<span id="3854">3854</span>
+<span id="3855">3855</span>
+<span id="3856">3856</span>
+<span id="3857">3857</span>
+<span id="3858">3858</span>
+<span id="3859">3859</span>
+<span id="3860">3860</span>
+<span id="3861">3861</span>
+<span id="3862">3862</span>
+<span id="3863">3863</span>
+<span id="3864">3864</span>
+<span id="3865">3865</span>
+<span id="3866">3866</span>
+<span id="3867">3867</span>
+<span id="3868">3868</span>
+<span id="3869">3869</span>
+<span id="3870">3870</span>
+<span id="3871">3871</span>
+<span id="3872">3872</span>
+<span id="3873">3873</span>
+<span id="3874">3874</span>
+<span id="3875">3875</span>
+<span id="3876">3876</span>
+<span id="3877">3877</span>
+<span id="3878">3878</span>
+<span id="3879">3879</span>
+<span id="3880">3880</span>
+<span id="3881">3881</span>
+<span id="3882">3882</span>
+<span id="3883">3883</span>
+<span id="3884">3884</span>
+<span id="3885">3885</span>
+<span id="3886">3886</span>
+<span id="3887">3887</span>
+<span id="3888">3888</span>
+<span id="3889">3889</span>
+<span id="3890">3890</span>
+<span id="3891">3891</span>
+<span id="3892">3892</span>
+<span id="3893">3893</span>
+<span id="3894">3894</span>
+<span id="3895">3895</span>
+<span id="3896">3896</span>
+<span id="3897">3897</span>
+<span id="3898">3898</span>
+<span id="3899">3899</span>
+<span id="3900">3900</span>
+<span id="3901">3901</span>
+<span id="3902">3902</span>
+<span id="3903">3903</span>
+<span id="3904">3904</span>
+<span id="3905">3905</span>
+<span id="3906">3906</span>
+<span id="3907">3907</span>
+<span id="3908">3908</span>
+<span id="3909">3909</span>
+<span id="3910">3910</span>
+<span id="3911">3911</span>
+<span id="3912">3912</span>
+<span id="3913">3913</span>
+<span id="3914">3914</span>
+<span id="3915">3915</span>
+<span id="3916">3916</span>
+<span id="3917">3917</span>
+<span id="3918">3918</span>
+<span id="3919">3919</span>
+<span id="3920">3920</span>
+<span id="3921">3921</span>
+<span id="3922">3922</span>
+<span id="3923">3923</span>
+<span id="3924">3924</span>
+<span id="3925">3925</span>
+<span id="3926">3926</span>
+<span id="3927">3927</span>
+<span id="3928">3928</span>
+<span id="3929">3929</span>
+<span id="3930">3930</span>
+<span id="3931">3931</span>
+<span id="3932">3932</span>
+<span id="3933">3933</span>
+<span id="3934">3934</span>
+<span id="3935">3935</span>
+<span id="3936">3936</span>
+<span id="3937">3937</span>
+<span id="3938">3938</span>
+<span id="3939">3939</span>
+<span id="3940">3940</span>
+<span id="3941">3941</span>
+<span id="3942">3942</span>
+<span id="3943">3943</span>
+<span id="3944">3944</span>
+<span id="3945">3945</span>
+<span id="3946">3946</span>
+<span id="3947">3947</span>
+<span id="3948">3948</span>
+<span id="3949">3949</span>
+<span id="3950">3950</span>
+<span id="3951">3951</span>
+<span id="3952">3952</span>
+<span id="3953">3953</span>
+<span id="3954">3954</span>
+<span id="3955">3955</span>
+<span id="3956">3956</span>
+<span id="3957">3957</span>
+<span id="3958">3958</span>
+<span id="3959">3959</span>
+<span id="3960">3960</span>
+<span id="3961">3961</span>
+<span id="3962">3962</span>
+<span id="3963">3963</span>
+<span id="3964">3964</span>
+<span id="3965">3965</span>
+<span id="3966">3966</span>
+<span id="3967">3967</span>
+<span id="3968">3968</span>
+<span id="3969">3969</span>
+<span id="3970">3970</span>
+<span id="3971">3971</span>
+<span id="3972">3972</span>
+<span id="3973">3973</span>
+<span id="3974">3974</span>
+<span id="3975">3975</span>
+<span id="3976">3976</span>
+<span id="3977">3977</span>
+<span id="3978">3978</span>
+<span id="3979">3979</span>
+<span id="3980">3980</span>
+<span id="3981">3981</span>
+<span id="3982">3982</span>
+<span id="3983">3983</span>
+<span id="3984">3984</span>
+<span id="3985">3985</span>
+<span id="3986">3986</span>
+<span id="3987">3987</span>
+<span id="3988">3988</span>
+<span id="3989">3989</span>
+<span id="3990">3990</span>
+<span id="3991">3991</span>
+<span id="3992">3992</span>
+<span id="3993">3993</span>
+<span id="3994">3994</span>
+<span id="3995">3995</span>
+<span id="3996">3996</span>
+<span id="3997">3997</span>
+<span id="3998">3998</span>
+<span id="3999">3999</span>
+<span id="4000">4000</span>
+<span id="4001">4001</span>
+<span id="4002">4002</span>
+<span id="4003">4003</span>
+<span id="4004">4004</span>
+<span id="4005">4005</span>
+<span id="4006">4006</span>
+<span id="4007">4007</span>
+<span id="4008">4008</span>
+<span id="4009">4009</span>
+<span id="4010">4010</span>
+<span id="4011">4011</span>
+<span id="4012">4012</span>
+<span id="4013">4013</span>
+<span id="4014">4014</span>
+<span id="4015">4015</span>
+<span id="4016">4016</span>
+<span id="4017">4017</span>
+<span id="4018">4018</span>
+<span id="4019">4019</span>
+<span id="4020">4020</span>
+<span id="4021">4021</span>
+<span id="4022">4022</span>
+<span id="4023">4023</span>
+<span id="4024">4024</span>
+<span id="4025">4025</span>
+<span id="4026">4026</span>
+<span id="4027">4027</span>
+<span id="4028">4028</span>
+<span id="4029">4029</span>
+<span id="4030">4030</span>
+<span id="4031">4031</span>
+<span id="4032">4032</span>
+<span id="4033">4033</span>
+<span id="4034">4034</span>
+<span id="4035">4035</span>
+<span id="4036">4036</span>
+<span id="4037">4037</span>
+<span id="4038">4038</span>
+<span id="4039">4039</span>
+<span id="4040">4040</span>
+<span id="4041">4041</span>
+<span id="4042">4042</span>
+<span id="4043">4043</span>
+<span id="4044">4044</span>
+<span id="4045">4045</span>
+<span id="4046">4046</span>
+<span id="4047">4047</span>
+<span id="4048">4048</span>
+<span id="4049">4049</span>
+<span id="4050">4050</span>
+<span id="4051">4051</span>
+<span id="4052">4052</span>
+<span id="4053">4053</span>
+<span id="4054">4054</span>
+<span id="4055">4055</span>
+<span id="4056">4056</span>
+<span id="4057">4057</span>
+<span id="4058">4058</span>
+<span id="4059">4059</span>
+<span id="4060">4060</span>
+<span id="4061">4061</span>
+<span id="4062">4062</span>
+<span id="4063">4063</span>
+<span id="4064">4064</span>
+<span id="4065">4065</span>
+<span id="4066">4066</span>
+<span id="4067">4067</span>
+<span id="4068">4068</span>
+<span id="4069">4069</span>
+<span id="4070">4070</span>
+<span id="4071">4071</span>
+<span id="4072">4072</span>
+<span id="4073">4073</span>
+<span id="4074">4074</span>
+<span id="4075">4075</span>
+<span id="4076">4076</span>
+<span id="4077">4077</span>
+<span id="4078">4078</span>
+<span id="4079">4079</span>
+<span id="4080">4080</span>
+<span id="4081">4081</span>
+<span id="4082">4082</span>
+<span id="4083">4083</span>
+<span id="4084">4084</span>
+<span id="4085">4085</span>
+<span id="4086">4086</span>
+<span id="4087">4087</span>
+<span id="4088">4088</span>
+<span id="4089">4089</span>
+<span id="4090">4090</span>
+<span id="4091">4091</span>
+<span id="4092">4092</span>
+<span id="4093">4093</span>
+<span id="4094">4094</span>
+<span id="4095">4095</span>
+<span id="4096">4096</span>
+<span id="4097">4097</span>
+<span id="4098">4098</span>
+<span id="4099">4099</span>
+<span id="4100">4100</span>
+<span id="4101">4101</span>
+<span id="4102">4102</span>
+<span id="4103">4103</span>
+<span id="4104">4104</span>
+<span id="4105">4105</span>
+<span id="4106">4106</span>
+<span id="4107">4107</span>
+<span id="4108">4108</span>
+<span id="4109">4109</span>
+<span id="4110">4110</span>
+<span id="4111">4111</span>
+<span id="4112">4112</span>
+<span id="4113">4113</span>
+<span id="4114">4114</span>
+<span id="4115">4115</span>
+<span id="4116">4116</span>
+<span id="4117">4117</span>
+<span id="4118">4118</span>
+<span id="4119">4119</span>
+<span id="4120">4120</span>
+<span id="4121">4121</span>
+<span id="4122">4122</span>
+<span id="4123">4123</span>
+<span id="4124">4124</span>
+<span id="4125">4125</span>
+<span id="4126">4126</span>
+<span id="4127">4127</span>
+<span id="4128">4128</span>
+<span id="4129">4129</span>
+<span id="4130">4130</span>
+<span id="4131">4131</span>
+<span id="4132">4132</span>
+<span id="4133">4133</span>
+<span id="4134">4134</span>
+<span id="4135">4135</span>
+<span id="4136">4136</span>
+<span id="4137">4137</span>
+<span id="4138">4138</span>
+<span id="4139">4139</span>
+<span id="4140">4140</span>
+<span id="4141">4141</span>
+<span id="4142">4142</span>
+<span id="4143">4143</span>
+<span id="4144">4144</span>
+<span id="4145">4145</span>
+<span id="4146">4146</span>
+<span id="4147">4147</span>
+<span id="4148">4148</span>
+<span id="4149">4149</span>
+<span id="4150">4150</span>
+<span id="4151">4151</span>
+<span id="4152">4152</span>
+<span id="4153">4153</span>
+<span id="4154">4154</span>
+<span id="4155">4155</span>
+<span id="4156">4156</span>
+<span id="4157">4157</span>
+<span id="4158">4158</span>
+<span id="4159">4159</span>
+<span id="4160">4160</span>
+<span id="4161">4161</span>
+<span id="4162">4162</span>
+<span id="4163">4163</span>
+<span id="4164">4164</span>
+<span id="4165">4165</span>
+<span id="4166">4166</span>
+<span id="4167">4167</span>
+<span id="4168">4168</span>
+<span id="4169">4169</span>
+<span id="4170">4170</span>
+<span id="4171">4171</span>
+<span id="4172">4172</span>
+<span id="4173">4173</span>
+<span id="4174">4174</span>
+<span id="4175">4175</span>
+<span id="4176">4176</span>
+<span id="4177">4177</span>
+<span id="4178">4178</span>
+<span id="4179">4179</span>
+<span id="4180">4180</span>
+<span id="4181">4181</span>
+<span id="4182">4182</span>
+<span id="4183">4183</span>
+<span id="4184">4184</span>
+<span id="4185">4185</span>
+<span id="4186">4186</span>
+<span id="4187">4187</span>
+<span id="4188">4188</span>
+<span id="4189">4189</span>
+<span id="4190">4190</span>
+<span id="4191">4191</span>
+<span id="4192">4192</span>
+<span id="4193">4193</span>
+<span id="4194">4194</span>
+<span id="4195">4195</span>
+<span id="4196">4196</span>
+<span id="4197">4197</span>
+<span id="4198">4198</span>
+<span id="4199">4199</span>
+<span id="4200">4200</span>
+<span id="4201">4201</span>
+<span id="4202">4202</span>
+<span id="4203">4203</span>
+<span id="4204">4204</span>
+<span id="4205">4205</span>
+<span id="4206">4206</span>
+<span id="4207">4207</span>
+<span id="4208">4208</span>
+<span id="4209">4209</span>
+<span id="4210">4210</span>
+<span id="4211">4211</span>
+<span id="4212">4212</span>
+<span id="4213">4213</span>
+<span id="4214">4214</span>
+<span id="4215">4215</span>
+<span id="4216">4216</span>
+<span id="4217">4217</span>
+<span id="4218">4218</span>
+<span id="4219">4219</span>
+<span id="4220">4220</span>
+<span id="4221">4221</span>
+<span id="4222">4222</span>
+<span id="4223">4223</span>
+<span id="4224">4224</span>
+<span id="4225">4225</span>
+<span id="4226">4226</span>
+<span id="4227">4227</span>
+<span id="4228">4228</span>
+<span id="4229">4229</span>
+<span id="4230">4230</span>
+<span id="4231">4231</span>
+<span id="4232">4232</span>
+<span id="4233">4233</span>
+<span id="4234">4234</span>
+<span id="4235">4235</span>
+<span id="4236">4236</span>
+<span id="4237">4237</span>
+<span id="4238">4238</span>
+<span id="4239">4239</span>
+<span id="4240">4240</span>
+<span id="4241">4241</span>
+<span id="4242">4242</span>
+<span id="4243">4243</span>
+<span id="4244">4244</span>
+<span id="4245">4245</span>
+<span id="4246">4246</span>
+<span id="4247">4247</span>
+<span id="4248">4248</span>
+<span id="4249">4249</span>
+<span id="4250">4250</span>
+<span id="4251">4251</span>
+<span id="4252">4252</span>
+<span id="4253">4253</span>
+<span id="4254">4254</span>
+<span id="4255">4255</span>
+<span id="4256">4256</span>
+<span id="4257">4257</span>
+<span id="4258">4258</span>
+<span id="4259">4259</span>
+<span id="4260">4260</span>
+<span id="4261">4261</span>
+<span id="4262">4262</span>
+<span id="4263">4263</span>
+<span id="4264">4264</span>
+<span id="4265">4265</span>
+<span id="4266">4266</span>
+<span id="4267">4267</span>
+<span id="4268">4268</span>
+<span id="4269">4269</span>
+<span id="4270">4270</span>
+<span id="4271">4271</span>
+<span id="4272">4272</span>
+<span id="4273">4273</span>
+<span id="4274">4274</span>
+<span id="4275">4275</span>
+<span id="4276">4276</span>
+<span id="4277">4277</span>
+<span id="4278">4278</span>
+<span id="4279">4279</span>
+<span id="4280">4280</span>
+<span id="4281">4281</span>
+<span id="4282">4282</span>
+<span id="4283">4283</span>
+<span id="4284">4284</span>
+<span id="4285">4285</span>
+<span id="4286">4286</span>
+<span id="4287">4287</span>
+<span id="4288">4288</span>
+<span id="4289">4289</span>
+<span id="4290">4290</span>
+<span id="4291">4291</span>
+<span id="4292">4292</span>
+<span id="4293">4293</span>
+<span id="4294">4294</span>
+<span id="4295">4295</span>
+<span id="4296">4296</span>
+<span id="4297">4297</span>
+<span id="4298">4298</span>
+<span id="4299">4299</span>
+<span id="4300">4300</span>
+<span id="4301">4301</span>
+<span id="4302">4302</span>
+<span id="4303">4303</span>
+<span id="4304">4304</span>
+<span id="4305">4305</span>
+<span id="4306">4306</span>
+<span id="4307">4307</span>
+<span id="4308">4308</span>
+<span id="4309">4309</span>
+<span id="4310">4310</span>
+<span id="4311">4311</span>
+<span id="4312">4312</span>
+<span id="4313">4313</span>
+<span id="4314">4314</span>
+<span id="4315">4315</span>
+<span id="4316">4316</span>
+<span id="4317">4317</span>
+<span id="4318">4318</span>
+<span id="4319">4319</span>
+<span id="4320">4320</span>
+<span id="4321">4321</span>
+<span id="4322">4322</span>
+<span id="4323">4323</span>
+<span id="4324">4324</span>
+<span id="4325">4325</span>
+<span id="4326">4326</span>
+<span id="4327">4327</span>
+<span id="4328">4328</span>
+<span id="4329">4329</span>
+<span id="4330">4330</span>
+<span id="4331">4331</span>
+<span id="4332">4332</span>
+<span id="4333">4333</span>
+<span id="4334">4334</span>
+<span id="4335">4335</span>
+<span id="4336">4336</span>
+<span id="4337">4337</span>
+<span id="4338">4338</span>
+<span id="4339">4339</span>
+<span id="4340">4340</span>
+<span id="4341">4341</span>
+<span id="4342">4342</span>
+<span id="4343">4343</span>
+<span id="4344">4344</span>
+<span id="4345">4345</span>
+<span id="4346">4346</span>
+<span id="4347">4347</span>
+<span id="4348">4348</span>
+<span id="4349">4349</span>
+<span id="4350">4350</span>
+<span id="4351">4351</span>
+<span id="4352">4352</span>
+<span id="4353">4353</span>
+<span id="4354">4354</span>
+<span id="4355">4355</span>
+<span id="4356">4356</span>
+<span id="4357">4357</span>
+<span id="4358">4358</span>
+<span id="4359">4359</span>
+<span id="4360">4360</span>
+<span id="4361">4361</span>
+<span id="4362">4362</span>
+<span id="4363">4363</span>
+<span id="4364">4364</span>
+<span id="4365">4365</span>
+<span id="4366">4366</span>
+<span id="4367">4367</span>
+<span id="4368">4368</span>
+<span id="4369">4369</span>
+<span id="4370">4370</span>
+<span id="4371">4371</span>
+<span id="4372">4372</span>
+<span id="4373">4373</span>
+<span id="4374">4374</span>
+<span id="4375">4375</span>
+<span id="4376">4376</span>
+<span id="4377">4377</span>
+<span id="4378">4378</span>
+<span id="4379">4379</span>
+<span id="4380">4380</span>
+<span id="4381">4381</span>
+<span id="4382">4382</span>
+<span id="4383">4383</span>
+<span id="4384">4384</span>
+<span id="4385">4385</span>
+<span id="4386">4386</span>
+<span id="4387">4387</span>
+<span id="4388">4388</span>
+<span id="4389">4389</span>
+<span id="4390">4390</span>
+<span id="4391">4391</span>
+<span id="4392">4392</span>
+<span id="4393">4393</span>
+<span id="4394">4394</span>
+<span id="4395">4395</span>
+<span id="4396">4396</span>
+<span id="4397">4397</span>
+<span id="4398">4398</span>
+<span id="4399">4399</span>
+<span id="4400">4400</span>
+<span id="4401">4401</span>
+<span id="4402">4402</span>
+<span id="4403">4403</span>
+<span id="4404">4404</span>
+<span id="4405">4405</span>
+<span id="4406">4406</span>
+<span id="4407">4407</span>
+<span id="4408">4408</span>
+<span id="4409">4409</span>
+<span id="4410">4410</span>
+<span id="4411">4411</span>
+<span id="4412">4412</span>
+<span id="4413">4413</span>
+<span id="4414">4414</span>
+<span id="4415">4415</span>
+<span id="4416">4416</span>
+<span id="4417">4417</span>
+<span id="4418">4418</span>
+<span id="4419">4419</span>
+<span id="4420">4420</span>
+<span id="4421">4421</span>
+<span id="4422">4422</span>
+<span id="4423">4423</span>
+<span id="4424">4424</span>
+<span id="4425">4425</span>
+<span id="4426">4426</span>
+<span id="4427">4427</span>
+<span id="4428">4428</span>
+<span id="4429">4429</span>
+<span id="4430">4430</span>
+<span id="4431">4431</span>
+<span id="4432">4432</span>
+<span id="4433">4433</span>
+<span id="4434">4434</span>
+<span id="4435">4435</span>
+<span id="4436">4436</span>
+<span id="4437">4437</span>
+<span id="4438">4438</span>
+<span id="4439">4439</span>
+<span id="4440">4440</span>
+<span id="4441">4441</span>
+<span id="4442">4442</span>
+<span id="4443">4443</span>
+<span id="4444">4444</span>
+<span id="4445">4445</span>
+<span id="4446">4446</span>
+<span id="4447">4447</span>
+<span id="4448">4448</span>
+<span id="4449">4449</span>
+<span id="4450">4450</span>
+<span id="4451">4451</span>
+<span id="4452">4452</span>
+<span id="4453">4453</span>
+<span id="4454">4454</span>
+<span id="4455">4455</span>
+<span id="4456">4456</span>
+<span id="4457">4457</span>
+<span id="4458">4458</span>
+<span id="4459">4459</span>
+<span id="4460">4460</span>
+<span id="4461">4461</span>
+<span id="4462">4462</span>
+<span id="4463">4463</span>
+<span id="4464">4464</span>
+<span id="4465">4465</span>
+<span id="4466">4466</span>
+<span id="4467">4467</span>
+<span id="4468">4468</span>
+<span id="4469">4469</span>
+<span id="4470">4470</span>
+<span id="4471">4471</span>
+<span id="4472">4472</span>
+<span id="4473">4473</span>
+<span id="4474">4474</span>
+<span id="4475">4475</span>
+<span id="4476">4476</span>
+<span id="4477">4477</span>
+<span id="4478">4478</span>
+<span id="4479">4479</span>
+<span id="4480">4480</span>
+<span id="4481">4481</span>
+<span id="4482">4482</span>
+<span id="4483">4483</span>
+<span id="4484">4484</span>
+<span id="4485">4485</span>
+<span id="4486">4486</span>
+<span id="4487">4487</span>
+<span id="4488">4488</span>
+<span id="4489">4489</span>
+<span id="4490">4490</span>
+<span id="4491">4491</span>
+<span id="4492">4492</span>
+<span id="4493">4493</span>
+<span id="4494">4494</span>
+<span id="4495">4495</span>
+<span id="4496">4496</span>
+<span id="4497">4497</span>
+<span id="4498">4498</span>
+<span id="4499">4499</span>
+<span id="4500">4500</span>
+<span id="4501">4501</span>
+<span id="4502">4502</span>
+<span id="4503">4503</span>
+<span id="4504">4504</span>
+<span id="4505">4505</span>
+<span id="4506">4506</span>
+<span id="4507">4507</span>
+<span id="4508">4508</span>
+<span id="4509">4509</span>
+<span id="4510">4510</span>
+<span id="4511">4511</span>
+<span id="4512">4512</span>
+<span id="4513">4513</span>
+<span id="4514">4514</span>
+<span id="4515">4515</span>
+<span id="4516">4516</span>
+<span id="4517">4517</span>
+<span id="4518">4518</span>
+<span id="4519">4519</span>
+<span id="4520">4520</span>
+<span id="4521">4521</span>
+<span id="4522">4522</span>
+<span id="4523">4523</span>
+<span id="4524">4524</span>
+<span id="4525">4525</span>
+<span id="4526">4526</span>
+<span id="4527">4527</span>
+<span id="4528">4528</span>
+<span id="4529">4529</span>
+<span id="4530">4530</span>
+<span id="4531">4531</span>
+<span id="4532">4532</span>
+<span id="4533">4533</span>
+<span id="4534">4534</span>
+<span id="4535">4535</span>
+<span id="4536">4536</span>
+<span id="4537">4537</span>
+<span id="4538">4538</span>
+<span id="4539">4539</span>
+<span id="4540">4540</span>
+<span id="4541">4541</span>
+<span id="4542">4542</span>
+<span id="4543">4543</span>
+<span id="4544">4544</span>
+<span id="4545">4545</span>
+<span id="4546">4546</span>
+<span id="4547">4547</span>
+<span id="4548">4548</span>
+<span id="4549">4549</span>
+<span id="4550">4550</span>
+<span id="4551">4551</span>
+<span id="4552">4552</span>
+<span id="4553">4553</span>
+<span id="4554">4554</span>
+<span id="4555">4555</span>
+<span id="4556">4556</span>
+<span id="4557">4557</span>
+<span id="4558">4558</span>
+<span id="4559">4559</span>
+<span id="4560">4560</span>
+<span id="4561">4561</span>
+<span id="4562">4562</span>
+<span id="4563">4563</span>
+<span id="4564">4564</span>
+<span id="4565">4565</span>
+<span id="4566">4566</span>
+<span id="4567">4567</span>
+<span id="4568">4568</span>
+<span id="4569">4569</span>
+<span id="4570">4570</span>
+<span id="4571">4571</span>
+<span id="4572">4572</span>
+<span id="4573">4573</span>
+<span id="4574">4574</span>
+<span id="4575">4575</span>
+<span id="4576">4576</span>
+<span id="4577">4577</span>
+<span id="4578">4578</span>
+<span id="4579">4579</span>
+<span id="4580">4580</span>
+<span id="4581">4581</span>
+<span id="4582">4582</span>
+<span id="4583">4583</span>
+<span id="4584">4584</span>
+<span id="4585">4585</span>
+<span id="4586">4586</span>
+<span id="4587">4587</span>
+<span id="4588">4588</span>
+<span id="4589">4589</span>
+<span id="4590">4590</span>
+<span id="4591">4591</span>
+<span id="4592">4592</span>
+<span id="4593">4593</span>
+<span id="4594">4594</span>
+<span id="4595">4595</span>
+<span id="4596">4596</span>
+<span id="4597">4597</span>
+<span id="4598">4598</span>
+<span id="4599">4599</span>
+<span id="4600">4600</span>
+<span id="4601">4601</span>
+<span id="4602">4602</span>
+<span id="4603">4603</span>
+<span id="4604">4604</span>
+<span id="4605">4605</span>
+<span id="4606">4606</span>
+<span id="4607">4607</span>
+<span id="4608">4608</span>
+<span id="4609">4609</span>
+<span id="4610">4610</span>
+<span id="4611">4611</span>
+<span id="4612">4612</span>
+<span id="4613">4613</span>
+<span id="4614">4614</span>
+<span id="4615">4615</span>
+<span id="4616">4616</span>
+<span id="4617">4617</span>
+<span id="4618">4618</span>
+<span id="4619">4619</span>
+<span id="4620">4620</span>
+<span id="4621">4621</span>
+<span id="4622">4622</span>
+<span id="4623">4623</span>
+<span id="4624">4624</span>
+<span id="4625">4625</span>
+<span id="4626">4626</span>
+<span id="4627">4627</span>
+<span id="4628">4628</span>
+<span id="4629">4629</span>
+<span id="4630">4630</span>
+<span id="4631">4631</span>
+<span id="4632">4632</span>
+<span id="4633">4633</span>
+<span id="4634">4634</span>
+<span id="4635">4635</span>
+<span id="4636">4636</span>
+<span id="4637">4637</span>
+<span id="4638">4638</span>
+<span id="4639">4639</span>
+<span id="4640">4640</span>
+<span id="4641">4641</span>
+<span id="4642">4642</span>
+<span id="4643">4643</span>
+<span id="4644">4644</span>
+<span id="4645">4645</span>
+<span id="4646">4646</span>
+<span id="4647">4647</span>
+<span id="4648">4648</span>
+<span id="4649">4649</span>
+<span id="4650">4650</span>
+<span id="4651">4651</span>
+<span id="4652">4652</span>
+<span id="4653">4653</span>
+<span id="4654">4654</span>
+<span id="4655">4655</span>
+<span id="4656">4656</span>
+<span id="4657">4657</span>
+<span id="4658">4658</span>
+<span id="4659">4659</span>
+<span id="4660">4660</span>
+<span id="4661">4661</span>
+<span id="4662">4662</span>
+<span id="4663">4663</span>
+<span id="4664">4664</span>
+<span id="4665">4665</span>
+<span id="4666">4666</span>
+<span id="4667">4667</span>
+<span id="4668">4668</span>
+<span id="4669">4669</span>
+<span id="4670">4670</span>
+<span id="4671">4671</span>
+<span id="4672">4672</span>
+<span id="4673">4673</span>
+<span id="4674">4674</span>
+<span id="4675">4675</span>
+<span id="4676">4676</span>
+<span id="4677">4677</span>
+<span id="4678">4678</span>
+<span id="4679">4679</span>
+<span id="4680">4680</span>
+<span id="4681">4681</span>
+<span id="4682">4682</span>
+<span id="4683">4683</span>
+<span id="4684">4684</span>
+<span id="4685">4685</span>
+<span id="4686">4686</span>
+<span id="4687">4687</span>
+<span id="4688">4688</span>
+<span id="4689">4689</span>
+<span id="4690">4690</span>
+<span id="4691">4691</span>
+<span id="4692">4692</span>
+<span id="4693">4693</span>
+<span id="4694">4694</span>
+<span id="4695">4695</span>
+<span id="4696">4696</span>
+<span id="4697">4697</span>
+<span id="4698">4698</span>
+<span id="4699">4699</span>
+<span id="4700">4700</span>
+<span id="4701">4701</span>
+<span id="4702">4702</span>
+<span id="4703">4703</span>
+<span id="4704">4704</span>
+<span id="4705">4705</span>
+<span id="4706">4706</span>
+<span id="4707">4707</span>
+<span id="4708">4708</span>
+<span id="4709">4709</span>
+<span id="4710">4710</span>
+<span id="4711">4711</span>
+<span id="4712">4712</span>
+<span id="4713">4713</span>
+<span id="4714">4714</span>
+<span id="4715">4715</span>
+<span id="4716">4716</span>
+<span id="4717">4717</span>
+<span id="4718">4718</span>
+<span id="4719">4719</span>
+<span id="4720">4720</span>
+<span id="4721">4721</span>
+<span id="4722">4722</span>
+<span id="4723">4723</span>
+<span id="4724">4724</span>
+<span id="4725">4725</span>
+<span id="4726">4726</span>
+<span id="4727">4727</span>
+<span id="4728">4728</span>
+<span id="4729">4729</span>
+<span id="4730">4730</span>
+<span id="4731">4731</span>
+<span id="4732">4732</span>
+<span id="4733">4733</span>
+<span id="4734">4734</span>
+<span id="4735">4735</span>
+<span id="4736">4736</span>
+<span id="4737">4737</span>
+<span id="4738">4738</span>
+<span id="4739">4739</span>
+<span id="4740">4740</span>
+<span id="4741">4741</span>
+<span id="4742">4742</span>
+<span id="4743">4743</span>
+<span id="4744">4744</span>
+<span id="4745">4745</span>
+<span id="4746">4746</span>
+<span id="4747">4747</span>
+<span id="4748">4748</span>
+<span id="4749">4749</span>
+<span id="4750">4750</span>
+<span id="4751">4751</span>
+<span id="4752">4752</span>
+<span id="4753">4753</span>
+<span id="4754">4754</span>
+<span id="4755">4755</span>
+<span id="4756">4756</span>
+<span id="4757">4757</span>
+<span id="4758">4758</span>
+<span id="4759">4759</span>
+<span id="4760">4760</span>
+<span id="4761">4761</span>
+<span id="4762">4762</span>
+<span id="4763">4763</span>
+<span id="4764">4764</span>
+<span id="4765">4765</span>
+<span id="4766">4766</span>
+<span id="4767">4767</span>
+<span id="4768">4768</span>
+<span id="4769">4769</span>
+<span id="4770">4770</span>
+<span id="4771">4771</span>
+<span id="4772">4772</span>
+<span id="4773">4773</span>
+<span id="4774">4774</span>
+<span id="4775">4775</span>
+<span id="4776">4776</span>
+<span id="4777">4777</span>
+<span id="4778">4778</span>
+<span id="4779">4779</span>
+<span id="4780">4780</span>
+<span id="4781">4781</span>
+<span id="4782">4782</span>
+<span id="4783">4783</span>
+<span id="4784">4784</span>
+<span id="4785">4785</span>
+<span id="4786">4786</span>
+<span id="4787">4787</span>
+<span id="4788">4788</span>
+<span id="4789">4789</span>
+<span id="4790">4790</span>
+<span id="4791">4791</span>
+<span id="4792">4792</span>
+<span id="4793">4793</span>
+<span id="4794">4794</span>
+<span id="4795">4795</span>
+<span id="4796">4796</span>
+<span id="4797">4797</span>
+<span id="4798">4798</span>
+<span id="4799">4799</span>
+<span id="4800">4800</span>
+<span id="4801">4801</span>
+<span id="4802">4802</span>
+<span id="4803">4803</span>
+<span id="4804">4804</span>
+<span id="4805">4805</span>
+<span id="4806">4806</span>
+<span id="4807">4807</span>
+<span id="4808">4808</span>
+<span id="4809">4809</span>
+<span id="4810">4810</span>
+<span id="4811">4811</span>
+<span id="4812">4812</span>
+<span id="4813">4813</span>
+<span id="4814">4814</span>
+<span id="4815">4815</span>
+<span id="4816">4816</span>
+<span id="4817">4817</span>
+<span id="4818">4818</span>
+<span id="4819">4819</span>
+<span id="4820">4820</span>
+<span id="4821">4821</span>
+<span id="4822">4822</span>
+<span id="4823">4823</span>
+<span id="4824">4824</span>
+<span id="4825">4825</span>
+<span id="4826">4826</span>
+<span id="4827">4827</span>
+<span id="4828">4828</span>
+<span id="4829">4829</span>
+<span id="4830">4830</span>
+<span id="4831">4831</span>
+<span id="4832">4832</span>
+<span id="4833">4833</span>
+<span id="4834">4834</span>
+<span id="4835">4835</span>
+<span id="4836">4836</span>
+<span id="4837">4837</span>
+<span id="4838">4838</span>
+<span id="4839">4839</span>
+<span id="4840">4840</span>
+<span id="4841">4841</span>
+<span id="4842">4842</span>
+<span id="4843">4843</span>
+<span id="4844">4844</span>
+<span id="4845">4845</span>
+<span id="4846">4846</span>
+<span id="4847">4847</span>
+<span id="4848">4848</span>
+<span id="4849">4849</span>
+<span id="4850">4850</span>
+<span id="4851">4851</span>
+<span id="4852">4852</span>
+<span id="4853">4853</span>
+<span id="4854">4854</span>
+<span id="4855">4855</span>
+<span id="4856">4856</span>
+<span id="4857">4857</span>
+<span id="4858">4858</span>
+<span id="4859">4859</span>
+<span id="4860">4860</span>
+<span id="4861">4861</span>
+<span id="4862">4862</span>
+<span id="4863">4863</span>
+<span id="4864">4864</span>
+<span id="4865">4865</span>
+<span id="4866">4866</span>
+<span id="4867">4867</span>
+<span id="4868">4868</span>
+<span id="4869">4869</span>
+<span id="4870">4870</span>
+<span id="4871">4871</span>
+<span id="4872">4872</span>
+<span id="4873">4873</span>
+<span id="4874">4874</span>
+<span id="4875">4875</span>
+<span id="4876">4876</span>
+<span id="4877">4877</span>
+<span id="4878">4878</span>
+<span id="4879">4879</span>
+<span id="4880">4880</span>
+<span id="4881">4881</span>
+<span id="4882">4882</span>
+<span id="4883">4883</span>
+<span id="4884">4884</span>
+<span id="4885">4885</span>
+<span id="4886">4886</span>
+<span id="4887">4887</span>
+<span id="4888">4888</span>
+<span id="4889">4889</span>
+<span id="4890">4890</span>
+<span id="4891">4891</span>
+<span id="4892">4892</span>
+<span id="4893">4893</span>
+<span id="4894">4894</span>
+<span id="4895">4895</span>
+<span id="4896">4896</span>
+<span id="4897">4897</span>
+<span id="4898">4898</span>
+<span id="4899">4899</span>
+<span id="4900">4900</span>
+<span id="4901">4901</span>
+<span id="4902">4902</span>
+<span id="4903">4903</span>
+<span id="4904">4904</span>
+<span id="4905">4905</span>
+<span id="4906">4906</span>
+<span id="4907">4907</span>
+<span id="4908">4908</span>
+<span id="4909">4909</span>
+<span id="4910">4910</span>
+<span id="4911">4911</span>
+<span id="4912">4912</span>
+<span id="4913">4913</span>
+<span id="4914">4914</span>
+<span id="4915">4915</span>
+<span id="4916">4916</span>
+<span id="4917">4917</span>
+<span id="4918">4918</span>
+<span id="4919">4919</span>
+<span id="4920">4920</span>
+<span id="4921">4921</span>
+<span id="4922">4922</span>
+<span id="4923">4923</span>
+<span id="4924">4924</span>
+<span id="4925">4925</span>
+<span id="4926">4926</span>
+<span id="4927">4927</span>
+<span id="4928">4928</span>
+<span id="4929">4929</span>
+<span id="4930">4930</span>
+<span id="4931">4931</span>
+<span id="4932">4932</span>
+<span id="4933">4933</span>
+<span id="4934">4934</span>
+<span id="4935">4935</span>
+<span id="4936">4936</span>
+<span id="4937">4937</span>
+<span id="4938">4938</span>
+<span id="4939">4939</span>
+<span id="4940">4940</span>
+<span id="4941">4941</span>
+<span id="4942">4942</span>
+<span id="4943">4943</span>
+<span id="4944">4944</span>
+<span id="4945">4945</span>
+<span id="4946">4946</span>
+<span id="4947">4947</span>
+<span id="4948">4948</span>
+<span id="4949">4949</span>
+<span id="4950">4950</span>
+<span id="4951">4951</span>
+<span id="4952">4952</span>
+<span id="4953">4953</span>
+<span id="4954">4954</span>
+<span id="4955">4955</span>
+<span id="4956">4956</span>
+<span id="4957">4957</span>
+<span id="4958">4958</span>
+<span id="4959">4959</span>
+<span id="4960">4960</span>
+<span id="4961">4961</span>
+<span id="4962">4962</span>
+<span id="4963">4963</span>
+<span id="4964">4964</span>
+<span id="4965">4965</span>
+<span id="4966">4966</span>
+<span id="4967">4967</span>
+<span id="4968">4968</span>
+<span id="4969">4969</span>
+<span id="4970">4970</span>
+<span id="4971">4971</span>
+<span id="4972">4972</span>
+<span id="4973">4973</span>
+<span id="4974">4974</span>
+<span id="4975">4975</span>
+<span id="4976">4976</span>
+<span id="4977">4977</span>
+<span id="4978">4978</span>
+<span id="4979">4979</span>
+<span id="4980">4980</span>
+<span id="4981">4981</span>
+<span id="4982">4982</span>
+<span id="4983">4983</span>
+<span id="4984">4984</span>
+<span id="4985">4985</span>
+<span id="4986">4986</span>
+<span id="4987">4987</span>
+<span id="4988">4988</span>
+<span id="4989">4989</span>
+<span id="4990">4990</span>
+<span id="4991">4991</span>
+<span id="4992">4992</span>
+<span id="4993">4993</span>
+<span id="4994">4994</span>
+<span id="4995">4995</span>
+<span id="4996">4996</span>
+<span id="4997">4997</span>
+<span id="4998">4998</span>
+<span id="4999">4999</span>
+<span id="5000">5000</span>
+<span id="5001">5001</span>
+<span id="5002">5002</span>
+<span id="5003">5003</span>
+<span id="5004">5004</span>
+<span id="5005">5005</span>
+<span id="5006">5006</span>
+<span id="5007">5007</span>
+<span id="5008">5008</span>
+<span id="5009">5009</span>
+<span id="5010">5010</span>
+<span id="5011">5011</span>
+<span id="5012">5012</span>
+<span id="5013">5013</span>
+<span id="5014">5014</span>
+<span id="5015">5015</span>
+<span id="5016">5016</span>
+<span id="5017">5017</span>
+<span id="5018">5018</span>
+<span id="5019">5019</span>
+<span id="5020">5020</span>
+<span id="5021">5021</span>
+<span id="5022">5022</span>
+<span id="5023">5023</span>
+<span id="5024">5024</span>
+<span id="5025">5025</span>
+<span id="5026">5026</span>
+<span id="5027">5027</span>
+<span id="5028">5028</span>
+<span id="5029">5029</span>
+<span id="5030">5030</span>
+<span id="5031">5031</span>
+<span id="5032">5032</span>
+<span id="5033">5033</span>
+<span id="5034">5034</span>
+<span id="5035">5035</span>
+<span id="5036">5036</span>
+<span id="5037">5037</span>
+<span id="5038">5038</span>
+<span id="5039">5039</span>
+<span id="5040">5040</span>
+<span id="5041">5041</span>
+<span id="5042">5042</span>
+<span id="5043">5043</span>
+<span id="5044">5044</span>
+<span id="5045">5045</span>
+<span id="5046">5046</span>
+<span id="5047">5047</span>
+<span id="5048">5048</span>
+<span id="5049">5049</span>
+<span id="5050">5050</span>
+<span id="5051">5051</span>
+<span id="5052">5052</span>
+<span id="5053">5053</span>
+<span id="5054">5054</span>
+<span id="5055">5055</span>
+<span id="5056">5056</span>
+<span id="5057">5057</span>
+<span id="5058">5058</span>
+<span id="5059">5059</span>
+<span id="5060">5060</span>
+<span id="5061">5061</span>
+<span id="5062">5062</span>
+<span id="5063">5063</span>
+<span id="5064">5064</span>
+<span id="5065">5065</span>
+<span id="5066">5066</span>
+<span id="5067">5067</span>
+<span id="5068">5068</span>
+<span id="5069">5069</span>
+<span id="5070">5070</span>
+<span id="5071">5071</span>
+<span id="5072">5072</span>
+<span id="5073">5073</span>
+<span id="5074">5074</span>
+<span id="5075">5075</span>
+<span id="5076">5076</span>
+<span id="5077">5077</span>
+<span id="5078">5078</span>
+<span id="5079">5079</span>
+<span id="5080">5080</span>
+<span id="5081">5081</span>
+<span id="5082">5082</span>
+<span id="5083">5083</span>
+<span id="5084">5084</span>
+<span id="5085">5085</span>
+<span id="5086">5086</span>
+<span id="5087">5087</span>
+<span id="5088">5088</span>
+<span id="5089">5089</span>
+<span id="5090">5090</span>
+<span id="5091">5091</span>
+<span id="5092">5092</span>
+<span id="5093">5093</span>
+<span id="5094">5094</span>
+<span id="5095">5095</span>
+<span id="5096">5096</span>
+<span id="5097">5097</span>
+<span id="5098">5098</span>
+<span id="5099">5099</span>
+<span id="5100">5100</span>
+<span id="5101">5101</span>
+<span id="5102">5102</span>
+<span id="5103">5103</span>
+<span id="5104">5104</span>
+<span id="5105">5105</span>
+<span id="5106">5106</span>
+<span id="5107">5107</span>
+<span id="5108">5108</span>
+<span id="5109">5109</span>
+<span id="5110">5110</span>
+<span id="5111">5111</span>
+<span id="5112">5112</span>
+<span id="5113">5113</span>
+<span id="5114">5114</span>
+<span id="5115">5115</span>
+<span id="5116">5116</span>
+<span id="5117">5117</span>
+<span id="5118">5118</span>
+<span id="5119">5119</span>
+<span id="5120">5120</span>
+<span id="5121">5121</span>
+<span id="5122">5122</span>
+<span id="5123">5123</span>
+<span id="5124">5124</span>
+<span id="5125">5125</span>
+<span id="5126">5126</span>
+<span id="5127">5127</span>
+<span id="5128">5128</span>
+<span id="5129">5129</span>
+<span id="5130">5130</span>
+<span id="5131">5131</span>
+<span id="5132">5132</span>
+<span id="5133">5133</span>
+<span id="5134">5134</span>
+<span id="5135">5135</span>
+<span id="5136">5136</span>
+<span id="5137">5137</span>
+<span id="5138">5138</span>
+<span id="5139">5139</span>
+<span id="5140">5140</span>
+<span id="5141">5141</span>
+<span id="5142">5142</span>
+<span id="5143">5143</span>
+<span id="5144">5144</span>
+<span id="5145">5145</span>
+<span id="5146">5146</span>
+<span id="5147">5147</span>
+<span id="5148">5148</span>
+<span id="5149">5149</span>
+<span id="5150">5150</span>
+<span id="5151">5151</span>
+<span id="5152">5152</span>
+<span id="5153">5153</span>
+<span id="5154">5154</span>
+<span id="5155">5155</span>
+<span id="5156">5156</span>
+<span id="5157">5157</span>
+<span id="5158">5158</span>
+<span id="5159">5159</span>
+<span id="5160">5160</span>
+<span id="5161">5161</span>
+<span id="5162">5162</span>
+<span id="5163">5163</span>
+<span id="5164">5164</span>
+<span id="5165">5165</span>
+<span id="5166">5166</span>
+<span id="5167">5167</span>
+<span id="5168">5168</span>
+<span id="5169">5169</span>
+<span id="5170">5170</span>
+<span id="5171">5171</span>
+<span id="5172">5172</span>
+<span id="5173">5173</span>
+<span id="5174">5174</span>
+<span id="5175">5175</span>
+<span id="5176">5176</span>
+<span id="5177">5177</span>
+<span id="5178">5178</span>
+<span id="5179">5179</span>
+<span id="5180">5180</span>
+<span id="5181">5181</span>
+<span id="5182">5182</span>
+<span id="5183">5183</span>
+<span id="5184">5184</span>
+<span id="5185">5185</span>
+<span id="5186">5186</span>
+<span id="5187">5187</span>
+<span id="5188">5188</span>
+<span id="5189">5189</span>
+<span id="5190">5190</span>
+<span id="5191">5191</span>
+<span id="5192">5192</span>
+<span id="5193">5193</span>
+<span id="5194">5194</span>
+<span id="5195">5195</span>
+<span id="5196">5196</span>
+<span id="5197">5197</span>
+<span id="5198">5198</span>
+<span id="5199">5199</span>
+<span id="5200">5200</span>
+<span id="5201">5201</span>
+<span id="5202">5202</span>
+<span id="5203">5203</span>
+<span id="5204">5204</span>
+<span id="5205">5205</span>
+<span id="5206">5206</span>
+<span id="5207">5207</span>
+<span id="5208">5208</span>
+<span id="5209">5209</span>
+<span id="5210">5210</span>
+<span id="5211">5211</span>
+<span id="5212">5212</span>
+<span id="5213">5213</span>
+<span id="5214">5214</span>
+<span id="5215">5215</span>
+<span id="5216">5216</span>
+<span id="5217">5217</span>
+<span id="5218">5218</span>
+<span id="5219">5219</span>
+<span id="5220">5220</span>
+<span id="5221">5221</span>
+<span id="5222">5222</span>
+<span id="5223">5223</span>
+<span id="5224">5224</span>
+<span id="5225">5225</span>
+<span id="5226">5226</span>
+<span id="5227">5227</span>
+<span id="5228">5228</span>
+<span id="5229">5229</span>
+<span id="5230">5230</span>
+<span id="5231">5231</span>
+<span id="5232">5232</span>
+<span id="5233">5233</span>
+<span id="5234">5234</span>
+<span id="5235">5235</span>
+<span id="5236">5236</span>
+<span id="5237">5237</span>
+<span id="5238">5238</span>
+<span id="5239">5239</span>
+<span id="5240">5240</span>
+<span id="5241">5241</span>
+<span id="5242">5242</span>
+<span id="5243">5243</span>
+<span id="5244">5244</span>
+<span id="5245">5245</span>
+<span id="5246">5246</span>
+<span id="5247">5247</span>
+<span id="5248">5248</span>
+<span id="5249">5249</span>
+<span id="5250">5250</span>
+<span id="5251">5251</span>
+<span id="5252">5252</span>
+<span id="5253">5253</span>
+<span id="5254">5254</span>
+<span id="5255">5255</span>
+<span id="5256">5256</span>
+<span id="5257">5257</span>
+<span id="5258">5258</span>
+<span id="5259">5259</span>
+<span id="5260">5260</span>
+<span id="5261">5261</span>
+<span id="5262">5262</span>
+<span id="5263">5263</span>
+<span id="5264">5264</span>
+<span id="5265">5265</span>
+<span id="5266">5266</span>
+<span id="5267">5267</span>
+<span id="5268">5268</span>
+<span id="5269">5269</span>
+<span id="5270">5270</span>
+<span id="5271">5271</span>
+<span id="5272">5272</span>
+<span id="5273">5273</span>
+<span id="5274">5274</span>
+<span id="5275">5275</span>
+<span id="5276">5276</span>
+<span id="5277">5277</span>
+<span id="5278">5278</span>
+<span id="5279">5279</span>
+<span id="5280">5280</span>
+<span id="5281">5281</span>
+<span id="5282">5282</span>
+<span id="5283">5283</span>
+<span id="5284">5284</span>
+<span id="5285">5285</span>
+<span id="5286">5286</span>
+<span id="5287">5287</span>
+<span id="5288">5288</span>
+<span id="5289">5289</span>
+<span id="5290">5290</span>
+<span id="5291">5291</span>
+<span id="5292">5292</span>
+<span id="5293">5293</span>
+<span id="5294">5294</span>
+<span id="5295">5295</span>
+<span id="5296">5296</span>
+<span id="5297">5297</span>
+<span id="5298">5298</span>
+<span id="5299">5299</span>
+<span id="5300">5300</span>
+<span id="5301">5301</span>
+<span id="5302">5302</span>
+<span id="5303">5303</span>
+<span id="5304">5304</span>
+<span id="5305">5305</span>
+<span id="5306">5306</span>
+<span id="5307">5307</span>
+<span id="5308">5308</span>
+<span id="5309">5309</span>
+<span id="5310">5310</span>
+<span id="5311">5311</span>
+<span id="5312">5312</span>
+<span id="5313">5313</span>
+<span id="5314">5314</span>
+<span id="5315">5315</span>
+<span id="5316">5316</span>
+<span id="5317">5317</span>
+<span id="5318">5318</span>
+<span id="5319">5319</span>
+<span id="5320">5320</span>
+<span id="5321">5321</span>
+<span id="5322">5322</span>
+<span id="5323">5323</span>
+<span id="5324">5324</span>
+<span id="5325">5325</span>
+<span id="5326">5326</span>
+<span id="5327">5327</span>
+<span id="5328">5328</span>
+<span id="5329">5329</span>
+<span id="5330">5330</span>
+<span id="5331">5331</span>
+<span id="5332">5332</span>
+<span id="5333">5333</span>
+<span id="5334">5334</span>
+<span id="5335">5335</span>
+<span id="5336">5336</span>
+<span id="5337">5337</span>
+<span id="5338">5338</span>
+<span id="5339">5339</span>
+<span id="5340">5340</span>
+<span id="5341">5341</span>
+<span id="5342">5342</span>
+<span id="5343">5343</span>
+<span id="5344">5344</span>
+<span id="5345">5345</span>
+<span id="5346">5346</span>
+<span id="5347">5347</span>
+<span id="5348">5348</span>
+<span id="5349">5349</span>
+<span id="5350">5350</span>
+<span id="5351">5351</span>
+<span id="5352">5352</span>
+<span id="5353">5353</span>
+<span id="5354">5354</span>
+<span id="5355">5355</span>
+<span id="5356">5356</span>
+<span id="5357">5357</span>
+<span id="5358">5358</span>
+<span id="5359">5359</span>
+<span id="5360">5360</span>
+<span id="5361">5361</span>
+<span id="5362">5362</span>
+<span id="5363">5363</span>
+<span id="5364">5364</span>
+<span id="5365">5365</span>
+<span id="5366">5366</span>
+<span id="5367">5367</span>
+<span id="5368">5368</span>
+<span id="5369">5369</span>
+<span id="5370">5370</span>
+<span id="5371">5371</span>
+<span id="5372">5372</span>
+<span id="5373">5373</span>
+<span id="5374">5374</span>
+<span id="5375">5375</span>
+<span id="5376">5376</span>
+<span id="5377">5377</span>
+<span id="5378">5378</span>
+<span id="5379">5379</span>
+<span id="5380">5380</span>
+<span id="5381">5381</span>
+<span id="5382">5382</span>
+<span id="5383">5383</span>
+<span id="5384">5384</span>
+<span id="5385">5385</span>
+<span id="5386">5386</span>
+<span id="5387">5387</span>
+<span id="5388">5388</span>
+<span id="5389">5389</span>
+<span id="5390">5390</span>
+<span id="5391">5391</span>
+<span id="5392">5392</span>
+<span id="5393">5393</span>
+<span id="5394">5394</span>
+<span id="5395">5395</span>
+<span id="5396">5396</span>
+<span id="5397">5397</span>
+<span id="5398">5398</span>
+<span id="5399">5399</span>
+<span id="5400">5400</span>
+<span id="5401">5401</span>
+<span id="5402">5402</span>
+<span id="5403">5403</span>
+<span id="5404">5404</span>
+<span id="5405">5405</span>
+<span id="5406">5406</span>
+<span id="5407">5407</span>
+<span id="5408">5408</span>
+<span id="5409">5409</span>
+<span id="5410">5410</span>
+<span id="5411">5411</span>
+<span id="5412">5412</span>
+<span id="5413">5413</span>
+<span id="5414">5414</span>
+<span id="5415">5415</span>
+<span id="5416">5416</span>
+<span id="5417">5417</span>
+<span id="5418">5418</span>
+<span id="5419">5419</span>
+<span id="5420">5420</span>
+<span id="5421">5421</span>
+<span id="5422">5422</span>
+<span id="5423">5423</span>
+<span id="5424">5424</span>
+<span id="5425">5425</span>
+<span id="5426">5426</span>
+<span id="5427">5427</span>
+<span id="5428">5428</span>
+<span id="5429">5429</span>
+<span id="5430">5430</span>
+<span id="5431">5431</span>
+<span id="5432">5432</span>
+<span id="5433">5433</span>
+<span id="5434">5434</span>
+<span id="5435">5435</span>
+<span id="5436">5436</span>
+<span id="5437">5437</span>
+<span id="5438">5438</span>
+<span id="5439">5439</span>
+<span id="5440">5440</span>
+<span id="5441">5441</span>
+<span id="5442">5442</span>
+<span id="5443">5443</span>
+<span id="5444">5444</span>
+<span id="5445">5445</span>
+<span id="5446">5446</span>
+<span id="5447">5447</span>
+<span id="5448">5448</span>
+<span id="5449">5449</span>
+<span id="5450">5450</span>
+<span id="5451">5451</span>
+<span id="5452">5452</span>
+<span id="5453">5453</span>
+<span id="5454">5454</span>
+<span id="5455">5455</span>
+<span id="5456">5456</span>
+<span id="5457">5457</span>
+<span id="5458">5458</span>
+<span id="5459">5459</span>
+<span id="5460">5460</span>
+<span id="5461">5461</span>
+<span id="5462">5462</span>
+<span id="5463">5463</span>
+<span id="5464">5464</span>
+<span id="5465">5465</span>
+<span id="5466">5466</span>
+<span id="5467">5467</span>
+<span id="5468">5468</span>
+<span id="5469">5469</span>
+<span id="5470">5470</span>
+<span id="5471">5471</span>
+<span id="5472">5472</span>
+<span id="5473">5473</span>
+<span id="5474">5474</span>
+<span id="5475">5475</span>
+<span id="5476">5476</span>
+<span id="5477">5477</span>
+<span id="5478">5478</span>
+<span id="5479">5479</span>
+<span id="5480">5480</span>
+<span id="5481">5481</span>
+<span id="5482">5482</span>
+<span id="5483">5483</span>
+<span id="5484">5484</span>
+<span id="5485">5485</span>
+<span id="5486">5486</span>
+<span id="5487">5487</span>
+<span id="5488">5488</span>
+<span id="5489">5489</span>
+<span id="5490">5490</span>
+<span id="5491">5491</span>
+<span id="5492">5492</span>
+<span id="5493">5493</span>
+<span id="5494">5494</span>
+<span id="5495">5495</span>
+<span id="5496">5496</span>
+<span id="5497">5497</span>
+<span id="5498">5498</span>
+<span id="5499">5499</span>
+<span id="5500">5500</span>
+<span id="5501">5501</span>
+<span id="5502">5502</span>
+<span id="5503">5503</span>
+<span id="5504">5504</span>
+<span id="5505">5505</span>
+<span id="5506">5506</span>
+<span id="5507">5507</span>
+<span id="5508">5508</span>
+<span id="5509">5509</span>
+<span id="5510">5510</span>
+<span id="5511">5511</span>
+<span id="5512">5512</span>
+<span id="5513">5513</span>
+<span id="5514">5514</span>
+<span id="5515">5515</span>
+<span id="5516">5516</span>
+<span id="5517">5517</span>
+<span id="5518">5518</span>
+<span id="5519">5519</span>
+<span id="5520">5520</span>
+<span id="5521">5521</span>
+<span id="5522">5522</span>
+<span id="5523">5523</span>
+<span id="5524">5524</span>
+<span id="5525">5525</span>
+<span id="5526">5526</span>
+<span id="5527">5527</span>
+<span id="5528">5528</span>
+<span id="5529">5529</span>
+<span id="5530">5530</span>
+<span id="5531">5531</span>
+<span id="5532">5532</span>
+<span id="5533">5533</span>
+<span id="5534">5534</span>
+<span id="5535">5535</span>
+<span id="5536">5536</span>
+<span id="5537">5537</span>
+<span id="5538">5538</span>
+<span id="5539">5539</span>
+<span id="5540">5540</span>
+<span id="5541">5541</span>
+<span id="5542">5542</span>
+<span id="5543">5543</span>
+<span id="5544">5544</span>
+<span id="5545">5545</span>
+<span id="5546">5546</span>
+<span id="5547">5547</span>
+<span id="5548">5548</span>
+<span id="5549">5549</span>
+<span id="5550">5550</span>
+<span id="5551">5551</span>
+<span id="5552">5552</span>
+<span id="5553">5553</span>
+<span id="5554">5554</span>
+<span id="5555">5555</span>
+<span id="5556">5556</span>
+<span id="5557">5557</span>
+<span id="5558">5558</span>
+<span id="5559">5559</span>
+<span id="5560">5560</span>
+<span id="5561">5561</span>
+<span id="5562">5562</span>
+<span id="5563">5563</span>
+<span id="5564">5564</span>
+<span id="5565">5565</span>
+<span id="5566">5566</span>
+<span id="5567">5567</span>
+<span id="5568">5568</span>
+<span id="5569">5569</span>
+<span id="5570">5570</span>
+<span id="5571">5571</span>
+<span id="5572">5572</span>
+<span id="5573">5573</span>
+<span id="5574">5574</span>
+<span id="5575">5575</span>
+<span id="5576">5576</span>
+<span id="5577">5577</span>
+<span id="5578">5578</span>
+<span id="5579">5579</span>
+<span id="5580">5580</span>
+<span id="5581">5581</span>
+<span id="5582">5582</span>
+<span id="5583">5583</span>
+<span id="5584">5584</span>
+<span id="5585">5585</span>
+<span id="5586">5586</span>
+<span id="5587">5587</span>
+<span id="5588">5588</span>
+<span id="5589">5589</span>
+<span id="5590">5590</span>
+<span id="5591">5591</span>
+<span id="5592">5592</span>
+<span id="5593">5593</span>
+<span id="5594">5594</span>
+<span id="5595">5595</span>
+<span id="5596">5596</span>
+<span id="5597">5597</span>
+<span id="5598">5598</span>
+<span id="5599">5599</span>
+<span id="5600">5600</span>
+<span id="5601">5601</span>
+<span id="5602">5602</span>
+<span id="5603">5603</span>
+<span id="5604">5604</span>
+<span id="5605">5605</span>
+<span id="5606">5606</span>
+<span id="5607">5607</span>
+<span id="5608">5608</span>
+<span id="5609">5609</span>
+<span id="5610">5610</span>
+<span id="5611">5611</span>
+<span id="5612">5612</span>
+<span id="5613">5613</span>
+<span id="5614">5614</span>
+<span id="5615">5615</span>
+<span id="5616">5616</span>
+<span id="5617">5617</span>
+<span id="5618">5618</span>
+<span id="5619">5619</span>
+<span id="5620">5620</span>
+<span id="5621">5621</span>
+<span id="5622">5622</span>
+<span id="5623">5623</span>
+<span id="5624">5624</span>
+<span id="5625">5625</span>
+<span id="5626">5626</span>
+<span id="5627">5627</span>
+<span id="5628">5628</span>
+<span id="5629">5629</span>
+<span id="5630">5630</span>
+<span id="5631">5631</span>
+<span id="5632">5632</span>
+<span id="5633">5633</span>
+<span id="5634">5634</span>
+<span id="5635">5635</span>
+<span id="5636">5636</span>
+<span id="5637">5637</span>
+<span id="5638">5638</span>
+<span id="5639">5639</span>
+<span id="5640">5640</span>
+<span id="5641">5641</span>
+<span id="5642">5642</span>
+<span id="5643">5643</span>
+<span id="5644">5644</span>
+<span id="5645">5645</span>
+<span id="5646">5646</span>
+<span id="5647">5647</span>
+<span id="5648">5648</span>
+<span id="5649">5649</span>
+<span id="5650">5650</span>
+<span id="5651">5651</span>
+<span id="5652">5652</span>
+<span id="5653">5653</span>
+<span id="5654">5654</span>
+<span id="5655">5655</span>
+<span id="5656">5656</span>
+<span id="5657">5657</span>
+<span id="5658">5658</span>
+<span id="5659">5659</span>
+<span id="5660">5660</span>
+<span id="5661">5661</span>
+<span id="5662">5662</span>
+<span id="5663">5663</span>
+<span id="5664">5664</span>
+<span id="5665">5665</span>
+<span id="5666">5666</span>
+<span id="5667">5667</span>
+<span id="5668">5668</span>
+<span id="5669">5669</span>
+<span id="5670">5670</span>
+<span id="5671">5671</span>
+<span id="5672">5672</span>
+<span id="5673">5673</span>
+<span id="5674">5674</span>
+<span id="5675">5675</span>
+<span id="5676">5676</span>
+<span id="5677">5677</span>
+<span id="5678">5678</span>
+<span id="5679">5679</span>
+<span id="5680">5680</span>
+<span id="5681">5681</span>
+<span id="5682">5682</span>
+<span id="5683">5683</span>
+<span id="5684">5684</span>
+<span id="5685">5685</span>
+<span id="5686">5686</span>
+<span id="5687">5687</span>
+<span id="5688">5688</span>
+<span id="5689">5689</span>
+<span id="5690">5690</span>
+<span id="5691">5691</span>
+<span id="5692">5692</span>
+<span id="5693">5693</span>
+<span id="5694">5694</span>
+<span id="5695">5695</span>
+<span id="5696">5696</span>
+<span id="5697">5697</span>
+<span id="5698">5698</span>
+<span id="5699">5699</span>
+<span id="5700">5700</span>
+<span id="5701">5701</span>
+<span id="5702">5702</span>
+<span id="5703">5703</span>
+<span id="5704">5704</span>
+<span id="5705">5705</span>
+<span id="5706">5706</span>
+<span id="5707">5707</span>
+<span id="5708">5708</span>
+<span id="5709">5709</span>
+<span id="5710">5710</span>
+<span id="5711">5711</span>
+<span id="5712">5712</span>
+<span id="5713">5713</span>
+<span id="5714">5714</span>
+<span id="5715">5715</span>
+<span id="5716">5716</span>
+<span id="5717">5717</span>
+<span id="5718">5718</span>
+<span id="5719">5719</span>
+<span id="5720">5720</span>
+<span id="5721">5721</span>
+<span id="5722">5722</span>
+<span id="5723">5723</span>
+<span id="5724">5724</span>
+<span id="5725">5725</span>
+<span id="5726">5726</span>
+<span id="5727">5727</span>
+<span id="5728">5728</span>
+<span id="5729">5729</span>
+<span id="5730">5730</span>
+<span id="5731">5731</span>
+<span id="5732">5732</span>
+<span id="5733">5733</span>
+<span id="5734">5734</span>
+<span id="5735">5735</span>
+<span id="5736">5736</span>
+<span id="5737">5737</span>
+<span id="5738">5738</span>
+<span id="5739">5739</span>
+<span id="5740">5740</span>
+<span id="5741">5741</span>
+<span id="5742">5742</span>
+<span id="5743">5743</span>
+<span id="5744">5744</span>
+<span id="5745">5745</span>
+<span id="5746">5746</span>
+<span id="5747">5747</span>
+<span id="5748">5748</span>
+<span id="5749">5749</span>
+<span id="5750">5750</span>
+<span id="5751">5751</span>
+<span id="5752">5752</span>
+<span id="5753">5753</span>
+<span id="5754">5754</span>
+<span id="5755">5755</span>
+<span id="5756">5756</span>
+<span id="5757">5757</span>
+<span id="5758">5758</span>
+<span id="5759">5759</span>
+<span id="5760">5760</span>
+<span id="5761">5761</span>
+<span id="5762">5762</span>
+<span id="5763">5763</span>
+<span id="5764">5764</span>
+<span id="5765">5765</span>
+<span id="5766">5766</span>
+<span id="5767">5767</span>
+<span id="5768">5768</span>
+<span id="5769">5769</span>
+<span id="5770">5770</span>
+<span id="5771">5771</span>
+<span id="5772">5772</span>
+<span id="5773">5773</span>
+<span id="5774">5774</span>
+<span id="5775">5775</span>
+<span id="5776">5776</span>
+<span id="5777">5777</span>
+<span id="5778">5778</span>
+<span id="5779">5779</span>
+<span id="5780">5780</span>
+<span id="5781">5781</span>
+<span id="5782">5782</span>
+<span id="5783">5783</span>
+<span id="5784">5784</span>
+<span id="5785">5785</span>
+<span id="5786">5786</span>
+<span id="5787">5787</span>
+<span id="5788">5788</span>
+<span id="5789">5789</span>
+<span id="5790">5790</span>
+<span id="5791">5791</span>
+<span id="5792">5792</span>
+<span id="5793">5793</span>
+<span id="5794">5794</span>
+<span id="5795">5795</span>
+<span id="5796">5796</span>
+<span id="5797">5797</span>
+<span id="5798">5798</span>
+<span id="5799">5799</span>
+<span id="5800">5800</span>
+<span id="5801">5801</span>
+<span id="5802">5802</span>
+<span id="5803">5803</span>
+<span id="5804">5804</span>
+<span id="5805">5805</span>
+<span id="5806">5806</span>
+<span id="5807">5807</span>
+<span id="5808">5808</span>
+<span id="5809">5809</span>
+<span id="5810">5810</span>
+<span id="5811">5811</span>
+<span id="5812">5812</span>
+<span id="5813">5813</span>
+<span id="5814">5814</span>
+<span id="5815">5815</span>
+<span id="5816">5816</span>
+<span id="5817">5817</span>
+<span id="5818">5818</span>
+<span id="5819">5819</span>
+<span id="5820">5820</span>
+<span id="5821">5821</span>
+<span id="5822">5822</span>
+<span id="5823">5823</span>
+<span id="5824">5824</span>
+<span id="5825">5825</span>
+<span id="5826">5826</span>
+<span id="5827">5827</span>
+<span id="5828">5828</span>
+<span id="5829">5829</span>
+<span id="5830">5830</span>
+<span id="5831">5831</span>
+<span id="5832">5832</span>
+<span id="5833">5833</span>
+<span id="5834">5834</span>
+<span id="5835">5835</span>
+<span id="5836">5836</span>
+<span id="5837">5837</span>
+<span id="5838">5838</span>
+<span id="5839">5839</span>
+<span id="5840">5840</span>
+<span id="5841">5841</span>
+<span id="5842">5842</span>
+<span id="5843">5843</span>
+<span id="5844">5844</span>
+<span id="5845">5845</span>
+<span id="5846">5846</span>
+<span id="5847">5847</span>
+<span id="5848">5848</span>
+<span id="5849">5849</span>
+<span id="5850">5850</span>
+<span id="5851">5851</span>
+<span id="5852">5852</span>
+<span id="5853">5853</span>
+<span id="5854">5854</span>
+<span id="5855">5855</span>
+<span id="5856">5856</span>
+<span id="5857">5857</span>
+<span id="5858">5858</span>
+<span id="5859">5859</span>
+<span id="5860">5860</span>
+<span id="5861">5861</span>
+<span id="5862">5862</span>
+<span id="5863">5863</span>
+<span id="5864">5864</span>
+<span id="5865">5865</span>
+<span id="5866">5866</span>
+<span id="5867">5867</span>
+<span id="5868">5868</span>
+<span id="5869">5869</span>
+<span id="5870">5870</span>
+<span id="5871">5871</span>
+<span id="5872">5872</span>
+<span id="5873">5873</span>
+<span id="5874">5874</span>
+<span id="5875">5875</span>
+<span id="5876">5876</span>
+<span id="5877">5877</span>
+<span id="5878">5878</span>
+<span id="5879">5879</span>
+<span id="5880">5880</span>
+<span id="5881">5881</span>
+<span id="5882">5882</span>
+<span id="5883">5883</span>
+<span id="5884">5884</span>
+<span id="5885">5885</span>
+<span id="5886">5886</span>
+<span id="5887">5887</span>
+<span id="5888">5888</span>
+<span id="5889">5889</span>
+<span id="5890">5890</span>
+<span id="5891">5891</span>
+<span id="5892">5892</span>
+<span id="5893">5893</span>
+<span id="5894">5894</span>
+<span id="5895">5895</span>
+<span id="5896">5896</span>
+<span id="5897">5897</span>
+<span id="5898">5898</span>
+<span id="5899">5899</span>
+<span id="5900">5900</span>
+<span id="5901">5901</span>
+<span id="5902">5902</span>
+<span id="5903">5903</span>
+<span id="5904">5904</span>
+<span id="5905">5905</span>
+<span id="5906">5906</span>
+<span id="5907">5907</span>
+<span id="5908">5908</span>
+<span id="5909">5909</span>
+<span id="5910">5910</span>
+<span id="5911">5911</span>
+<span id="5912">5912</span>
+<span id="5913">5913</span>
+<span id="5914">5914</span>
+<span id="5915">5915</span>
+<span id="5916">5916</span>
+<span id="5917">5917</span>
+<span id="5918">5918</span>
+<span id="5919">5919</span>
+<span id="5920">5920</span>
+<span id="5921">5921</span>
+<span id="5922">5922</span>
+<span id="5923">5923</span>
+<span id="5924">5924</span>
+<span id="5925">5925</span>
+<span id="5926">5926</span>
+<span id="5927">5927</span>
+<span id="5928">5928</span>
+<span id="5929">5929</span>
+<span id="5930">5930</span>
+<span id="5931">5931</span>
+<span id="5932">5932</span>
+<span id="5933">5933</span>
+<span id="5934">5934</span>
+<span id="5935">5935</span>
+<span id="5936">5936</span>
+<span id="5937">5937</span>
+<span id="5938">5938</span>
+<span id="5939">5939</span>
+<span id="5940">5940</span>
+<span id="5941">5941</span>
+<span id="5942">5942</span>
+<span id="5943">5943</span>
+<span id="5944">5944</span>
+<span id="5945">5945</span>
+<span id="5946">5946</span>
+<span id="5947">5947</span>
+<span id="5948">5948</span>
+<span id="5949">5949</span>
+<span id="5950">5950</span>
+<span id="5951">5951</span>
+<span id="5952">5952</span>
+<span id="5953">5953</span>
+<span id="5954">5954</span>
+<span id="5955">5955</span>
+<span id="5956">5956</span>
+<span id="5957">5957</span>
+<span id="5958">5958</span>
+<span id="5959">5959</span>
+<span id="5960">5960</span>
+<span id="5961">5961</span>
+<span id="5962">5962</span>
+<span id="5963">5963</span>
+<span id="5964">5964</span>
+<span id="5965">5965</span>
+<span id="5966">5966</span>
+<span id="5967">5967</span>
+<span id="5968">5968</span>
+<span id="5969">5969</span>
+<span id="5970">5970</span>
+<span id="5971">5971</span>
+<span id="5972">5972</span>
+<span id="5973">5973</span>
+<span id="5974">5974</span>
+<span id="5975">5975</span>
+<span id="5976">5976</span>
+<span id="5977">5977</span>
+<span id="5978">5978</span>
+<span id="5979">5979</span>
+<span id="5980">5980</span>
+<span id="5981">5981</span>
+<span id="5982">5982</span>
+<span id="5983">5983</span>
+<span id="5984">5984</span>
+<span id="5985">5985</span>
+<span id="5986">5986</span>
+<span id="5987">5987</span>
+<span id="5988">5988</span>
+<span id="5989">5989</span>
+<span id="5990">5990</span>
+<span id="5991">5991</span>
+<span id="5992">5992</span>
+<span id="5993">5993</span>
+<span id="5994">5994</span>
+<span id="5995">5995</span>
+<span id="5996">5996</span>
+<span id="5997">5997</span>
+<span id="5998">5998</span>
+<span id="5999">5999</span>
+<span id="6000">6000</span>
+<span id="6001">6001</span>
+<span id="6002">6002</span>
+<span id="6003">6003</span>
+<span id="6004">6004</span>
+<span id="6005">6005</span>
+<span id="6006">6006</span>
+<span id="6007">6007</span>
+<span id="6008">6008</span>
+<span id="6009">6009</span>
+<span id="6010">6010</span>
+<span id="6011">6011</span>
+<span id="6012">6012</span>
+<span id="6013">6013</span>
+<span id="6014">6014</span>
+<span id="6015">6015</span>
+<span id="6016">6016</span>
+<span id="6017">6017</span>
+<span id="6018">6018</span>
+<span id="6019">6019</span>
+<span id="6020">6020</span>
+<span id="6021">6021</span>
+<span id="6022">6022</span>
+<span id="6023">6023</span>
+<span id="6024">6024</span>
+<span id="6025">6025</span>
+<span id="6026">6026</span>
+<span id="6027">6027</span>
+<span id="6028">6028</span>
+<span id="6029">6029</span>
+<span id="6030">6030</span>
+<span id="6031">6031</span>
+<span id="6032">6032</span>
+<span id="6033">6033</span>
+<span id="6034">6034</span>
+<span id="6035">6035</span>
+<span id="6036">6036</span>
+<span id="6037">6037</span>
+<span id="6038">6038</span>
+<span id="6039">6039</span>
+<span id="6040">6040</span>
+<span id="6041">6041</span>
+<span id="6042">6042</span>
+<span id="6043">6043</span>
+<span id="6044">6044</span>
+<span id="6045">6045</span>
+<span id="6046">6046</span>
+<span id="6047">6047</span>
+<span id="6048">6048</span>
+<span id="6049">6049</span>
+<span id="6050">6050</span>
+<span id="6051">6051</span>
+<span id="6052">6052</span>
+<span id="6053">6053</span>
+<span id="6054">6054</span>
+<span id="6055">6055</span>
+<span id="6056">6056</span>
+<span id="6057">6057</span>
+<span id="6058">6058</span>
+<span id="6059">6059</span>
+<span id="6060">6060</span>
+<span id="6061">6061</span>
+<span id="6062">6062</span>
+<span id="6063">6063</span>
+<span id="6064">6064</span>
+<span id="6065">6065</span>
+<span id="6066">6066</span>
+<span id="6067">6067</span>
+<span id="6068">6068</span>
+<span id="6069">6069</span>
+<span id="6070">6070</span>
+<span id="6071">6071</span>
+<span id="6072">6072</span>
+<span id="6073">6073</span>
+<span id="6074">6074</span>
+<span id="6075">6075</span>
+<span id="6076">6076</span>
+<span id="6077">6077</span>
+<span id="6078">6078</span>
+<span id="6079">6079</span>
+<span id="6080">6080</span>
+<span id="6081">6081</span>
+<span id="6082">6082</span>
+<span id="6083">6083</span>
+<span id="6084">6084</span>
+<span id="6085">6085</span>
+<span id="6086">6086</span>
+<span id="6087">6087</span>
+<span id="6088">6088</span>
+<span id="6089">6089</span>
+<span id="6090">6090</span>
+<span id="6091">6091</span>
+<span id="6092">6092</span>
+<span id="6093">6093</span>
+<span id="6094">6094</span>
+<span id="6095">6095</span>
+<span id="6096">6096</span>
+<span id="6097">6097</span>
+<span id="6098">6098</span>
+<span id="6099">6099</span>
+<span id="6100">6100</span>
+<span id="6101">6101</span>
+<span id="6102">6102</span>
+<span id="6103">6103</span>
+<span id="6104">6104</span>
+<span id="6105">6105</span>
+<span id="6106">6106</span>
+<span id="6107">6107</span>
+<span id="6108">6108</span>
+<span id="6109">6109</span>
+<span id="6110">6110</span>
+<span id="6111">6111</span>
+<span id="6112">6112</span>
+<span id="6113">6113</span>
+<span id="6114">6114</span>
+<span id="6115">6115</span>
+<span id="6116">6116</span>
+<span id="6117">6117</span>
+<span id="6118">6118</span>
+<span id="6119">6119</span>
+<span id="6120">6120</span>
+<span id="6121">6121</span>
+<span id="6122">6122</span>
+<span id="6123">6123</span>
+<span id="6124">6124</span>
+<span id="6125">6125</span>
+<span id="6126">6126</span>
+<span id="6127">6127</span>
+<span id="6128">6128</span>
+<span id="6129">6129</span>
+<span id="6130">6130</span>
+<span id="6131">6131</span>
+<span id="6132">6132</span>
+<span id="6133">6133</span>
+<span id="6134">6134</span>
+<span id="6135">6135</span>
+<span id="6136">6136</span>
+<span id="6137">6137</span>
+<span id="6138">6138</span>
+<span id="6139">6139</span>
+<span id="6140">6140</span>
+<span id="6141">6141</span>
+<span id="6142">6142</span>
+<span id="6143">6143</span>
+<span id="6144">6144</span>
+<span id="6145">6145</span>
+<span id="6146">6146</span>
+<span id="6147">6147</span>
+<span id="6148">6148</span>
+<span id="6149">6149</span>
+<span id="6150">6150</span>
+<span id="6151">6151</span>
+<span id="6152">6152</span>
+<span id="6153">6153</span>
+<span id="6154">6154</span>
+<span id="6155">6155</span>
+<span id="6156">6156</span>
+<span id="6157">6157</span>
+<span id="6158">6158</span>
+<span id="6159">6159</span>
+<span id="6160">6160</span>
+<span id="6161">6161</span>
+<span id="6162">6162</span>
+<span id="6163">6163</span>
+<span id="6164">6164</span>
+<span id="6165">6165</span>
+<span id="6166">6166</span>
+<span id="6167">6167</span>
+<span id="6168">6168</span>
+<span id="6169">6169</span>
+<span id="6170">6170</span>
+<span id="6171">6171</span>
+<span id="6172">6172</span>
+<span id="6173">6173</span>
+<span id="6174">6174</span>
+<span id="6175">6175</span>
+<span id="6176">6176</span>
+<span id="6177">6177</span>
+<span id="6178">6178</span>
+<span id="6179">6179</span>
+<span id="6180">6180</span>
+<span id="6181">6181</span>
+<span id="6182">6182</span>
+<span id="6183">6183</span>
+<span id="6184">6184</span>
+<span id="6185">6185</span>
+<span id="6186">6186</span>
+<span id="6187">6187</span>
+<span id="6188">6188</span>
+<span id="6189">6189</span>
+<span id="6190">6190</span>
+<span id="6191">6191</span>
+<span id="6192">6192</span>
+<span id="6193">6193</span>
+<span id="6194">6194</span>
+<span id="6195">6195</span>
+<span id="6196">6196</span>
+<span id="6197">6197</span>
+<span id="6198">6198</span>
+<span id="6199">6199</span>
+<span id="6200">6200</span>
+<span id="6201">6201</span>
+<span id="6202">6202</span>
+<span id="6203">6203</span>
+<span id="6204">6204</span>
+<span id="6205">6205</span>
+<span id="6206">6206</span>
+<span id="6207">6207</span>
+<span id="6208">6208</span>
+<span id="6209">6209</span>
+<span id="6210">6210</span>
+<span id="6211">6211</span>
+<span id="6212">6212</span>
+<span id="6213">6213</span>
+<span id="6214">6214</span>
+<span id="6215">6215</span>
+<span id="6216">6216</span>
+<span id="6217">6217</span>
+<span id="6218">6218</span>
+<span id="6219">6219</span>
+<span id="6220">6220</span>
+<span id="6221">6221</span>
+<span id="6222">6222</span>
+<span id="6223">6223</span>
+<span id="6224">6224</span>
+<span id="6225">6225</span>
+<span id="6226">6226</span>
+<span id="6227">6227</span>
+<span id="6228">6228</span>
+<span id="6229">6229</span>
+<span id="6230">6230</span>
+<span id="6231">6231</span>
+<span id="6232">6232</span>
+<span id="6233">6233</span>
+<span id="6234">6234</span>
+<span id="6235">6235</span>
+<span id="6236">6236</span>
+<span id="6237">6237</span>
+<span id="6238">6238</span>
+<span id="6239">6239</span>
+<span id="6240">6240</span>
+<span id="6241">6241</span>
+<span id="6242">6242</span>
+<span id="6243">6243</span>
+<span id="6244">6244</span>
+<span id="6245">6245</span>
+<span id="6246">6246</span>
+<span id="6247">6247</span>
+<span id="6248">6248</span>
+<span id="6249">6249</span>
+<span id="6250">6250</span>
+<span id="6251">6251</span>
+<span id="6252">6252</span>
+<span id="6253">6253</span>
+<span id="6254">6254</span>
+<span id="6255">6255</span>
+<span id="6256">6256</span>
+<span id="6257">6257</span>
+<span id="6258">6258</span>
+<span id="6259">6259</span>
+<span id="6260">6260</span>
+<span id="6261">6261</span>
+<span id="6262">6262</span>
+<span id="6263">6263</span>
+<span id="6264">6264</span>
+<span id="6265">6265</span>
+<span id="6266">6266</span>
+<span id="6267">6267</span>
+<span id="6268">6268</span>
+<span id="6269">6269</span>
+<span id="6270">6270</span>
+<span id="6271">6271</span>
+<span id="6272">6272</span>
+<span id="6273">6273</span>
+<span id="6274">6274</span>
+<span id="6275">6275</span>
+<span id="6276">6276</span>
+<span id="6277">6277</span>
+<span id="6278">6278</span>
+<span id="6279">6279</span>
+<span id="6280">6280</span>
+<span id="6281">6281</span>
+<span id="6282">6282</span>
+<span id="6283">6283</span>
+<span id="6284">6284</span>
+<span id="6285">6285</span>
+<span id="6286">6286</span>
+<span id="6287">6287</span>
+<span id="6288">6288</span>
+<span id="6289">6289</span>
+<span id="6290">6290</span>
+<span id="6291">6291</span>
+<span id="6292">6292</span>
+<span id="6293">6293</span>
+<span id="6294">6294</span>
+<span id="6295">6295</span>
+<span id="6296">6296</span>
+<span id="6297">6297</span>
+<span id="6298">6298</span>
+<span id="6299">6299</span>
+<span id="6300">6300</span>
+<span id="6301">6301</span>
+<span id="6302">6302</span>
+<span id="6303">6303</span>
+<span id="6304">6304</span>
+<span id="6305">6305</span>
+<span id="6306">6306</span>
+<span id="6307">6307</span>
+<span id="6308">6308</span>
+<span id="6309">6309</span>
+<span id="6310">6310</span>
+<span id="6311">6311</span>
+<span id="6312">6312</span>
+<span id="6313">6313</span>
+<span id="6314">6314</span>
+<span id="6315">6315</span>
+<span id="6316">6316</span>
+<span id="6317">6317</span>
+<span id="6318">6318</span>
+<span id="6319">6319</span>
+<span id="6320">6320</span>
+<span id="6321">6321</span>
+<span id="6322">6322</span>
+<span id="6323">6323</span>
+<span id="6324">6324</span>
+<span id="6325">6325</span>
+<span id="6326">6326</span>
+<span id="6327">6327</span>
+<span id="6328">6328</span>
+<span id="6329">6329</span>
+<span id="6330">6330</span>
+<span id="6331">6331</span>
+<span id="6332">6332</span>
+<span id="6333">6333</span>
+<span id="6334">6334</span>
+<span id="6335">6335</span>
+<span id="6336">6336</span>
+<span id="6337">6337</span>
+<span id="6338">6338</span>
+<span id="6339">6339</span>
+<span id="6340">6340</span>
+<span id="6341">6341</span>
+<span id="6342">6342</span>
+<span id="6343">6343</span>
+<span id="6344">6344</span>
+<span id="6345">6345</span>
+<span id="6346">6346</span>
+<span id="6347">6347</span>
+<span id="6348">6348</span>
+<span id="6349">6349</span>
+<span id="6350">6350</span>
+<span id="6351">6351</span>
+<span id="6352">6352</span>
+<span id="6353">6353</span>
+<span id="6354">6354</span>
+<span id="6355">6355</span>
+<span id="6356">6356</span>
+<span id="6357">6357</span>
+<span id="6358">6358</span>
+<span id="6359">6359</span>
+<span id="6360">6360</span>
+<span id="6361">6361</span>
+<span id="6362">6362</span>
+<span id="6363">6363</span>
+<span id="6364">6364</span>
+<span id="6365">6365</span>
+<span id="6366">6366</span>
+<span id="6367">6367</span>
+<span id="6368">6368</span>
+<span id="6369">6369</span>
+<span id="6370">6370</span>
+<span id="6371">6371</span>
+<span id="6372">6372</span>
+<span id="6373">6373</span>
+<span id="6374">6374</span>
+<span id="6375">6375</span>
+<span id="6376">6376</span>
+<span id="6377">6377</span>
+<span id="6378">6378</span>
+<span id="6379">6379</span>
+<span id="6380">6380</span>
+<span id="6381">6381</span>
+<span id="6382">6382</span>
+<span id="6383">6383</span>
+<span id="6384">6384</span>
+<span id="6385">6385</span>
+<span id="6386">6386</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='comment'>// Do not remove on snapshot creation. Needed for bootstrap. (Issue #22364)</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>stage0</span>, <span class='ident'>feature</span>(<span class='ident'>custom_attribute</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>crate_name</span> <span class='op'>=</span> <span class='string'>&quot;libc&quot;</span>]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>crate_type</span> <span class='op'>=</span> <span class='string'>&quot;rlib&quot;</span>]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>unstable</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;libc&quot;</span>,
+ <span class='ident'>reason</span> <span class='op'>=</span> <span class='string'>&quot;use `libc` from crates.io&quot;</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>feature</span>(<span class='ident'>staged_api</span>, <span class='ident'>core</span>, <span class='ident'>no_std</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>staged_api</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>no_std</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_logo_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png&quot;</span>,
+ <span class='ident'>html_favicon_url</span> <span class='op'>=</span> <span class='string'>&quot;https://doc.rust-lang.org/favicon.ico&quot;</span>,
+ <span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://doc.rust-lang.org/nightly/&quot;</span>,
+ <span class='ident'>html_playground_url</span> <span class='op'>=</span> <span class='string'>&quot;http://play.rust-lang.org/&quot;</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>test</span>, <span class='ident'>feature</span>(<span class='ident'>test</span>))]</span>
+
+<span class='doccomment'>//! Bindings for the C standard library and other platform libraries</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! **NOTE:** These are *architecture and libc* specific. On Linux, these</span>
+<span class='doccomment'>//! bindings are only correct for glibc.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This module contains bindings to the C standard library, organized into</span>
+<span class='doccomment'>//! modules by their defining standard. Additionally, it contains some assorted</span>
+<span class='doccomment'>//! platform-specific definitions. For convenience, most functions and types</span>
+<span class='doccomment'>//! are reexported, so `use libc::*` will import the available C bindings as</span>
+<span class='doccomment'>//! appropriate for the target platform. The exact set of functions available</span>
+<span class='doccomment'>//! are platform specific.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! *Note:* Because these definitions are platform-specific, some may not appear</span>
+<span class='doccomment'>//! in the generated documentation.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! We consider the following specs reasonably normative with respect to</span>
+<span class='doccomment'>//! interoperating with the C standard library (libc/msvcrt):</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! * ISO 9899:1990 (&#39;C95&#39;, &#39;ANSI C&#39;, &#39;Standard C&#39;), NA1, 1995.</span>
+<span class='doccomment'>//! * ISO 9899:1999 (&#39;C99&#39; or &#39;C9x&#39;).</span>
+<span class='doccomment'>//! * ISO 9945:1988 / IEEE 1003.1-1988 (&#39;POSIX.1&#39;).</span>
+<span class='doccomment'>//! * ISO 9945:2001 / IEEE 1003.1-2001 (&#39;POSIX:2001&#39;, &#39;SUSv3&#39;).</span>
+<span class='doccomment'>//! * ISO 9945:2008 / IEEE 1003.1-2008 (&#39;POSIX:2008&#39;, &#39;SUSv4&#39;).</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Note that any reference to the 1996 revision of POSIX, or any revs between</span>
+<span class='doccomment'>//! 1990 (when &#39;88 was approved at ISO) and 2001 (when the next actual</span>
+<span class='doccomment'>//! revision-revision happened), are merely additions of other chapters (1b and</span>
+<span class='doccomment'>//! 1c) outside the core interfaces.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Despite having several names each, these are *reasonably* coherent</span>
+<span class='doccomment'>//! point-in-time, list-of-definition sorts of specs. You can get each under a</span>
+<span class='doccomment'>//! variety of names but will wind up with the same definition in each case.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! See standards(7) in linux-manpages for more details.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Our interface to these libraries is complicated by the non-universality of</span>
+<span class='doccomment'>//! conformance to any of them. About the only thing universally supported is</span>
+<span class='doccomment'>//! the first (C95), beyond that definitions quickly become absent on various</span>
+<span class='doccomment'>//! platforms.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! We therefore wind up dividing our module-space up (mostly for the sake of</span>
+<span class='doccomment'>//! sanity while editing, filling-in-details and eliminating duplication) into</span>
+<span class='doccomment'>//! definitions common-to-all (held in modules named c95, c99, posix88, posix01</span>
+<span class='doccomment'>//! and posix08) and definitions that appear only on *some* platforms (named</span>
+<span class='doccomment'>//! &#39;extra&#39;). This would be things like significant OSX foundation kit, or Windows</span>
+<span class='doccomment'>//! library kernel32.dll, or various fancy glibc, Linux or BSD extensions.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! In addition to the per-platform &#39;extra&#39; modules, we define a module of</span>
+<span class='doccomment'>//! &#39;common BSD&#39; libc routines that never quite made it into POSIX but show up</span>
+<span class='doccomment'>//! in multiple derived systems. This is the 4.4BSD r2 / 1995 release, the final</span>
+<span class='doccomment'>//! one from Berkeley after the lawsuits died down and the CSRG dissolved.</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>bad_style</span>, <span class='ident'>raw_pointer_derive</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>allow</span>(<span class='ident'>unused_imports</span>))]</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>std</span> <span class='kw'>as</span> <span class='ident'>core</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>))]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>core</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>std</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>test</span>;
+
+<span class='comment'>// Explicit export lists for the intersection (provided here) mean that</span>
+<span class='comment'>// you can write more-platform-agnostic code if you stick to just these</span>
+<span class='comment'>// symbols.</span>
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>posix88</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd44</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix01</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>extra</span>::<span class='op'>*</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>c95</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>posix88</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>posix01</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>bsd44</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>extra</span>::<span class='op'>*</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>c95</span>::<span class='ident'>ctype</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>c95</span>::<span class='ident'>stdio</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>c95</span>::<span class='ident'>stdlib</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>c95</span>::<span class='ident'>string</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>fcntl</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>stat_</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>stdio</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>unistd</span>::<span class='op'>*</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>bsd43</span>::<span class='op'>*</span>;
+
+<span class='comment'>// But we also reexport most everything</span>
+<span class='comment'>// if you&#39;re interested in writing platform-specific code.</span>
+
+<span class='comment'>// FIXME: This is a mess, but the design of this entire module needs to be</span>
+<span class='comment'>// reconsidered, so I&#39;m not inclined to do better right now. As part of</span>
+<span class='comment'>// #11870 I removed all the pub globs here, leaving explicit reexports</span>
+<span class='comment'>// of everything that is actually used in-tree.</span>
+<span class='comment'>//</span>
+<span class='comment'>// So the following exports don&#39;t follow any particular plan.</span>
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>sysconf</span>::<span class='op'>*</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>mman</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>dirent</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix88</span>::<span class='ident'>net</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix01</span>::<span class='ident'>stat_</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix01</span>::<span class='ident'>unistd</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>unix</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>posix01</span>::<span class='ident'>resource</span>::<span class='op'>*</span>;
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>windows</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>extra</span>::<span class='ident'>kernel32</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>windows</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>extra</span>::<span class='ident'>winsock</span>::<span class='op'>*</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>windows</span>)]</span> <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>funcs</span>::<span class='ident'>extra</span>::<span class='ident'>msvcrt</span>::<span class='op'>*</span>;
+
+<span class='comment'>// On NaCl, these libraries are static. Thus it would be a Bad Idea to link them</span>
+<span class='comment'>// in when creating a test crate.</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>any</span>(<span class='ident'>windows</span>, <span class='ident'>target_env</span> <span class='op'>=</span> <span class='string'>&quot;musl&quot;</span>, <span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>test</span>))))]</span>
+<span class='attribute'>#[<span class='ident'>link</span>(<span class='ident'>name</span> <span class='op'>=</span> <span class='string'>&quot;c&quot;</span>)]</span>
+<span class='attribute'>#[<span class='ident'>link</span>(<span class='ident'>name</span> <span class='op'>=</span> <span class='string'>&quot;m&quot;</span>)]</span>
+<span class='kw'>extern</span> {}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_env</span> <span class='op'>=</span> <span class='string'>&quot;musl&quot;</span>, <span class='ident'>not</span>(<span class='ident'>test</span>)))]</span>
+<span class='attribute'>#[<span class='ident'>link</span>(<span class='ident'>name</span> <span class='op'>=</span> <span class='string'>&quot;c&quot;</span>, <span class='ident'>kind</span> <span class='op'>=</span> <span class='string'>&quot;static&quot;</span>)]</span>
+<span class='kw'>extern</span> {}
+
+<span class='comment'>// libnacl provides functions that require a trip through the IRT to work.</span>
+<span class='comment'>// ie: _exit, mmap, nanosleep, etc. Anything that would otherwise require a trip</span>
+<span class='comment'>// to the kernel.</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>not</span>(<span class='ident'>test</span>)))]</span>
+<span class='attribute'>#[<span class='ident'>link</span>(<span class='ident'>name</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>kind</span> <span class='op'>=</span> <span class='string'>&quot;static&quot;</span>)]</span>
+<span class='kw'>extern</span> {}
+
+<span class='comment'>// pnaclmm provides a number of functions that the toolchain&#39;s Clang emits calls</span>
+<span class='comment'>// to when codegening atomic ops. All the functions within wrap various atomic</span>
+<span class='comment'>// operations.</span>
+<span class='comment'>// Yes, it could be linked by rustc explicitly, however by linking it here</span>
+<span class='comment'>// instead we save a bit of time where bins are involved (by not running the</span>
+<span class='comment'>// optimizations on the whole pnaclmm foreach binary built).</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;cargo-build&quot;</span>), <span class='ident'>not</span>(<span class='ident'>test</span>)))]</span>
+<span class='attribute'>#[<span class='ident'>link</span>(<span class='ident'>name</span> <span class='op'>=</span> <span class='string'>&quot;pnaclmm&quot;</span>, <span class='ident'>kind</span> <span class='op'>=</span> <span class='string'>&quot;static&quot;</span>)]</span>
+<span class='kw'>extern</span> {}
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>types</span> {
+
+ <span class='comment'>// Types tend to vary *per architecture* so we pull their definitions out</span>
+ <span class='comment'>// into this module.</span>
+
+ <span class='comment'>// Standard types that are opaque or common, so are not per-target.</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='doccomment'>/// Type used to construct void pointers for use with C.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This type is only useful as a pointer target. Do not use it as a</span>
+ <span class='doccomment'>/// return type for FFI functions which have the `void` return type in</span>
+ <span class='doccomment'>/// C. Use the unit type `()` or omit the return type instead.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// For LLVM to recognize the void pointer type and by extension</span>
+ <span class='doccomment'>/// functions like malloc(), we need to have it represented as i8* in</span>
+ <span class='doccomment'>/// LLVM bitcode. The enum used here ensures this and prevents misuse</span>
+ <span class='doccomment'>/// of the &quot;raw&quot; type by only having private variants.. We need two</span>
+ <span class='doccomment'>/// variants, because the compiler complains about the repr attribute</span>
+ <span class='doccomment'>/// otherwise.</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>u8</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>c_void</span> {
+ <span class='ident'>__variant1</span>,
+ <span class='ident'>__variant2</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>FILE</span> {}
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>fpos_t</span> {}
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>int8_t</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>int16_t</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>int32_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>int64_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uint8_t</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uint16_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uint32_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uint64_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>DIR</span> {}
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>dirent_t</span> {}
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {}
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {}
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {}
+ }
+
+ <span class='comment'>// Standard types that are scalar but vary by OS and arch.</span>
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_ulong</span>, <span class='ident'>size_t</span>,
+ <span class='ident'>time_t</span>, <span class='ident'>suseconds_t</span>, <span class='ident'>c_long</span>};
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='ident'>c_ulong</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>size_t</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>suseconds_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sighandler_t</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rlimit</span> {
+ <span class='kw'>pub</span> <span class='ident'>rlim_cur</span>: <span class='ident'>rlim_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>rlim_max</span>: <span class='ident'>rlim_t</span>,
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timeval</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+ <span class='comment'>// This is also specified in POSIX 2001, but only has two fields. All implementors</span>
+ <span class='comment'>// implement BSD 4.3 version.</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rusage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ru_utime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_stime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_maxrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_ixrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_idrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_isrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_minflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_majflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nswap</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_inblock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_oublock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgsnd</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgrcv</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nsignals</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nvcsw</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nivcsw</span>: <span class='ident'>c_long</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_align</span>: <span class='ident'>isize</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_pointer_width</span> <span class='op'>=</span> <span class='string'>&quot;32&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>128</span> <span class='op'>-</span> <span class='number'>2</span> <span class='op'>*</span> <span class='number'>4</span>],
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_pointer_width</span> <span class='op'>=</span> <span class='string'>&quot;64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>128</span> <span class='op'>-</span> <span class='number'>2</span> <span class='op'>*</span> <span class='number'>8</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>socklen_t</span>,
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>108</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ifaddrs</span> {
+ <span class='kw'>pub</span> <span class='ident'>ifa_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_flags</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_netmask</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_ifu</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>, <span class='comment'>// FIXME This should be a union</span>
+ <span class='kw'>pub</span> <span class='ident'>ifa_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+ }
+
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>,
+ <span class='ident'>all</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>, <span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>,
+ <span class='ident'>all</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>, <span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_short</span>, <span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad1</span>: <span class='ident'>c_short</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad2</span>: <span class='ident'>c_short</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__size</span>: [<span class='ident'>u32</span>; <span class='number'>9</span>]
+ }
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_uchar</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_ulong</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>c_longlong</span>, <span class='ident'>c_ulonglong</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>c_ulonglong</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad0</span>: [<span class='ident'>c_uchar</span>; <span class='number'>4</span>],
+ <span class='kw'>pub</span> <span class='ident'>__st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>c_ulonglong</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad3</span>: [<span class='ident'>c_uchar</span>; <span class='number'>4</span>],
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>c_longlong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>c_ulonglong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>c_ulonglong</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__size</span>: [<span class='ident'>u32</span>; <span class='number'>9</span>]
+ }
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>c_ulong</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_pad1</span>: [<span class='ident'>c_long</span>; <span class='number'>3</span>],
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_pad2</span>: [<span class='ident'>c_long</span>; <span class='number'>2</span>],
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_pad3</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_pad5</span>: [<span class='ident'>c_long</span>; <span class='number'>14</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__size</span>: [<span class='ident'>u32</span>; <span class='number'>9</span>]
+ }
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {}
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {}
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_ushort</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uchar</span>};
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_ll</span> {
+ <span class='kw'>pub</span> <span class='ident'>sll_family</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_protocol</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_ifindex</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_hatype</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_pkttype</span>: <span class='ident'>c_uchar</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_halen</span>: <span class='ident'>c_uchar</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_addr</span>: [<span class='ident'>c_uchar</span>; <span class='number'>8</span>]
+ }
+ }
+
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad0</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused</span>: [<span class='ident'>c_long</span>; <span class='number'>3</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__size</span>: [<span class='ident'>u64</span>; <span class='number'>7</span>]
+ }
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad1</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__pad2</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused</span>: [<span class='ident'>c_int</span>; <span class='number'>2</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__size</span>: [<span class='ident'>u64</span>; <span class='number'>8</span>]
+ }
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_ushort</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uchar</span>};
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_ll</span> {
+ <span class='kw'>pub</span> <span class='ident'>sll_family</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_protocol</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_ifindex</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_hatype</span>: <span class='ident'>c_ushort</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_pkttype</span>: <span class='ident'>c_uchar</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_halen</span>: <span class='ident'>c_uchar</span>,
+ <span class='kw'>pub</span> <span class='ident'>sll_addr</span>: [<span class='ident'>c_uchar</span>; <span class='number'>8</span>]
+ }
+
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>,
+ <span class='ident'>time_t</span>, <span class='ident'>suseconds_t</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>uintptr_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='ident'>uintptr_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused6</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused7</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused8</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>suseconds_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sighandler_t</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rlimit</span> {
+ <span class='kw'>pub</span> <span class='ident'>rlim_cur</span>: <span class='ident'>rlim_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>rlim_max</span>: <span class='ident'>rlim_t</span>,
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timeval</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rusage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ru_utime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_stime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_maxrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_ixrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_idrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_isrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_minflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_majflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nswap</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_inblock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_oublock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgsnd</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgrcv</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nsignals</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nvcsw</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nivcsw</span>: <span class='ident'>c_long</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad1</span>: [<span class='ident'>u8</span>; <span class='number'>6</span>],
+ <span class='kw'>pub</span> <span class='ident'>__ss_align</span>: <span class='ident'>i64</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>112</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>socklen_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>104</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ifaddrs</span> {
+ <span class='kw'>pub</span> <span class='ident'>ifa_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_flags</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_netmask</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_dstaddr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+ }
+
+
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>uint8_t</span>, <span class='ident'>uint32_t</span>, <span class='ident'>int32_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>fflags_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_flags</span>: <span class='ident'>fflags_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gen</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_lspare</span>: <span class='ident'>int32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused</span>: [<span class='ident'>uint8_t</span>; <span class='number'>2</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_attr_t</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>,
+ <span class='ident'>time_t</span>, <span class='ident'>suseconds_t</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>uintptr_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='ident'>uintptr_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused6</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused7</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused8</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>suseconds_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sighandler_t</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rlimit</span> {
+ <span class='kw'>pub</span> <span class='ident'>rlim_cur</span>: <span class='ident'>rlim_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>rlim_max</span>: <span class='ident'>rlim_t</span>,
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timeval</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rusage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ru_utime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_stime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_maxrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_ixrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_idrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_isrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_minflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_majflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nswap</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_inblock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_oublock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgsnd</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgrcv</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nsignals</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nvcsw</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nivcsw</span>: <span class='ident'>c_long</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad1</span>: [<span class='ident'>u8</span>; <span class='number'>6</span>],
+ <span class='kw'>pub</span> <span class='ident'>__ss_align</span>: <span class='ident'>i64</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>112</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>socklen_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>104</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ifaddrs</span> {
+ <span class='kw'>pub</span> <span class='ident'>ifa_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_flags</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_netmask</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_dstaddr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+ }
+
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>uint16_t</span>, <span class='ident'>uint32_t</span>, <span class='ident'>int32_t</span>, <span class='ident'>uint64_t</span>, <span class='ident'>int64_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>uint32_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>uint64_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>fflags_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_padding1</span>: <span class='ident'>uint16_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_flags</span>: <span class='ident'>fflags_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gen</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_lspare</span>: <span class='ident'>int32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_qspare1</span>: <span class='ident'>int64_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_qspare2</span>: <span class='ident'>int64_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_attr_t</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>,
+ <span class='ident'>time_t</span>, <span class='ident'>suseconds_t</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>uintptr_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='ident'>uintptr_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_matchc</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused6</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused7</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused6</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused7</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused8</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused9</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>suseconds_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sighandler_t</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rlimit</span> {
+ <span class='kw'>pub</span> <span class='ident'>rlim_cur</span>: <span class='ident'>rlim_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>rlim_max</span>: <span class='ident'>rlim_t</span>,
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timeval</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rusage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ru_utime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_stime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_maxrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_ixrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_idrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_isrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_minflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_majflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nswap</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_inblock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_oublock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgsnd</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgrcv</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nsignals</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nvcsw</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nivcsw</span>: <span class='ident'>c_long</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad1</span>: [<span class='ident'>u8</span>; <span class='number'>6</span>],
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: <span class='ident'>i64</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad3</span>: [<span class='ident'>u8</span>; <span class='number'>240</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>socklen_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>104</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ifaddrs</span> {
+ <span class='kw'>pub</span> <span class='ident'>ifa_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_flags</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_netmask</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_dstaddr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>};
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>uint32_t</span>, <span class='ident'>uint64_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>uint32_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>uint32_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>uint64_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>fflags_t</span> <span class='op'>=</span> <span class='ident'>u32</span>; <span class='comment'>// type not declared, but struct stat have u_int32_t</span>
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_flags</span>: <span class='ident'>fflags_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gen</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime_nsec</span>: <span class='ident'>c_long</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_attr_t</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_short</span>, <span class='ident'>time_t</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>extra</span>::{<span class='ident'>int64</span>, <span class='ident'>time64_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>ino_t</span>};
+
+ <span class='comment'>// pub Note: this is the struct called stat64 in Windows. Not stat,</span>
+ <span class='comment'>// nor stati64.</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>u16</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>c_short</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>c_short</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>c_short</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>int64</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time64_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time64_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time64_t</span>,
+ }
+
+ <span class='comment'>// note that this is called utimbuf64 in Windows</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time64_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time64_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::<span class='ident'>uintptr_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>SOCKET</span> <span class='op'>=</span> <span class='ident'>uintptr_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad1</span>: [<span class='ident'>u8</span>; <span class='number'>6</span>],
+ <span class='kw'>pub</span> <span class='ident'>__ss_align</span>: <span class='ident'>i64</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>112</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>108</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>consts</span>::<span class='ident'>os</span>::<span class='ident'>extra</span>::{<span class='ident'>MAX_PROTOCOL_CHAIN</span>,
+ <span class='ident'>WSAPROTOCOL_LEN</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>c_ulong</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>wchar_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>c_ulonglong</span>, <span class='ident'>c_longlong</span>, <span class='ident'>uintptr_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BOOL</span> <span class='op'>=</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BYTE</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BOOLEAN</span> <span class='op'>=</span> <span class='ident'>BYTE</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CCHAR</span> <span class='op'>=</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CHAR</span> <span class='op'>=</span> <span class='ident'>c_char</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>DWORDLONG</span> <span class='op'>=</span> <span class='ident'>c_ulonglong</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>HANDLE</span> <span class='op'>=</span> <span class='ident'>LPVOID</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>HINSTANCE</span> <span class='op'>=</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>HMODULE</span> <span class='op'>=</span> <span class='ident'>HINSTANCE</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LONG</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>PLONG</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_long</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LONG_PTR</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LONG_PTR</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LARGE_INTEGER</span> <span class='op'>=</span> <span class='ident'>c_longlong</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>PLARGE_INTEGER</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_longlong</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPCWSTR</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>WCHAR</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPCSTR</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>CHAR</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWSTR</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WCHAR</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPSTR</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>CHAR</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWCH</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WCHAR</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPCH</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>CHAR</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SECURITY_ATTRIBUTES</span> {
+ <span class='kw'>pub</span> <span class='ident'>nLength</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpSecurityDescriptor</span>: <span class='ident'>LPVOID</span>,
+ <span class='kw'>pub</span> <span class='ident'>bInheritHandle</span>: <span class='ident'>BOOL</span>,
+ }
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPSECURITY_ATTRIBUTES</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SECURITY_ATTRIBUTES</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPVOID</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPCVOID</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPBYTE</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BYTE</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWORD</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPDWORD</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPHANDLE</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HANDLE</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LRESULT</span> <span class='op'>=</span> <span class='ident'>LONG_PTR</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>PBOOL</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>WCHAR</span> <span class='op'>=</span> <span class='ident'>wchar_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>WORD</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>SIZE_T</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time64_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>int64</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>STARTUPINFO</span> {
+ <span class='kw'>pub</span> <span class='ident'>cb</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpReserved</span>: <span class='ident'>LPWSTR</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpDesktop</span>: <span class='ident'>LPWSTR</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpTitle</span>: <span class='ident'>LPWSTR</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwX</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwY</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwXSize</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwYSize</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwXCountChars</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwYCountCharts</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwFillAttribute</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwFlags</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>wShowWindow</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>cbReserved2</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpReserved2</span>: <span class='ident'>LPBYTE</span>,
+ <span class='kw'>pub</span> <span class='ident'>hStdInput</span>: <span class='ident'>HANDLE</span>,
+ <span class='kw'>pub</span> <span class='ident'>hStdOutput</span>: <span class='ident'>HANDLE</span>,
+ <span class='kw'>pub</span> <span class='ident'>hStdError</span>: <span class='ident'>HANDLE</span>,
+ }
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPSTARTUPINFO</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>STARTUPINFO</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PROCESS_INFORMATION</span> {
+ <span class='kw'>pub</span> <span class='ident'>hProcess</span>: <span class='ident'>HANDLE</span>,
+ <span class='kw'>pub</span> <span class='ident'>hThread</span>: <span class='ident'>HANDLE</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwProcessId</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwThreadId</span>: <span class='ident'>DWORD</span>,
+ }
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPPROCESS_INFORMATION</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>PROCESS_INFORMATION</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SYSTEM_INFO</span> {
+ <span class='kw'>pub</span> <span class='ident'>wProcessorArchitecture</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>wReserved</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwPageSize</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpMinimumApplicationAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='kw'>pub</span> <span class='ident'>lpMaximumApplicationAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwActiveProcessorMask</span>: <span class='ident'>uintptr_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwNumberOfProcessors</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwProcessorType</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwAllocationGranularity</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>wProcessorLevel</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>wProcessorRevision</span>: <span class='ident'>WORD</span>,
+ }
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPSYSTEM_INFO</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SYSTEM_INFO</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>MEMORY_BASIC_INFORMATION</span> {
+ <span class='kw'>pub</span> <span class='ident'>BaseAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='kw'>pub</span> <span class='ident'>AllocationBase</span>: <span class='ident'>LPVOID</span>,
+ <span class='kw'>pub</span> <span class='ident'>AllocationProtect</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>RegionSize</span>: <span class='ident'>SIZE_T</span>,
+ <span class='kw'>pub</span> <span class='ident'>State</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>Protect</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>Type</span>: <span class='ident'>DWORD</span>,
+ }
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPMEMORY_BASIC_INFORMATION</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>MEMORY_BASIC_INFORMATION</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>OVERLAPPED</span> {
+ <span class='kw'>pub</span> <span class='ident'>Internal</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>InternalHigh</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_ulong</span>,
+ <span class='kw'>pub</span> <span class='ident'>Offset</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>OffsetHigh</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>hEvent</span>: <span class='ident'>HANDLE</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPOVERLAPPED</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>OVERLAPPED</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>FILETIME</span> {
+ <span class='kw'>pub</span> <span class='ident'>dwLowDateTime</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwHighDateTime</span>: <span class='ident'>DWORD</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPFILETIME</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILETIME</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>GUID</span> {
+ <span class='kw'>pub</span> <span class='ident'>Data1</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>Data2</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>Data3</span>: <span class='ident'>WORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>Data4</span>: [<span class='ident'>BYTE</span>; <span class='number'>8</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>WSAPROTOCOLCHAIN</span> {
+ <span class='kw'>pub</span> <span class='ident'>ChainLen</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ChainEntries</span>: [<span class='ident'>DWORD</span>; <span class='ident'>MAX_PROTOCOL_CHAIN</span> <span class='kw'>as</span> <span class='ident'>usize</span>],
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWSAPROTOCOLCHAIN</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WSAPROTOCOLCHAIN</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>WSAPROTOCOL_INFO</span> {
+ <span class='kw'>pub</span> <span class='ident'>dwServiceFlags1</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwServiceFlags2</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwServiceFlags3</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwServiceFlags4</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwProviderFlags</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>ProviderId</span>: <span class='ident'>GUID</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwCatalogEntryId</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>ProtocolChain</span>: <span class='ident'>WSAPROTOCOLCHAIN</span>,
+ <span class='kw'>pub</span> <span class='ident'>iVersion</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iAddressFamily</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iMaxSockAddr</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iMinSockAddr</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iSocketType</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iProtocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iProtocolMaxOffset</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iNetworkByteOrder</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>iSecurityScheme</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwMessageSize</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwProviderReserved</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>szProtocol</span>: [<span class='ident'>u8</span>; <span class='ident'>WSAPROTOCOL_LEN</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>+</span> <span class='number'>1</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>WSAPROTOCOL_INFO</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>WSAPROTOCOL_INFO</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWSAPROTOCOL_INFO</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WSAPROTOCOL_INFO</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>GROUP</span> <span class='op'>=</span> <span class='ident'>c_uint</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>WIN32_FIND_DATAW</span> {
+ <span class='kw'>pub</span> <span class='ident'>dwFileAttributes</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>ftCreationTime</span>: <span class='ident'>FILETIME</span>,
+ <span class='kw'>pub</span> <span class='ident'>ftLastAccessTime</span>: <span class='ident'>FILETIME</span>,
+ <span class='kw'>pub</span> <span class='ident'>ftLastWriteTime</span>: <span class='ident'>FILETIME</span>,
+ <span class='kw'>pub</span> <span class='ident'>nFileSizeHigh</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>nFileSizeLow</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwReserved0</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>dwReserved1</span>: <span class='ident'>DWORD</span>,
+ <span class='kw'>pub</span> <span class='ident'>cFileName</span>: [<span class='ident'>wchar_t</span>; <span class='number'>260</span>], <span class='comment'>// #define MAX_PATH 260</span>
+ <span class='kw'>pub</span> <span class='ident'>cAlternateFileName</span>: [<span class='ident'>wchar_t</span>; <span class='number'>14</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>WIN32_FIND_DATAW</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>WIN32_FIND_DATAW</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>LPWIN32_FIND_DATAW</span> <span class='op'>=</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>WIN32_FIND_DATAW</span>;
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>common</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>suseconds_t</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::{<span class='ident'>uintptr_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pthread_t</span> <span class='op'>=</span> <span class='ident'>uintptr_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>glob_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>gl_pathc</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused1</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_offs</span>: <span class='ident'>size_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused2</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>gl_pathv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused3</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+
+ <span class='kw'>pub</span> <span class='ident'>__unused4</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused5</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused6</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused7</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>__unused8</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timeval</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_usec</span>: <span class='ident'>suseconds_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>timespec</span> {
+ <span class='kw'>pub</span> <span class='ident'>tv_sec</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>tv_nsec</span>: <span class='ident'>c_long</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>timezone</span> {}
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sighandler_t</span> <span class='op'>=</span> <span class='ident'>size_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rlimit</span> {
+ <span class='kw'>pub</span> <span class='ident'>rlim_cur</span>: <span class='ident'>rlim_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>rlim_max</span>: <span class='ident'>rlim_t</span>,
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timeval</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>rusage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ru_utime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_stime</span>: <span class='ident'>timeval</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_maxrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_ixrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_idrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_isrss</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_minflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_majflt</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nswap</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_inblock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_oublock</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgsnd</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_msgrcv</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nsignals</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nvcsw</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>ru_nivcsw</span>: <span class='ident'>c_long</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>socklen_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>sa_family_t</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_port_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>in_addr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr</span> {
+ <span class='kw'>pub</span> <span class='ident'>sa_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sa_data</span>: [<span class='ident'>u8</span>; <span class='number'>14</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>pub</span> <span class='ident'>ss_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>ss_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad1</span>: [<span class='ident'>u8</span>; <span class='number'>6</span>],
+ <span class='kw'>pub</span> <span class='ident'>__ss_align</span>: <span class='ident'>i64</span>,
+ <span class='kw'>pub</span> <span class='ident'>__ss_pad2</span>: [<span class='ident'>u8</span>; <span class='number'>112</span>],
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_storage</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_storage</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_addr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin_zero</span>: [<span class='ident'>u8</span>; <span class='number'>8</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s_addr</span>: <span class='ident'>in_addr_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_in6</span> {
+ <span class='kw'>pub</span> <span class='ident'>sin6_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_port</span>: <span class='ident'>in_port_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_flowinfo</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_addr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>sin6_scope_id</span>: <span class='ident'>u32</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>in6_addr</span> {
+ <span class='kw'>pub</span> <span class='ident'>s6_addr</span>: [<span class='ident'>u16</span>; <span class='number'>8</span>]
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>imr_multiaddr</span>: <span class='ident'>in_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>imr_interface</span>: <span class='ident'>in_addr</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ip6_mreq</span> {
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_multiaddr</span>: <span class='ident'>in6_addr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ipv6mr_interface</span>: <span class='ident'>c_uint</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>addrinfo</span> {
+ <span class='kw'>pub</span> <span class='ident'>ai_flags</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_family</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_socktype</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_protocol</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addrlen</span>: <span class='ident'>socklen_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_canonname</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ai_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>addrinfo</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>pub</span> <span class='ident'>sun_len</span>: <span class='ident'>u8</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_family</span>: <span class='ident'>sa_family_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>sun_path</span>: [<span class='ident'>c_char</span>; <span class='number'>104</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>sockaddr_un</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>sockaddr_un</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ifaddrs</span> {
+ <span class='kw'>pub</span> <span class='ident'>ifa_next</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_flags</span>: <span class='ident'>c_uint</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_netmask</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_dstaddr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='kw'>pub</span> <span class='ident'>ifa_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>, <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>int32_t</span>, <span class='ident'>int64_t</span>, <span class='ident'>uint32_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>,
+ <span class='ident'>mode_t</span>, <span class='ident'>off_t</span>, <span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_flags</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gen</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_lspare</span>: <span class='ident'>int32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_qspare</span>: [<span class='ident'>int64_t</span>; <span class='number'>2</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__sig</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__opaque</span>: [<span class='ident'>c_char</span>; <span class='number'>36</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>pthread_attr_t</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>mach_timebase_info</span> {
+ <span class='kw'>pub</span> <span class='ident'>numer</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>denom</span>: <span class='ident'>u32</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mach_timebase_info_data_t</span> <span class='op'>=</span> <span class='ident'>mach_timebase_info</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>, <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>arch</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_schar</span> <span class='op'>=</span> <span class='ident'>i8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>u8</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_short</span> <span class='op'>=</span> <span class='ident'>i16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ushort</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_long</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_float</span> <span class='op'>=</span> <span class='ident'>f32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_double</span> <span class='op'>=</span> <span class='ident'>f64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>size_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ptrdiff_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>clock_t</span> <span class='op'>=</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>time_t</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>suseconds_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>wchar_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_longlong</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>c_ulonglong</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intptr_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintptr_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>intmax_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uintmax_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_long</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>off_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>dev_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ino_t</span> <span class='op'>=</span> <span class='ident'>u64</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>pid_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>uid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>gid_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>useconds_t</span> <span class='op'>=</span> <span class='ident'>u32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ssize_t</span> <span class='op'>=</span> <span class='ident'>c_long</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>int32_t</span>, <span class='ident'>int64_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c99</span>::{<span class='ident'>uint32_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_long</span>, <span class='ident'>time_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>dev_t</span>, <span class='ident'>gid_t</span>, <span class='ident'>ino_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>, <span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>nlink_t</span> <span class='op'>=</span> <span class='ident'>u16</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blksize_t</span> <span class='op'>=</span> <span class='ident'>i32</span>;
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>blkcnt_t</span> <span class='op'>=</span> <span class='ident'>i64</span>;
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>stat</span> {
+ <span class='kw'>pub</span> <span class='ident'>st_dev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mode</span>: <span class='ident'>mode_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_nlink</span>: <span class='ident'>nlink_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ino</span>: <span class='ident'>ino_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_uid</span>: <span class='ident'>uid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gid</span>: <span class='ident'>gid_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_rdev</span>: <span class='ident'>dev_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_atime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_mtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_ctime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_birthtime_nsec</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_size</span>: <span class='ident'>off_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blocks</span>: <span class='ident'>blkcnt_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_blksize</span>: <span class='ident'>blksize_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_flags</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_gen</span>: <span class='ident'>uint32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_lspare</span>: <span class='ident'>int32_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>st_qspare</span>: [<span class='ident'>int64_t</span>; <span class='number'>2</span>],
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>utimbuf</span> {
+ <span class='kw'>pub</span> <span class='ident'>actime</span>: <span class='ident'>time_t</span>,
+ <span class='kw'>pub</span> <span class='ident'>modtime</span>: <span class='ident'>time_t</span>,
+ }
+
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>pub</span> <span class='ident'>__sig</span>: <span class='ident'>c_long</span>,
+ <span class='kw'>pub</span> <span class='ident'>__opaque</span>: [<span class='ident'>c_char</span>; <span class='number'>56</span>]
+ }
+ <span class='kw'>impl</span> ::<span class='ident'>core</span>::<span class='ident'>clone</span>::<span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>pthread_attr_t</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>pthread_attr_t</span> { <span class='op'>*</span><span class='self'>self</span> }
+ }
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span> <span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>mach_timebase_info</span> {
+ <span class='kw'>pub</span> <span class='ident'>numer</span>: <span class='ident'>u32</span>,
+ <span class='kw'>pub</span> <span class='ident'>denom</span>: <span class='ident'>u32</span>,
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>mach_timebase_info_data_t</span> <span class='op'>=</span> <span class='ident'>mach_timebase_info</span>;
+ }
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>consts</span> {
+ <span class='comment'>// Consts tend to vary per OS so we pull their definitions out</span>
+ <span class='comment'>// into this module.</span>
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_FAILURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RAND_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32767</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_SET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_CUR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_END</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOFBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IONBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOLBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BUFSIZ</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FOPEN_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILENAME_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>260</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>L_tmpnam</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TMP_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>32767</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEINTR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEBADF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10009</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEACCES</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10013</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEFAULT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10014</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEINVAL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10022</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEMFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEWOULDBLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10035</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEINPROGRESS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10036</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEALREADY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10037</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOTSOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10038</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEDESTADDRREQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10039</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEMSGSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEPROTOTYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10041</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOPROTOOPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10042</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEPROTONOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10043</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAESOCKTNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10044</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEOPNOTSUPP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10045</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEPFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10046</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEAFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10047</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEADDRINUSE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEADDRNOTAVAIL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10049</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENETDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10050</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENETUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10051</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENETRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10052</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAECONNABORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10053</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAECONNRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10054</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOBUFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10055</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEISCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10056</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10057</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAESHUTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10058</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAETOOMANYREFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10059</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAETIMEDOUT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10060</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAECONNREFUSED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10061</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAELOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10062</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENAMETOOLONG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10063</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEHOSTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10064</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEHOSTUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10065</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOTEMPTY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10066</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEPROCLIM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10067</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEUSERS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10068</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEDQUOT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10069</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAESTALE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10070</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEREMOTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10071</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSASYSNOTREADY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10091</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAVERNOTSUPPORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10092</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSANOTINITIALISED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10093</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEDISCON</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAENOMORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAECANCELLED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10103</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEINVALIDPROCTABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10104</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEINVALIDPROVIDER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10105</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAEPROVIDERFAILEDINIT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10106</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12288</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0xffff</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_USELOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1005</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1007</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1008</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IFF_LOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd44</span>::<span class='ident'>SOCKET</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>extra</span>::{<span class='ident'>WORD</span>, <span class='ident'>DWORD</span>, <span class='ident'>BOOL</span>, <span class='ident'>HANDLE</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TRUE</span> : <span class='ident'>BOOL</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FALSE</span> : <span class='ident'>BOOL</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TEXT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_BINARY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOINHERIT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_INVALID_FUNCTION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_FILE_NOT_FOUND</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_ACCESS_DENIED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_INVALID_HANDLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_BROKEN_PIPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>109</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_DISK_FULL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>112</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_CALL_NOT_IMPLEMENTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>120</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_INSUFFICIENT_BUFFER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>122</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_INVALID_NAME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>123</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_ALREADY_EXISTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>183</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_PIPE_BUSY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>231</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_NO_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>232</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_INVALID_ADDRESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>487</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_PIPE_CONNECTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>535</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_NOTHING_TO_TERMINATE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>758</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_OPERATION_ABORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>995</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_IO_PENDING</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>997</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_FILE_INVALID</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERROR_NOT_FOUND</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1168</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>INVALID_HANDLE_VALUE</span>: <span class='ident'>HANDLE</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>HANDLE</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>DELETE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00010000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>READ_CONTROL</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00020000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SYNCHRONIZE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00100000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WRITE_DAC</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00040000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WRITE_OWNER</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00080000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_CREATE_PROCESS</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_CREATE_THREAD</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_DUP_HANDLE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_QUERY_INFORMATION</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_QUERY_LIMITED_INFORMATION</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_SET_INFORMATION</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_SET_QUOTA</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_SUSPEND_RESUME</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_TERMINATE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_VM_OPERATION</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_VM_READ</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESS_VM_WRITE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_FORCEONFEEDBACK</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_FORCEOFFFEEDBACK</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_PREVENTPINNING</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00002000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_RUNFULLSCREEN</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_TITLEISAPPID</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00001000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_TITLEISLINKNAME</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USECOUNTCHARS</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USEFILLATTRIBUTE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USEHOTKEY</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USEPOSITION</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USESHOWWINDOW</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USESIZE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STARTF_USESTDHANDLES</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000100</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WAIT_ABANDONED</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WAIT_OBJECT_0</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WAIT_TIMEOUT</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WAIT_FAILED</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>DUPLICATE_CLOSE_SOURCE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>DUPLICATE_SAME_ACCESS</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>INFINITE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STILL_ACTIVE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>259</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_COMMIT</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00001000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_RESERVE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00002000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_DECOMMIT</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00004000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_RELEASE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00008000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_RESET</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00080000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_RESET_UNDO</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_LARGE_PAGES</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_PHYSICAL</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00400000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_TOP_DOWN</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00100000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MEM_WRITE_WATCH</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00200000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_EXECUTE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_EXECUTE_READ</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_EXECUTE_READWRITE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_EXECUTE_WRITECOPY</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_NOACCESS</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_READONLY</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x02</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_READWRITE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x04</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_WRITECOPY</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x08</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_GUARD</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_NOCACHE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PAGE_WRITECOMBINE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x400</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_COMMIT</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x8000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_IMAGE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_IMAGE_NO_EXECUTE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x11000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_LARGE_PAGES</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x80000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_NOCACHE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_RESERVE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEC_WRITECOMBINE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x40000000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_MAP_ALL_ACCESS</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0xf001f</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_MAP_READ</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_MAP_WRITE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_MAP_COPY</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_MAP_EXECUTE</span> : <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESSOR_ARCHITECTURE_INTEL</span> : <span class='ident'>WORD</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESSOR_ARCHITECTURE_ARM</span> : <span class='ident'>WORD</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESSOR_ARCHITECTURE_IA64</span> : <span class='ident'>WORD</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESSOR_ARCHITECTURE_AMD64</span> : <span class='ident'>WORD</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROCESSOR_ARCHITECTURE_UNKNOWN</span> : <span class='ident'>WORD</span> <span class='op'>=</span> <span class='number'>0xffff</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_COPY_ALLOWED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_CREATE_HARDLINK</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_DELAY_UNTIL_REBOOT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_FAIL_IF_NOT_TRACKABLE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_REPLACE_EXISTING</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MOVEFILE_WRITE_THROUGH</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SYMBOLIC_LINK_FLAG_DIRECTORY</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_SHARE_DELETE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_SHARE_READ</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_SHARE_WRITE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CREATE_ALWAYS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CREATE_NEW</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>OPEN_ALWAYS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>OPEN_EXISTING</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TRUNCATE_EXISTING</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>5</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_APPEND_DATA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_READ_DATA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_WRITE_DATA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_ARCHIVE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_COMPRESSED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_DEVICE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_DIRECTORY</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_ENCRYPTED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_HIDDEN</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_INTEGRITY_STREAM</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x8000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_NORMAL</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_NOT_CONTENT_INDEXED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x2000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_NO_SCRUB_DATA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_OFFLINE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_READONLY</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_REPARSE_POINT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_SPARSE_FILE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_SYSTEM</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_TEMPORARY</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_ATTRIBUTE_VIRTUAL</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_BACKUP_SEMANTICS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x02000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_DELETE_ON_CLOSE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x04000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_NO_BUFFERING</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_OPEN_NO_RECALL</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00100000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_OPEN_REPARSE_POINT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00200000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_OVERLAPPED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x40000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_POSIX_SEMANTICS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0100000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_RANDOM_ACCESS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_SESSION_AWARE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00800000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_SEQUENTIAL_SCAN</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x08000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_WRITE_THROUGH</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x80000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_FLAG_FIRST_PIPE_INSTANCE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00080000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_NAME_NORMALIZED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_NAME_OPENED</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>VOLUME_NAME_DOS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>VOLUME_NAME_GUID</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>VOLUME_NAME_NONE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>VOLUME_NAME_NT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GENERIC_READ</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x80000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GENERIC_WRITE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x40000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GENERIC_EXECUTE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GENERIC_ALL</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x10000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_WRITE_ATTRIBUTES</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_READ_ATTRIBUTES</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000080</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STANDARD_RIGHTS_READ</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STANDARD_RIGHTS_WRITE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x20000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_WRITE_EA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_READ_EA</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_GENERIC_READ</span>: <span class='ident'>DWORD</span> <span class='op'>=</span>
+ <span class='ident'>STANDARD_RIGHTS_READ</span> <span class='op'>|</span> <span class='ident'>FILE_READ_DATA</span> <span class='op'>|</span>
+ <span class='ident'>FILE_READ_ATTRIBUTES</span> <span class='op'>|</span> <span class='ident'>FILE_READ_EA</span> <span class='op'>|</span> <span class='ident'>SYNCHRONIZE</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_GENERIC_WRITE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span>
+ <span class='ident'>STANDARD_RIGHTS_WRITE</span> <span class='op'>|</span> <span class='ident'>FILE_WRITE_DATA</span> <span class='op'>|</span>
+ <span class='ident'>FILE_WRITE_ATTRIBUTES</span> <span class='op'>|</span> <span class='ident'>FILE_WRITE_EA</span> <span class='op'>|</span> <span class='ident'>FILE_APPEND_DATA</span> <span class='op'>|</span>
+ <span class='ident'>SYNCHRONIZE</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_BEGIN</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_CURRENT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILE_END</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>2</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAX_PROTOCOL_CHAIN</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>WSAPROTOCOL_LEN</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>255</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>INVALID_SOCKET</span>: <span class='ident'>SOCKET</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>DETACHED_PROCESS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CREATE_NEW_PROCESS_GROUP</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CREATE_UNICODE_ENVIRONMENT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000400</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_ACCESS_DUPLEX</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_ACCESS_INBOUND</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_ACCESS_OUTBOUND</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_TYPE_BYTE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_TYPE_MESSAGE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_READMODE_BYTE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_READMODE_MESSAGE</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_WAIT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_NOWAIT</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_ACCEPT_REMOTE_CLIENTS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_REJECT_REMOTE_CLIENTS</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>0x00000008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PIPE_UNLIMITED_INSTANCES</span>: <span class='ident'>DWORD</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FIONBIO</span>: <span class='ident'>c_long</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>0x7FFB9982</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ }
+ }
+
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_FAILURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RAND_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2147483647</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_SET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_CUR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_END</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOFBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IONBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOLBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BUFSIZ</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FOPEN_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILENAME_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>L_tmpnam</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TMP_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>238328</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOCTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>24576</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_LOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TEST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_ULOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGHUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGQUIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGABRT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGFPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGKILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGSEGV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGALRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_NONE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_READ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_WRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_EXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_PRIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FIXED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FAILED</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_CURRENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_FUTURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_ASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_INVALIDATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENXIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>E2BIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHILD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAGAIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EACCES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFAULT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBUSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EEXIST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXDEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINVAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETXTBSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EROFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAMETOOLONG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSYS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTEMPTY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EWOULDBLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>EAGAIN</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMSG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIDRM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHRNG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL2NSYNC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL3HLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL3RST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELNRNG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNATCH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOCSI</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL2HLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXFULL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOANO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADRQC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADSLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>EDEADLK</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBFONT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSTR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENONET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPKG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLINK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADV</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRMNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECOMM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMULTIHOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOTDOT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADMSG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOVERFLOW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTUNIQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADFD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMCHG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBACC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBBAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBSCN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBMAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBEXEC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EILSEQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERESTART</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTRPIPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUSERS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDESTADDRREQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMSGSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTOTYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPROTOOPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTONOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESOCKTNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOPNOTSUPP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRINUSE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>98</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRNOTAVAIL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNABORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>103</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>104</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOBUFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>105</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>106</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>107</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHUTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>108</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETOOMANYREFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>109</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIMEDOUT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>110</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNREFUSED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>111</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>112</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>113</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EALREADY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>114</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINPROGRESS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>115</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTALE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>116</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUCLEAN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>117</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTNAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>118</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAVAIL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>119</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISNAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>120</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTEIO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>121</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDQUOT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>122</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEDIUM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>123</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMEDIUMTYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>124</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECANCELED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>125</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOKEY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>126</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYEXPIRED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>127</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYREVOKED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYREJECTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>129</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOWNERDEAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTRECOVERABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERFKILL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>132</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHWPOISON</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>133</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOCTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>24576</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_LOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TEST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_ULOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGHUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGQUIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGABRT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGFPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGKILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGSEGV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGALRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_NONE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_READ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_WRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_EXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_PRIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FIXED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FAILED</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_CURRENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_FUTURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_ASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_INVALIDATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENXIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>E2BIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHILD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAGAIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EACCES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFAULT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBUSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EEXIST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXDEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINVAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETXTBSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EROFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMSG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIDRM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHRNG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL2NSYNC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL3HLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL3RST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELNRNG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNATCH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOCSI</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EL2HLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXFULL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOANO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADRQC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADSLT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBFONT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSTR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENONET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPKG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLINK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADV</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRMNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECOMM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOTDOT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMULTIHOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADMSG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAMETOOLONG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOVERFLOW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTUNIQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADFD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMCHG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBACC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBBAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBSCN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBMAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELIBEXEC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EILSEQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSYS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERESTART</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTRPIPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTEMPTY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUSERS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDESTADDRREQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMSGSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTOTYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>98</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPROTOOPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTONOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>120</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESOCKTNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>121</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOPNOTSUPP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>122</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>123</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAFNOSUPPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>124</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRINUSE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>125</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRNOTAVAIL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>126</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>127</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>129</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNABORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNRESET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOBUFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>132</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>133</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>134</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUCLEAN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>135</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTNAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>137</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAVAIL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>138</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISNAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>139</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTEIO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>140</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHUTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>143</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETOOMANYREFS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>144</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIMEDOUT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>145</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNREFUSED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>146</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTDOWN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>147</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTUNREACH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>148</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EWOULDBLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>EAGAIN</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EALREADY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>149</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINPROGRESS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>150</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTALE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>151</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECANCELED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>158</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEDIUM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>159</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMEDIUMTYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>160</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOKEY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>161</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYEXPIRED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>162</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYREVOKED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>163</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EKEYREJECTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>164</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOWNERDEAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>165</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTRECOVERABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>166</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERFKILL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>167</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHWPOISON</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>168</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDQUOT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1133</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlim_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_ACCMODE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTRAP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIG_IGN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_MARK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_DOOFFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOCHECK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOESCAPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>6</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSPACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_PRIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IOV_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETGR_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETPW_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LOGIN_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TTY_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SAFE_FUNCTIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_DESTRUCTOR_ITERATIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_KEYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_STACK_MIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_THREADS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKADDR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PROCESS_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ATEXIT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_XCU_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_UNIX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_CRYPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_ENH_I18N</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_SHM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_LEGACY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>129</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131</span>;
+
+
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_JOINABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_DETACHED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)))]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>)))]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>131072</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_REALTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_MONOTONIC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CPU</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_FSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_STACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RSS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NOFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_AS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MEMLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_LOCKS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_SIGPENDING</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MSGQUEUE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NICE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RTPRIO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RTTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NLIMITS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_INFINITY</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>0xffff_ffff_ffff_ffff</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_MAX</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_CUR</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_SELF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_CHILDREN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_THREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlim_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTRAP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIG_IGN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_MARK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_DOOFFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOCHECK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOESCAPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>6</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSPACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_PRIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IOV_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETGR_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETPW_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LOGIN_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TTY_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SAFE_FUNCTIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_DESTRUCTOR_ITERATIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_KEYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_STACK_MIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_THREADS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKADDR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PROCESS_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ATEXIT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_XCU_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_UNIX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_CRYPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_ENH_I18N</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_SHM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_LEGACY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>129</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_JOINABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_DETACHED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1024</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_REALTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_MONOTONIC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CPU</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_FSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_STACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RSS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NOFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_AS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MEMLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_LOCKS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_SIGPENDING</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MSGQUEUE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NICE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RTPRIO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RTTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NLIMITS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_INFINITY</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>0xffff_ffff_ffff_ffff</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_MAX</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_CUR</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_SELF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_CHILDREN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_THREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_REMOVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTFORK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DOFORK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_MERGEABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_UNMERGEABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_HWPOISON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IFF_LOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_UNIX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_MAXSEG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_CORK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPIDLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPINTVL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPCNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_SYNCNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_LINGER2</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_DEFER_ACCEPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_WINDOW_CLAMP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_INFO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_QUICKACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_CONGESTION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_MD5SIG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_COOKIE_TRANSACTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_THIN_LINEAR_TIMEOUTS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_THIN_DUPACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_USER_TIMEOUT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR_QUEUE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_QUEUE_SEQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR_OPTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_FASTOPEN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_TIMESTAMP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_REMOVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTFORK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DOFORK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_MERGEABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_UNMERGEABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_HWPOISON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_UNIX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_MAXSEG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_CORK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPIDLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPINTVL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPCNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_SYNCNT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_LINGER2</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_DEFER_ACCEPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_WINDOW_CLAMP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_INFO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_QUICKACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_CONGESTION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_MD5SIG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_COOKIE_TRANSACTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_THIN_LINEAR_TIMEOUTS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_THIN_DUPACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_USER_TIMEOUT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR_QUEUE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_QUEUE_SEQ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_REPAIR_OPTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_FASTOPEN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_TIMESTAMP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65535</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1005</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1007</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1009</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;le32&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;powerpc&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_PACKET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1052672</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_DSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1052672</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_GROWSDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x010000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_GROWSUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x020000000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_TYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x000f</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANONYMOUS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_32BIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_GROWSDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_DENYWRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_EXECUTABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_LOCKED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x02000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NORESERVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x04000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_POPULATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x08000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x010000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_STACK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x020000</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_PACKET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_DSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16400</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_GROWSDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01000000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_GROWSUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x02000000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_TYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x000f</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANONYMOUS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_GROWSDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_DENYWRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x02000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_EXECUTABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x04000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_LOCKED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x08000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NORESERVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_POPULATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x010000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x020000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_STACK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x040000</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ARG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CHILD_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLK_TCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NGROUPS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_STREAM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TZNAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_JOB_CONTROL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SAVED_IDS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_REALTIME_SIGNALS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ASYNCHRONOUS_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SYNCHRONIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_FSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MAPPED_FILES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK_RANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMORY_PROTECTION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MESSAGE_PASSING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEMAPHORES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SHARED_MEMORY_OBJECTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_LISTIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_PRIO_DELTA_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_DELAYTIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RTSIG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_NSEMS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_VALUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SIGQUEUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_BASE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_DIM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_SCALE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_STRING_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_COLL_WEIGHTS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_EXPR_NEST_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LINE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RE_DUP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_BIND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_RUN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_SW_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_LOCALEDEF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NPROCESSORS_ONLN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_CHAR_TERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_UPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_ILP32_OFF32</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>125</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_ILP32_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>126</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_LPBIG_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>static</span> <span class='ident'>_SC_SENDMSG_MAX_SIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>static</span> <span class='ident'>_SC_NPROCESSORS_ONLN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>static</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ARG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_BASE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_DIM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_SCALE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_STRING_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CHILD_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLK_TCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_COLL_WEIGHTS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_EXPR_NEST_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LINE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NGROUPS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_BIND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_CHAR_TERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_RUN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_LOCALEDEF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_SW_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_UPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_JOB_CONTROL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SAVED_IDS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RE_DUP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_STREAM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TZNAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_FAILURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RAND_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2147483647</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_SET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_CUR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_END</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOFBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IONBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOLBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BUFSIZ</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FOPEN_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILENAME_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>L_tmpnam</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TMP_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>308915776</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOCTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>24576</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_LOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TEST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_ULOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGHUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGQUIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGABRT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGFPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGKILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGSEGV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGALRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_NONE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_READ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_WRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_EXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_PRIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FIXED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FAILED</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_CURRENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_FUTURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_ASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_INVALIDATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENXIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>E2BIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHILD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EACCES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFAULT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBUSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EEXIST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXDEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINVAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETXTBSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EROFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAGAIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EWOULDBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINPROGRESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EALREADY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDESTADDRREQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMSGSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTOTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPROTOOPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTONOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESOCKTNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOPNOTSUPP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRINUSE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRNOTAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOBUFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHUTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>58</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETOOMANYREFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIMEDOUT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNREFUSED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELOOP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAMETOOLONG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTEMPTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCLIM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUSERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDQUOT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTALE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADRPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERPCMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSYS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENEEDAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIDRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMSG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOVERFLOW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECANCELED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EILSEQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOATTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOOFUS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADMSG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMULTIHOP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEDIUM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNUSED94</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNUSED95</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNUSED96</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNUSED97</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUNUSED98</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>98</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELAST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlim_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTRAP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIG_IGN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_DOOFFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_MARK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOCHECK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOESCAPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x2000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSPACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IOV_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETGR_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETPW_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LOGIN_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_PRIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKADDR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_DESTRUCTOR_ITERATIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_KEYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PROCESS_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SAFE_FUNCTIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_STACK_MIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_THREADS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TTY_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ATEXIT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>107</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_CRYPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>108</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_ENH_I18N</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>109</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_LEGACY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>110</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>111</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>112</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_SHM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>113</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_UNIX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>115</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>116</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_XCU_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>117</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_JOINABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_DETACHED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>any</span>(<span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mips&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;mipsel&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86&quot;</span>,
+ <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;x86_64&quot;</span>)))]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>2048</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1024</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_REALTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_MONOTONIC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CPU</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_FSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_STACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RSS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MEMLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NOFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_SBSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_VMEM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_AS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>RLIMIT_VMEM</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPTS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_SWAP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_KQUEUES</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_NLIMITS</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_INFINITY</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>0x7fff_ffff_ffff_ffff</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_SELF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_CHILDREN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_THREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_FREE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NOSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_AUTOSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NOCORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_CORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_INCORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_REFERENCED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_MODIFIED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_REFERENCED_OTHER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_MODIFIED_OTHER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_SUPER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x20</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_UNIX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPIDLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0xffff</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_USELOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1005</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1007</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1008</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IFF_LOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CTL_KERN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>KERN_PROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>KERN_PROC_PATHNAME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>KERN_PROC_PATHNAME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_COPY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_RENAME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NORESERVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_HASSEMAPHORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_STACK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NOSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NOCORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x020000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ARG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CHILD_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLK_TCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NGROUPS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_JOB_CONTROL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SAVED_IDS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_BASE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_DIM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_SCALE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_STRING_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_COLL_WEIGHTS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_EXPR_NEST_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LINE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RE_DUP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_BIND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_CHAR_TERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_RUN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_LOCALEDEF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_SW_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_UPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_STREAM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TZNAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ASYNCHRONOUS_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MAPPED_FILES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK_RANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMORY_PROTECTION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MESSAGE_PASSING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_REALTIME_SIGNALS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEMAPHORES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_FSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SHARED_MEMORY_OBJECTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SYNCHRONIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_LISTIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_PRIO_DELTA_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_DELAYTIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RTSIG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_NSEMS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_VALUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SIGQUEUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_FAILURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RAND_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2147483647</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_SET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_CUR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_END</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOFBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IONBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOLBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BUFSIZ</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FOPEN_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILENAME_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>L_tmpnam</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TMP_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>308915776</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOCTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>24576</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_LOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TEST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_ULOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGHUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGQUIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGABRT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGFPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGKILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGSEGV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGALRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_NONE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_READ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_WRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_EXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_PRIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FIXED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FAILED</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_CURRENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_FUTURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_ASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_INVALIDATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENXIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>E2BIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHILD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EACCES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFAULT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBUSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EEXIST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXDEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINVAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETXTBSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EROFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAGAIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EWOULDBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINPROGRESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EALREADY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDESTADDRREQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMSGSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTOTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPROTOOPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTONOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESOCKTNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOPNOTSUPP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRINUSE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRNOTAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOBUFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHUTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>58</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETOOMANYREFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIMEDOUT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNREFUSED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELOOP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAMETOOLONG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTEMPTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCLIM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUSERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDQUOT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTALE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADRPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERPCMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSYS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENEEDAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIPSEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOATTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EILSEQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEDIUM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMEDIUMTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOVERFLOW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECANCELED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIDRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMSG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELAST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>; <span class='comment'>// must be equal to largest errno</span>
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlim_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETLKW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD_CLOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTRAP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIG_IGN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_DOOFFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_MARK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOCHECK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOESCAPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSPACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSYS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IOV_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETGR_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETPW_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LOGIN_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_PRIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKADDR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_DESTRUCTOR_ITERATIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_KEYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PROCESS_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SAFE_FUNCTIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>103</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_STACK_MIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_THREADS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TTY_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>107</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ATEXIT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_CRYPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>117</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_ENH_I18N</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>118</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_LEGACY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>119</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>120</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>121</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_SHM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_UNIX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>123</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>125</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_JOINABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_DETACHED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span> : <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>2048</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CLOCK_MONOTONIC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CPU</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_FSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_STACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_RSS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MEMLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NOFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_NLIMITS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_INFINITY</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>0x7fff_ffff_ffff_ffff</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_MAX</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_SAVED_CUR</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='ident'>RLIM_INFINITY</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_SELF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_CHILDREN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_THREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_FREE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_UNIX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>; <span class='comment'>// don&#39;t exist</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>; <span class='comment'>// don&#39;t exist</span>
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0xffff</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_USELOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1005</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1007</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1008</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IFF_LOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_DSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>; <span class='comment'>// same as SYNC</span>
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CTL_KERN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>KERN_PROC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_COPY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_RENAME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NORESERVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NOEXTEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_HASSEMAPHORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PATH_MAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ARG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CHILD_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLK_TCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NGROUPS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_JOB_CONTROL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SAVED_IDS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_BASE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_DIM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_SCALE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_STRING_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_COLL_WEIGHTS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_EXPR_NEST_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LINE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RE_DUP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_BIND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_CHAR_TERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_RUN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_LOCALEDEF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_SW_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_UPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_STREAM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TZNAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_FSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_NSEMS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_VALUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_LISTIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_PRIO_DELTA_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ASYNCHRONOUS_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_DELAYTIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MAPPED_FILES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK_RANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMORY_PROTECTION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MESSAGE_PASSING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>58</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_REALTIME_SIGNALS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RTSIG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEMAPHORES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SHARED_MEMORY_OBJECTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SIGQUEUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SYNCHRONIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>os</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_FAILURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXIT_SUCCESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RAND_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2147483647</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_SET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_CUR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SEEK_END</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOFBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IONBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_IOLBF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BUFSIZ</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FOPEN_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>FILENAME_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>L_tmpnam</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TMP_MAX</span> : <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>308915776</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c99</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_WRONLY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_RDWR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_CREAT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>512</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_EXCL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2048</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NOCTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131072</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_TRUNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFIFO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4096</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFCHR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFBLK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>24576</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFDIR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16384</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFREG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32768</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFLNK</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>40960</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IFMT</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>61440</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IEXEC</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWRITE</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IREAD</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXU</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>448</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRUSR</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>256</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXG</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRGRP</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IRWXO</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IXOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IWOTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>S_IROTH</span> : <span class='ident'>mode_t</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>R_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>W_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X_OK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDIN_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDOUT_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>STDERR_FILENO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_LOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TEST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_TLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_ULOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGHUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGQUIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGABRT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGFPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGKILL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGSEGV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGALRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_NONE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_READ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_WRITE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PROT_EXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_PRIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FIXED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_ANON</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_FAILED</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span> <span class='op'>=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_CURRENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MCL_FUTURE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_ASYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_INVALIDATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_KILLPAGES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MS_DEACTIVATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOENT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESRCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENXIO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>E2BIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECHILD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEADLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMEM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EACCES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFAULT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTBLK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBUSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EEXIST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EXDEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISDIR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINVAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMFILE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETXTBSY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EROFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPIPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAGAIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EWOULDBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>EAGAIN</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EINPROGRESS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EALREADY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDESTADDRREQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMSGSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTOTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPROTOOPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTONOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESOCKTNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTSUP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAFNOSUPPORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRINUSE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EADDRNOTAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENETRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNRESET</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOBUFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EISCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTCONN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHUTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>58</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETOOMANYREFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIMEDOUT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECONNREFUSED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELOOP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENAMETOOLONG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTDOWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EHOSTUNREACH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTEMPTY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCLIM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EUSERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDQUOT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESTALE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EREMOTE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADRPC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ERPCMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROGMISMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROCUNAVAIL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSYS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EFTYPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENEEDAUTH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPWROFF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EDEVERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOVERFLOW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADEXEC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADARCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ESHLIBVERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADMACHO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ECANCELED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EIDRM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOMSG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EILSEQ</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOATTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EBADMSG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EMULTIHOP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENODATA</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOLINK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>98</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOSTR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EPROTO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ETIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOPNOTSUPP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOPOLICY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>103</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ENOTRECOVERABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>104</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EOWNERDEAD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>105</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>EQFULL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>106</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>ELAST</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>106</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlim_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_DUPFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFD</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_GETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_SETFL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIGTRAP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SIG_IGN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_APPEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_DOOFFS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ERR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_MARK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOCHECK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSORT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOESCAPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x2000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOSPACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_ABORTED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>GLOB_NOMATCH</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>3</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>POSIX_MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IOV_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>56</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETGR_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>70</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_GETPW_R_SIZE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>71</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LOGIN_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>73</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_PRIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>75</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKADDR</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>82</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_ATTR_STACKSIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_DESTRUCTOR_ITERATIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>85</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_KEYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>86</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>87</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIO_PROTECT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>88</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>89</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_PROCESS_SHARED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>90</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SAFE_FUNCTIONS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>91</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_STACK_MIN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>93</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_THREADS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>94</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>96</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TTY_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>101</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ATEXIT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>107</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_CRYPT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>108</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_ENH_I18N</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>109</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_LEGACY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>110</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>111</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_REALTIME_THREADS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>112</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_SHM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>113</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_UNIX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>115</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>116</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_XCU_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>121</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_JOINABLE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_CREATE_DETACHED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>PTHREAD_STACK_MIN</span>: <span class='ident'>size_t</span> <span class='op'>=</span> <span class='number'>8192</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CPU</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_FSIZE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_DATA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_STACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_CORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_AS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_MEMLOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NPROC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIMIT_NOFILE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_NLIMITS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_RLIMIT_POSIX_FLAG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RLIM_INFINITY</span>: <span class='ident'>rlim_t</span> <span class='op'>=</span> <span class='number'>0xffff_ffff_ffff_ffff</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_SELF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_CHILDREN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>RUSAGE_THREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_NORMAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_RANDOM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_SEQUENTIAL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_WILLNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_DONTNEED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_FREE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_ZERO_WIRED_PAGES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_FREE_REUSABLE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_FREE_REUSE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MADV_CAN_REUSE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_INCORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_REFERENCED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_MODIFIED</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_REFERENCED_OTHER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MINCORE_MODIFIED_OTHER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x10</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_UNIX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>AF_INET6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_STREAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_DGRAM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOCK_RAW</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_TCP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_IPV6</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_MULTICAST_LOOP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_TTL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_HDRINCL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IP_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_ADD_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPV6_DROP_MEMBERSHIP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_NODELAY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TCP_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SOL_SOCKET</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0xffff</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DEBUG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x01</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ACCEPTCONN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEADDR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_KEEPALIVE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0008</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTROUTE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0010</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_BROADCAST</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_USELOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_LINGER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0080</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_OOBINLINE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_REUSEPORT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1001</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVBUF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1003</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVLOWAT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1004</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_SNDTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1005</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_RCVTIMEO</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1006</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1007</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1008</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IFF_LOOPBACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_WR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SHUT_RDWR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_DSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4194304</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_SYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>O_NONBLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>F_FULLFSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_COPY</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0002</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_RENAME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NORESERVE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0040</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NOEXTEND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_HASSEMAPHORE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0200</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_NOCACHE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0400</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_JIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x0800</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MAP_STACK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>IPPROTO_RAW</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>255</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_NREAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1020</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_NKE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1021</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_NOSIGPIPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1022</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_NOADDRERR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1023</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_NWRITE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1024</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_DONTTRUNC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x2000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_WANTMORE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x4000</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SO_WANTOOBFLAG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x8000</span>;
+ }
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>sysconf</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ARG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CHILD_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLK_TCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NGROUPS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_JOB_CONTROL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SAVED_IDS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_BASE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_DIM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_SCALE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BC_STRING_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_COLL_WEIGHTS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_EXPR_NEST_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_LINE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RE_DUP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_VERSION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_BIND</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_C_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_CHAR_TERM</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_FORT_RUN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_LOCALEDEF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_SW_DEV</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_UPE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_STREAM_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TZNAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ASYNCHRONOUS_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGESIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMLOCK_RANGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MEMORY_PROTECTION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MESSAGE_PASSING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PRIORITY_SCHEDULING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_REALTIME_SIGNALS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEMAPHORES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_FSYNC</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SHARED_MEMORY_OBJECTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SYNCHRONIZED_IO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_LISTIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_AIO_PRIO_DELTA_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_DELAYTIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MQ_OPEN_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MAPPED_FILES</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RTSIG_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_NSEMS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SEM_VALUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SIGQUEUE_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMER_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NPROCESSORS_CONF</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>57</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_NPROCESSORS_ONLN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>58</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>59</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS_ACCOUNTING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>60</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS_CHECKPOINT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>61</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS_LOCATE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>62</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS_MESSAGE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>63</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_2_PBS_TRACK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>64</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_ADVISORY_INFO</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>65</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_BARRIERS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>66</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CLOCK_SELECTION</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>67</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_CPUTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>68</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_FILE_LOCKING</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>69</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_HOST_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>72</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_MONOTONIC_CLOCK</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>74</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_READER_WRITER_LOCKS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>76</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_REGEXP</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SHELL</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>78</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SPAWN</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>79</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SPIN_LOCKS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>80</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SPORADIC_SERVER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>81</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_CPUTIME</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>84</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_THREAD_SPORADIC_SERVER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>92</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TIMEOUTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>95</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>97</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_EVENT_FILTER</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>98</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_INHERIT</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>99</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_LOG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>100</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TYPED_MEMORY_OBJECTS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>102</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_V6_ILP32_OFF32</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>103</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_V6_ILP32_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>104</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_V6_LP64_OFF64</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>105</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_V6_LPBIG_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>106</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_IPV6</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>118</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_RAW_SOCKETS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>119</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SYMLOOP_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>120</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PAGE_SIZE</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>_SC_PAGESIZE</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XOPEN_STREAMS</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>114</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_ILP32_OFF32</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>122</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_ILP32_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>123</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_LP64_OFF64</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>124</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_XBS5_LPBIG_OFFBIG</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>125</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_SS_REPL_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>126</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_EVENT_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>127</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_NAME_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>128</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_SYS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>129</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_TRACE_USER_EVENT_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_SC_PASS_MAX</span> : <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>131</span>;
+ }
+ }
+}
+
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>funcs</span> {
+ <span class='comment'>// Thankfully most of c95 is universally available and does not vary by OS</span>
+ <span class='comment'>// or anything. The same is not true of POSIX.</span>
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>c95</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>ctype</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isalnum</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isalpha</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>iscntrl</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isdigit</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isgraph</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>islower</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isprint</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ispunct</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isspace</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isupper</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isxdigit</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>tolower</span>(<span class='ident'>c</span>: <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>toupper</span>(<span class='ident'>c</span>: <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_char</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stdio</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>FILE</span>, <span class='ident'>c_void</span>, <span class='ident'>fpos_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>size_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fopen</span>(<span class='ident'>filename</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>freopen</span>(<span class='ident'>filename</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>file</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>)
+ <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fflush</span>(<span class='ident'>file</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fclose</span>(<span class='ident'>file</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>remove</span>(<span class='ident'>filename</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rename</span>(<span class='ident'>oldname</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>newname</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>tmpfile</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setvbuf</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>,
+ <span class='ident'>buffer</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='ident'>mode</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>size</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setbuf</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>);
+ <span class='comment'>// Omitted: printf and scanf variants.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fgetc</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fgets</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>, <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>)
+ <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fputc</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>, <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fputs</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>)<span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='comment'>// Omitted: getc, getchar (might be macros).</span>
+
+ <span class='comment'>// Omitted: gets, so ridiculously unsafe that it should not</span>
+ <span class='comment'>// survive.</span>
+
+ <span class='comment'>// Omitted: putc, putchar (might be macros).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>puts</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ungetc</span>(<span class='ident'>c</span>: <span class='ident'>c_int</span>, <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fread</span>(<span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>size</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>nobj</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fwrite</span>(<span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>size</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>nobj</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fseek</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>, <span class='ident'>offset</span>: <span class='ident'>c_long</span>, <span class='ident'>whence</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ftell</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rewind</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fgetpos</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>fpos_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fsetpos</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>fpos_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>feof</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ferror</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>perror</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>);
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stdlib</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_double</span>, <span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_long</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_ulong</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>size_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>abs</span>(<span class='ident'>i</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>labs</span>(<span class='ident'>i</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='comment'>// Omitted: div, ldiv (return pub type incomplete).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>atof</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_double</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>atoi</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strtod</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>endp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_double</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strtol</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>endp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>base</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strtoul</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>endp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='ident'>base</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>calloc</span>(<span class='ident'>nobj</span>: <span class='ident'>size_t</span>, <span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>malloc</span>(<span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>realloc</span>(<span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>free</span>(<span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+
+ <span class='doccomment'>/// Exits the running program in a possibly dangerous manner.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Unsafety</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// While this forces your program to exit, it does so in a way that has</span>
+ <span class='doccomment'>/// consequences. This will skip all unwinding code, which means that anything</span>
+ <span class='doccomment'>/// relying on unwinding for cleanup (such as flushing and closing a buffer to a</span>
+ <span class='doccomment'>/// file) may act in an unexpected way.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Examples</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```no_run,ignore</span>
+ <span class='doccomment'>/// extern crate libc;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// fn main() {</span>
+ <span class='doccomment'>/// unsafe {</span>
+ <span class='doccomment'>/// libc::exit(1);</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>exit</span>(<span class='ident'>status</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>!</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>_exit</span>(<span class='ident'>status</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>!</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>atexit</span>(<span class='ident'>cb</span>: <span class='kw'>extern</span> <span class='kw'>fn</span>()) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>system</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getenv</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='comment'>// Omitted: bsearch, qsort</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rand</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>srand</span>(<span class='ident'>seed</span>: <span class='ident'>c_uint</span>);
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>string</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>wchar_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strcpy</span>(<span class='ident'>dst</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strncpy</span>(<span class='ident'>dst</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>n</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strcat</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strncat</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>n</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strcmp</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strncmp</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>n</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strcoll</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strchr</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strrchr</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>c</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strspn</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strcspn</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strpbrk</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strstr</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strlen</span>(<span class='ident'>cs</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strerror</span>(<span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strtok</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>t</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>strxfrm</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>n</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wcslen</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>) <span class='op'>-&gt;</span> <span class='ident'>size_t</span>;
+
+ <span class='comment'>// Omitted: memcpy, memmove, memset (provided by LLVM)</span>
+
+ <span class='comment'>// These are fine to execute on the Rust stack. They must be,</span>
+ <span class='comment'>// in fact, because LLVM generates calls to them!</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>memcmp</span>(<span class='ident'>cx</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>ct</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>n</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>memchr</span>(<span class='ident'>cx</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>c</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>n</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ }
+ }
+ }
+
+ <span class='comment'>// Microsoft helpfully underscore-qualifies all of its POSIX-like symbols</span>
+ <span class='comment'>// to make sure you don&#39;t use them accidentally. It also randomly deviates</span>
+ <span class='comment'>// from the exact signatures you might otherwise expect, and omits much,</span>
+ <span class='comment'>// so be careful when trying to write portable code; it won&#39;t always work</span>
+ <span class='comment'>// with the same POSIX functions and types as other platforms.</span>
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stat_</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::{<span class='ident'>stat</span>, <span class='ident'>utimbuf</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_char</span>, <span class='ident'>wchar_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_chmod&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chmod</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_wchmod&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wchmod</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_mkdir&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mkdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_wrmdir&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wrmdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_fstat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fstat</span>(<span class='ident'>fildes</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_stat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>stat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_wstat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wstat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_wutime64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wutime</span>(<span class='ident'>file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>utimbuf</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stdio</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>FILE</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_char</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_popen&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>popen</span>(<span class='ident'>command</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_pclose&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pclose</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_fdopen&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fdopen</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_fileno&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fileno</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>fcntl</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_char</span>, <span class='ident'>wchar_t</span>};
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_open&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>open</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>oflag</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_wopen&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wopen</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>wchar_t</span>, <span class='ident'>oflag</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_creat&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>creat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>dirent</span> {
+ <span class='comment'>// Not supplied at all.</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unistd</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_char</span>,
+ <span class='ident'>c_long</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::<span class='ident'>intptr_t</span>;
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_access&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>access</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>amode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_chdir&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chdir</span>(<span class='ident'>dir</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_close&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>close</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_dup&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_dup2&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup2</span>(<span class='ident'>src</span>: <span class='ident'>c_int</span>, <span class='ident'>dst</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_execv&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execv</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>intptr_t</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_execve&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execve</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>envp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_execvp&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execvp</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_execvpe&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execvpe</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>envp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_getcwd&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getcwd</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_getpid&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getpid</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_isatty&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isatty</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_lseek&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lseek</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>offset</span>: <span class='ident'>c_long</span>, <span class='ident'>origin</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_pipe&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pipe</span>(<span class='ident'>fds</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>, <span class='ident'>psize</span>: <span class='ident'>c_uint</span>, <span class='ident'>textmode</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_read&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>c_uint</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_rmdir&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rmdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_unlink&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>unlink</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_write&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>count</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>mman</span> {
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix88</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stat_</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix01</span>::<span class='ident'>stat</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chmod</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fchmod</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fstat</span>(<span class='ident'>fildes</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;fstat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fstat</span>(<span class='ident'>fildes</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mkdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mkfifo</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>stat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;stat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>stat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stdio</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>FILE</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>popen</span>(<span class='ident'>command</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pclose</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fdopen</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fileno</span>(<span class='ident'>stream</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>FILE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>fcntl</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>mode_t</span>;
+
+ <span class='kw'>mod</span> <span class='ident'>open_shim</span> {
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>open</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> ::<span class='ident'>c_char</span>, <span class='ident'>oflag</span>: ::<span class='ident'>c_int</span>, ...)
+ <span class='op'>-&gt;</span> ::<span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>)))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>open</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> ::<span class='ident'>c_char</span>, <span class='ident'>oflag</span>: ::<span class='ident'>c_int</span>, <span class='ident'>mode</span>: ::<span class='ident'>mode_t</span>)
+ <span class='op'>-&gt;</span> ::<span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>))]</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>open</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>oflag</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_uint</span>;
+ <span class='ident'>open_shim</span>::<span class='ident'>open</span>(<span class='ident'>path</span>, <span class='ident'>oflag</span>, <span class='ident'>mode</span> <span class='kw'>as</span> <span class='ident'>c_uint</span>)
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>)))]</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>open</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>oflag</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='ident'>open_shim</span>::<span class='ident'>open</span>(<span class='ident'>path</span>, <span class='ident'>oflag</span>, <span class='ident'>mode</span>)
+ }
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>creat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fcntl</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>cmd</span>: <span class='ident'>c_int</span>, ...) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>dirent</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>posix88</span>::{<span class='ident'>DIR</span>, <span class='ident'>dirent_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_long</span>};
+
+ <span class='comment'>// NB: On OS X opendir and readdir have two versions,</span>
+ <span class='comment'>// one for 32-bit kernelspace and one for 64.</span>
+ <span class='comment'>// We should be linking to the 64-bit ones, called</span>
+ <span class='comment'>// opendir$INODE64, etc. but for some reason rustc</span>
+ <span class='comment'>// doesn&#39;t link it correctly on i686, so we&#39;re going</span>
+ <span class='comment'>// through a C function that mysteriously does work.</span>
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span><span class='op'>=</span><span class='string'>&quot;rust_opendir&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>opendir</span>(<span class='ident'>dirname</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>;
+ <span class='attribute'>#[<span class='ident'>link_name</span><span class='op'>=</span><span class='string'>&quot;rust_readdir_r&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>readdir_r</span>(<span class='ident'>dirp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>, <span class='ident'>entry</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>dirent_t</span>,
+ <span class='ident'>result</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>dirent_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>closedir</span>(<span class='ident'>dirp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rewinddir</span>(<span class='ident'>dirp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>seekdir</span>(<span class='ident'>dirp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>, <span class='ident'>loc</span>: <span class='ident'>c_long</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>telldir</span>(<span class='ident'>dirp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>DIR</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unistd</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>c_uint</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>timespec</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix01</span>::<span class='ident'>utimbuf</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>gid_t</span>, <span class='ident'>off_t</span>, <span class='ident'>pid_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>ssize_t</span>, <span class='ident'>uid_t</span>};
+
+ <span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>_PC_NAME_MAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>access</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>amode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>alarm</span>(<span class='ident'>seconds</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_uint</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chdir</span>(<span class='ident'>dir</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chown</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>uid</span>: <span class='ident'>uid_t</span>,
+ <span class='ident'>gid</span>: <span class='ident'>gid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>close</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup2</span>(<span class='ident'>src</span>: <span class='ident'>c_int</span>, <span class='ident'>dst</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execv</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execve</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>envp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execvp</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fork</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fpathconf</span>(<span class='ident'>filedes</span>: <span class='ident'>c_int</span>, <span class='ident'>name</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getcwd</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getegid</span>() <span class='op'>-&gt;</span> <span class='ident'>gid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>geteuid</span>() <span class='op'>-&gt;</span> <span class='ident'>uid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getgid</span>() <span class='op'>-&gt;</span> <span class='ident'>gid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getgroups</span>(<span class='ident'>ngroups_max</span>: <span class='ident'>c_int</span>, <span class='ident'>groups</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>gid_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getlogin</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getopt</span>(<span class='ident'>argc</span>: <span class='ident'>c_int</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>optstr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getpgrp</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getpid</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getppid</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getuid</span>() <span class='op'>-&gt;</span> <span class='ident'>uid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getsid</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isatty</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>link</span>(<span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>dst</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lseek</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>offset</span>: <span class='ident'>off_t</span>, <span class='ident'>whence</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>off_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pathconf</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>name</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pause</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pipe</span>(<span class='ident'>fds</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rmdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setgid</span>(<span class='ident'>gid</span>: <span class='ident'>gid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setpgid</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>, <span class='ident'>pgid</span>: <span class='ident'>pid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setsid</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setuid</span>(<span class='ident'>uid</span>: <span class='ident'>uid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sleep</span>(<span class='ident'>secs</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_uint</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>usleep</span>(<span class='ident'>secs</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>nanosleep</span>(<span class='ident'>rqtp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>timespec</span>,
+ <span class='ident'>rmtp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>timespec</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sysconf</span>(<span class='ident'>name</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>tcgetpgrp</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ttyname</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>unlink</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wait</span>(<span class='ident'>status</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>waitpid</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>, <span class='ident'>status</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_int</span>, <span class='ident'>options</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pread</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>offset</span>: <span class='ident'>off_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pwrite</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>offset</span>: <span class='ident'>off_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>utime</span>(<span class='ident'>file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>utimbuf</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>access</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>amode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chdir</span>(<span class='ident'>dir</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>chown</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>uid</span>: <span class='ident'>uid_t</span>,
+ <span class='ident'>gid</span>: <span class='ident'>gid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>close</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>dup2</span>(<span class='ident'>src</span>: <span class='ident'>c_int</span>, <span class='ident'>dst</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execv</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execve</span>(<span class='ident'>prog</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>envp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>execvp</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fork</span>() <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getcwd</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>size</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getegid</span>() <span class='op'>-&gt;</span> <span class='ident'>gid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>geteuid</span>() <span class='op'>-&gt;</span> <span class='ident'>uid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getgid</span>() <span class='op'>-&gt;</span> <span class='ident'>gid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getlogin</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getopt</span>(<span class='ident'>argc</span>: <span class='ident'>c_int</span>, <span class='ident'>argv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>optstr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getuid</span>() <span class='op'>-&gt;</span> <span class='ident'>uid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getsid</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>isatty</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>link</span>(<span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>dst</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lseek</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>offset</span>: <span class='ident'>off_t</span>, <span class='ident'>whence</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>off_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pipe</span>(<span class='ident'>fds</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rmdir</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setgid</span>(<span class='ident'>gid</span>: <span class='ident'>gid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setuid</span>(<span class='ident'>uid</span>: <span class='ident'>uid_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sleep</span>(<span class='ident'>secs</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_uint</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>usleep</span>(<span class='ident'>secs</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>nanosleep</span>(<span class='ident'>rqtp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>timespec</span>,
+ <span class='ident'>rmtp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>timespec</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sysconf</span>(<span class='ident'>name</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ttyname</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>unlink</span>(<span class='ident'>c</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>wait</span>(<span class='ident'>status</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>waitpid</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>, <span class='ident'>status</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_int</span>, <span class='ident'>options</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>pid_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pread</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>offset</span>: <span class='ident'>off_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pwrite</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>count</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>offset</span>: <span class='ident'>off_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>utime</span>(<span class='ident'>file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>utimbuf</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>signal</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>pid_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>kill</span>(<span class='ident'>pid</span>: <span class='ident'>pid_t</span>, <span class='ident'>sig</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>mman</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>size_t</span>, <span class='ident'>c_int</span>, <span class='ident'>c_char</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>mode_t</span>, <span class='ident'>off_t</span>};
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mlock</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>munlock</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mlockall</span>(<span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>munlockall</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mprotect</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>prot</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>msync</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>flags</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>shm_open</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>oflag</span>: <span class='ident'>c_int</span>, <span class='ident'>mode</span>: <span class='ident'>mode_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>shm_unlink</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mmap</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>prot</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>fd</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>offset</span>: <span class='ident'>off_t</span>)
+ <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>munmap</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>net</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_uint</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>if_nametoindex</span>(<span class='ident'>ifname</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_uint</span>;
+ }
+ }
+
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stat_</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix01</span>::<span class='ident'>stat</span>;
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lstat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;lstat64&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>lstat</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>stat</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unistd</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::{<span class='ident'>ssize_t</span>, <span class='ident'>off_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>readlink</span>(<span class='ident'>path</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>,
+ <span class='ident'>bufsz</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fsync</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fdatasync</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setenv</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>val</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>overwrite</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>unsetenv</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>putenv</span>(<span class='ident'>string</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>symlink</span>(<span class='ident'>path1</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>path2</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ftruncate</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>, <span class='ident'>length</span>: <span class='ident'>off_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>signal</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>sighandler_t</span>;
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>)))]</span>
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>signal</span>(<span class='ident'>signum</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>handler</span>: <span class='ident'>sighandler_t</span>) <span class='op'>-&gt;</span> <span class='ident'>sighandler_t</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;arm&quot;</span>))]</span>
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;bsd_signal&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>signal</span>(<span class='ident'>signum</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>handler</span>: <span class='ident'>sighandler_t</span>) <span class='op'>-&gt;</span> <span class='ident'>sighandler_t</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>glob</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::{<span class='ident'>glob_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>glob</span>(<span class='ident'>pattern</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>errfunc</span>: ::<span class='ident'>core</span>::<span class='ident'>option</span>::<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>epath</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>errno</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span><span class='op'>&gt;</span>,
+ <span class='ident'>pglob</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>glob_t</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>globfree</span>(<span class='ident'>pglob</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>glob_t</span>);
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>mman</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>posix_madvise</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>advice</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>resource</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>posix01</span>::<span class='ident'>rlimit</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd43</span>::<span class='ident'>rusage</span>;
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getrlimit</span>(<span class='ident'>resource</span>: <span class='ident'>c_int</span>, <span class='ident'>rlim</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>rlimit</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setrlimit</span>(<span class='ident'>resource</span>: <span class='ident'>c_int</span>, <span class='ident'>rlim</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>rlimit</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getrusage</span>(<span class='ident'>resource</span>: <span class='ident'>c_int</span>, <span class='ident'>usage</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>rusage</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ }
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix01</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>stat_</span> {
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unistd</span> {
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>glob</span> {
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>mman</span> {
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>net</span> {
+ }
+ }
+
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>posix08</span> {
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unistd</span> {
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>windows</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd44</span>::{<span class='ident'>socklen_t</span>, <span class='ident'>sockaddr</span>, <span class='ident'>ifaddrs</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>ssize_t</span>;
+
+ <span class='kw'>extern</span> <span class='string'>&quot;system&quot;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>socket</span>(<span class='ident'>domain</span>: <span class='ident'>c_int</span>, <span class='ident'>ty</span>: <span class='ident'>c_int</span>, <span class='ident'>protocol</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>connect</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>bind</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>listen</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>backlog</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>accept</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getpeername</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getsockname</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setsockopt</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>level</span>: <span class='ident'>c_int</span>, <span class='ident'>name</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>value</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>option_len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recv</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recvfrom</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>, <span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>addrlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sendto</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>, <span class='ident'>addr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>addrlen</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getifaddrs</span>(<span class='ident'>ifap</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>freeifaddrs</span>(<span class='ident'>ifa</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ifaddrs</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>shutdown</span>(<span class='ident'>socket</span>: <span class='ident'>c_int</span>, <span class='ident'>how</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>windows</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd43</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd44</span>::{<span class='ident'>socklen_t</span>, <span class='ident'>sockaddr</span>, <span class='ident'>SOCKET</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>posix88</span>::<span class='ident'>ssize_t</span>;
+
+ <span class='kw'>extern</span> <span class='string'>&quot;system&quot;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>socket</span>(<span class='ident'>domain</span>: <span class='ident'>c_int</span>, <span class='ident'>ty</span>: <span class='ident'>c_int</span>, <span class='ident'>protocol</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>SOCKET</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>connect</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>bind</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>listen</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>backlog</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>accept</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>SOCKET</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getpeername</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getsockname</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>address</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>address_len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>setsockopt</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>level</span>: <span class='ident'>c_int</span>, <span class='ident'>name</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>value</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>option_len</span>: <span class='ident'>socklen_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>closesocket</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recv</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>send</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>recvfrom</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>, <span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>addrlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>ssize_t</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sendto</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>, <span class='ident'>addr</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>sockaddr</span>,
+ <span class='ident'>addrlen</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>shutdown</span>(<span class='ident'>socket</span>: <span class='ident'>SOCKET</span>, <span class='ident'>how</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_uchar</span>, <span class='ident'>c_int</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_ulong</span>, <span class='ident'>size_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ioctl</span>(<span class='ident'>d</span>: <span class='ident'>c_int</span>, <span class='ident'>request</span>: <span class='ident'>c_ulong</span>, ...) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sysctl</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>,
+ <span class='ident'>namelen</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>oldp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>oldlenp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>size_t</span>,
+ <span class='ident'>newp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>newlen</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sysctlbyname</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>oldp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>oldlenp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>size_t</span>,
+ <span class='ident'>newp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>newlen</span>: <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sysctlnametomib</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>mibp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>,
+ <span class='ident'>sizep</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>size_t</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getdtablesize</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>madvise</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>advice</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mincore</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>vec</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>realpath</span>(<span class='ident'>pathname</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>resolved</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>)
+ <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::{<span class='ident'>c_void</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_uchar</span>, <span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>all</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_arch</span> <span class='op'>=</span> <span class='string'>&quot;aarch64&quot;</span>)))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getdtablesize</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ioctl</span>(<span class='ident'>d</span>: <span class='ident'>c_int</span>, <span class='ident'>request</span>: <span class='ident'>c_int</span>, ...) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>madvise</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>advice</span>: <span class='ident'>c_int</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mincore</span>(<span class='ident'>addr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>size_t</span>, <span class='ident'>vec</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::<span class='ident'>c_int</span>;
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>getdtablesize</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bsd44</span> {
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;macos&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;ios&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>};
+
+ <span class='kw'>extern</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>_NSGetExecutablePath</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>bufsize</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u32</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;freebsd&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;dragonfly&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;bitrig&quot;</span>,
+ <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;openbsd&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;linux&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;android&quot;</span>, <span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+ }
+
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;windows&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>extra</span> {
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>kernel32</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_uint</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>extra</span>::{<span class='ident'>BOOL</span>, <span class='ident'>DWORD</span>, <span class='ident'>SIZE_T</span>, <span class='ident'>HMODULE</span>,
+ <span class='ident'>LPCWSTR</span>, <span class='ident'>LPWSTR</span>,
+ <span class='ident'>LPWCH</span>, <span class='ident'>LPDWORD</span>, <span class='ident'>LPVOID</span>,
+ <span class='ident'>LPCVOID</span>, <span class='ident'>LPOVERLAPPED</span>,
+ <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>LPSTARTUPINFO</span>,
+ <span class='ident'>LPPROCESS_INFORMATION</span>,
+ <span class='ident'>LPMEMORY_BASIC_INFORMATION</span>,
+ <span class='ident'>LPSYSTEM_INFO</span>, <span class='ident'>HANDLE</span>, <span class='ident'>LPHANDLE</span>,
+ <span class='ident'>LARGE_INTEGER</span>, <span class='ident'>PLARGE_INTEGER</span>,
+ <span class='ident'>LPFILETIME</span>, <span class='ident'>LPWIN32_FIND_DATAW</span>};
+
+ <span class='kw'>extern</span> <span class='string'>&quot;system&quot;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetEnvironmentVariableW</span>(<span class='ident'>n</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>v</span>: <span class='ident'>LPWSTR</span>,
+ <span class='ident'>nsize</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SetEnvironmentVariableW</span>(<span class='ident'>n</span>: <span class='ident'>LPCWSTR</span>, <span class='ident'>v</span>: <span class='ident'>LPCWSTR</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetEnvironmentStringsW</span>() <span class='op'>-&gt;</span> <span class='ident'>LPWCH</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>FreeEnvironmentStringsW</span>(<span class='ident'>env_ptr</span>: <span class='ident'>LPWCH</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetModuleFileNameW</span>(<span class='ident'>hModule</span>: <span class='ident'>HMODULE</span>,
+ <span class='ident'>lpFilename</span>: <span class='ident'>LPWSTR</span>,
+ <span class='ident'>nSize</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateDirectoryW</span>(<span class='ident'>lpPathName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpSecurityAttributes</span>:
+ <span class='ident'>LPSECURITY_ATTRIBUTES</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CopyFileW</span>(<span class='ident'>lpExistingFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpNewFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>bFailIfExists</span>: <span class='ident'>BOOL</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>DeleteFileW</span>(<span class='ident'>lpPathName</span>: <span class='ident'>LPCWSTR</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RemoveDirectoryW</span>(<span class='ident'>lpPathName</span>: <span class='ident'>LPCWSTR</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetCurrentDirectoryW</span>(<span class='ident'>nBufferLength</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpBuffer</span>: <span class='ident'>LPWSTR</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SetCurrentDirectoryW</span>(<span class='ident'>lpPathName</span>: <span class='ident'>LPCWSTR</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetLastError</span>() <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>FindFirstFileW</span>(<span class='ident'>fileName</span>: <span class='ident'>LPCWSTR</span>, <span class='ident'>findFileData</span>: <span class='ident'>LPWIN32_FIND_DATAW</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>FindNextFileW</span>(<span class='ident'>findFile</span>: <span class='ident'>HANDLE</span>, <span class='ident'>findFileData</span>: <span class='ident'>LPWIN32_FIND_DATAW</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>FindClose</span>(<span class='ident'>findFile</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>DuplicateHandle</span>(<span class='ident'>hSourceProcessHandle</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>hSourceHandle</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>hTargetProcessHandle</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpTargetHandle</span>: <span class='ident'>LPHANDLE</span>,
+ <span class='ident'>dwDesiredAccess</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>bInheritHandle</span>: <span class='ident'>BOOL</span>,
+ <span class='ident'>dwOptions</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CloseHandle</span>(<span class='ident'>hObject</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>OpenProcess</span>(<span class='ident'>dwDesiredAccess</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>bInheritHandle</span>: <span class='ident'>BOOL</span>,
+ <span class='ident'>dwProcessId</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetCurrentProcess</span>() <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateProcessW</span>(<span class='ident'>lpApplicationName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpCommandLine</span>: <span class='ident'>LPWSTR</span>,
+ <span class='ident'>lpProcessAttributes</span>:
+ <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>lpThreadAttributes</span>:
+ <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>bInheritHandles</span>: <span class='ident'>BOOL</span>,
+ <span class='ident'>dwCreationFlags</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpEnvironment</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>lpCurrentDirectory</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpStartupInfo</span>: <span class='ident'>LPSTARTUPINFO</span>,
+ <span class='ident'>lpProcessInformation</span>:
+ <span class='ident'>LPPROCESS_INFORMATION</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>WaitForSingleObject</span>(<span class='ident'>hHandle</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>dwMilliseconds</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>TerminateProcess</span>(<span class='ident'>hProcess</span>: <span class='ident'>HANDLE</span>, <span class='ident'>uExitCode</span>: <span class='ident'>c_uint</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetExitCodeProcess</span>(<span class='ident'>hProcess</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpExitCode</span>: <span class='ident'>LPDWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetSystemInfo</span>(<span class='ident'>lpSystemInfo</span>: <span class='ident'>LPSYSTEM_INFO</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualAlloc</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>dwSize</span>: <span class='ident'>SIZE_T</span>,
+ <span class='ident'>flAllocationType</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>flProtect</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>LPVOID</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualFree</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>dwSize</span>: <span class='ident'>SIZE_T</span>,
+ <span class='ident'>dwFreeType</span>: <span class='ident'>DWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualLock</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPVOID</span>, <span class='ident'>dwSize</span>: <span class='ident'>SIZE_T</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualUnlock</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPVOID</span>, <span class='ident'>dwSize</span>: <span class='ident'>SIZE_T</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualProtect</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>dwSize</span>: <span class='ident'>SIZE_T</span>,
+ <span class='ident'>flNewProtect</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpflOldProtect</span>: <span class='ident'>LPDWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>VirtualQuery</span>(<span class='ident'>lpAddress</span>: <span class='ident'>LPCVOID</span>,
+ <span class='ident'>lpBuffer</span>: <span class='ident'>LPMEMORY_BASIC_INFORMATION</span>,
+ <span class='ident'>dwLength</span>: <span class='ident'>SIZE_T</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>SIZE_T</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateFileMappingW</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpAttributes</span>: <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>flProtect</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwMaximumSizeHigh</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwMaximumSizeLow</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpName</span>: <span class='ident'>LPCWSTR</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>MapViewOfFile</span>(<span class='ident'>hFileMappingObject</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>dwDesiredAccess</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwFileOffsetHigh</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwFileOffsetLow</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwNumberOfBytesToMap</span>: <span class='ident'>SIZE_T</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>LPVOID</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>UnmapViewOfFile</span>(<span class='ident'>lpBaseAddress</span>: <span class='ident'>LPCVOID</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>MoveFileExW</span>(<span class='ident'>lpExistingFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpNewFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>dwFlags</span>: <span class='ident'>DWORD</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateHardLinkW</span>(<span class='ident'>lpSymlinkFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpTargetFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>lpSecurityAttributes</span>: <span class='ident'>LPSECURITY_ATTRIBUTES</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>FlushFileBuffers</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateFileW</span>(<span class='ident'>lpFileName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>dwDesiredAccess</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwShareMode</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpSecurityAttributes</span>: <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>dwCreationDisposition</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwFlagsAndAttributes</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>hTemplateFile</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ReadFile</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpBuffer</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>nNumberOfBytesToRead</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpNumberOfBytesRead</span>: <span class='ident'>LPDWORD</span>,
+ <span class='ident'>lpOverlapped</span>: <span class='ident'>LPOVERLAPPED</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>WriteFile</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpBuffer</span>: <span class='ident'>LPVOID</span>,
+ <span class='ident'>nNumberOfBytesToRead</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpNumberOfBytesRead</span>: <span class='ident'>LPDWORD</span>,
+ <span class='ident'>lpOverlapped</span>: <span class='ident'>LPOVERLAPPED</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SetFilePointerEx</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>liDistanceToMove</span>: <span class='ident'>LARGE_INTEGER</span>,
+ <span class='ident'>lpNewFilePointer</span>: <span class='ident'>PLARGE_INTEGER</span>,
+ <span class='ident'>dwMoveMethod</span>: <span class='ident'>DWORD</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SetEndOfFile</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetSystemTimeAsFileTime</span>(
+ <span class='ident'>lpSystemTimeAsFileTime</span>: <span class='ident'>LPFILETIME</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>QueryPerformanceFrequency</span>(
+ <span class='ident'>lpFrequency</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>LARGE_INTEGER</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>QueryPerformanceCounter</span>(
+ <span class='ident'>lpPerformanceCount</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>LARGE_INTEGER</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetCurrentProcessId</span>() <span class='op'>-&gt;</span> <span class='ident'>DWORD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateNamedPipeW</span>(
+ <span class='ident'>lpName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>dwOpenMode</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>dwPipeMode</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>nMaxInstances</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>nOutBufferSize</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>nInBufferSize</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>nDefaultTimeOut</span>: <span class='ident'>DWORD</span>,
+ <span class='ident'>lpSecurityAttributes</span>: <span class='ident'>LPSECURITY_ATTRIBUTES</span>
+ ) <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ConnectNamedPipe</span>(<span class='ident'>hNamedPipe</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpOverlapped</span>: <span class='ident'>LPOVERLAPPED</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>WaitNamedPipeW</span>(<span class='ident'>lpNamedPipeName</span>: <span class='ident'>LPCWSTR</span>,
+ <span class='ident'>nTimeOut</span>: <span class='ident'>DWORD</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SetNamedPipeHandleState</span>(<span class='ident'>hNamedPipe</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpMode</span>: <span class='ident'>LPDWORD</span>,
+ <span class='ident'>lpMaxCollectionCount</span>: <span class='ident'>LPDWORD</span>,
+ <span class='ident'>lpCollectDataTimeout</span>: <span class='ident'>LPDWORD</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CreateEventW</span>(<span class='ident'>lpEventAttributes</span>: <span class='ident'>LPSECURITY_ATTRIBUTES</span>,
+ <span class='ident'>bManualReset</span>: <span class='ident'>BOOL</span>,
+ <span class='ident'>bInitialState</span>: <span class='ident'>BOOL</span>,
+ <span class='ident'>lpName</span>: <span class='ident'>LPCWSTR</span>) <span class='op'>-&gt;</span> <span class='ident'>HANDLE</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>GetOverlappedResult</span>(<span class='ident'>hFile</span>: <span class='ident'>HANDLE</span>,
+ <span class='ident'>lpOverlapped</span>: <span class='ident'>LPOVERLAPPED</span>,
+ <span class='ident'>lpNumberOfBytesTransferred</span>: <span class='ident'>LPDWORD</span>,
+ <span class='ident'>bWait</span>: <span class='ident'>BOOL</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>DisconnectNamedPipe</span>(<span class='ident'>hNamedPipe</span>: <span class='ident'>HANDLE</span>) <span class='op'>-&gt;</span> <span class='ident'>BOOL</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>msvcrt</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_long</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c99</span>::<span class='ident'>intptr_t</span>;
+
+ <span class='kw'>extern</span> {
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_commit&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>commit</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_get_osfhandle&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_osfhandle</span>(<span class='ident'>fd</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+
+ <span class='attribute'>#[<span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;_open_osfhandle&quot;</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>open_osfhandle</span>(<span class='ident'>osfhandle</span>: <span class='ident'>intptr_t</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>winsock</span> {
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>c_ulong</span>};
+ <span class='kw'>use</span> <span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>common</span>::<span class='ident'>bsd44</span>::<span class='ident'>SOCKET</span>;
+
+ <span class='kw'>extern</span> <span class='string'>&quot;system&quot;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ioctlsocket</span>(<span class='ident'>s</span>: <span class='ident'>SOCKET</span>, <span class='ident'>cmd</span>: <span class='ident'>c_long</span>, <span class='ident'>argp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ }
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>issue_14344_workaround</span>() {} <span class='comment'>// FIXME #14344 force linkage to happen correctly</span>
+
+<span class='attribute'>#[<span class='ident'>test</span>]</span> <span class='kw'>fn</span> <span class='ident'>work_on_windows</span>() { } <span class='comment'>// FIXME #10872 needed for a happy windows</span>
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "libc";
+ window.playgroundUrl = "http://play.rust-lang.org/";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+ <script src="../../playpen.js"></script>
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/log/lib.rs.html b/src/log/lib.rs.html
new file mode 100644
index 0000000..78cbf86
--- /dev/null
+++ b/src/log/lib.rs.html
@@ -0,0 +1,1643 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/log-0.3.1/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../log/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+<span id="683">683</span>
+<span id="684">684</span>
+<span id="685">685</span>
+<span id="686">686</span>
+<span id="687">687</span>
+<span id="688">688</span>
+<span id="689">689</span>
+<span id="690">690</span>
+<span id="691">691</span>
+<span id="692">692</span>
+<span id="693">693</span>
+<span id="694">694</span>
+<span id="695">695</span>
+<span id="696">696</span>
+<span id="697">697</span>
+<span id="698">698</span>
+<span id="699">699</span>
+<span id="700">700</span>
+<span id="701">701</span>
+<span id="702">702</span>
+<span id="703">703</span>
+<span id="704">704</span>
+<span id="705">705</span>
+<span id="706">706</span>
+<span id="707">707</span>
+<span id="708">708</span>
+<span id="709">709</span>
+<span id="710">710</span>
+<span id="711">711</span>
+<span id="712">712</span>
+<span id="713">713</span>
+<span id="714">714</span>
+<span id="715">715</span>
+<span id="716">716</span>
+<span id="717">717</span>
+<span id="718">718</span>
+<span id="719">719</span>
+<span id="720">720</span>
+<span id="721">721</span>
+<span id="722">722</span>
+<span id="723">723</span>
+<span id="724">724</span>
+<span id="725">725</span>
+<span id="726">726</span>
+<span id="727">727</span>
+<span id="728">728</span>
+<span id="729">729</span>
+<span id="730">730</span>
+<span id="731">731</span>
+<span id="732">732</span>
+<span id="733">733</span>
+<span id="734">734</span>
+<span id="735">735</span>
+<span id="736">736</span>
+<span id="737">737</span>
+<span id="738">738</span>
+<span id="739">739</span>
+<span id="740">740</span>
+<span id="741">741</span>
+<span id="742">742</span>
+<span id="743">743</span>
+<span id="744">744</span>
+<span id="745">745</span>
+<span id="746">746</span>
+<span id="747">747</span>
+<span id="748">748</span>
+<span id="749">749</span>
+<span id="750">750</span>
+<span id="751">751</span>
+<span id="752">752</span>
+<span id="753">753</span>
+<span id="754">754</span>
+<span id="755">755</span>
+<span id="756">756</span>
+<span id="757">757</span>
+<span id="758">758</span>
+<span id="759">759</span>
+<span id="760">760</span>
+<span id="761">761</span>
+<span id="762">762</span>
+<span id="763">763</span>
+<span id="764">764</span>
+<span id="765">765</span>
+<span id="766">766</span>
+<span id="767">767</span>
+<span id="768">768</span>
+<span id="769">769</span>
+<span id="770">770</span>
+<span id="771">771</span>
+<span id="772">772</span>
+<span id="773">773</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='doccomment'>//! A lightweight logging facade.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! A logging facade provides a single logging API that abstracts over the</span>
+<span class='doccomment'>//! actual logging implementation. Libraries can use the logging API provided</span>
+<span class='doccomment'>//! by this crate, and the consumer of those libraries can choose the logging</span>
+<span class='doccomment'>//! framework that is most suitable for its use case.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! If no logging implementation is selected, the facade falls back to a &quot;noop&quot;</span>
+<span class='doccomment'>//! implementation that ignores all log messages. The overhead in this case</span>
+<span class='doccomment'>//! is very small - just an integer load, comparison and jump.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! A log request consists of a target, a level, and a body. A target is a</span>
+<span class='doccomment'>//! string which defaults to the module path of the location of the log</span>
+<span class='doccomment'>//! request, though that default may be overridden. Logger implementations</span>
+<span class='doccomment'>//! typically use the target to filter requests based on some user</span>
+<span class='doccomment'>//! configuration.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Use</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## In libraries</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Libraries should link only to the `log` crate, and use the provided</span>
+<span class='doccomment'>//! macros to log whatever information will be useful to downstream consumers.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ### Examples</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # #![allow(unstable)]</span>
+<span class='doccomment'>//! #[macro_use]</span>
+<span class='doccomment'>//! extern crate log;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # #[derive(Debug)] pub struct Yak(String);</span>
+<span class='doccomment'>//! # impl Yak { fn shave(&amp;self, _: u32) {} }</span>
+<span class='doccomment'>//! # fn find_a_razor() -&gt; Result&lt;u32, u32&gt; { Ok(1) }</span>
+<span class='doccomment'>//! pub fn shave_the_yak(yak: &amp;Yak) {</span>
+<span class='doccomment'>//! info!(target: &quot;yak_events&quot;, &quot;Commencing yak shaving for {:?}&quot;, yak);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! loop {</span>
+<span class='doccomment'>//! match find_a_razor() {</span>
+<span class='doccomment'>//! Ok(razor) =&gt; {</span>
+<span class='doccomment'>//! info!(&quot;Razor located: {}&quot;, razor);</span>
+<span class='doccomment'>//! yak.shave(razor);</span>
+<span class='doccomment'>//! break;</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! Err(err) =&gt; {</span>
+<span class='doccomment'>//! warn!(&quot;Unable to locate a razor: {}, retrying&quot;, err);</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! # fn main() {}</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## In executables</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Executables should chose a logging framework and initialize it early in the</span>
+<span class='doccomment'>//! runtime of the program. Logging frameworks will typically include a</span>
+<span class='doccomment'>//! function to do this. Any log messages generated before the framework is</span>
+<span class='doccomment'>//! initialized will be ignored.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The executable itself may use the `log` crate to log as well.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ### Warning</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The logging system may only be initialized once.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ### Examples</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust,ignore</span>
+<span class='doccomment'>//! #[macro_use]</span>
+<span class='doccomment'>//! extern crate log;</span>
+<span class='doccomment'>//! extern crate my_logger;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! my_logger::init();</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! info!(&quot;starting up&quot;);</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! // ...</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Logger implementations</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Loggers implement the `Log` trait. Here&#39;s a very basic example that simply</span>
+<span class='doccomment'>//! logs all messages at the `Error`, `Warn` or `Info` levels to stdout:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! extern crate log;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! use log::{LogRecord, LogLevel, LogMetadata};</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! struct SimpleLogger;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! impl log::Log for SimpleLogger {</span>
+<span class='doccomment'>//! fn enabled(&amp;self, metadata: &amp;LogMetadata) -&gt; bool {</span>
+<span class='doccomment'>//! metadata.level() &lt;= LogLevel::Info</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn log(&amp;self, record: &amp;LogRecord) {</span>
+<span class='doccomment'>//! if self.enabled(record.metadata()) {</span>
+<span class='doccomment'>//! println!(&quot;{} - {}&quot;, record.level(), record.args());</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # fn main() {}</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Loggers are installed by calling the `set_logger` function. It takes a</span>
+<span class='doccomment'>//! closure which is provided a `MaxLogLevel` token and returns a `Log` trait</span>
+<span class='doccomment'>//! object. The `MaxLogLevel` token controls the global maximum log level. The</span>
+<span class='doccomment'>//! logging facade uses this as an optimization to improve performance of log</span>
+<span class='doccomment'>//! messages at levels that are disabled. In the case of our example logger,</span>
+<span class='doccomment'>//! we&#39;ll want to set the maximum log level to `Info`, since we ignore any</span>
+<span class='doccomment'>//! `Debug` or `Trace` level log messages. A logging framework should provide a</span>
+<span class='doccomment'>//! function that wraps a call to `set_logger`, handling initialization of the</span>
+<span class='doccomment'>//! logger:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate log;</span>
+<span class='doccomment'>//! # use log::{LogLevel, LogLevelFilter, SetLoggerError, LogMetadata};</span>
+<span class='doccomment'>//! # struct SimpleLogger;</span>
+<span class='doccomment'>//! # impl log::Log for SimpleLogger {</span>
+<span class='doccomment'>//! # fn enabled(&amp;self, _: &amp;LogMetadata) -&gt; bool { false }</span>
+<span class='doccomment'>//! # fn log(&amp;self, _: &amp;log::LogRecord) {}</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! # fn main() {}</span>
+<span class='doccomment'>//! pub fn init() -&gt; Result&lt;(), SetLoggerError&gt; {</span>
+<span class='doccomment'>//! log::set_logger(|max_log_level| {</span>
+<span class='doccomment'>//! max_log_level.set(LogLevelFilter::Info);</span>
+<span class='doccomment'>//! Box::new(SimpleLogger)</span>
+<span class='doccomment'>//! })</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_logo_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png&quot;</span>,
+ <span class='ident'>html_favicon_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/favicon.ico&quot;</span>,
+ <span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://doc.rust-lang.org/log/&quot;</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>warn</span>(<span class='ident'>missing_docs</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>libc</span>;
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ascii</span>::<span class='ident'>AsciiExt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>::<span class='ident'>FromStr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::<span class='ident'>atomic</span>::{<span class='ident'>AtomicUsize</span>, <span class='ident'>ATOMIC_USIZE_INIT</span>, <span class='ident'>Ordering</span>};
+<span class='kw'>mod</span> <span class='ident'>macros</span>;
+
+<span class='comment'>// The setup here is a bit weird to make at_exit work.</span>
+<span class='comment'>//</span>
+<span class='comment'>// There are four different states that we care about: the logger&#39;s</span>
+<span class='comment'>// uninitialized, the logger&#39;s initializing (set_logger&#39;s been called but</span>
+<span class='comment'>// LOGGER hasn&#39;t actually been set yet), the logger&#39;s active, or the logger&#39;s</span>
+<span class='comment'>// shutting down inside of at_exit.</span>
+<span class='comment'>//</span>
+<span class='comment'>// The LOGGER static is normally a Box&lt;Box&lt;Log&gt;&gt; with some special possible</span>
+<span class='comment'>// values as well. The uninitialized and initializing states are represented by</span>
+<span class='comment'>// the values 0 and 1 respectively. The shutting down state is also represented</span>
+<span class='comment'>// by 1. Any other value is a valid pointer to the logger.</span>
+<span class='comment'>//</span>
+<span class='comment'>// The at_exit routine needs to make sure that no threads are actively logging</span>
+<span class='comment'>// when it deallocates the logger. The number of actively logging threads is</span>
+<span class='comment'>// tracked in the REFCOUNT static. The routine first sets LOGGER back to 1.</span>
+<span class='comment'>// All logging calls past that point will immediately return without accessing</span>
+<span class='comment'>// the logger. At that point, the at_exit routine just waits for the refcount</span>
+<span class='comment'>// to reach 0 before deallocating the logger. Note that the refcount does not</span>
+<span class='comment'>// necessarily monotonically decrease at this point, as new log calls still</span>
+<span class='comment'>// increment and decrement it, but the interval in between is small enough that</span>
+<span class='comment'>// the wait is really just for the active log calls to finish.</span>
+<span class='kw'>static</span> <span class='ident'>LOGGER</span>: <span class='ident'>AtomicUsize</span> <span class='op'>=</span> <span class='ident'>ATOMIC_USIZE_INIT</span>;
+<span class='kw'>static</span> <span class='ident'>REFCOUNT</span>: <span class='ident'>AtomicUsize</span> <span class='op'>=</span> <span class='ident'>ATOMIC_USIZE_INIT</span>;
+
+<span class='kw'>const</span> <span class='ident'>UNINITIALIZED</span>: <span class='ident'>usize</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='kw'>const</span> <span class='ident'>INITIALIZING</span>: <span class='ident'>usize</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+<span class='kw'>static</span> <span class='ident'>MAX_LOG_LEVEL_FILTER</span>: <span class='ident'>AtomicUsize</span> <span class='op'>=</span> <span class='ident'>ATOMIC_USIZE_INIT</span>;
+
+<span class='kw'>static</span> <span class='ident'>LOG_LEVEL_NAMES</span>: [<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>; <span class='number'>6</span>] <span class='op'>=</span> [<span class='string'>&quot;OFF&quot;</span>, <span class='string'>&quot;ERROR&quot;</span>, <span class='string'>&quot;WARN&quot;</span>, <span class='string'>&quot;INFO&quot;</span>,
+ <span class='string'>&quot;DEBUG&quot;</span>, <span class='string'>&quot;TRACE&quot;</span>];
+
+<span class='doccomment'>/// An enum representing the available verbosity levels of the logging framework</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// A `LogLevel` may be compared directly to a `LogLevelFilter`.</span>
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>usize</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Eq</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>LogLevel</span> {
+ <span class='doccomment'>/// The &quot;error&quot; level.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Designates very serious errors.</span>
+ <span class='ident'>Error</span> <span class='op'>=</span> <span class='number'>1</span>, <span class='comment'>// This way these line up with the discriminants for LogLevelFilter below</span>
+ <span class='doccomment'>/// The &quot;warn&quot; level.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Designates hazardous situations.</span>
+ <span class='ident'>Warn</span>,
+ <span class='doccomment'>/// The &quot;info&quot; level.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Designates useful information.</span>
+ <span class='ident'>Info</span>,
+ <span class='doccomment'>/// The &quot;debug&quot; level.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Designates lower priority information.</span>
+ <span class='ident'>Debug</span>,
+ <span class='doccomment'>/// The &quot;trace&quot; level.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Designates very low priority, often extremely verbose, information.</span>
+ <span class='ident'>Trace</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevel</span> {
+ <span class='op'>*</span><span class='self'>self</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevel</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>==</span> <span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>LogLevelFilter</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>==</span> <span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevel</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>cmp</span>::<span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>cmp</span>(<span class='ident'>other</span>))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>LogLevelFilter</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>cmp</span>::<span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='prelude-val'>Some</span>((<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>)))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Ord</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevel</span>) <span class='op'>-&gt;</span> <span class='ident'>cmp</span>::<span class='ident'>Ordering</span> {
+ (<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>))
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>ok_or</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>E</span><span class='op'>&gt;</span>(<span class='ident'>t</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>e</span>: <span class='ident'>E</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>E</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>t</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>t</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Ok</span>(<span class='ident'>t</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='ident'>e</span>),
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>FromStr</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='kw'>type</span> <span class='prelude-val'>Err</span> <span class='op'>=</span> ();
+ <span class='kw'>fn</span> <span class='ident'>from_str</span>(<span class='ident'>level</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>LogLevel</span>, ()<span class='op'>&gt;</span> {
+ <span class='ident'>ok_or</span>(<span class='ident'>LOG_LEVEL_NAMES</span>.<span class='ident'>iter</span>()
+ .<span class='ident'>position</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>name</span><span class='op'>|</span> <span class='ident'>name</span>.<span class='ident'>eq_ignore_ascii_case</span>(<span class='ident'>level</span>))
+ .<span class='ident'>into_iter</span>()
+ .<span class='ident'>filter</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>idx</span><span class='op'>|</span> <span class='ident'>idx</span> <span class='op'>!=</span> <span class='number'>0</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>idx</span><span class='op'>|</span> <span class='ident'>LogLevel</span>::<span class='ident'>from_usize</span>(<span class='ident'>idx</span>).<span class='ident'>unwrap</span>())
+ .<span class='ident'>next</span>(), ())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>LogLevel</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='ident'>fmt</span>.<span class='ident'>pad</span>(<span class='ident'>LOG_LEVEL_NAMES</span>[<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>])
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>LogLevel</span> {
+ <span class='kw'>fn</span> <span class='ident'>from_usize</span>(<span class='ident'>u</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>LogLevel</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>u</span> {
+ <span class='number'>1</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>),
+ <span class='number'>2</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span>),
+ <span class='number'>3</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Info</span>),
+ <span class='number'>4</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>),
+ <span class='number'>5</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>),
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+
+ <span class='doccomment'>/// Returns the most verbose logging level.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>max</span>() <span class='op'>-&gt;</span> <span class='ident'>LogLevel</span> {
+ <span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>
+ }
+
+ <span class='doccomment'>/// Converts the `LogLevel` to the equivalent `LogLevelFilter`.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_log_level_filter</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='ident'>LogLevelFilter</span>::<span class='ident'>from_usize</span>(<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>unwrap</span>()
+ }
+}
+
+<span class='doccomment'>/// An enum representing the available verbosity level filters of the logging</span>
+<span class='doccomment'>/// framework.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// A `LogLevelFilter` may be compared directly to a `LogLevel`.</span>
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>usize</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Eq</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='doccomment'>/// A level lower than all log levels.</span>
+ <span class='ident'>Off</span>,
+ <span class='doccomment'>/// Corresponds to the `Error` log level.</span>
+ <span class='ident'>Error</span>,
+ <span class='doccomment'>/// Corresponds to the `Warn` log level.</span>
+ <span class='ident'>Warn</span>,
+ <span class='doccomment'>/// Corresponds to the `Trace` log level.</span>
+ <span class='ident'>Info</span>,
+ <span class='doccomment'>/// Corresponds to the `Debug` log level.</span>
+ <span class='ident'>Debug</span>,
+ <span class='doccomment'>/// Corresponds to the `Trace` log level.</span>
+ <span class='ident'>Trace</span>,
+}
+
+<span class='comment'>// Deriving generates terrible impls of these traits</span>
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='op'>*</span><span class='self'>self</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>==</span> <span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>LogLevel</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevel</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>other</span>.<span class='ident'>eq</span>(<span class='self'>self</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>cmp</span>::<span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>cmp</span>(<span class='ident'>other</span>))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>LogLevel</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevel</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>cmp</span>::<span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='ident'>other</span>.<span class='ident'>partial_cmp</span>(<span class='self'>self</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>reverse</span>())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Ord</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='ident'>cmp</span>::<span class='ident'>Ordering</span> {
+ (<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>usize</span>))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>FromStr</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='kw'>type</span> <span class='prelude-val'>Err</span> <span class='op'>=</span> ();
+ <span class='kw'>fn</span> <span class='ident'>from_str</span>(<span class='ident'>level</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>LogLevelFilter</span>, ()<span class='op'>&gt;</span> {
+ <span class='ident'>ok_or</span>(<span class='ident'>LOG_LEVEL_NAMES</span>.<span class='ident'>iter</span>()
+ .<span class='ident'>position</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span><span class='ident'>name</span><span class='op'>|</span> <span class='ident'>name</span>.<span class='ident'>eq_ignore_ascii_case</span>(<span class='ident'>level</span>))
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>p</span><span class='op'>|</span> <span class='ident'>LogLevelFilter</span>::<span class='ident'>from_usize</span>(<span class='ident'>p</span>).<span class='ident'>unwrap</span>()), ())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>LOG_LEVEL_NAMES</span>[<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>])
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='kw'>fn</span> <span class='ident'>from_usize</span>(<span class='ident'>u</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>LogLevelFilter</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>u</span> {
+ <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span>),
+ <span class='number'>1</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>),
+ <span class='number'>2</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Warn</span>),
+ <span class='number'>3</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Info</span>),
+ <span class='number'>4</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Debug</span>),
+ <span class='number'>5</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>),
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+ <span class='doccomment'>/// Returns the most verbose logging level filter.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>max</span>() <span class='op'>-&gt;</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>
+ }
+
+ <span class='doccomment'>/// Converts `self` to the equivalent `LogLevel`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Returns `None` if `self` is `LogLevelFilter::Off`.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_log_level</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>LogLevel</span><span class='op'>&gt;</span> {
+ <span class='ident'>LogLevel</span>::<span class='ident'>from_usize</span>(<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>usize</span>)
+ }
+}
+
+<span class='doccomment'>/// The &quot;payload&quot; of a log message.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>LogRecord</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>metadata</span>: <span class='ident'>LogMetadata</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>,
+ <span class='ident'>location</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>LogLocation</span>,
+ <span class='ident'>args</span>: <span class='ident'>fmt</span>::<span class='ident'>Arguments</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>LogRecord</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// The message body.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>fmt</span>::<span class='ident'>Arguments</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>args</span>
+ }
+
+ <span class='doccomment'>/// Metadata about the log directive.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>metadata</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>LogMetadata</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>metadata</span>
+ }
+
+ <span class='doccomment'>/// The location of the log directive.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>location</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>LogLocation</span> {
+ <span class='self'>self</span>.<span class='ident'>location</span>
+ }
+
+ <span class='doccomment'>/// The verbosity level of the message.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>level</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevel</span> {
+ <span class='self'>self</span>.<span class='ident'>metadata</span>.<span class='ident'>level</span>()
+ }
+
+ <span class='doccomment'>/// The name of the target of the directive.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>target</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>metadata</span>.<span class='ident'>target</span>()
+ }
+}
+
+<span class='doccomment'>/// Metadata about a log message.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>LogMetadata</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>level</span>: <span class='ident'>LogLevel</span>,
+ <span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>str</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>LogMetadata</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// The verbosity level of the message.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>level</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevel</span> {
+ <span class='self'>self</span>.<span class='ident'>level</span>
+ }
+
+ <span class='doccomment'>/// The name of the target of the directive.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>target</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>target</span>
+ }
+}
+
+<span class='doccomment'>/// A trait encapsulating the operations required of a logger</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Log</span>: <span class='ident'>Sync</span><span class='op'>+</span><span class='ident'>Send</span> {
+ <span class='doccomment'>/// Determines if a log message with the specified metadata would be</span>
+ <span class='doccomment'>/// logged.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is used by the `log_enabled!` macro to allow callers to avoid</span>
+ <span class='doccomment'>/// expensive computation of log message arguments if the message would be</span>
+ <span class='doccomment'>/// discarded anyway.</span>
+ <span class='kw'>fn</span> <span class='ident'>enabled</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>metadata</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogMetadata</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>;
+
+ <span class='doccomment'>/// Logs the `LogRecord`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that `enabled` is *not* necessarily called before this method.</span>
+ <span class='doccomment'>/// Implementations of `log` should perform all necessary filtering</span>
+ <span class='doccomment'>/// internally.</span>
+ <span class='kw'>fn</span> <span class='ident'>log</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>record</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogRecord</span>);
+}
+
+<span class='doccomment'>/// The location of a log message.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Warning</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The fields of this struct are public so that they may be initialized by the</span>
+<span class='doccomment'>/// `log!` macro. They are subject to change at any time and should never be</span>
+<span class='doccomment'>/// accessed directly.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>LogLocation</span> {
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>__module_path</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>,
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>__file</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>,
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>__line</span>: <span class='ident'>u32</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>LogLocation</span> {
+ <span class='doccomment'>/// The module path of the message.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>module_path</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>__module_path</span>
+ }
+
+ <span class='doccomment'>/// The source file containing the message.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>file</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>__file</span>
+ }
+
+ <span class='doccomment'>/// The line containing the message.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>line</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>u32</span> {
+ <span class='self'>self</span>.<span class='ident'>__line</span>
+ }
+}
+
+<span class='doccomment'>/// A token providing read and write access to the global maximum log level</span>
+<span class='doccomment'>/// filter.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The maximum log level is used as an optimization to avoid evaluating log</span>
+<span class='doccomment'>/// messages that will be ignored by the logger. Any message with a level</span>
+<span class='doccomment'>/// higher than the maximum log level filter will be ignored. A logger should</span>
+<span class='doccomment'>/// make sure to keep the maximum log level filter in sync with its current</span>
+<span class='doccomment'>/// configuration.</span>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>missing_copy_implementations</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>MaxLogLevelFilter</span>(());
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>MaxLogLevelFilter</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;MaxLogLevelFilter&quot;</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>MaxLogLevelFilter</span> {
+ <span class='doccomment'>/// Gets the current maximum log level filter.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='ident'>max_log_level</span>()
+ }
+
+ <span class='doccomment'>/// Sets the maximum log level.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>level</span>: <span class='ident'>LogLevelFilter</span>) {
+ <span class='ident'>MAX_LOG_LEVEL_FILTER</span>.<span class='ident'>store</span>(<span class='ident'>level</span> <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>)
+ }
+}
+
+<span class='doccomment'>/// Returns the current maximum log level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The `log!`, `error!`, `warn!`, `info!`, `debug!`, and `trace!` macros check</span>
+<span class='doccomment'>/// this value and discard any message logged at a higher level. The maximum</span>
+<span class='doccomment'>/// log level is set by the `MaxLogLevel` token passed to loggers.</span>
+<span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>max_log_level</span>() <span class='op'>-&gt;</span> <span class='ident'>LogLevelFilter</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>MAX_LOG_LEVEL_FILTER</span>.<span class='ident'>load</span>(<span class='ident'>Ordering</span>::<span class='ident'>Relaxed</span>)) }
+}
+
+<span class='doccomment'>/// Sets the global logger.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The `make_logger` closure is passed a `MaxLogLevel` object, which the</span>
+<span class='doccomment'>/// logger should use to keep the global maximum log level in sync with the</span>
+<span class='doccomment'>/// highest log level that the logger will not ignore.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This function may only be called once in the lifetime of a program. Any log</span>
+<span class='doccomment'>/// events that occur before the call to `set_logger` completes will be</span>
+<span class='doccomment'>/// ignored.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This function does not typically need to be called manually. Logger</span>
+<span class='doccomment'>/// implementations should provide an initialization method that calls</span>
+<span class='doccomment'>/// `set_logger` internally.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_logger</span><span class='op'>&lt;</span><span class='ident'>M</span><span class='op'>&gt;</span>(<span class='ident'>make_logger</span>: <span class='ident'>M</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SetLoggerError</span><span class='op'>&gt;</span>
+ <span class='kw'>where</span> <span class='ident'>M</span>: <span class='ident'>FnOnce</span>(<span class='ident'>MaxLogLevelFilter</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Log</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>LOGGER</span>.<span class='ident'>compare_and_swap</span>(<span class='ident'>UNINITIALIZED</span>, <span class='ident'>INITIALIZING</span>,
+ <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>) <span class='op'>!=</span> <span class='ident'>UNINITIALIZED</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>SetLoggerError</span>(()));
+ }
+
+ <span class='kw'>let</span> <span class='ident'>logger</span> <span class='op'>=</span> <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>make_logger</span>(<span class='ident'>MaxLogLevelFilter</span>(())));
+ <span class='kw'>let</span> <span class='ident'>logger</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>::<span class='op'>&lt;</span><span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Log</span><span class='op'>&gt;&gt;</span>, <span class='ident'>usize</span><span class='op'>&gt;</span>(<span class='ident'>logger</span>) };
+ <span class='ident'>LOGGER</span>.<span class='ident'>store</span>(<span class='ident'>logger</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>libc</span>::<span class='ident'>atexit</span>(<span class='ident'>shutdown</span>), <span class='number'>0</span>);
+ }
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(());
+
+ <span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>shutdown</span>() {
+ <span class='comment'>// Set to INITIALIZING to prevent re-initialization after</span>
+ <span class='kw'>let</span> <span class='ident'>logger</span> <span class='op'>=</span> <span class='ident'>LOGGER</span>.<span class='ident'>swap</span>(<span class='ident'>INITIALIZING</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+
+ <span class='kw'>while</span> <span class='ident'>REFCOUNT</span>.<span class='ident'>load</span>(<span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>) <span class='op'>!=</span> <span class='number'>0</span> {
+ <span class='comment'>// FIXME add a sleep here when it doesn&#39;t involve timers</span>
+ }
+
+ <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>::<span class='op'>&lt;</span><span class='ident'>usize</span>, <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Log</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>(<span class='ident'>logger</span>); }
+ }
+}
+
+<span class='doccomment'>/// The type returned by `set_logger` if `set_logger` has already been called.</span>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>missing_copy_implementations</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SetLoggerError</span>(());
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>SetLoggerError</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;attempted to set a logger after the logging system \
+ was already initialized&quot;</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>error</span>::<span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>SetLoggerError</span> {
+ <span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> { <span class='string'>&quot;set_logger() called multiple times&quot;</span> }
+}
+
+<span class='kw'>struct</span> <span class='ident'>LoggerGuard</span>(<span class='ident'>usize</span>);
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>LoggerGuard</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='ident'>REFCOUNT</span>.<span class='ident'>fetch_sub</span>(<span class='number'>1</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>LoggerGuard</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Log</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Log</span><span class='op'>+</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='self'>self</span>.<span class='number'>0</span>) }
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>logger</span>() <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>LoggerGuard</span><span class='op'>&gt;</span> {
+ <span class='ident'>REFCOUNT</span>.<span class='ident'>fetch_add</span>(<span class='number'>1</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+ <span class='kw'>let</span> <span class='ident'>logger</span> <span class='op'>=</span> <span class='ident'>LOGGER</span>.<span class='ident'>load</span>(<span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+ <span class='kw'>if</span> <span class='ident'>logger</span> <span class='op'>==</span> <span class='ident'>UNINITIALIZED</span> <span class='op'>||</span> <span class='ident'>logger</span> <span class='op'>==</span> <span class='ident'>INITIALIZING</span> {
+ <span class='ident'>REFCOUNT</span>.<span class='ident'>fetch_sub</span>(<span class='number'>1</span>, <span class='ident'>Ordering</span>::<span class='ident'>SeqCst</span>);
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>LoggerGuard</span>(<span class='ident'>logger</span>))
+ }
+}
+
+<span class='comment'>// WARNING</span>
+<span class='comment'>// This is not considered part of the crate&#39;s public API. It is subject to</span>
+<span class='comment'>// change at any time.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>__enabled</span>(<span class='ident'>level</span>: <span class='ident'>LogLevel</span>, <span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>logger</span>) <span class='op'>=</span> <span class='ident'>logger</span>() {
+ <span class='ident'>logger</span>.<span class='ident'>enabled</span>(<span class='kw-2'>&amp;</span><span class='ident'>LogMetadata</span> { <span class='ident'>level</span>: <span class='ident'>level</span>, <span class='ident'>target</span>: <span class='ident'>target</span> })
+ } <span class='kw'>else</span> {
+ <span class='boolval'>false</span>
+ }
+}
+
+<span class='comment'>// WARNING</span>
+<span class='comment'>// This is not considered part of the crate&#39;s public API. It is subject to</span>
+<span class='comment'>// change at any time.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>__log</span>(<span class='ident'>level</span>: <span class='ident'>LogLevel</span>, <span class='ident'>target</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>loc</span>: <span class='kw-2'>&amp;</span><span class='ident'>LogLocation</span>,
+ <span class='ident'>args</span>: <span class='ident'>fmt</span>::<span class='ident'>Arguments</span>) {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>logger</span>) <span class='op'>=</span> <span class='ident'>logger</span>() {
+ <span class='kw'>let</span> <span class='ident'>record</span> <span class='op'>=</span> <span class='ident'>LogRecord</span> {
+ <span class='ident'>metadata</span>: <span class='ident'>LogMetadata</span> {
+ <span class='ident'>level</span>: <span class='ident'>level</span>,
+ <span class='ident'>target</span>: <span class='ident'>target</span>,
+ },
+ <span class='ident'>location</span>: <span class='ident'>loc</span>,
+ <span class='ident'>args</span>: <span class='ident'>args</span>
+ };
+ <span class='ident'>logger</span>.<span class='ident'>log</span>(<span class='kw-2'>&amp;</span><span class='ident'>record</span>)
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span>;
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>LogLevel</span>, <span class='ident'>LogLevelFilter</span>, <span class='ident'>SetLoggerError</span>};
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_loglevelfilter_from_str</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span> <span class='op'>=</span> [
+ (<span class='string'>&quot;off&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span>)),
+ (<span class='string'>&quot;error&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>)),
+ (<span class='string'>&quot;warn&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Warn</span>)),
+ (<span class='string'>&quot;info&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Info</span>)),
+ (<span class='string'>&quot;debug&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Debug</span>)),
+ (<span class='string'>&quot;trace&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>)),
+ (<span class='string'>&quot;OFF&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span>)),
+ (<span class='string'>&quot;ERROR&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>)),
+ (<span class='string'>&quot;WARN&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Warn</span>)),
+ (<span class='string'>&quot;INFO&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Info</span>)),
+ (<span class='string'>&quot;DEBUG&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Debug</span>)),
+ (<span class='string'>&quot;TRACE&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>)),
+ (<span class='string'>&quot;asdf&quot;</span>, <span class='prelude-val'>Err</span>(())),
+ ];
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, <span class='kw-2'>ref</span> <span class='ident'>expected</span>) <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='ident'>tests</span> {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>expected</span>, <span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>parse</span>());
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_loglevel_from_str</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span> <span class='op'>=</span> [
+ (<span class='string'>&quot;OFF&quot;</span>, <span class='prelude-val'>Err</span>(())),
+ (<span class='string'>&quot;error&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>)),
+ (<span class='string'>&quot;warn&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span>)),
+ (<span class='string'>&quot;info&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Info</span>)),
+ (<span class='string'>&quot;debug&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>)),
+ (<span class='string'>&quot;trace&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>)),
+ (<span class='string'>&quot;ERROR&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>)),
+ (<span class='string'>&quot;WARN&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span>)),
+ (<span class='string'>&quot;INFO&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Info</span>)),
+ (<span class='string'>&quot;DEBUG&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>)),
+ (<span class='string'>&quot;TRACE&quot;</span>, <span class='prelude-val'>Ok</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>)),
+ (<span class='string'>&quot;asdf&quot;</span>, <span class='prelude-val'>Err</span>(())),
+ ];
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, <span class='kw-2'>ref</span> <span class='ident'>expected</span>) <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='ident'>tests</span> {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>expected</span>, <span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>parse</span>());
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_loglevel_show</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='string'>&quot;INFO&quot;</span>, <span class='ident'>LogLevel</span>::<span class='ident'>Info</span>.<span class='ident'>to_string</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='string'>&quot;ERROR&quot;</span>, <span class='ident'>LogLevel</span>::<span class='ident'>Error</span>.<span class='ident'>to_string</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_loglevelfilter_show</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='string'>&quot;OFF&quot;</span>, <span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span>.<span class='ident'>to_string</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='string'>&quot;ERROR&quot;</span>, <span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>.<span class='ident'>to_string</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_cross_cmp</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span> <span class='op'>&gt;</span> <span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Warn</span> <span class='op'>&lt;</span> <span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span> <span class='op'>&lt;</span> <span class='ident'>LogLevel</span>::<span class='ident'>Error</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_cross_eq</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Error</span> <span class='op'>==</span> <span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span> <span class='op'>!=</span> <span class='ident'>LogLevel</span>::<span class='ident'>Error</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span> <span class='op'>==</span> <span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_to_log_level</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>), <span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>.<span class='ident'>to_log_level</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>None</span>, <span class='ident'>LogLevelFilter</span>::<span class='ident'>Off</span>.<span class='ident'>to_log_level</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>), <span class='ident'>LogLevelFilter</span>::<span class='ident'>Debug</span>.<span class='ident'>to_log_level</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_to_log_level_filter</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Error</span>, <span class='ident'>LogLevel</span>::<span class='ident'>Error</span>.<span class='ident'>to_log_level_filter</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>LogLevelFilter</span>::<span class='ident'>Trace</span>, <span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>.<span class='ident'>to_log_level_filter</span>());
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_error_trait</span>() {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='ident'>SetLoggerError</span>(());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>e</span>.<span class='ident'>description</span>(), <span class='string'>&quot;set_logger() called multiple times&quot;</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "log";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/log/macros.rs.html b/src/log/macros.rs.html
new file mode 100644
index 0000000..cd4dd2a
--- /dev/null
+++ b/src/log/macros.rs.html
@@ -0,0 +1,387 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/log-0.3.1/src/macros.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>macros.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../log/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+<span class='doccomment'>/// The standard logging macro.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This macro will generically log with the specified `LogLevel` and `format!`</span>
+<span class='doccomment'>/// based argument list.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The `log_level` cfg can be used to statically disable logging at various</span>
+<span class='doccomment'>/// levels.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>log</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>+</span>) <span class='op'>=&gt;</span> ({
+ <span class='kw'>static</span> <span class='ident'>LOC</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLocation</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLocation</span> {
+ <span class='ident'>__line</span>: <span class='macro'>line</span><span class='macro'>!</span>(),
+ <span class='ident'>__file</span>: <span class='macro'>file</span><span class='macro'>!</span>(),
+ <span class='ident'>__module_path</span>: <span class='macro'>module_path</span><span class='macro'>!</span>(),
+ };
+ <span class='kw'>let</span> <span class='ident'>lvl</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>;
+ <span class='kw'>if</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;off&quot;</span>) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Error</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;error&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;warn&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;debug&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Info</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;info&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ <span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>max_log_level</span>() {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>__log</span>(<span class='ident'>lvl</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='kw-2'>&amp;</span><span class='ident'>LOC</span>, <span class='macro'>format_args</span><span class='macro'>!</span>($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>+</span>))
+ }
+ });
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>+</span>) <span class='op'>=&gt;</span> (<span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro'>module_path</span><span class='macro'>!</span>(), <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>+</span>))
+}
+
+<span class='doccomment'>/// Logs a message at the error level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Logging at this level is disabled if the `log_level = &quot;off&quot;` cfg is</span>
+<span class='doccomment'>/// present.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>error</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ );
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Error</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ )
+}
+
+<span class='doccomment'>/// Logs a message at the warn level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Logging at this level is disabled if any of the following cfgs are present:</span>
+<span class='doccomment'>/// `log_level = &quot;off&quot;` or `log_level = &quot;error&quot;`.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>warn</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ );
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ )
+}
+
+<span class='doccomment'>/// Logs a message at the info level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Logging at this level is disabled if any of the following cfgs are present:</span>
+<span class='doccomment'>/// `log_level = &quot;off&quot;`, `log_level = &quot;error&quot;`, or</span>
+<span class='doccomment'>/// `log_level = &quot;warn&quot;`.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>info</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Info</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ );
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Info</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ )
+}
+
+<span class='doccomment'>/// Logs a message at the debug level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Logging at this level is disabled if any of the following cfgs are present:</span>
+<span class='doccomment'>/// `log_level = &quot;off&quot;`, `log_level = &quot;error&quot;`, `log_level = &quot;warn&quot;`,</span>
+<span class='doccomment'>/// or `log_level = &quot;info&quot;`.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>debug</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ );
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ )
+}
+
+<span class='doccomment'>/// Logs a message at the trace level.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Logging at this level is disabled if any of the following cfgs are present:</span>
+<span class='doccomment'>/// `log_level = &quot;off&quot;`, `log_level = &quot;error&quot;`, `log_level = &quot;warn&quot;`,</span>
+<span class='doccomment'>/// `log_level = &quot;info&quot;`, or `log_level = &quot;debug&quot;`.</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>trace</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ );
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>:<span class='ident'>tt</span>)<span class='op'>*</span>) <span class='op'>=&gt;</span> (
+ <span class='macro'>log</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Trace</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>arg</span>)<span class='op'>*</span>);
+ )
+}
+
+<span class='doccomment'>/// Determines if a message logged at the specified level in that module will</span>
+<span class='doccomment'>/// be logged.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This can be used to avoid expensive computation of log message arguments if</span>
+<span class='doccomment'>/// the message would be ignored anyway.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Examples</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```rust</span>
+<span class='doccomment'>/// # #[macro_use]</span>
+<span class='doccomment'>/// # extern crate log;</span>
+<span class='doccomment'>/// use log::LogLevel::Debug;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # fn foo() {</span>
+<span class='doccomment'>/// if log_enabled!(Debug) {</span>
+<span class='doccomment'>/// debug!(&quot;expensive debug data: {}&quot;, expensive_call());</span>
+<span class='doccomment'>/// }</span>
+<span class='doccomment'>/// # }</span>
+<span class='doccomment'>/// # fn expensive_call() -&gt; u32 { 0 }</span>
+<span class='doccomment'>/// # fn main() {}</span>
+<span class='doccomment'>/// ```</span>
+<span class='attribute'>#[<span class='ident'>macro_export</span>]</span>
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>log_enabled</span> {
+ (<span class='ident'>target</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>:<span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>:<span class='ident'>expr</span>) <span class='op'>=&gt;</span> ({
+ <span class='kw'>let</span> <span class='ident'>lvl</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>;
+ <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;off&quot;</span>) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Error</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;error&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Warn</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;warn&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Debug</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;debug&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ (<span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>LogLevel</span>::<span class='ident'>Info</span> <span class='op'>||</span> <span class='op'>!</span><span class='macro'>cfg</span><span class='macro'>!</span>(<span class='ident'>log_level</span> <span class='op'>=</span> <span class='string'>&quot;info&quot;</span>)) <span class='op'>&amp;&amp;</span>
+ <span class='ident'>lvl</span> <span class='op'>&lt;=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>max_log_level</span>() <span class='op'>&amp;&amp;</span>
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>crate</span>::<span class='ident'>__enabled</span>(<span class='ident'>lvl</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>target</span>)
+ });
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>:<span class='ident'>expr</span>) <span class='op'>=&gt;</span> (<span class='macro'>log_enabled</span><span class='macro'>!</span>(<span class='ident'>target</span>: <span class='macro'>module_path</span><span class='macro'>!</span>(), <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>lvl</span>))
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "log";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/memchr/lib.rs.html b/src/memchr/lib.rs.html
new file mode 100644
index 0000000..0e3568c
--- /dev/null
+++ b/src/memchr/lib.rs.html
@@ -0,0 +1,287 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/memchr-0.1.3/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+<span id="47">47</span>
+<span id="48">48</span>
+<span id="49">49</span>
+<span id="50">50</span>
+<span id="51">51</span>
+<span id="52">52</span>
+<span id="53">53</span>
+<span id="54">54</span>
+<span id="55">55</span>
+<span id="56">56</span>
+<span id="57">57</span>
+<span id="58">58</span>
+<span id="59">59</span>
+<span id="60">60</span>
+<span id="61">61</span>
+<span id="62">62</span>
+<span id="63">63</span>
+<span id="64">64</span>
+<span id="65">65</span>
+<span id="66">66</span>
+<span id="67">67</span>
+<span id="68">68</span>
+<span id="69">69</span>
+<span id="70">70</span>
+<span id="71">71</span>
+<span id="72">72</span>
+<span id="73">73</span>
+<span id="74">74</span>
+<span id="75">75</span>
+<span id="76">76</span>
+<span id="77">77</span>
+<span id="78">78</span>
+<span id="79">79</span>
+<span id="80">80</span>
+<span id="81">81</span>
+<span id="82">82</span>
+<span id="83">83</span>
+<span id="84">84</span>
+<span id="85">85</span>
+<span id="86">86</span>
+<span id="87">87</span>
+<span id="88">88</span>
+<span id="89">89</span>
+<span id="90">90</span>
+<span id="91">91</span>
+<span id="92">92</span>
+<span id="93">93</span>
+<span id="94">94</span>
+<span id="95">95</span>
+</pre><pre class='rust '>
+<span class='doccomment'>/*!
+This crate defines a single function, `memchr`, which exposes a safe interface
+to the corresponding function in `libc`.
+*/</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(<span class='ident'>missing_docs</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>libc</span>;
+
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>funcs</span>::<span class='ident'>c95</span>::<span class='ident'>string</span>;
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>types</span>::<span class='ident'>common</span>::<span class='ident'>c95</span>::<span class='ident'>c_void</span>;
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>types</span>::<span class='ident'>os</span>::<span class='ident'>arch</span>::<span class='ident'>c95</span>::{<span class='ident'>c_int</span>, <span class='ident'>size_t</span>};
+
+<span class='doccomment'>/// A safe interface to `memchr`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Returns the index corresponding to the first occurrence of `needle` in</span>
+<span class='doccomment'>/// `haystack`, or `None` if one is not found.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// memchr reduces to super-optimized machine code at around an order of</span>
+<span class='doccomment'>/// magnitude faster than `haystack.iter().position(|&amp;b| b == needle)`.</span>
+<span class='doccomment'>/// (See benchmarks.)</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Example</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This shows how to find the first position of a byte in a byte string.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```rust</span>
+<span class='doccomment'>/// use memchr::memchr;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// let haystack = b&quot;the quick brown fox&quot;;</span>
+<span class='doccomment'>/// assert_eq!(memchr(b&#39;k&#39;, haystack), Some(8));</span>
+<span class='doccomment'>/// ```</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>memchr</span>(<span class='ident'>needle</span>: <span class='ident'>u8</span>, <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>string</span>::<span class='ident'>memchr</span>(
+ <span class='ident'>haystack</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>needle</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>haystack</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>size_t</span>)
+ };
+ <span class='kw'>if</span> <span class='ident'>p</span>.<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>p</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>-</span> (<span class='ident'>haystack</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='ident'>usize</span>))
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>quickcheck</span>;
+
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='ident'>memchr</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>matches_one</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='number'>0</span>), <span class='ident'>memchr</span>(<span class='string'>b&#39;a&#39;</span>, <span class='string'>b&quot;a&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>matches_begin</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='number'>0</span>), <span class='ident'>memchr</span>(<span class='string'>b&#39;a&#39;</span>, <span class='string'>b&quot;aaaa&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>matches_end</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='number'>4</span>), <span class='ident'>memchr</span>(<span class='string'>b&#39;z&#39;</span>, <span class='string'>b&quot;aaaaz&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>matches_nul</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='number'>4</span>), <span class='ident'>memchr</span>(<span class='string'>b&#39;\x00&#39;</span>, <span class='string'>b&quot;aaaa\x00&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>matches_past_nul</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>Some</span>(<span class='number'>5</span>), <span class='ident'>memchr</span>(<span class='string'>b&#39;z&#39;</span>, <span class='string'>b&quot;aaaa\x00z&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>no_match_empty</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>None</span>, <span class='ident'>memchr</span>(<span class='string'>b&#39;a&#39;</span>, <span class='string'>b&quot;&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>no_match</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='prelude-val'>None</span>, <span class='ident'>memchr</span>(<span class='string'>b&#39;a&#39;</span>, <span class='string'>b&quot;xyz&quot;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>qc_never_fail</span>() {
+ <span class='kw'>fn</span> <span class='ident'>prop</span>(<span class='ident'>needle</span>: <span class='ident'>u8</span>, <span class='ident'>haystack</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>memchr</span>(<span class='ident'>needle</span>, <span class='kw-2'>&amp;</span><span class='ident'>haystack</span>); <span class='boolval'>true</span>
+ }
+ <span class='ident'>quickcheck</span>::<span class='ident'>quickcheck</span>(<span class='ident'>prop</span> <span class='kw'>as</span> <span class='kw'>fn</span>(<span class='ident'>u8</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "memchr";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/asn1/mod.rs.html b/src/openssl/asn1/mod.rs.html
new file mode 100644
index 0000000..5d7d165
--- /dev/null
+++ b/src/openssl/asn1/mod.rs.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/asn1/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+<span id="47">47</span>
+<span id="48">48</span>
+<span id="49">49</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_long</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>};
+
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Asn1Time</span> {
+ <span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>ASN1_TIME</span>,
+ <span class='ident'>owned</span>: <span class='ident'>bool</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Asn1Time</span> {
+ <span class='doccomment'>/// Wraps existing ASN1_TIME and takes ownership</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>ASN1_TIME</span>) <span class='op'>-&gt;</span> <span class='ident'>Asn1Time</span> {
+ <span class='ident'>Asn1Time</span> {
+ <span class='ident'>handle</span>: <span class='ident'>handle</span>,
+ <span class='ident'>owned</span>: <span class='boolval'>true</span>
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>new_with_period</span>(<span class='ident'>period</span>: <span class='ident'>u64</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Asn1Time</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>handle</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_gmtime_adj</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(),
+ <span class='ident'>period</span> <span class='kw'>as</span> <span class='ident'>c_long</span>))
+ };
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Asn1Time</span>::<span class='ident'>new</span>(<span class='ident'>handle</span>))
+ }
+
+ <span class='doccomment'>/// Creates a new time on specified interval in days from now</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>days_from_now</span>(<span class='ident'>days</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Asn1Time</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>Asn1Time</span>::<span class='ident'>new_with_period</span>(<span class='ident'>days</span> <span class='kw'>as</span> <span class='ident'>u64</span> <span class='op'>*</span> <span class='number'>60</span> <span class='op'>*</span> <span class='number'>60</span> <span class='op'>*</span> <span class='number'>24</span>)
+ }
+
+ <span class='doccomment'>/// Returns raw handle</span>
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>get_handle</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>ASN1_TIME</span> {
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>handle</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>Asn1Time</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>owned</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>ASN1_TIME_free</span>(<span class='self'>self</span>.<span class='ident'>handle</span>) };
+ }
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/bio/mod.rs.html b/src/openssl/bio/mod.rs.html
new file mode 100644
index 0000000..0d8a555
--- /dev/null
+++ b/src/openssl/bio/mod.rs.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/bio/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_void</span>, <span class='ident'>c_int</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>;
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>};
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>MemBio</span> {
+ <span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIO</span>,
+ <span class='ident'>owned</span>: <span class='ident'>bool</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>MemBio</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>owned</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BIO_free_all</span>(<span class='self'>self</span>.<span class='ident'>bio</span>);
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>MemBio</span> {
+ <span class='doccomment'>/// Creates a new owned memory based BIO</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>MemBio</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>bio</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>BIO_new</span>(<span class='ident'>ffi</span>::<span class='ident'>BIO_s_mem</span>()) };
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>bio</span>);
+
+ <span class='prelude-val'>Ok</span>(<span class='ident'>MemBio</span> {
+ <span class='ident'>bio</span>: <span class='ident'>bio</span>,
+ <span class='ident'>owned</span>: <span class='boolval'>true</span>
+ })
+ }
+
+ <span class='doccomment'>/// Returns a &quot;borrow&quot;, i.e. it has no ownership</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>borrowed</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIO</span>) <span class='op'>-&gt;</span> <span class='ident'>MemBio</span> {
+ <span class='ident'>MemBio</span> {
+ <span class='ident'>bio</span>: <span class='ident'>bio</span>,
+ <span class='ident'>owned</span>: <span class='boolval'>false</span>
+ }
+ }
+
+ <span class='doccomment'>/// Consumes current bio and returns wrapped value</span>
+ <span class='doccomment'>/// Note that data ownership is lost and</span>
+ <span class='doccomment'>/// should be managed manually</span>
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>unwrap</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIO</span> {
+ <span class='self'>self</span>.<span class='ident'>owned</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='self'>self</span>.<span class='ident'>bio</span>
+ }
+
+ <span class='doccomment'>/// Temporarily gets wrapped value</span>
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>get_handle</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIO</span> {
+ <span class='self'>self</span>.<span class='ident'>bio</span>
+ }
+
+ <span class='doccomment'>/// Sets the BIO&#39;s EOF state.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_eof</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>eof</span>: <span class='ident'>bool</span>) {
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>eof</span> { <span class='number'>0</span> } <span class='kw'>else</span> { <span class='op'>-</span><span class='number'>1</span> };
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>BIO_set_mem_eof_return</span>(<span class='self'>self</span>.<span class='ident'>bio</span>, <span class='ident'>v</span>); }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Read</span> <span class='kw'>for</span> <span class='ident'>MemBio</span> {
+ <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>cmp</span>::<span class='ident'>min</span>(<span class='ident'>c_int</span>::<span class='ident'>max_value</span>() <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>buf</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>c_int</span>;
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BIO_read</span>(<span class='self'>self</span>.<span class='ident'>bio</span>, <span class='ident'>buf</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>)
+ };
+
+ <span class='kw'>if</span> <span class='ident'>ret</span> <span class='op'>&lt;=</span> <span class='number'>0</span> {
+ <span class='kw'>let</span> <span class='ident'>is_eof</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>BIO_eof</span>(<span class='self'>self</span>.<span class='ident'>bio</span>) };
+ <span class='kw'>if</span> <span class='ident'>is_eof</span> {
+ <span class='prelude-val'>Ok</span>(<span class='number'>0</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>Other</span>,
+ <span class='ident'>SslError</span>::<span class='ident'>get</span>()))
+ }
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ret</span> <span class='kw'>as</span> <span class='ident'>usize</span>)
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>MemBio</span> {
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>cmp</span>::<span class='ident'>min</span>(<span class='ident'>c_int</span>::<span class='ident'>max_value</span>() <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>buf</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>c_int</span>;
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BIO_write</span>(<span class='self'>self</span>.<span class='ident'>bio</span>, <span class='ident'>buf</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>)
+ };
+
+ <span class='kw'>if</span> <span class='ident'>ret</span> <span class='op'>&lt;</span> <span class='number'>0</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>Other</span>,
+ <span class='ident'>SslError</span>::<span class='ident'>get</span>()))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ret</span> <span class='kw'>as</span> <span class='ident'>usize</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/bn/mod.rs.html b/src/openssl/bn/mod.rs.html
new file mode 100644
index 0000000..f57f83e
--- /dev/null
+++ b/src/openssl/bn/mod.rs.html
@@ -0,0 +1,1305 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/bn/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_ulong</span>, <span class='ident'>c_void</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::{<span class='ident'>CStr</span>, <span class='ident'>CString</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::<span class='ident'>Ordering</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::{<span class='ident'>fmt</span>, <span class='ident'>ptr</span>};
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::<span class='ident'>SslError</span>;
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>BigNum</span>(<span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIGNUM</span>);
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>RNGProperty</span> {
+ <span class='ident'>MsbMaybeZero</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>,
+ <span class='ident'>MsbOne</span> <span class='op'>=</span> <span class='number'>0</span>,
+ <span class='ident'>TwoMsbOne</span> <span class='op'>=</span> <span class='number'>1</span>,
+}
+
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>with_ctx</span>(
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>:<span class='ident'>ident</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span>:<span class='ident'>block</span>) <span class='op'>=&gt;</span> ({
+ <span class='kw'>let</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_CTX_new</span>();
+ <span class='kw'>if</span> (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>).<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span>;
+ <span class='ident'>ffi</span>::<span class='ident'>BN_CTX_free</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>);
+ <span class='ident'>r</span>
+ }
+ });
+);
+
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>with_bn</span>(
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>:<span class='ident'>ident</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span>:<span class='ident'>block</span>) <span class='op'>=&gt;</span> ({
+ <span class='kw'>let</span> <span class='ident'>tmp</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new</span>();
+ <span class='kw'>match</span> <span class='ident'>tmp</span> {
+ <span class='prelude-val'>Ok</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span> {
+ <span class='prelude-val'>Ok</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ },
+ <span class='prelude-val'>Err</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='ident'>err</span>),
+ }
+ });
+);
+
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>with_bn_in_ctx</span>(
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>:<span class='ident'>ident</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ctx_name</span>:<span class='ident'>ident</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span>:<span class='ident'>block</span>) <span class='op'>=&gt;</span> ({
+ <span class='kw'>let</span> <span class='ident'>tmp</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new</span>();
+ <span class='kw'>match</span> <span class='ident'>tmp</span> {
+ <span class='prelude-val'>Ok</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ctx_name</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_CTX_new</span>();
+ <span class='kw'>if</span> (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ctx_name</span>).<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span>
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>action</span> {
+ <span class='prelude-val'>Ok</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ };
+ <span class='ident'>ffi</span>::<span class='ident'>BN_CTX_free</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ctx_name</span>);
+ <span class='ident'>r</span>
+ }
+ },
+ <span class='prelude-val'>Err</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='ident'>err</span>),
+ }
+ });
+);
+
+<span class='kw'>impl</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_new</span>());
+ <span class='prelude-val'>Ok</span>(<span class='ident'>BigNum</span>(<span class='ident'>v</span>))
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_from</span>(<span class='ident'>n</span>: <span class='ident'>u64</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>BigNum</span>::<span class='ident'>new</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='ident'>v</span><span class='op'>|</span> <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_set_word</span>(<span class='ident'>v</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>c_ulong</span>));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>v</span>)
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_dec_str</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>BigNum</span>::<span class='ident'>new</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='ident'>v</span><span class='op'>|</span> <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>c_str</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>s</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_dec2bn</span>(<span class='ident'>v</span>.<span class='ident'>raw_ptr</span>(), <span class='ident'>c_str</span>.<span class='ident'>as_ptr</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>v</span>)
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_hex_str</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>BigNum</span>::<span class='ident'>new</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='ident'>v</span><span class='op'>|</span> <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>c_str</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>s</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_hex2bn</span>(<span class='ident'>v</span>.<span class='ident'>raw_ptr</span>(), <span class='ident'>c_str</span>.<span class='ident'>as_ptr</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>v</span>)
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_from_slice</span>(<span class='ident'>n</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>BigNum</span>::<span class='ident'>new</span>().<span class='ident'>and_then</span>(<span class='op'>|</span><span class='ident'>v</span><span class='op'>|</span> <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_bin2bn</span>(<span class='ident'>n</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>n</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>v</span>.<span class='ident'>raw</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>v</span>)
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_sqr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_sqr</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_nnmod</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_nnmod</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_add</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mod_add</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_sub</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mod_sub</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_mul</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mod_mul</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_sqr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mod_sqr</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_exp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_exp</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>p</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_exp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mod_exp</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>p</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod_inv</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>n</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='op'>!</span><span class='ident'>ffi</span>::<span class='ident'>BN_mod_inverse</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>).<span class='ident'>is_null</span>() })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>add_word</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_add_word</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>w</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sub_word</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_sub_word</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>w</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mul_word</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_mul_word</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>w</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>div_word</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>c_ulong</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_div_word</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>w</span>);
+ <span class='kw'>if</span> <span class='ident'>result</span> <span class='op'>!=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_ulong</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>result</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mod_word</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>c_ulong</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_mod_word</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>w</span>);
+ <span class='kw'>if</span> <span class='ident'>result</span> <span class='op'>!=</span> <span class='op'>!</span><span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_ulong</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>result</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_gcd</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_gcd</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_generate_prime</span>(<span class='ident'>bits</span>: <span class='ident'>i32</span>, <span class='ident'>safe</span>: <span class='ident'>bool</span>, <span class='ident'>add</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>BigNum</span><span class='op'>&gt;</span>, <span class='ident'>rem</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>BigNum</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, {
+ <span class='kw'>let</span> <span class='ident'>add_arg</span> <span class='op'>=</span> <span class='ident'>add</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>a</span><span class='op'>|</span> <span class='ident'>a</span>.<span class='ident'>raw</span>()).<span class='ident'>unwrap_or</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+ <span class='kw'>let</span> <span class='ident'>rem_arg</span> <span class='op'>=</span> <span class='ident'>rem</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>raw</span>()).<span class='ident'>unwrap_or</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+
+ <span class='ident'>ffi</span>::<span class='ident'>BN_generate_prime_ex</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>safe</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>add_arg</span>, <span class='ident'>rem_arg</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>()) <span class='op'>==</span> <span class='number'>1</span>
+ })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_prime</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>checks</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_ctx</span><span class='macro'>!</span>(<span class='ident'>ctx</span>, {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_is_prime_ex</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>checks</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>ctx</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>()) <span class='op'>==</span> <span class='number'>1</span>)
+ })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_prime_fast</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>checks</span>: <span class='ident'>i32</span>, <span class='ident'>do_trial_division</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_ctx</span><span class='macro'>!</span>(<span class='ident'>ctx</span>, {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ffi</span>::<span class='ident'>BN_is_prime_fasttest_ex</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>checks</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>ctx</span>, <span class='ident'>do_trial_division</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>()) <span class='op'>==</span> <span class='number'>1</span>)
+ })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_new_random</span>(<span class='ident'>bits</span>: <span class='ident'>i32</span>, <span class='ident'>prop</span>: <span class='ident'>RNGProperty</span>, <span class='ident'>odd</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_rand</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>prop</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>odd</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_new_pseudo_random</span>(<span class='ident'>bits</span>: <span class='ident'>i32</span>, <span class='ident'>prop</span>: <span class='ident'>RNGProperty</span>, <span class='ident'>odd</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_pseudo_rand</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>prop</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>odd</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_rand_in_range</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_rand_range</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_pseudo_rand_in_range</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_pseudo_rand_range</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_bit</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_set_bit</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>clear_bit</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_clear_bit</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_bit_set</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_is_bit_set</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>mask_bits</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='ident'>ffi</span>::<span class='ident'>BN_mask_bits</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='prelude-val'>Ok</span>(())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_shl1</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_lshift1</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_shr1</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_rshift1</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_add</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_add</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_sub</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_sub</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mul</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_mul</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_div</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_div</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_mod</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn_in_ctx</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='ident'>ctx</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_div</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>a</span>.<span class='ident'>raw</span>(), <span class='ident'>ctx</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_shl</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_lshift</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='op'>*</span><span class='ident'>a</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>checked_shr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>a</span>: <span class='kw-2'>&amp;</span><span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>BigNum</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>with_bn</span><span class='macro'>!</span>(<span class='ident'>r</span>, { <span class='ident'>ffi</span>::<span class='ident'>BN_rshift</span>(<span class='ident'>r</span>.<span class='ident'>raw</span>(), <span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='op'>*</span><span class='ident'>a</span> <span class='kw'>as</span> <span class='ident'>c_int</span>) <span class='op'>==</span> <span class='number'>1</span> })
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>negate</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_set_negative</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>is_negative</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>)
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>abs_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>oth</span>: <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>Ordering</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_ucmp</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>oth</span>.<span class='ident'>raw</span>()) <span class='kw'>as</span> <span class='ident'>i32</span>;
+ <span class='kw'>if</span> <span class='ident'>res</span> <span class='op'>&lt;</span> <span class='number'>0</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>res</span> <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span>
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_negative</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>unsafe</span> {
+ (<span class='op'>*</span><span class='self'>self</span>.<span class='ident'>raw</span>()).<span class='ident'>neg</span> <span class='op'>==</span> <span class='number'>1</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>num_bits</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_num_bits</span>(<span class='self'>self</span>.<span class='ident'>raw</span>()) <span class='kw'>as</span> <span class='ident'>i32</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>num_bytes</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>i32</span> {
+ (<span class='self'>self</span>.<span class='ident'>num_bits</span>() <span class='op'>+</span> <span class='number'>7</span>) <span class='op'>/</span> <span class='number'>8</span>
+ }
+
+ <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>raw</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIGNUM</span> {
+ <span class='kw'>let</span> <span class='ident'>BigNum</span>(<span class='ident'>n</span>) <span class='op'>=</span> <span class='op'>*</span><span class='self'>self</span>;
+ <span class='ident'>n</span>
+ }
+
+ <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>raw_ptr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIGNUM</span> {
+ <span class='kw'>let</span> <span class='ident'>BigNum</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>) <span class='op'>=</span> <span class='op'>*</span><span class='self'>self</span>;
+ <span class='ident'>n</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_vec</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>size</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>num_bytes</span>() <span class='kw'>as</span> <span class='ident'>usize</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>size</span>);
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_bn2bin</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>v</span>.<span class='ident'>as_mut_ptr</span>());
+ <span class='ident'>v</span>.<span class='ident'>set_len</span>(<span class='ident'>size</span>);
+ }
+ <span class='ident'>v</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_dec_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>buf</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_bn2dec</span>(<span class='self'>self</span>.<span class='ident'>raw</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>buf</span>.<span class='ident'>is_null</span>());
+ <span class='kw'>let</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>buf</span>).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>()).<span class='ident'>unwrap</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_free</span>(<span class='ident'>buf</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+ <span class='ident'>str</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>to_hex_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>buf</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_bn2hex</span>(<span class='self'>self</span>.<span class='ident'>raw</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>buf</span>.<span class='ident'>is_null</span>());
+ <span class='kw'>let</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>buf</span>).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>()).<span class='ident'>unwrap</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_free</span>(<span class='ident'>buf</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+ <span class='ident'>str</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='self'>self</span>.<span class='ident'>to_dec_str</span>())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Eq</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> { }
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_cmp</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>oth</span>.<span class='ident'>raw</span>()) <span class='op'>==</span> <span class='number'>0</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Ord</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>Ordering</span> {
+ <span class='self'>self</span>.<span class='ident'>partial_cmp</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_cmp</span>(<span class='self'>self</span>.<span class='ident'>raw</span>(), <span class='ident'>oth</span>.<span class='ident'>raw</span>());
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span>
+ <span class='kw'>if</span> <span class='ident'>v</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>v</span> <span class='op'>&lt;</span> <span class='number'>0</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span>
+ };
+ <span class='prelude-val'>Some</span>(<span class='ident'>ret</span>)
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>raw</span>().<span class='ident'>is_null</span>() {
+ <span class='ident'>ffi</span>::<span class='ident'>BN_clear_free</span>(<span class='self'>self</span>.<span class='ident'>raw</span>());
+ }
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>unchecked</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::{<span class='ident'>Add</span>, <span class='ident'>Div</span>, <span class='ident'>Mul</span>, <span class='ident'>Neg</span>, <span class='ident'>Rem</span>, <span class='ident'>Shl</span>, <span class='ident'>Shr</span>, <span class='ident'>Sub</span>};
+ <span class='kw'>use</span> <span class='ident'>ffi</span>;
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>BigNum</span>};
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Add</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>add</span>(<span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_add</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Sub</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>sub</span>(<span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_sub</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Mul</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>mul</span>(<span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_mul</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Div</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>div</span>(<span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_div</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Rem</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>rem</span>(<span class='self'>self</span>, <span class='ident'>oth</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_mod</span>(<span class='ident'>oth</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Shl</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>shl</span>(<span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_shl</span>(<span class='kw-2'>&amp;</span><span class='ident'>n</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Shr</span><span class='op'>&lt;</span><span class='ident'>i32</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>shr</span>(<span class='self'>self</span>, <span class='ident'>n</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='self'>self</span>.<span class='ident'>checked_shr</span>(<span class='kw-2'>&amp;</span><span class='ident'>n</span>).<span class='ident'>unwrap</span>()
+ }
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>BN_dup</span>(<span class='self'>self</span>.<span class='ident'>raw</span>());
+ <span class='kw'>if</span> <span class='ident'>r</span>.<span class='ident'>is_null</span>() {
+ <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;Unexpected null pointer from BN_dup(..)&quot;</span>)
+ } <span class='kw'>else</span> {
+ <span class='ident'>BigNum</span>(<span class='ident'>r</span>)
+ }
+ }
+ }
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>Neg</span> <span class='kw'>for</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>type</span> <span class='ident'>Output</span> <span class='op'>=</span> <span class='ident'>BigNum</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>neg</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>BigNum</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>clone</span>();
+ <span class='ident'>n</span>.<span class='ident'>negate</span>();
+ <span class='ident'>n</span>
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>bn</span>::<span class='ident'>BigNum</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_to_from_slice</span>() {
+ <span class='kw'>let</span> <span class='ident'>v0</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new_from</span>(<span class='number'>10203004_u64</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>vec</span> <span class='op'>=</span> <span class='ident'>v0</span>.<span class='ident'>to_vec</span>();
+ <span class='kw'>let</span> <span class='ident'>v1</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new_from_slice</span>(<span class='kw-2'>&amp;</span><span class='ident'>vec</span>).<span class='ident'>unwrap</span>();
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>v0</span> <span class='op'>==</span> <span class='ident'>v1</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_negation</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new_from</span>(<span class='number'>909829283_u64</span>).<span class='ident'>unwrap</span>();
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>a</span>.<span class='ident'>is_negative</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>((<span class='op'>-</span><span class='ident'>a</span>).<span class='ident'>is_negative</span>());
+ }
+
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_prime_numbers</span>() {
+ <span class='kw'>let</span> <span class='ident'>a</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>new_from</span>(<span class='number'>19029017_u64</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>BigNum</span>::<span class='ident'>checked_generate_prime</span>(<span class='number'>128</span>, <span class='boolval'>true</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>Some</span>(<span class='kw-2'>&amp;</span><span class='ident'>a</span>)).<span class='ident'>unwrap</span>();
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>p</span>.<span class='ident'>is_prime</span>(<span class='number'>100</span>).<span class='ident'>unwrap</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>p</span>.<span class='ident'>is_prime_fast</span>(<span class='number'>100</span>, <span class='boolval'>true</span>).<span class='ident'>unwrap</span>());
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/hash.rs.html b/src/openssl/crypto/hash.rs.html
new file mode 100644
index 0000000..3acc27b
--- /dev/null
+++ b/src/openssl/crypto/hash.rs.html
@@ -0,0 +1,773 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/hash.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>hash.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>c_uint</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='doccomment'>/// Message digest (hash) type.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Type</span> {
+ <span class='ident'>MD5</span>,
+ <span class='ident'>SHA1</span>,
+ <span class='ident'>SHA224</span>,
+ <span class='ident'>SHA256</span>,
+ <span class='ident'>SHA384</span>,
+ <span class='ident'>SHA512</span>,
+ <span class='ident'>RIPEMD160</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Type</span> {
+ <span class='doccomment'>/// Returns the length of the message digest.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>md_len</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Type</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MD5</span> <span class='op'>=&gt;</span> <span class='number'>16</span>,
+ <span class='ident'>SHA1</span> <span class='op'>=&gt;</span> <span class='number'>20</span>,
+ <span class='ident'>SHA224</span> <span class='op'>=&gt;</span> <span class='number'>28</span>,
+ <span class='ident'>SHA256</span> <span class='op'>=&gt;</span> <span class='number'>32</span>,
+ <span class='ident'>SHA384</span> <span class='op'>=&gt;</span> <span class='number'>48</span>,
+ <span class='ident'>SHA512</span> <span class='op'>=&gt;</span> <span class='number'>64</span>,
+ <span class='ident'>RIPEMD160</span> <span class='op'>=&gt;</span> <span class='number'>20</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Internal interface subject to removal.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>evp_md</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Type</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MD5</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_md5</span>(),
+ <span class='ident'>SHA1</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_sha1</span>(),
+ <span class='ident'>SHA224</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_sha224</span>(),
+ <span class='ident'>SHA256</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_sha256</span>(),
+ <span class='ident'>SHA384</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_sha384</span>(),
+ <span class='ident'>SHA512</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_sha512</span>(),
+ <span class='ident'>RIPEMD160</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_ripemd160</span>(),
+ }
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>PartialEq</span>, <span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>enum</span> <span class='ident'>State</span> {
+ <span class='ident'>Reset</span>,
+ <span class='ident'>Updated</span>,
+ <span class='ident'>Finalized</span>,
+}
+
+<span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>State</span>::<span class='op'>*</span>;
+
+<span class='doccomment'>/// Provides message digest (hash) computation.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Examples</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Calculate a hash in one go.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// use openssl::crypto::hash::{hash, Type};</span>
+<span class='doccomment'>/// let data = b&quot;\x42\xF4\x97\xE0&quot;;</span>
+<span class='doccomment'>/// let spec = b&quot;\x7c\x43\x0f\x17\x8a\xef\xdf\x14\x87\xfe\xe7\x14\x4e\x96\x41\xe2&quot;;</span>
+<span class='doccomment'>/// let res = hash(Type::MD5, data);</span>
+<span class='doccomment'>/// assert_eq!(res, spec);</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Use the `Write` trait to supply the input in chunks.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// use std::io::prelude::*;</span>
+<span class='doccomment'>/// use openssl::crypto::hash::{Hasher, Type};</span>
+<span class='doccomment'>/// let data = [b&quot;\x42\xF4&quot;, b&quot;\x97\xE0&quot;];</span>
+<span class='doccomment'>/// let spec = b&quot;\x7c\x43\x0f\x17\x8a\xef\xdf\x14\x87\xfe\xe7\x14\x4e\x96\x41\xe2&quot;;</span>
+<span class='doccomment'>/// let mut h = Hasher::new(Type::MD5);</span>
+<span class='doccomment'>/// h.write_all(data[0]);</span>
+<span class='doccomment'>/// h.write_all(data[1]);</span>
+<span class='doccomment'>/// let res = h.finish();</span>
+<span class='doccomment'>/// assert_eq!(res, spec);</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Warning</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Don&#39;t actually use MD5 and SHA-1 hashes, they&#39;re not secure anymore.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Don&#39;t ever hash passwords, use `crypto::pkcs5` or bcrypt/scrypt instead.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Hasher</span> {
+ <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD_CTX</span>,
+ <span class='ident'>md</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD</span>,
+ <span class='ident'>type_</span>: <span class='ident'>Type</span>,
+ <span class='ident'>state</span>: <span class='ident'>State</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Hasher</span> {
+ <span class='doccomment'>/// Creates a new `Hasher` with the specified hash type.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ty</span>: <span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='ident'>Hasher</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD_CTX_create</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>r</span>.<span class='ident'>is_null</span>());
+ <span class='ident'>r</span>
+ };
+ <span class='kw'>let</span> <span class='ident'>md</span> <span class='op'>=</span> <span class='ident'>ty</span>.<span class='ident'>evp_md</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>Hasher</span> { <span class='ident'>ctx</span>: <span class='ident'>ctx</span>, <span class='ident'>md</span>: <span class='ident'>md</span>, <span class='ident'>type_</span>: <span class='ident'>ty</span>, <span class='ident'>state</span>: <span class='ident'>Finalized</span> };
+ <span class='ident'>h</span>.<span class='ident'>init</span>();
+ <span class='ident'>h</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>init</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>state</span> {
+ <span class='ident'>Reset</span> <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ <span class='ident'>Updated</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>finalize</span>(); },
+ <span class='ident'>Finalized</span> <span class='op'>=&gt;</span> (),
+ }
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_DigestInit_ex</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='self'>self</span>.<span class='ident'>md</span>, <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Reset</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>==</span> <span class='ident'>Finalized</span> {
+ <span class='self'>self</span>.<span class='ident'>init</span>();
+ }
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_DigestUpdate</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>data</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>data</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Updated</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>finalize</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>==</span> <span class='ident'>Finalized</span> {
+ <span class='self'>self</span>.<span class='ident'>init</span>();
+ }
+ <span class='kw'>let</span> <span class='ident'>md_len</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>type_</span>.<span class='ident'>md_len</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0</span>).<span class='ident'>take</span>(<span class='ident'>md_len</span>).<span class='ident'>collect</span>();
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_DigestFinal_ex</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>res</span>.<span class='ident'>as_mut_ptr</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>);
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Finalized</span>;
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>md_len</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='ident'>res</span>
+ }
+
+ <span class='doccomment'>/// Returns the hash of the data written since creation or</span>
+ <span class='doccomment'>/// the last `finish` and resets the hasher.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>finish</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>finalize</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>Hasher</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>update</span>(<span class='ident'>buf</span>);
+ <span class='prelude-val'>Ok</span>(<span class='ident'>buf</span>.<span class='ident'>len</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>Hasher</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Hasher</span> {
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD_CTX_create</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>ctx</span>.<span class='ident'>is_null</span>());
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD_CTX_copy_ex</span>(<span class='ident'>ctx</span>, <span class='self'>self</span>.<span class='ident'>ctx</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ <span class='ident'>ctx</span>
+ };
+ <span class='ident'>Hasher</span> { <span class='ident'>ctx</span>: <span class='ident'>ctx</span>, <span class='ident'>md</span>: <span class='self'>self</span>.<span class='ident'>md</span>, <span class='ident'>type_</span>: <span class='self'>self</span>.<span class='ident'>type_</span>, <span class='ident'>state</span>: <span class='self'>self</span>.<span class='ident'>state</span> }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>Hasher</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>!=</span> <span class='ident'>Finalized</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buf</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0</span>).<span class='ident'>take</span>(<span class='self'>self</span>.<span class='ident'>type_</span>.<span class='ident'>md_len</span>()).<span class='ident'>collect</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_DigestFinal_ex</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>buf</span>.<span class='ident'>as_mut_ptr</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>);
+ }
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_MD_CTX_destroy</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>);
+ }
+ }
+}
+
+<span class='doccomment'>/// Computes the hash of the `data` with the hash `t`.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>hash</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>Hasher</span>::<span class='ident'>new</span>(<span class='ident'>t</span>);
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='ident'>data</span>);
+ <span class='ident'>h</span>.<span class='ident'>finish</span>()
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>serialize</span>::<span class='ident'>hex</span>::{<span class='ident'>FromHex</span>, <span class='ident'>ToHex</span>};
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>hash</span>, <span class='ident'>Hasher</span>, <span class='ident'>Type</span>};
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>hash_test</span>(<span class='ident'>hashtype</span>: <span class='ident'>Type</span>, <span class='ident'>hashtest</span>: <span class='kw-2'>&amp;</span>(<span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='kw-2'>&amp;</span><span class='ident'>str</span>)) {
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>hash</span>(<span class='ident'>hashtype</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>hashtest</span>.<span class='number'>0</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>.<span class='ident'>to_hex</span>(), <span class='ident'>hashtest</span>.<span class='number'>1</span>);
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>hash_recycle_test</span>(<span class='ident'>h</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Hasher</span>, <span class='ident'>hashtest</span>: <span class='kw-2'>&amp;</span>(<span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='kw-2'>&amp;</span><span class='ident'>str</span>)) {
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>hashtest</span>.<span class='number'>0</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>.<span class='ident'>to_hex</span>(), <span class='ident'>hashtest</span>.<span class='number'>1</span>);
+ }
+
+ <span class='comment'>// Test vectors from http://www.nsrl.nist.gov/testdata/</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_upper_case_globals</span>)]</span>
+ <span class='kw'>const</span> <span class='ident'>md5_tests</span>: [(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>); <span class='number'>13</span>] <span class='op'>=</span> [
+ (<span class='string'>&quot;&quot;</span>, <span class='string'>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</span>),
+ (<span class='string'>&quot;7F&quot;</span>, <span class='string'>&quot;83acb6e67e50e31db6ed341dd2de1595&quot;</span>),
+ (<span class='string'>&quot;EC9C&quot;</span>, <span class='string'>&quot;0b07f0d4ca797d8ac58874f887cb0b68&quot;</span>),
+ (<span class='string'>&quot;FEE57A&quot;</span>, <span class='string'>&quot;e0d583171eb06d56198fc0ef22173907&quot;</span>),
+ (<span class='string'>&quot;42F497E0&quot;</span>, <span class='string'>&quot;7c430f178aefdf1487fee7144e9641e2&quot;</span>),
+ (<span class='string'>&quot;C53B777F1C&quot;</span>, <span class='string'>&quot;75ef141d64cb37ec423da2d9d440c925&quot;</span>),
+ (<span class='string'>&quot;89D5B576327B&quot;</span>, <span class='string'>&quot;ebbaf15eb0ed784c6faa9dc32831bf33&quot;</span>),
+ (<span class='string'>&quot;5D4CCE781EB190&quot;</span>, <span class='string'>&quot;ce175c4b08172019f05e6b5279889f2c&quot;</span>),
+ (<span class='string'>&quot;81901FE94932D7B9&quot;</span>, <span class='string'>&quot;cd4d2f62b8cdb3a0cf968a735a239281&quot;</span>),
+ (<span class='string'>&quot;C9FFDEE7788EFB4EC9&quot;</span>, <span class='string'>&quot;e0841a231ab698db30c6c0f3f246c014&quot;</span>),
+ (<span class='string'>&quot;66AC4B7EBA95E53DC10B&quot;</span>, <span class='string'>&quot;a3b3cea71910d9af56742aa0bb2fe329&quot;</span>),
+ (<span class='string'>&quot;A510CD18F7A56852EB0319&quot;</span>, <span class='string'>&quot;577e216843dd11573574d3fb209b97d8&quot;</span>),
+ (<span class='string'>&quot;AAED18DBE8938C19ED734A8D&quot;</span>, <span class='string'>&quot;6f80fb775f27e0a4ce5c2f42fc72c5f1&quot;</span>)
+ ];
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_md5</span>() {
+ <span class='kw'>for</span> <span class='ident'>test</span> <span class='kw'>in</span> <span class='ident'>md5_tests</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>hash_test</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>, <span class='ident'>test</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_md5_recycle</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>Hasher</span>::<span class='ident'>new</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>);
+ <span class='kw'>for</span> <span class='ident'>test</span> <span class='kw'>in</span> <span class='ident'>md5_tests</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>hash_recycle_test</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>h</span>, <span class='ident'>test</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_finish_twice</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>Hasher</span>::<span class='ident'>new</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>);
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>md5_tests</span>[<span class='number'>6</span>].<span class='number'>0</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>finish</span>();
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>finish</span>();
+ <span class='kw'>let</span> <span class='ident'>null</span> <span class='op'>=</span> <span class='ident'>hash</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span>[]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>, <span class='ident'>null</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_clone</span>() {
+ <span class='kw'>let</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='number'>7</span>;
+ <span class='kw'>let</span> <span class='ident'>inp</span> <span class='op'>=</span> <span class='ident'>md5_tests</span>[<span class='ident'>i</span>].<span class='number'>0</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>inp</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>2</span>);
+ <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>inp</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='number'>2</span>;
+ <span class='kw'>let</span> <span class='ident'>h0</span> <span class='op'>=</span> <span class='ident'>Hasher</span>::<span class='ident'>new</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>);
+
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone a new hasher&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h1</span> <span class='op'>=</span> <span class='ident'>h0</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>inp</span>[..<span class='ident'>p</span>]);
+ {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone an updated hasher&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h2</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h2</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>inp</span>[<span class='ident'>p</span>..]);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h2</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>.<span class='ident'>to_hex</span>(), <span class='ident'>md5_tests</span>[<span class='ident'>i</span>].<span class='number'>1</span>);
+ }
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>inp</span>[<span class='ident'>p</span>..]);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>.<span class='ident'>to_hex</span>(), <span class='ident'>md5_tests</span>[<span class='ident'>i</span>].<span class='number'>1</span>);
+
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone a finished hasher&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h3</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h3</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>md5_tests</span>[<span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>].<span class='number'>0</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h3</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>.<span class='ident'>to_hex</span>(), <span class='ident'>md5_tests</span>[<span class='ident'>i</span> <span class='op'>+</span> <span class='number'>1</span>].<span class='number'>1</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_sha1</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span> <span class='op'>=</span> [
+ (<span class='string'>&quot;616263&quot;</span>, <span class='string'>&quot;a9993e364706816aba3e25717850c26c9cd0d89d&quot;</span>),
+ ];
+
+ <span class='kw'>for</span> <span class='ident'>test</span> <span class='kw'>in</span> <span class='ident'>tests</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>hash_test</span>(<span class='ident'>Type</span>::<span class='ident'>SHA1</span>, <span class='ident'>test</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_sha256</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span> <span class='op'>=</span> [
+ (<span class='string'>&quot;616263&quot;</span>, <span class='string'>&quot;ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad&quot;</span>)
+ ];
+
+ <span class='kw'>for</span> <span class='ident'>test</span> <span class='kw'>in</span> <span class='ident'>tests</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>hash_test</span>(<span class='ident'>Type</span>::<span class='ident'>SHA256</span>, <span class='ident'>test</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_ripemd160</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span> <span class='op'>=</span> [
+ (<span class='string'>&quot;616263&quot;</span>, <span class='string'>&quot;8eb208f7e05d987a9b044a8e98c6b087f15a0bfc&quot;</span>)
+ ];
+
+ <span class='kw'>for</span> <span class='ident'>test</span> <span class='kw'>in</span> <span class='ident'>tests</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>hash_test</span>(<span class='ident'>Type</span>::<span class='ident'>RIPEMD160</span>, <span class='ident'>test</span>);
+ }
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/hmac.rs.html b/src/openssl/crypto/hmac.rs.html
new file mode 100644
index 0000000..e63ec32
--- /dev/null
+++ b/src/openssl/crypto/hmac.rs.html
@@ -0,0 +1,1053 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/hmac.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>hmac.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+</pre><pre class='rust '>
+<span class='comment'>/*
+ * Copyright 2013 Jack Lloyd
+ *
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */</span>
+
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>PartialEq</span>, <span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>enum</span> <span class='ident'>State</span> {
+ <span class='ident'>Reset</span>,
+ <span class='ident'>Updated</span>,
+ <span class='ident'>Finalized</span>,
+}
+
+<span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>State</span>::<span class='op'>*</span>;
+
+<span class='doccomment'>/// Provides HMAC computation.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Examples</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Calculate a HMAC in one go.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// use openssl::crypto::hash::Type;</span>
+<span class='doccomment'>/// use openssl::crypto::hmac::hmac;</span>
+<span class='doccomment'>/// let key = b&quot;Jefe&quot;;</span>
+<span class='doccomment'>/// let data = b&quot;what do ya want for nothing?&quot;;</span>
+<span class='doccomment'>/// let spec = b&quot;\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38&quot;;</span>
+<span class='doccomment'>/// let res = hmac(Type::MD5, key, data);</span>
+<span class='doccomment'>/// assert_eq!(res, spec);</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Use the `Write` trait to supply the input in chunks.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// use std::io::prelude::*;</span>
+<span class='doccomment'>/// use openssl::crypto::hash::Type;</span>
+<span class='doccomment'>/// use openssl::crypto::hmac::HMAC;</span>
+<span class='doccomment'>/// let key = b&quot;Jefe&quot;;</span>
+<span class='doccomment'>/// let data: &amp;[&amp;[u8]] = &amp;[b&quot;what do ya &quot;, b&quot;want for nothing?&quot;];</span>
+<span class='doccomment'>/// let spec = b&quot;\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38&quot;;</span>
+<span class='doccomment'>/// let mut h = HMAC::new(Type::MD5, &amp;*key);</span>
+<span class='doccomment'>/// h.write_all(data[0]);</span>
+<span class='doccomment'>/// h.write_all(data[1]);</span>
+<span class='doccomment'>/// let res = h.finish();</span>
+<span class='doccomment'>/// assert_eq!(res, spec);</span>
+<span class='doccomment'>/// ```</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>HMAC</span> {
+ <span class='ident'>ctx</span>: <span class='ident'>ffi</span>::<span class='ident'>HMAC_CTX</span>,
+ <span class='ident'>type_</span>: <span class='ident'>Type</span>,
+ <span class='ident'>state</span>: <span class='ident'>State</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>HMAC</span> {
+ <span class='doccomment'>/// Creates a new `HMAC` with the specified hash type using the `key`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ty</span>: <span class='ident'>Type</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>HMAC</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ctx</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>uninitialized</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>HMAC_CTX_init</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>ctx</span>);
+ <span class='ident'>ctx</span>
+ };
+ <span class='kw'>let</span> <span class='ident'>md</span> <span class='op'>=</span> <span class='ident'>ty</span>.<span class='ident'>evp_md</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span> { <span class='ident'>ctx</span>: <span class='ident'>ctx</span>, <span class='ident'>type_</span>: <span class='ident'>ty</span>, <span class='ident'>state</span>: <span class='ident'>Finalized</span> };
+ <span class='ident'>h</span>.<span class='ident'>init_once</span>(<span class='ident'>md</span>, <span class='ident'>key</span>);
+ <span class='ident'>h</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>init_once</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>md</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_MD</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>HMAC_Init_ex_shim</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>,
+ <span class='ident'>key</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>key</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>md</span>, <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Reset</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>init</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>state</span> {
+ <span class='ident'>Reset</span> <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ <span class='ident'>Updated</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>finalize</span>(); },
+ <span class='ident'>Finalized</span> <span class='op'>=&gt;</span> (),
+ }
+ <span class='comment'>// If the key and/or md is not supplied it&#39;s reused from the last time</span>
+ <span class='comment'>// avoiding redundant initializations</span>
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>HMAC_Init_ex_shim</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>,
+ <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _, <span class='number'>0</span>,
+ <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _, <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Reset</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>==</span> <span class='ident'>Finalized</span> {
+ <span class='self'>self</span>.<span class='ident'>init</span>();
+ }
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>HMAC_Update_shim</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>data</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>data</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Updated</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>finalize</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>==</span> <span class='ident'>Finalized</span> {
+ <span class='self'>self</span>.<span class='ident'>init</span>();
+ }
+ <span class='kw'>let</span> <span class='ident'>md_len</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>type_</span>.<span class='ident'>md_len</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0</span>).<span class='ident'>take</span>(<span class='ident'>md_len</span>).<span class='ident'>collect</span>();
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>HMAC_Final_shim</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>res</span>.<span class='ident'>as_mut_ptr</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>);
+ <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>=</span> <span class='ident'>Finalized</span>;
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>md_len</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='ident'>res</span>
+ }
+
+ <span class='doccomment'>/// Returns the hash of the data written since creation or</span>
+ <span class='doccomment'>/// the last `finish` and resets the hasher.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>finish</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>finalize</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>HMAC</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>update</span>(<span class='ident'>buf</span>);
+ <span class='prelude-val'>Ok</span>(<span class='ident'>buf</span>.<span class='ident'>len</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>HMAC</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>HMAC</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ctx</span>: <span class='ident'>ffi</span>::<span class='ident'>HMAC_CTX</span>;
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ctx</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>uninitialized</span>();
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>HMAC_CTX_copy</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>ctx</span>, <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>ctx</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>r</span>, <span class='number'>1</span>);
+ }
+ <span class='ident'>HMAC</span> { <span class='ident'>ctx</span>: <span class='ident'>ctx</span>, <span class='ident'>type_</span>: <span class='self'>self</span>.<span class='ident'>type_</span>, <span class='ident'>state</span>: <span class='self'>self</span>.<span class='ident'>state</span> }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>HMAC</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>state</span> <span class='op'>!=</span> <span class='ident'>Finalized</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buf</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0</span>).<span class='ident'>take</span>(<span class='self'>self</span>.<span class='ident'>type_</span>.<span class='ident'>md_len</span>()).<span class='ident'>collect</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='ident'>ffi</span>::<span class='ident'>HMAC_Final_shim</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>buf</span>.<span class='ident'>as_mut_ptr</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>);
+ }
+ <span class='ident'>ffi</span>::<span class='ident'>HMAC_CTX_cleanup</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>ctx</span>);
+ }
+ }
+}
+
+<span class='doccomment'>/// Computes the HMAC of the `data` with the hash `t` and `key`.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>hmac</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>t</span>, <span class='ident'>key</span>);
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='ident'>data</span>);
+ <span class='ident'>h</span>.<span class='ident'>finish</span>()
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+ <span class='kw'>use</span> <span class='ident'>serialize</span>::<span class='ident'>hex</span>::<span class='ident'>FromHex</span>;
+ <span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span>;
+ <span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span>::<span class='op'>*</span>;
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>hmac</span>, <span class='ident'>HMAC</span>};
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>test_hmac</span>(<span class='ident'>ty</span>: <span class='ident'>Type</span>, <span class='ident'>tests</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>)]) {
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>key</span>, <span class='kw-2'>ref</span> <span class='ident'>data</span>, <span class='kw-2'>ref</span> <span class='ident'>res</span>) <span class='kw'>in</span> <span class='ident'>tests</span>.<span class='ident'>iter</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>hmac</span>(<span class='ident'>ty</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>key</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>data</span>), <span class='op'>*</span><span class='ident'>res</span>);
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_recycle</span>(<span class='ident'>h</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>HMAC</span>, <span class='ident'>test</span>: <span class='kw-2'>&amp;</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>)) {
+ <span class='kw'>let</span> <span class='kw-2'>&amp;</span>(_, <span class='kw-2'>ref</span> <span class='ident'>data</span>, <span class='kw-2'>ref</span> <span class='ident'>res</span>) <span class='op'>=</span> <span class='ident'>test</span>;
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>data</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>h</span>.<span class='ident'>finish</span>(), <span class='op'>*</span><span class='ident'>res</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_md5</span>() {
+ <span class='comment'>// test vectors from RFC 2202</span>
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>7</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0x0b_u8</span>).<span class='ident'>take</span>(<span class='number'>16</span>).<span class='ident'>collect</span>(), <span class='string'>b&quot;Hi There&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;9294727a3638bb1c13f48ef8158bfc9d&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='string'>b&quot;Jefe&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>b&quot;what do ya want for nothing?&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;750c783e6ab0b503eaa86e310a5db738&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>16</span>).<span class='ident'>collect</span>(), <span class='ident'>repeat</span>(<span class='number'>0xdd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>(),
+ <span class='string'>&quot;56be34521d144c88dbb8c733f0e8b3f6&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='string'>&quot;0102030405060708090a0b0c0d0e0f10111213141516171819&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='ident'>repeat</span>(<span class='number'>0xcd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>(),
+ <span class='string'>&quot;697eaf0aca3a3aea3a75164746ffaa79&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0x0c_u8</span>).<span class='ident'>take</span>(<span class='number'>16</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test With Truncation&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;56461ef2342edc00f9bab995690efd4c&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key \
+ and Larger Than One Block-Size Data&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6f630fad67cda0ee1fb1f562db3aa53e&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>())
+ ];
+
+ <span class='ident'>test_hmac</span>(<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span><span class='ident'>tests</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_md5_recycle</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>2</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key \
+ and Larger Than One Block-Size Data&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6f630fad67cda0ee1fb1f562db3aa53e&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>())
+ ];
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>0</span>);
+ <span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>100usize</span> {
+ <span class='kw'>let</span> <span class='ident'>test</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='ident'>i</span> <span class='op'>%</span> <span class='number'>2</span>];
+ <span class='ident'>test_hmac_recycle</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>h</span>, <span class='ident'>test</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_finish_twice</span>() {
+ <span class='kw'>let</span> <span class='ident'>test</span>: (<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>) <span class='op'>=</span>
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>test</span>.<span class='number'>0</span>);
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>test</span>.<span class='number'>1</span>);
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>finish</span>();
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h</span>.<span class='ident'>finish</span>();
+ <span class='kw'>let</span> <span class='ident'>null</span> <span class='op'>=</span> <span class='ident'>hmac</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>test</span>.<span class='number'>0</span>, <span class='kw-2'>&amp;</span>[]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>, <span class='ident'>null</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_clone</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>2</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key \
+ and Larger Than One Block-Size Data&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;6f630fad67cda0ee1fb1f562db3aa53e&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ ];
+ <span class='kw'>let</span> <span class='ident'>p</span> <span class='op'>=</span> <span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>0</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='number'>2</span>;
+ <span class='kw'>let</span> <span class='ident'>h0</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>Type</span>::<span class='ident'>MD5</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>0</span>);
+
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone a new hmac&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h1</span> <span class='op'>=</span> <span class='ident'>h0</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>1</span>[..<span class='ident'>p</span>]);
+ {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone an updated hmac&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h2</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h2</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>1</span>[<span class='ident'>p</span>..]);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h2</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>, <span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>2</span>);
+ }
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>1</span>[<span class='ident'>p</span>..]);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>, <span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>2</span>);
+
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Clone a finished hmac&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h3</span> <span class='op'>=</span> <span class='ident'>h1</span>.<span class='ident'>clone</span>();
+ <span class='kw'>let</span> _ <span class='op'>=</span> <span class='ident'>h3</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>tests</span>[<span class='number'>1</span>].<span class='number'>1</span>);
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>h3</span>.<span class='ident'>finish</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>res</span>, <span class='ident'>tests</span>[<span class='number'>1</span>].<span class='number'>2</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha1</span>() {
+ <span class='comment'>// test vectors from RFC 2202</span>
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>7</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0x0b_u8</span>).<span class='ident'>take</span>(<span class='number'>20</span>).<span class='ident'>collect</span>(), <span class='string'>b&quot;Hi There&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;b617318655057264e28bc0b6fb378c8ef146be00&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='string'>b&quot;Jefe&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>b&quot;what do ya want for nothing?&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;effcdf6ae5eb2fa2d27416d5f184df9c259a7c79&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>20</span>).<span class='ident'>collect</span>(), <span class='ident'>repeat</span>(<span class='number'>0xdd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>(),
+ <span class='string'>&quot;125d7342b9ac11cd91a39af48aa17b4f63f175d3&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='string'>&quot;0102030405060708090a0b0c0d0e0f10111213141516171819&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='ident'>repeat</span>(<span class='number'>0xcd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>(),
+ <span class='string'>&quot;4c9007f4026250c6bc8414f9bf50c86c2d7235da&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0x0c_u8</span>).<span class='ident'>take</span>(<span class='number'>20</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test With Truncation&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;4c1a03424b55e07fe7f27be1d58bb9324a9a5a04&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;aa4ae5e15272d00e95705637ce8a3b55ed402112&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key \
+ and Larger Than One Block-Size Data&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;e8e99d0f45237d786d6bbaa7965c7808bbff1a91&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>())
+ ];
+
+ <span class='ident'>test_hmac</span>(<span class='ident'>SHA1</span>, <span class='kw-2'>&amp;</span><span class='ident'>tests</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha1_recycle</span>() {
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>2</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;aa4ae5e15272d00e95705637ce8a3b55ed402112&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>80</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key \
+ and Larger Than One Block-Size Data&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>&quot;e8e99d0f45237d786d6bbaa7965c7808bbff1a91&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>())
+ ];
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>SHA1</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>tests</span>[<span class='number'>0</span>].<span class='number'>0</span>);
+ <span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>100usize</span> {
+ <span class='kw'>let</span> <span class='ident'>test</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='ident'>i</span> <span class='op'>%</span> <span class='number'>2</span>];
+ <span class='ident'>test_hmac_recycle</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>h</span>, <span class='ident'>test</span>);
+ }
+ }
+
+
+
+ <span class='kw'>fn</span> <span class='ident'>test_sha2</span>(<span class='ident'>ty</span>: <span class='ident'>Type</span>, <span class='ident'>results</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>]) {
+ <span class='comment'>// test vectors from RFC 4231</span>
+ <span class='kw'>let</span> <span class='ident'>tests</span>: [(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>, <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>); <span class='number'>6</span>] <span class='op'>=</span> [
+ (<span class='ident'>repeat</span>(<span class='number'>0xb_u8</span>).<span class='ident'>take</span>(<span class='number'>20</span>).<span class='ident'>collect</span>(), <span class='string'>b&quot;Hi There&quot;</span>.<span class='ident'>to_vec</span>()),
+ (<span class='string'>b&quot;Jefe&quot;</span>.<span class='ident'>to_vec</span>(),
+ <span class='string'>b&quot;what do ya want for nothing?&quot;</span>.<span class='ident'>to_vec</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>20</span>).<span class='ident'>collect</span>(), <span class='ident'>repeat</span>(<span class='number'>0xdd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>()),
+ (<span class='string'>&quot;0102030405060708090a0b0c0d0e0f10111213141516171819&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='ident'>repeat</span>(<span class='number'>0xcd_u8</span>).<span class='ident'>take</span>(<span class='number'>50</span>).<span class='ident'>collect</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>131</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;Test Using Larger Than Block-Size Key - Hash Key First&quot;</span>.<span class='ident'>to_vec</span>()),
+ (<span class='ident'>repeat</span>(<span class='number'>0xaa_u8</span>).<span class='ident'>take</span>(<span class='number'>131</span>).<span class='ident'>collect</span>(),
+ <span class='string'>b&quot;This is a test using a larger than block-size key and a \
+ larger than block-size data. The key needs to be hashed \
+ before being used by the HMAC algorithm.&quot;</span>.<span class='ident'>to_vec</span>())
+ ];
+
+ <span class='kw'>for</span> (<span class='kw-2'>&amp;</span>(<span class='kw-2'>ref</span> <span class='ident'>key</span>, <span class='kw-2'>ref</span> <span class='ident'>data</span>), <span class='ident'>res</span>) <span class='kw'>in</span> <span class='ident'>tests</span>.<span class='ident'>iter</span>().<span class='ident'>zip</span>(<span class='ident'>results</span>.<span class='ident'>iter</span>()) {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>hmac</span>(<span class='ident'>ty</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>key</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>data</span>), <span class='op'>*</span><span class='ident'>res</span>);
+ }
+
+ <span class='comment'>// recycle test</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>h</span> <span class='op'>=</span> <span class='ident'>HMAC</span>::<span class='ident'>new</span>(<span class='ident'>ty</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>tests</span>[<span class='number'>5</span>].<span class='number'>0</span>);
+ <span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>100usize</span> {
+ <span class='kw'>let</span> <span class='ident'>test</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>tests</span>[<span class='number'>4</span> <span class='op'>+</span> <span class='ident'>i</span> <span class='op'>%</span> <span class='number'>2</span>];
+ <span class='kw'>let</span> <span class='ident'>tup</span> <span class='op'>=</span> (<span class='ident'>test</span>.<span class='number'>0</span>.<span class='ident'>clone</span>(), <span class='ident'>test</span>.<span class='number'>1</span>.<span class='ident'>clone</span>(), <span class='ident'>results</span>[<span class='number'>4</span> <span class='op'>+</span> <span class='ident'>i</span> <span class='op'>%</span> <span class='number'>2</span>].<span class='ident'>clone</span>());
+ <span class='ident'>test_hmac_recycle</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>h</span>, <span class='kw-2'>&amp;</span><span class='ident'>tup</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha224</span>() {
+ <span class='kw'>let</span> <span class='ident'>results</span> <span class='op'>=</span> [
+ <span class='string'>&quot;896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()
+ ];
+ <span class='ident'>test_sha2</span>(<span class='ident'>SHA224</span>, <span class='kw-2'>&amp;</span><span class='ident'>results</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha256</span>() {
+ <span class='kw'>let</span> <span class='ident'>results</span> <span class='op'>=</span> [
+ <span class='string'>&quot;b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()
+ ];
+ <span class='ident'>test_sha2</span>(<span class='ident'>SHA256</span>, <span class='kw-2'>&amp;</span><span class='ident'>results</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha384</span>() {
+ <span class='kw'>let</span> <span class='ident'>results</span> <span class='op'>=</span> [
+ <span class='string'>&quot;afd03944d84895626b0825f4ab46907f\
+ 15f9dadbe4101ec682aa034c7cebc59c\
+ faea9ea9076ede7f4af152e8b2fa9cb6&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;af45d2e376484031617f78d2b58a6b1b\
+ 9c7ef464f5a01b47e42ec3736322445e\
+ 8e2240ca5e69e2c78b3239ecfab21649&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;88062608d3e6ad8a0aa2ace014c8a86f\
+ 0aa635d947ac9febe83ef4e55966144b\
+ 2a5ab39dc13814b94e3ab6e101a34f27&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;3e8a69b7783c25851933ab6290af6ca7\
+ 7a9981480850009cc5577c6e1f573b4e\
+ 6801dd23c4a7d679ccf8a386c674cffb&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;4ece084485813e9088d2c63a041bc5b4\
+ 4f9ef1012a2b588f3cd11f05033ac4c6\
+ 0c2ef6ab4030fe8296248df163f44952&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;6617178e941f020d351e2f254e8fd32c\
+ 602420feb0b8fb9adccebb82461e99c5\
+ a678cc31e799176d3860e6110c46523e&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()
+ ];
+ <span class='ident'>test_sha2</span>(<span class='ident'>SHA384</span>, <span class='kw-2'>&amp;</span><span class='ident'>results</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_hmac_sha512</span>() {
+ <span class='kw'>let</span> <span class='ident'>results</span> <span class='op'>=</span> [
+ <span class='string'>&quot;87aa7cdea5ef619d4ff0b4241a1d6cb0\
+ 2379f4e2ce4ec2787ad0b30545e17cde\
+ daa833b7d6b8a702038b274eaea3f4e4\
+ be9d914eeb61f1702e696c203a126854&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;164b7a7bfcf819e2e395fbe73b56e0a3\
+ 87bd64222e831fd610270cd7ea250554\
+ 9758bf75c05a994a6d034f65f8f0e6fd\
+ caeab1a34d4a6b4b636e070a38bce737&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;fa73b0089d56a284efb0f0756c890be9\
+ b1b5dbdd8ee81a3655f83e33b2279d39\
+ bf3e848279a722c806b485a47e67c807\
+ b946a337bee8942674278859e13292fb&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;b0ba465637458c6990e5a8c5f61d4af7\
+ e576d97ff94b872de76f8050361ee3db\
+ a91ca5c11aa25eb4d679275cc5788063\
+ a5f19741120c4f2de2adebeb10a298dd&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;80b24263c7c1a3ebb71493c1dd7be8b4\
+ 9b46d1f41b4aeec1121b013783f8f352\
+ 6b56d037e05f2598bd0fd2215d6a1e52\
+ 95e64f73f63f0aec8b915a985d786598&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(),
+ <span class='string'>&quot;e37b6a775dc87dbaa4dfa9f96e5e3ffd\
+ debd71f8867289865df5a32d20cdc944\
+ b6022cac3c4982b10d5eeb55c3e4de15\
+ 134676fb6de0446065c97440fa8c6a58&quot;</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>()
+ ];
+ <span class='ident'>test_sha2</span>(<span class='ident'>SHA512</span>, <span class='kw-2'>&amp;</span><span class='ident'>results</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/memcmp.rs.html b/src/openssl/crypto/memcmp.rs.html
new file mode 100644
index 0000000..ecc2b6d
--- /dev/null
+++ b/src/openssl/crypto/memcmp.rs.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/memcmp.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>memcmp.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>size_t</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='doccomment'>/// Returns `true` iff `a` and `b` contain the same bytes.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This operation takes an amount of time dependent on the length of the two</span>
+<span class='doccomment'>/// arrays given, but is independent of the contents of a and b.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Failure</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This function will panic the current task if `a` and `b` do not have the same</span>
+<span class='doccomment'>/// length.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='ident'>a</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>b</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>a</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='ident'>b</span>.<span class='ident'>len</span>());
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_memcmp</span>(<span class='ident'>a</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _,
+ <span class='ident'>b</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> _,
+ <span class='ident'>a</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>size_t</span>)
+ };
+ <span class='ident'>ret</span> <span class='op'>==</span> <span class='number'>0</span>
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='ident'>eq</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_eq</span>() {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>eq</span>(<span class='kw-2'>&amp;</span>[], <span class='kw-2'>&amp;</span>[]));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>eq</span>(<span class='kw-2'>&amp;</span>[<span class='number'>1</span>], <span class='kw-2'>&amp;</span>[<span class='number'>1</span>]));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>eq</span>(<span class='kw-2'>&amp;</span>[<span class='number'>1</span>, <span class='number'>2</span>, <span class='number'>3</span>], <span class='kw-2'>&amp;</span>[<span class='number'>1</span>, <span class='number'>2</span>, <span class='number'>4</span>]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='attribute'>#[<span class='ident'>should_panic</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_diff_lens</span>() {
+ <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span>[], <span class='kw-2'>&amp;</span>[<span class='number'>1</span>]);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/mod.rs.html b/src/openssl/crypto/mod.rs.html
new file mode 100644
index 0000000..47e1c77
--- /dev/null
+++ b/src/openssl/crypto/mod.rs.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+</pre><pre class='rust '>
+<span class='comment'>/*
+ * Copyright 2011 Google Inc.
+ * 2013 Jack Lloyd
+ *
+ * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */</span>
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>hash</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>hmac</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>pkcs5</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>pkey</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>rand</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>symm</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>memcmp</span>;
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/pkcs5.rs.html b/src/openssl/crypto/pkcs5.rs.html
new file mode 100644
index 0000000..5ac11c1
--- /dev/null
+++ b/src/openssl/crypto/pkcs5.rs.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/pkcs5.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>pkcs5.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>c_int</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='doccomment'>/// Derives a key from a password and salt using the PBKDF2-HMAC-SHA1 algorithm.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pbkdf2_hmac_sha1</span>(<span class='ident'>pass</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>salt</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>iter</span>: <span class='ident'>usize</span>, <span class='ident'>keylen</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>iter</span> <span class='op'>&gt;=</span> <span class='number'>1</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>keylen</span> <span class='op'>&gt;=</span> <span class='number'>1</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>keylen</span>);
+
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>PKCS5_PBKDF2_HMAC_SHA1</span>(
+ <span class='ident'>pass</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>pass</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>salt</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>salt</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>iter</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>keylen</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>out</span>.<span class='ident'>as_mut_ptr</span>());
+
+ <span class='kw'>if</span> <span class='ident'>r</span> <span class='op'>!=</span> <span class='number'>1</span> { <span class='macro'>panic</span><span class='macro'>!</span>(); }
+
+ <span class='ident'>out</span>.<span class='ident'>set_len</span>(<span class='ident'>keylen</span>);
+
+ <span class='ident'>out</span>
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='comment'>// Test vectors from</span>
+ <span class='comment'>// http://tools.ietf.org/html/draft-josefsson-pbkdf2-test-vectors-06</span>
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_pbkdf2_hmac_sha1</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;password&quot;</span>,
+ <span class='string'>&quot;salt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>1</span>,
+ <span class='number'>20</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0x0c_u8</span>, <span class='number'>0x60_u8</span>, <span class='number'>0xc8_u8</span>, <span class='number'>0x0f_u8</span>, <span class='number'>0x96_u8</span>, <span class='number'>0x1f_u8</span>, <span class='number'>0x0e_u8</span>,
+ <span class='number'>0x71_u8</span>, <span class='number'>0xf3_u8</span>, <span class='number'>0xa9_u8</span>, <span class='number'>0xb5_u8</span>, <span class='number'>0x24_u8</span>, <span class='number'>0xaf_u8</span>, <span class='number'>0x60_u8</span>,
+ <span class='number'>0x12_u8</span>, <span class='number'>0x06_u8</span>, <span class='number'>0x2f_u8</span>, <span class='number'>0xe0_u8</span>, <span class='number'>0x37_u8</span>, <span class='number'>0xa6_u8</span>
+ )
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;password&quot;</span>,
+ <span class='string'>&quot;salt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>2</span>,
+ <span class='number'>20</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0xea_u8</span>, <span class='number'>0x6c_u8</span>, <span class='number'>0x01_u8</span>, <span class='number'>0x4d_u8</span>, <span class='number'>0xc7_u8</span>, <span class='number'>0x2d_u8</span>, <span class='number'>0x6f_u8</span>,
+ <span class='number'>0x8c_u8</span>, <span class='number'>0xcd_u8</span>, <span class='number'>0x1e_u8</span>, <span class='number'>0xd9_u8</span>, <span class='number'>0x2a_u8</span>, <span class='number'>0xce_u8</span>, <span class='number'>0x1d_u8</span>,
+ <span class='number'>0x41_u8</span>, <span class='number'>0xf0_u8</span>, <span class='number'>0xd8_u8</span>, <span class='number'>0xde_u8</span>, <span class='number'>0x89_u8</span>, <span class='number'>0x57_u8</span>
+ )
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;password&quot;</span>,
+ <span class='string'>&quot;salt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>4096</span>,
+ <span class='number'>20</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0x4b_u8</span>, <span class='number'>0x00_u8</span>, <span class='number'>0x79_u8</span>, <span class='number'>0x01_u8</span>, <span class='number'>0xb7_u8</span>, <span class='number'>0x65_u8</span>, <span class='number'>0x48_u8</span>,
+ <span class='number'>0x9a_u8</span>, <span class='number'>0xbe_u8</span>, <span class='number'>0xad_u8</span>, <span class='number'>0x49_u8</span>, <span class='number'>0xd9_u8</span>, <span class='number'>0x26_u8</span>, <span class='number'>0xf7_u8</span>,
+ <span class='number'>0x21_u8</span>, <span class='number'>0xd0_u8</span>, <span class='number'>0x65_u8</span>, <span class='number'>0xa4_u8</span>, <span class='number'>0x29_u8</span>, <span class='number'>0xc1_u8</span>
+ )
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;password&quot;</span>,
+ <span class='string'>&quot;salt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>16777216</span>,
+ <span class='number'>20</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0xee_u8</span>, <span class='number'>0xfe_u8</span>, <span class='number'>0x3d_u8</span>, <span class='number'>0x61_u8</span>, <span class='number'>0xcd_u8</span>, <span class='number'>0x4d_u8</span>, <span class='number'>0xa4_u8</span>,
+ <span class='number'>0xe4_u8</span>, <span class='number'>0xe9_u8</span>, <span class='number'>0x94_u8</span>, <span class='number'>0x5b_u8</span>, <span class='number'>0x3d_u8</span>, <span class='number'>0x6b_u8</span>, <span class='number'>0xa2_u8</span>,
+ <span class='number'>0x15_u8</span>, <span class='number'>0x8c_u8</span>, <span class='number'>0x26_u8</span>, <span class='number'>0x34_u8</span>, <span class='number'>0xe9_u8</span>, <span class='number'>0x84_u8</span>
+ )
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;passwordPASSWORDpassword&quot;</span>,
+ <span class='string'>&quot;saltSALTsaltSALTsaltSALTsaltSALTsalt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>4096</span>,
+ <span class='number'>25</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0x3d_u8</span>, <span class='number'>0x2e_u8</span>, <span class='number'>0xec_u8</span>, <span class='number'>0x4f_u8</span>, <span class='number'>0xe4_u8</span>, <span class='number'>0x1c_u8</span>, <span class='number'>0x84_u8</span>,
+ <span class='number'>0x9b_u8</span>, <span class='number'>0x80_u8</span>, <span class='number'>0xc8_u8</span>, <span class='number'>0xd8_u8</span>, <span class='number'>0x36_u8</span>, <span class='number'>0x62_u8</span>, <span class='number'>0xc0_u8</span>,
+ <span class='number'>0xe4_u8</span>, <span class='number'>0x4a_u8</span>, <span class='number'>0x8b_u8</span>, <span class='number'>0x29_u8</span>, <span class='number'>0x1a_u8</span>, <span class='number'>0x96_u8</span>, <span class='number'>0x4c_u8</span>,
+ <span class='number'>0xf2_u8</span>, <span class='number'>0xf0_u8</span>, <span class='number'>0x70_u8</span>, <span class='number'>0x38_u8</span>
+ )
+ );
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(
+ <span class='ident'>super</span>::<span class='ident'>pbkdf2_hmac_sha1</span>(
+ <span class='string'>&quot;pass\x00word&quot;</span>,
+ <span class='string'>&quot;sa\x00lt&quot;</span>.<span class='ident'>as_bytes</span>(),
+ <span class='number'>4096</span>,
+ <span class='number'>16</span>
+ ),
+ <span class='macro'>vec</span><span class='macro'>!</span>(
+ <span class='number'>0x56_u8</span>, <span class='number'>0xfa_u8</span>, <span class='number'>0x6a_u8</span>, <span class='number'>0xa7_u8</span>, <span class='number'>0x55_u8</span>, <span class='number'>0x48_u8</span>, <span class='number'>0x09_u8</span>,
+ <span class='number'>0x9d_u8</span>, <span class='number'>0xcc_u8</span>, <span class='number'>0x37_u8</span>, <span class='number'>0xd7_u8</span>, <span class='number'>0xf0_u8</span>, <span class='number'>0x34_u8</span>, <span class='number'>0x25_u8</span>,
+ <span class='number'>0xe0_u8</span>, <span class='number'>0xc3_u8</span>
+ )
+ );
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/pkey.rs.html b/src/openssl/crypto/pkey.rs.html
new file mode 100644
index 0000000..4b93f74
--- /dev/null
+++ b/src/openssl/crypto/pkey.rs.html
@@ -0,0 +1,1103 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/pkey.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>pkey.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_ulong</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+<span class='kw'>use</span> <span class='ident'>bio</span>::{<span class='ident'>MemBio</span>};
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>;
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span> <span class='kw'>as</span> <span class='ident'>HashType</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>, <span class='ident'>StreamError</span>};
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Parts</span> {
+ <span class='ident'>Neither</span>,
+ <span class='ident'>Public</span>,
+ <span class='ident'>Both</span>
+}
+
+<span class='doccomment'>/// Represents a role an asymmetric key might be appropriate for.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Role</span> {
+ <span class='ident'>Encrypt</span>,
+ <span class='ident'>Decrypt</span>,
+ <span class='ident'>Sign</span>,
+ <span class='ident'>Verify</span>
+}
+
+<span class='doccomment'>/// Type of encryption padding to use.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>EncryptionPadding</span> {
+ <span class='ident'>OAEP</span>,
+ <span class='ident'>PKCS1v15</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>openssl_padding_code</span>(<span class='ident'>padding</span>: <span class='ident'>EncryptionPadding</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>match</span> <span class='ident'>padding</span> {
+ <span class='ident'>EncryptionPadding</span>::<span class='ident'>OAEP</span> <span class='op'>=&gt;</span> <span class='number'>4</span>,
+ <span class='ident'>EncryptionPadding</span>::<span class='ident'>PKCS1v15</span> <span class='op'>=&gt;</span> <span class='number'>1</span>
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>openssl_hash_nid</span>(<span class='ident'>hash</span>: <span class='ident'>HashType</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>match</span> <span class='ident'>hash</span> {
+ <span class='ident'>HashType</span>::<span class='ident'>MD5</span> <span class='op'>=&gt;</span> <span class='number'>4</span>, <span class='comment'>// NID_md5,</span>
+ <span class='ident'>HashType</span>::<span class='ident'>SHA1</span> <span class='op'>=&gt;</span> <span class='number'>64</span>, <span class='comment'>// NID_sha1</span>
+ <span class='ident'>HashType</span>::<span class='ident'>SHA224</span> <span class='op'>=&gt;</span> <span class='number'>675</span>, <span class='comment'>// NID_sha224</span>
+ <span class='ident'>HashType</span>::<span class='ident'>SHA256</span> <span class='op'>=&gt;</span> <span class='number'>672</span>, <span class='comment'>// NID_sha256</span>
+ <span class='ident'>HashType</span>::<span class='ident'>SHA384</span> <span class='op'>=&gt;</span> <span class='number'>673</span>, <span class='comment'>// NID_sha384</span>
+ <span class='ident'>HashType</span>::<span class='ident'>SHA512</span> <span class='op'>=&gt;</span> <span class='number'>674</span>, <span class='comment'>// NID_sha512</span>
+ <span class='ident'>HashType</span>::<span class='ident'>RIPEMD160</span> <span class='op'>=&gt;</span> <span class='number'>117</span>, <span class='comment'>// NID_ripemd160</span>
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>PKey</span> {
+ <span class='ident'>evp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY</span>,
+ <span class='ident'>parts</span>: <span class='ident'>Parts</span>,
+}
+
+<span class='doccomment'>/// Represents a public key, optionally with a private key attached.</span>
+<span class='kw'>impl</span> <span class='ident'>PKey</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>PKey</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='ident'>PKey</span> {
+ <span class='ident'>evp</span>: <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_new</span>(),
+ <span class='ident'>parts</span>: <span class='ident'>Parts</span>::<span class='ident'>Neither</span>,
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_handle</span>(<span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY</span>, <span class='ident'>parts</span>: <span class='ident'>Parts</span>) <span class='op'>-&gt;</span> <span class='ident'>PKey</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>handle</span>.<span class='ident'>is_null</span>());
+
+ <span class='ident'>PKey</span> {
+ <span class='ident'>evp</span>: <span class='ident'>handle</span>,
+ <span class='ident'>parts</span>: <span class='ident'>parts</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Reads private key from PEM, takes ownership of handle</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>private_key_from_pem</span><span class='op'>&lt;</span><span class='ident'>R</span><span class='op'>&gt;</span>(<span class='ident'>reader</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>PKey</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>R</span>: <span class='ident'>Read</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='ident'>reader</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>));
+
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>evp</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_read_bio_PrivateKey</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(),
+ <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(),
+ <span class='prelude-val'>None</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>PKey</span> {
+ <span class='ident'>evp</span>: <span class='ident'>evp</span>,
+ <span class='ident'>parts</span>: <span class='ident'>Parts</span>::<span class='ident'>Both</span>,
+ })
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>_tostr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw'>unsafe</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>RSA</span>, <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>f</span>(<span class='ident'>rsa</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>());
+ <span class='kw'>if</span> <span class='ident'>len</span> <span class='op'>&lt;</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_int</span> { <span class='kw'>return</span> <span class='macro'>vec</span><span class='macro'>!</span>(); }
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>f</span>(<span class='ident'>rsa</span>, <span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>as_mut_ptr</span>());
+
+ <span class='ident'>s</span>.<span class='ident'>truncate</span>(<span class='ident'>r</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>s</span>
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>_fromstr</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>f</span>: <span class='kw'>unsafe</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>RSA</span>, <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>RSA</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>();
+ <span class='ident'>f</span>(<span class='kw-2'>&amp;</span><span class='ident'>rsa</span>, <span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>);
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_set1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>, <span class='ident'>rsa</span>);
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>gen</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>keysz</span>: <span class='ident'>usize</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_generate_key</span>(
+ <span class='ident'>keysz</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='number'>65537</span> <span class='kw'>as</span> <span class='ident'>c_ulong</span>,
+ <span class='ident'>ptr</span>::<span class='ident'>null</span>(),
+ <span class='ident'>ptr</span>::<span class='ident'>null</span>()
+ );
+
+ <span class='comment'>// XXX: 6 == NID_rsaEncryption</span>
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_assign</span>(
+ <span class='self'>self</span>.<span class='ident'>evp</span>,
+ <span class='number'>6</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>rsa</span>));
+
+ <span class='self'>self</span>.<span class='ident'>parts</span> <span class='op'>=</span> <span class='ident'>Parts</span>::<span class='ident'>Both</span>;
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Returns a serialized form of the public key, suitable for load_pub().
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>save_pub</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>_tostr</span>(<span class='ident'>ffi</span>::<span class='ident'>i2d_RSA_PUBKEY</span>)
+ }
+
+ <span class='doccomment'>/**
+ * Loads a serialized form of the public key, as produced by save_pub().
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) {
+ <span class='self'>self</span>.<span class='ident'>_fromstr</span>(<span class='ident'>s</span>, <span class='ident'>ffi</span>::<span class='ident'>d2i_RSA_PUBKEY</span>);
+ <span class='self'>self</span>.<span class='ident'>parts</span> <span class='op'>=</span> <span class='ident'>Parts</span>::<span class='ident'>Public</span>;
+ }
+
+ <span class='doccomment'>/**
+ * Returns a serialized form of the public and private keys, suitable for
+ * load_priv().
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>save_priv</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>_tostr</span>(<span class='ident'>ffi</span>::<span class='ident'>i2d_RSAPrivateKey</span>)
+ }
+ <span class='doccomment'>/**
+ * Loads a serialized form of the public and private keys, as produced by
+ * save_priv().
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>load_priv</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) {
+ <span class='self'>self</span>.<span class='ident'>_fromstr</span>(<span class='ident'>s</span>, <span class='ident'>ffi</span>::<span class='ident'>d2i_RSAPrivateKey</span>);
+ <span class='self'>self</span>.<span class='ident'>parts</span> <span class='op'>=</span> <span class='ident'>Parts</span>::<span class='ident'>Both</span>;
+ }
+
+ <span class='doccomment'>/// Stores private key as a PEM</span>
+ <span class='comment'>// FIXME: also add password and encryption</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write_pem</span><span class='op'>&lt;</span><span class='ident'>W</span>: <span class='ident'>Write</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>writer</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>W</span><span class='comment'>/*, password: Option&lt;String&gt;*/</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_write_bio_PrivateKey</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(), <span class='self'>self</span>.<span class='ident'>evp</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>(),
+ <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='op'>-</span><span class='number'>1</span>, <span class='prelude-val'>None</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()));
+
+ }
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>buf</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>mem_bio</span>.<span class='ident'>read_to_end</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>buf</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>));
+ <span class='ident'>writer</span>.<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>buf</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>)
+ }
+
+ <span class='doccomment'>/**
+ * Returns the size of the public key modulus.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>size</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>)) <span class='kw'>as</span> <span class='ident'>usize</span>
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Returns whether this pkey object can perform the specified role.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>can</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>r</span>: <span class='ident'>Role</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='ident'>r</span> {
+ <span class='ident'>Role</span>::<span class='ident'>Encrypt</span> <span class='op'>=&gt;</span>
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>parts</span> {
+ <span class='ident'>Parts</span>::<span class='ident'>Neither</span> <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ },
+ <span class='ident'>Role</span>::<span class='ident'>Verify</span> <span class='op'>=&gt;</span>
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>parts</span> {
+ <span class='ident'>Parts</span>::<span class='ident'>Neither</span> <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ },
+ <span class='ident'>Role</span>::<span class='ident'>Decrypt</span> <span class='op'>=&gt;</span>
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>parts</span> {
+ <span class='ident'>Parts</span>::<span class='ident'>Both</span> <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ },
+ <span class='ident'>Role</span>::<span class='ident'>Sign</span> <span class='op'>=&gt;</span>
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>parts</span> {
+ <span class='ident'>Parts</span>::<span class='ident'>Both</span> <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ },
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Returns the maximum amount of data that can be encrypted by an encrypt()
+ * call.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>max_data</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>rsa</span>);
+
+ <span class='comment'>// 41 comes from RSA_public_encrypt(3) for OAEP</span>
+ <span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>-</span> <span class='number'>41</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>encrypt_with_padding</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>padding</span>: <span class='ident'>EncryptionPadding</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>rsa</span>);
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>s</span>.<span class='ident'>len</span>() <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>max_data</span>());
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>+</span> <span class='number'>1</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+
+ <span class='kw'>let</span> <span class='ident'>rv</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_public_encrypt</span>(
+ <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>s</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>r</span>.<span class='ident'>as_mut_ptr</span>(),
+ <span class='ident'>rsa</span>,
+ <span class='ident'>openssl_padding_code</span>(<span class='ident'>padding</span>));
+
+ <span class='kw'>if</span> <span class='ident'>rv</span> <span class='op'>&lt;</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_int</span> {
+ <span class='macro'>vec</span><span class='macro'>!</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>r</span>.<span class='ident'>truncate</span>(<span class='ident'>rv</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>r</span>
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>decrypt_with_padding</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>padding</span>: <span class='ident'>EncryptionPadding</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>rsa</span>);
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>rsa</span>));
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>+</span> <span class='number'>1</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+
+ <span class='kw'>let</span> <span class='ident'>rv</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_private_decrypt</span>(
+ <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>s</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>r</span>.<span class='ident'>as_mut_ptr</span>(),
+ <span class='ident'>rsa</span>,
+ <span class='ident'>openssl_padding_code</span>(<span class='ident'>padding</span>));
+
+ <span class='kw'>if</span> <span class='ident'>rv</span> <span class='op'>&lt;</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_int</span> {
+ <span class='macro'>vec</span><span class='macro'>!</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>r</span>.<span class='ident'>truncate</span>(<span class='ident'>rv</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>r</span>
+ }
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Encrypts data using OAEP padding, returning the encrypted data. The
+ * supplied data must not be larger than max_data().
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>encrypt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>encrypt_with_padding</span>(<span class='ident'>s</span>, <span class='ident'>EncryptionPadding</span>::<span class='ident'>OAEP</span>) }
+
+ <span class='doccomment'>/**
+ * Decrypts data, expecting OAEP padding, returning the decrypted data.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>decrypt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>decrypt_with_padding</span>(<span class='ident'>s</span>, <span class='ident'>EncryptionPadding</span>::<span class='ident'>OAEP</span>) }
+
+ <span class='doccomment'>/**
+ * Signs data, using OpenSSL&#39;s default scheme and adding sha256 ASN.1 information to the
+ * signature.
+ * The bytes to sign must be the result of a sha256 hashing;
+ * returns the signature.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>sign_with_hash</span>(<span class='ident'>s</span>, <span class='ident'>HashType</span>::<span class='ident'>SHA256</span>) }
+
+ <span class='doccomment'>/**
+ * Verifies a signature s (using OpenSSL&#39;s default scheme and sha256) on the SHA256 hash of a
+ * message.
+ * Returns true if the signature is valid, and false otherwise.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>verify</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>h</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='self'>self</span>.<span class='ident'>verify_with_hash</span>(<span class='ident'>h</span>, <span class='ident'>s</span>, <span class='ident'>HashType</span>::<span class='ident'>SHA256</span>) }
+
+ <span class='doccomment'>/**
+ * Signs data, using OpenSSL&#39;s default scheme and add ASN.1 information for the given hash type to the
+ * signature.
+ * The bytes to sign must be the result of this type of hashing;
+ * returns the signature.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign_with_hash</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>hash</span>: <span class='ident'>hash</span>::<span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_size</span>(<span class='ident'>rsa</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span> <span class='op'>+</span> <span class='number'>1</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>let</span> <span class='ident'>rv</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_sign</span>(
+ <span class='ident'>openssl_hash_nid</span>(<span class='ident'>hash</span>),
+ <span class='ident'>s</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>r</span>.<span class='ident'>as_mut_ptr</span>(),
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>,
+ <span class='ident'>rsa</span>);
+
+ <span class='kw'>if</span> <span class='ident'>rv</span> <span class='op'>&lt;</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_int</span> {
+ <span class='macro'>vec</span><span class='macro'>!</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>r</span>.<span class='ident'>truncate</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>r</span>
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>verify_with_hash</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>h</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>s</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>hash</span>: <span class='ident'>hash</span>::<span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>rsa</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+
+ <span class='kw'>let</span> <span class='ident'>rv</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RSA_verify</span>(
+ <span class='ident'>openssl_hash_nid</span>(<span class='ident'>hash</span>),
+ <span class='ident'>h</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>h</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>s</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>rsa</span>
+ );
+
+ <span class='ident'>rv</span> <span class='op'>==</span> <span class='number'>1</span> <span class='kw'>as</span> <span class='ident'>c_int</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>get_handle</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY</span> {
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>evp</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>PKey</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_cmp</span>(<span class='self'>self</span>.<span class='ident'>evp</span>, <span class='ident'>other</span>.<span class='ident'>evp</span>) <span class='op'>==</span> <span class='number'>1</span> }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>PKey</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_PKEY_free</span>(<span class='self'>self</span>.<span class='ident'>evp</span>);
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::<span class='ident'>Path</span>;
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fs</span>::<span class='ident'>File</span>;
+ <span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span>::{<span class='ident'>MD5</span>, <span class='ident'>SHA1</span>};
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_gen_pub</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>save_pub</span>(), <span class='ident'>k1</span>.<span class='ident'>save_pub</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>size</span>(), <span class='ident'>k1</span>.<span class='ident'>size</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Encrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Decrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Verify</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Sign</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Encrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Decrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Verify</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Sign</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_gen_priv</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_priv</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_priv</span>());
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>save_priv</span>(), <span class='ident'>k1</span>.<span class='ident'>save_priv</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>size</span>(), <span class='ident'>k1</span>.<span class='ident'>size</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Encrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Decrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Verify</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Sign</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Encrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Decrypt</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Verify</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>can</span>(<span class='ident'>super</span>::<span class='ident'>Role</span>::<span class='ident'>Sign</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_private_key_from_pem</span>() {
+ <span class='kw'>let</span> <span class='ident'>key_path</span> <span class='op'>=</span> <span class='ident'>Path</span>::<span class='ident'>new</span>(<span class='string'>&quot;test/key.pem&quot;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>file</span> <span class='op'>=</span> <span class='ident'>File</span>::<span class='ident'>open</span>(<span class='kw-2'>&amp;</span><span class='ident'>key_path</span>)
+ .<span class='ident'>ok</span>()
+ .<span class='ident'>expect</span>(<span class='string'>&quot;Failed to open `test/key.pem`&quot;</span>);
+
+ <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>private_key_from_pem</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>file</span>).<span class='ident'>unwrap</span>();
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_encrypt</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>msg</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>(<span class='number'>0xdeu8</span>, <span class='number'>0xadu8</span>, <span class='number'>0xd0u8</span>, <span class='number'>0x0du8</span>);
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+ <span class='kw'>let</span> <span class='ident'>emsg</span> <span class='op'>=</span> <span class='ident'>k1</span>.<span class='ident'>encrypt</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>);
+ <span class='kw'>let</span> <span class='ident'>dmsg</span> <span class='op'>=</span> <span class='ident'>k0</span>.<span class='ident'>decrypt</span>(<span class='kw-2'>&amp;</span><span class='ident'>emsg</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>msg</span> <span class='op'>==</span> <span class='ident'>dmsg</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_encrypt_pkcs</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>msg</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>(<span class='number'>0xdeu8</span>, <span class='number'>0xadu8</span>, <span class='number'>0xd0u8</span>, <span class='number'>0x0du8</span>);
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+ <span class='kw'>let</span> <span class='ident'>emsg</span> <span class='op'>=</span> <span class='ident'>k1</span>.<span class='ident'>encrypt_with_padding</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='ident'>super</span>::<span class='ident'>EncryptionPadding</span>::<span class='ident'>PKCS1v15</span>);
+ <span class='kw'>let</span> <span class='ident'>dmsg</span> <span class='op'>=</span> <span class='ident'>k0</span>.<span class='ident'>decrypt_with_padding</span>(<span class='kw-2'>&amp;</span><span class='ident'>emsg</span>, <span class='ident'>super</span>::<span class='ident'>EncryptionPadding</span>::<span class='ident'>PKCS1v15</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>msg</span> <span class='op'>==</span> <span class='ident'>dmsg</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_sign</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>msg</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>(<span class='number'>0xdeu8</span>, <span class='number'>0xadu8</span>, <span class='number'>0xd0u8</span>, <span class='number'>0x0du8</span>);
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+ <span class='kw'>let</span> <span class='ident'>sig</span> <span class='op'>=</span> <span class='ident'>k0</span>.<span class='ident'>sign</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>);
+ <span class='kw'>let</span> <span class='ident'>rv</span> <span class='op'>=</span> <span class='ident'>k1</span>.<span class='ident'>verify</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='kw-2'>&amp;</span><span class='ident'>sig</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>rv</span> <span class='op'>==</span> <span class='boolval'>true</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_sign_hashes</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>msg</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>(<span class='number'>0xdeu8</span>, <span class='number'>0xadu8</span>, <span class='number'>0xd0u8</span>, <span class='number'>0x0du8</span>);
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+
+ <span class='kw'>let</span> <span class='ident'>sig</span> <span class='op'>=</span> <span class='ident'>k0</span>.<span class='ident'>sign_with_hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='ident'>MD5</span>);
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>verify_with_hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='kw-2'>&amp;</span><span class='ident'>sig</span>, <span class='ident'>MD5</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>k1</span>.<span class='ident'>verify_with_hash</span>(<span class='kw-2'>&amp;</span><span class='ident'>msg</span>, <span class='kw-2'>&amp;</span><span class='ident'>sig</span>, <span class='ident'>SHA1</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_eq</span>() {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p0</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>k1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p1</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='ident'>k0</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>k1</span>.<span class='ident'>gen</span>(<span class='number'>512</span>);
+ <span class='ident'>p0</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>.<span class='ident'>save_pub</span>());
+ <span class='ident'>p1</span>.<span class='ident'>load_pub</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>.<span class='ident'>save_pub</span>());
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k0</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>p0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p0</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>p1</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p0</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>k1</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p1</span>));
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>p0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>k0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>p1</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>p0</span>.<span class='ident'>public_eq</span>(<span class='kw-2'>&amp;</span><span class='ident'>k1</span>));
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/rand.rs.html b/src/openssl/crypto/rand.rs.html
new file mode 100644
index 0000000..fd6f00a
--- /dev/null
+++ b/src/openssl/crypto/rand.rs.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/rand.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>rand.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>c_int</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>rand_bytes</span>(<span class='ident'>len</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>len</span>);
+
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>RAND_bytes</span>(<span class='ident'>out</span>.<span class='ident'>as_mut_ptr</span>(), <span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>c_int</span>);
+ <span class='kw'>if</span> <span class='ident'>r</span> <span class='op'>!=</span> <span class='number'>1</span> <span class='kw'>as</span> <span class='ident'>c_int</span> { <span class='macro'>panic</span><span class='macro'>!</span>() }
+
+ <span class='ident'>out</span>.<span class='ident'>set_len</span>(<span class='ident'>len</span>);
+
+ <span class='ident'>out</span>
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='ident'>rand_bytes</span>;
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_rand_bytes</span>() {
+ <span class='kw'>let</span> <span class='ident'>bytes</span> <span class='op'>=</span> <span class='ident'>rand_bytes</span>(<span class='number'>32</span>);
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;{:?}&quot;</span>, <span class='ident'>bytes</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/crypto/symm.rs.html b/src/openssl/crypto/symm.rs.html
new file mode 100644
index 0000000..5cbd394
--- /dev/null
+++ b/src/openssl/crypto/symm.rs.html
@@ -0,0 +1,721 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/crypto/symm.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>symm.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>convert</span>::<span class='ident'>AsRef</span>;
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_int</span>};
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Mode</span> {
+ <span class='ident'>Encrypt</span>,
+ <span class='ident'>Decrypt</span>,
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Type</span> {
+ <span class='ident'>AES_128_ECB</span>,
+ <span class='ident'>AES_128_CBC</span>,
+ <span class='doccomment'>/// Requires the `aes_xts` feature</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='ident'>AES_128_XTS</span>,
+ <span class='comment'>// AES_128_CTR,</span>
+ <span class='comment'>//AES_128_GCM,</span>
+
+ <span class='ident'>AES_256_ECB</span>,
+ <span class='ident'>AES_256_CBC</span>,
+ <span class='doccomment'>/// Requires the `aes_xts` feature</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='ident'>AES_256_XTS</span>,
+ <span class='comment'>// AES_256_CTR,</span>
+ <span class='comment'>//AES_256_GCM,</span>
+
+ <span class='ident'>RC4_128</span>,
+}
+
+<span class='kw'>fn</span> <span class='ident'>evpc</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>) <span class='op'>-&gt;</span> (<span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER</span>, <span class='ident'>u32</span>, <span class='ident'>u32</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>match</span> <span class='ident'>t</span> {
+ <span class='ident'>Type</span>::<span class='ident'>AES_128_ECB</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_128_ecb</span>(), <span class='number'>16</span>, <span class='number'>16</span>),
+ <span class='ident'>Type</span>::<span class='ident'>AES_128_CBC</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_128_cbc</span>(), <span class='number'>16</span>, <span class='number'>16</span>),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='ident'>Type</span>::<span class='ident'>AES_128_XTS</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_128_xts</span>(), <span class='number'>32</span>, <span class='number'>16</span>),
+ <span class='comment'>// AES_128_CTR =&gt; (EVP_aes_128_ctr(), 16, 0),</span>
+ <span class='comment'>//AES_128_GCM =&gt; (EVP_aes_128_gcm(), 16, 16),</span>
+
+ <span class='ident'>Type</span>::<span class='ident'>AES_256_ECB</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_256_ecb</span>(), <span class='number'>32</span>, <span class='number'>16</span>),
+ <span class='ident'>Type</span>::<span class='ident'>AES_256_CBC</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_256_cbc</span>(), <span class='number'>32</span>, <span class='number'>16</span>),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='ident'>Type</span>::<span class='ident'>AES_256_XTS</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_aes_256_xts</span>(), <span class='number'>64</span>, <span class='number'>16</span>),
+ <span class='comment'>// AES_256_CTR =&gt; (EVP_aes_256_ctr(), 32, 0),</span>
+ <span class='comment'>//AES_256_GCM =&gt; (EVP_aes_256_gcm(), 32, 16),</span>
+
+ <span class='ident'>Type</span>::<span class='ident'>RC4_128</span> <span class='op'>=&gt;</span> (<span class='ident'>ffi</span>::<span class='ident'>EVP_rc4</span>(), <span class='number'>16</span>, <span class='number'>0</span>),
+ }
+ }
+}
+
+<span class='doccomment'>/// Represents a symmetric cipher context.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Crypter</span> {
+ <span class='ident'>evp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER</span>,
+ <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER_CTX</span>,
+ <span class='ident'>keylen</span>: <span class='ident'>u32</span>,
+ <span class='ident'>blocksize</span>: <span class='ident'>u32</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Crypter</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='ident'>Crypter</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER_CTX_new</span>() };
+ <span class='kw'>let</span> (<span class='ident'>evp</span>, <span class='ident'>keylen</span>, <span class='ident'>blocksz</span>) <span class='op'>=</span> <span class='ident'>evpc</span>(<span class='ident'>t</span>);
+ <span class='ident'>Crypter</span> { <span class='ident'>evp</span>: <span class='ident'>evp</span>, <span class='ident'>ctx</span>: <span class='ident'>ctx</span>, <span class='ident'>keylen</span>: <span class='ident'>keylen</span>, <span class='ident'>blocksize</span>: <span class='ident'>blocksz</span> }
+ }
+
+ <span class='doccomment'>/**
+ * Enables or disables padding. If padding is disabled, total amount of
+ * data encrypted must be a multiple of block size.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pad</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>padding</span>: <span class='ident'>bool</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>blocksize</span> <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='ident'>padding</span> { <span class='number'>1</span> <span class='kw'>as</span> <span class='ident'>c_int</span> } <span class='kw'>else</span> { <span class='number'>0</span> };
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER_CTX_set_padding</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>v</span>);
+ }
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Initializes this crypter.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>init</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span>[<span class='ident'>u8</span>]<span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>mode</span>: <span class='ident'>Mode</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>iv</span>: <span class='ident'>T</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>mode</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>mode</span> {
+ <span class='ident'>Mode</span>::<span class='ident'>Encrypt</span> <span class='op'>=&gt;</span> <span class='number'>1</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ <span class='ident'>Mode</span>::<span class='ident'>Decrypt</span> <span class='op'>=&gt;</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='ident'>c_int</span>,
+ };
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>key</span>.<span class='ident'>len</span>(), <span class='self'>self</span>.<span class='ident'>keylen</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_CipherInit</span>(
+ <span class='self'>self</span>.<span class='ident'>ctx</span>,
+ <span class='self'>self</span>.<span class='ident'>evp</span>,
+ <span class='ident'>key</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>iv</span>.<span class='ident'>as_ref</span>().<span class='ident'>as_ptr</span>(),
+ <span class='ident'>mode</span>
+ );
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Update this crypter with more data to encrypt or decrypt. Returns
+ * encrypted or decrypted bytes.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>sum</span> <span class='op'>=</span> <span class='ident'>data</span>.<span class='ident'>len</span>() <span class='op'>+</span> (<span class='self'>self</span>.<span class='ident'>blocksize</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='ident'>sum</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>reslen</span> <span class='op'>=</span> <span class='ident'>sum</span> <span class='kw'>as</span> <span class='ident'>c_int</span>;
+
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_CipherUpdate</span>(
+ <span class='self'>self</span>.<span class='ident'>ctx</span>,
+ <span class='ident'>res</span>.<span class='ident'>as_mut_ptr</span>(),
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>reslen</span>,
+ <span class='ident'>data</span>.<span class='ident'>as_ptr</span>(),
+ <span class='ident'>data</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>
+ );
+
+ <span class='ident'>res</span>.<span class='ident'>truncate</span>(<span class='ident'>reslen</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>res</span>
+ }
+ }
+
+ <span class='doccomment'>/**
+ * Finish crypting. Returns the remaining partial block of output, if any.
+ */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>finalize</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0u8</span>).<span class='ident'>take</span>(<span class='self'>self</span>.<span class='ident'>blocksize</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>reslen</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>blocksize</span> <span class='kw'>as</span> <span class='ident'>c_int</span>;
+
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_CipherFinal</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>,
+ <span class='ident'>res</span>.<span class='ident'>as_mut_ptr</span>(),
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>reslen</span>);
+
+ <span class='ident'>res</span>.<span class='ident'>truncate</span>(<span class='ident'>reslen</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+ <span class='ident'>res</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>Crypter</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>EVP_CIPHER_CTX_free</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>);
+ }
+ }
+}
+
+<span class='doccomment'>/**
+ * Encrypts data, using the specified crypter type in encrypt mode with the
+ * specified key and iv; returns the resulting (encrypted) data.
+ */</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>encrypt</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span>[<span class='ident'>u8</span>]<span class='op'>&gt;&gt;</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>iv</span>: <span class='ident'>T</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>Crypter</span>::<span class='ident'>new</span>(<span class='ident'>t</span>);
+ <span class='ident'>c</span>.<span class='ident'>init</span>(<span class='ident'>Mode</span>::<span class='ident'>Encrypt</span>, <span class='ident'>key</span>, <span class='ident'>iv</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>update</span>(<span class='ident'>data</span>);
+ <span class='kw'>let</span> <span class='ident'>rest</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>finalize</span>();
+ <span class='ident'>r</span>.<span class='ident'>extend</span>(<span class='ident'>rest</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>r</span>
+}
+
+<span class='doccomment'>/**
+ * Decrypts data, using the specified crypter type in decrypt mode with the
+ * specified key and iv; returns the resulting (decrypted) data.
+ */</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>decrypt</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span>[<span class='ident'>u8</span>]<span class='op'>&gt;&gt;</span>(<span class='ident'>t</span>: <span class='ident'>Type</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>], <span class='ident'>iv</span>: <span class='ident'>T</span>, <span class='ident'>data</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>Crypter</span>::<span class='ident'>new</span>(<span class='ident'>t</span>);
+ <span class='ident'>c</span>.<span class='ident'>init</span>(<span class='ident'>Mode</span>::<span class='ident'>Decrypt</span>, <span class='ident'>key</span>, <span class='ident'>iv</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>update</span>(<span class='ident'>data</span>);
+ <span class='kw'>let</span> <span class='ident'>rest</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>finalize</span>();
+ <span class='ident'>r</span>.<span class='ident'>extend</span>(<span class='ident'>rest</span>.<span class='ident'>into_iter</span>());
+ <span class='ident'>r</span>
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> <span class='ident'>serialize</span>::<span class='ident'>hex</span>::<span class='ident'>FromHex</span>;
+
+ <span class='comment'>// Test vectors from FIPS-197:</span>
+ <span class='comment'>// http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf</span>
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_aes_256_ecb</span>() {
+ <span class='kw'>let</span> <span class='ident'>k0</span> <span class='op'>=</span>
+ [<span class='number'>0x00u8</span>, <span class='number'>0x01u8</span>, <span class='number'>0x02u8</span>, <span class='number'>0x03u8</span>, <span class='number'>0x04u8</span>, <span class='number'>0x05u8</span>, <span class='number'>0x06u8</span>, <span class='number'>0x07u8</span>,
+ <span class='number'>0x08u8</span>, <span class='number'>0x09u8</span>, <span class='number'>0x0au8</span>, <span class='number'>0x0bu8</span>, <span class='number'>0x0cu8</span>, <span class='number'>0x0du8</span>, <span class='number'>0x0eu8</span>, <span class='number'>0x0fu8</span>,
+ <span class='number'>0x10u8</span>, <span class='number'>0x11u8</span>, <span class='number'>0x12u8</span>, <span class='number'>0x13u8</span>, <span class='number'>0x14u8</span>, <span class='number'>0x15u8</span>, <span class='number'>0x16u8</span>, <span class='number'>0x17u8</span>,
+ <span class='number'>0x18u8</span>, <span class='number'>0x19u8</span>, <span class='number'>0x1au8</span>, <span class='number'>0x1bu8</span>, <span class='number'>0x1cu8</span>, <span class='number'>0x1du8</span>, <span class='number'>0x1eu8</span>, <span class='number'>0x1fu8</span>];
+ <span class='kw'>let</span> <span class='ident'>p0</span> <span class='op'>=</span>
+ [<span class='number'>0x00u8</span>, <span class='number'>0x11u8</span>, <span class='number'>0x22u8</span>, <span class='number'>0x33u8</span>, <span class='number'>0x44u8</span>, <span class='number'>0x55u8</span>, <span class='number'>0x66u8</span>, <span class='number'>0x77u8</span>,
+ <span class='number'>0x88u8</span>, <span class='number'>0x99u8</span>, <span class='number'>0xaau8</span>, <span class='number'>0xbbu8</span>, <span class='number'>0xccu8</span>, <span class='number'>0xddu8</span>, <span class='number'>0xeeu8</span>, <span class='number'>0xffu8</span>];
+ <span class='kw'>let</span> <span class='ident'>c0</span> <span class='op'>=</span>
+ [<span class='number'>0x8eu8</span>, <span class='number'>0xa2u8</span>, <span class='number'>0xb7u8</span>, <span class='number'>0xcau8</span>, <span class='number'>0x51u8</span>, <span class='number'>0x67u8</span>, <span class='number'>0x45u8</span>, <span class='number'>0xbfu8</span>,
+ <span class='number'>0xeau8</span>, <span class='number'>0xfcu8</span>, <span class='number'>0x49u8</span>, <span class='number'>0x90u8</span>, <span class='number'>0x4bu8</span>, <span class='number'>0x49u8</span>, <span class='number'>0x60u8</span>, <span class='number'>0x89u8</span>];
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>Crypter</span>::<span class='ident'>new</span>(<span class='ident'>super</span>::<span class='ident'>Type</span>::<span class='ident'>AES_256_ECB</span>);
+ <span class='ident'>c</span>.<span class='ident'>init</span>(<span class='ident'>super</span>::<span class='ident'>Mode</span>::<span class='ident'>Encrypt</span>, <span class='kw-2'>&amp;</span><span class='ident'>k0</span>, <span class='kw-2'>&amp;</span>[]);
+ <span class='ident'>c</span>.<span class='ident'>pad</span>(<span class='boolval'>false</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>r0</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='ident'>p0</span>);
+ <span class='ident'>r0</span>.<span class='ident'>extend</span>(<span class='ident'>c</span>.<span class='ident'>finalize</span>().<span class='ident'>into_iter</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>r0</span> <span class='op'>==</span> <span class='ident'>c0</span>);
+ <span class='ident'>c</span>.<span class='ident'>init</span>(<span class='ident'>super</span>::<span class='ident'>Mode</span>::<span class='ident'>Decrypt</span>, <span class='kw-2'>&amp;</span><span class='ident'>k0</span>, <span class='kw-2'>&amp;</span>[]);
+ <span class='ident'>c</span>.<span class='ident'>pad</span>(<span class='boolval'>false</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p1</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='ident'>r0</span>);
+ <span class='ident'>p1</span>.<span class='ident'>extend</span>(<span class='ident'>c</span>.<span class='ident'>finalize</span>().<span class='ident'>into_iter</span>());
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>p1</span> <span class='op'>==</span> <span class='ident'>p0</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_aes_256_cbc_decrypt</span>() {
+ <span class='kw'>let</span> <span class='ident'>cr</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>Crypter</span>::<span class='ident'>new</span>(<span class='ident'>super</span>::<span class='ident'>Type</span>::<span class='ident'>AES_256_CBC</span>);
+ <span class='kw'>let</span> <span class='ident'>iv</span> <span class='op'>=</span> [
+ <span class='number'>4_u8</span>, <span class='number'>223_u8</span>, <span class='number'>153_u8</span>, <span class='number'>219_u8</span>, <span class='number'>28_u8</span>, <span class='number'>142_u8</span>, <span class='number'>234_u8</span>, <span class='number'>68_u8</span>, <span class='number'>227_u8</span>,
+ <span class='number'>69_u8</span>, <span class='number'>98_u8</span>, <span class='number'>107_u8</span>, <span class='number'>208_u8</span>, <span class='number'>14_u8</span>, <span class='number'>236_u8</span>, <span class='number'>60_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>,
+ <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>,
+ <span class='number'>0_u8</span>, <span class='number'>0_u8</span>, <span class='number'>0_u8</span>
+ ];
+ <span class='kw'>let</span> <span class='ident'>data</span> <span class='op'>=</span> [
+ <span class='number'>143_u8</span>, <span class='number'>210_u8</span>, <span class='number'>75_u8</span>, <span class='number'>63_u8</span>, <span class='number'>214_u8</span>, <span class='number'>179_u8</span>, <span class='number'>155_u8</span>,
+ <span class='number'>241_u8</span>, <span class='number'>242_u8</span>, <span class='number'>31_u8</span>, <span class='number'>154_u8</span>, <span class='number'>56_u8</span>, <span class='number'>198_u8</span>, <span class='number'>145_u8</span>, <span class='number'>192_u8</span>, <span class='number'>64_u8</span>,
+ <span class='number'>2_u8</span>, <span class='number'>245_u8</span>, <span class='number'>167_u8</span>, <span class='number'>220_u8</span>, <span class='number'>55_u8</span>, <span class='number'>119_u8</span>, <span class='number'>233_u8</span>, <span class='number'>136_u8</span>, <span class='number'>139_u8</span>,
+ <span class='number'>27_u8</span>, <span class='number'>71_u8</span>, <span class='number'>242_u8</span>, <span class='number'>119_u8</span>, <span class='number'>175_u8</span>, <span class='number'>65_u8</span>, <span class='number'>207_u8</span>
+ ];
+ <span class='kw'>let</span> <span class='ident'>ciphered_data</span> <span class='op'>=</span> [
+ <span class='number'>0x4a_u8</span>, <span class='number'>0x2e_u8</span>, <span class='number'>0xe5_u8</span>, <span class='number'>0x6_u8</span>, <span class='number'>0xbf_u8</span>, <span class='number'>0xcf_u8</span>, <span class='number'>0xf2_u8</span>, <span class='number'>0xd7_u8</span>,
+ <span class='number'>0xea_u8</span>, <span class='number'>0x2d_u8</span>, <span class='number'>0xb1_u8</span>, <span class='number'>0x85_u8</span>, <span class='number'>0x6c_u8</span>, <span class='number'>0x93_u8</span>, <span class='number'>0x65_u8</span>, <span class='number'>0x6f_u8</span>
+ ];
+ <span class='ident'>cr</span>.<span class='ident'>init</span>(<span class='ident'>super</span>::<span class='ident'>Mode</span>::<span class='ident'>Decrypt</span>, <span class='kw-2'>&amp;</span><span class='ident'>data</span>, <span class='kw-2'>&amp;</span><span class='ident'>iv</span>);
+ <span class='ident'>cr</span>.<span class='ident'>pad</span>(<span class='boolval'>false</span>);
+ <span class='kw'>let</span> <span class='ident'>unciphered_data_1</span> <span class='op'>=</span> <span class='ident'>cr</span>.<span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='ident'>ciphered_data</span>);
+ <span class='kw'>let</span> <span class='ident'>unciphered_data_2</span> <span class='op'>=</span> <span class='ident'>cr</span>.<span class='ident'>finalize</span>();
+
+ <span class='kw'>let</span> <span class='ident'>expected_unciphered_data</span> <span class='op'>=</span> <span class='string'>b&quot;I love turtles.\x01&quot;</span>;
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>unciphered_data_2</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span>);
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>unciphered_data_1</span>, <span class='ident'>expected_unciphered_data</span>);
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>cipher_test</span>(<span class='ident'>ciphertype</span>: <span class='ident'>super</span>::<span class='ident'>Type</span>, <span class='ident'>pt</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>ct</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>iv</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) {
+ <span class='kw'>use</span> <span class='ident'>serialize</span>::<span class='ident'>hex</span>::<span class='ident'>ToHex</span>;
+
+ <span class='kw'>let</span> <span class='ident'>cipher</span> <span class='op'>=</span> <span class='ident'>super</span>::<span class='ident'>Crypter</span>::<span class='ident'>new</span>(<span class='ident'>ciphertype</span>);
+ <span class='ident'>cipher</span>.<span class='ident'>init</span>(<span class='ident'>super</span>::<span class='ident'>Mode</span>::<span class='ident'>Encrypt</span>, <span class='kw-2'>&amp;</span><span class='ident'>key</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>(), <span class='kw-2'>&amp;</span><span class='ident'>iv</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+
+ <span class='kw'>let</span> <span class='ident'>expected</span> <span class='op'>=</span> <span class='ident'>ct</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>computed</span> <span class='op'>=</span> <span class='ident'>cipher</span>.<span class='ident'>update</span>(<span class='kw-2'>&amp;</span><span class='ident'>pt</span>.<span class='ident'>from_hex</span>().<span class='ident'>unwrap</span>());
+ <span class='ident'>computed</span>.<span class='ident'>extend</span>(<span class='ident'>cipher</span>.<span class='ident'>finalize</span>().<span class='ident'>into_iter</span>());
+
+ <span class='kw'>if</span> <span class='ident'>computed</span> <span class='op'>!=</span> <span class='ident'>expected</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Computed: {}&quot;</span>, <span class='ident'>computed</span>.<span class='ident'>to_hex</span>());
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Expected: {}&quot;</span>, <span class='ident'>expected</span>.<span class='ident'>to_hex</span>());
+ <span class='kw'>if</span> <span class='ident'>computed</span>.<span class='ident'>len</span>() <span class='op'>!=</span> <span class='ident'>expected</span>.<span class='ident'>len</span>() {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;Lengths differ: {} in computed vs {} expected&quot;</span>,
+ <span class='ident'>computed</span>.<span class='ident'>len</span>(), <span class='ident'>expected</span>.<span class='ident'>len</span>());
+ }
+ <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;test failure&quot;</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_rc4</span>() {
+
+ <span class='kw'>let</span> <span class='ident'>pt</span> <span class='op'>=</span> <span class='string'>&quot;0000000000000000000000000000000000000000000000000000000000000000000000000000&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>ct</span> <span class='op'>=</span> <span class='string'>&quot;A68686B04D686AA107BD8D4CAB191A3EEC0A6294BC78B60F65C25CB47BD7BB3A48EFC4D26BE4&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>key</span> <span class='op'>=</span> <span class='string'>&quot;97CD440324DA5FD1F7955C1C13B6B466&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>iv</span> <span class='op'>=</span> <span class='string'>&quot;&quot;</span>;
+
+ <span class='ident'>cipher_test</span>(<span class='ident'>super</span>::<span class='ident'>Type</span>::<span class='ident'>RC4_128</span>, <span class='ident'>pt</span>, <span class='ident'>ct</span>, <span class='ident'>key</span>, <span class='ident'>iv</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>test_aes256_xts</span>() {
+ <span class='comment'>// Test case 174 from</span>
+ <span class='comment'>// http://csrc.nist.gov/groups/STM/cavp/documents/aes/XTSTestVectors.zip</span>
+ <span class='kw'>let</span> <span class='ident'>pt</span> <span class='op'>=</span> <span class='string'>&quot;77f4ef63d734ebd028508da66c22cdebdd52ecd6ee2ab0a50bc8ad0cfd692ca5fcd4e6dedc45df7f6503f462611dc542&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>ct</span> <span class='op'>=</span> <span class='string'>&quot;ce7d905a7776ac72f240d22aafed5e4eb7566cdc7211220e970da634ce015f131a5ecb8d400bc9e84f0b81d8725dbbc7&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>key</span> <span class='op'>=</span> <span class='string'>&quot;b6bfef891f83b5ff073f2231267be51eb084b791fa19a154399c0684c8b2dfcb37de77d28bbda3b4180026ad640b74243b3133e7b9fae629403f6733423dae28&quot;</span>;
+ <span class='kw'>let</span> <span class='ident'>iv</span> <span class='op'>=</span> <span class='string'>&quot;db200efb7eaaa737dbdf40babb68953f&quot;</span>;
+
+ <span class='ident'>cipher_test</span>(<span class='ident'>super</span>::<span class='ident'>Type</span>::<span class='ident'>AES_256_XTS</span>, <span class='ident'>pt</span>, <span class='ident'>ct</span>, <span class='ident'>key</span>, <span class='ident'>iv</span>);
+ }
+
+ <span class='comment'>/*#[test]
+ fn test_aes128_ctr() {
+
+ let pt = ~&quot;6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710&quot;;
+ let ct = ~&quot;874D6191B620E3261BEF6864990DB6CE9806F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE&quot;;
+ let key = ~&quot;2B7E151628AED2A6ABF7158809CF4F3C&quot;;
+ let iv = ~&quot;F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF&quot;;
+
+ cipher_test(super::AES_128_CTR, pt, ct, key, iv);
+ }*/</span>
+
+ <span class='comment'>/*#[test]
+ fn test_aes128_gcm() {
+ // Test case 3 in GCM spec
+ let pt = ~&quot;d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255&quot;;
+ let ct = ~&quot;42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f59854d5c2af327cd64a62cf35abd2ba6fab4&quot;;
+ let key = ~&quot;feffe9928665731c6d6a8f9467308308&quot;;
+ let iv = ~&quot;cafebabefacedbaddecaf888&quot;;
+
+ cipher_test(super::AES_128_GCM, pt, ct, key, iv);
+ }*/</span>
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/lib.rs.html b/src/openssl/lib.rs.html
new file mode 100644
index 0000000..e8ad872
--- /dev/null
+++ b/src/openssl/lib.rs.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+</pre><pre class='rust '>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_root_url</span><span class='op'>=</span><span class='string'>&quot;https://sfackler.github.io/rust-openssl/doc/v0.6.3&quot;</span>)]</span>
+
+<span class='attribute'>#[<span class='ident'>macro_use</span>]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>bitflags</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>libc</span>;
+<span class='attribute'>#[<span class='ident'>macro_use</span>]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>lazy_static</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>openssl_sys</span> <span class='kw'>as</span> <span class='ident'>ffi</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rustc_serialize</span> <span class='kw'>as</span> <span class='ident'>serialize</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>any</span>(<span class='ident'>feature</span><span class='op'>=</span><span class='string'>&quot;dtlsv1&quot;</span>, <span class='ident'>feature</span><span class='op'>=</span><span class='string'>&quot;dtlsv1_2&quot;</span>))]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>connected_socket</span>;
+
+<span class='kw'>mod</span> <span class='ident'>macros</span>;
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>asn1</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bn</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>bio</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>crypto</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>ssl</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>x509</span>;
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>nid</span>;
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/nid.rs.html b/src/openssl/nid.rs.html
new file mode 100644
index 0000000..857ab9d
--- /dev/null
+++ b/src/openssl/nid.rs.html
@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/nid.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>nid.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+</pre><pre class='rust '>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>usize</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Nid</span> {
+ <span class='ident'>Undefined</span>,
+ <span class='ident'>Rsadsi</span>,
+ <span class='ident'>Pkcs</span>,
+ <span class='ident'>MD2</span>,
+ <span class='ident'>MD4</span>,
+ <span class='ident'>MD5</span>,
+ <span class='ident'>RC4</span>,
+ <span class='ident'>RsaEncryption</span>,
+ <span class='ident'>RSA_MD2</span>,
+ <span class='ident'>RSA_MD5</span>,
+ <span class='ident'>PBE_MD2_DES</span>,
+ <span class='ident'>X500</span>,
+ <span class='ident'>x509</span>,
+ <span class='ident'>CN</span>,
+ <span class='ident'>C</span>,
+ <span class='ident'>L</span>,
+ <span class='ident'>ST</span>,
+ <span class='ident'>O</span>,
+ <span class='ident'>OU</span>,
+ <span class='ident'>RSA</span>,
+ <span class='ident'>Pkcs7</span>,
+ <span class='ident'>Pkcs7_data</span>,
+ <span class='ident'>Pkcs7_signedData</span>,
+ <span class='ident'>Pkcs7_envelopedData</span>,
+ <span class='ident'>Pkcs7_signedAndEnvelopedData</span>,
+ <span class='ident'>Pkcs7_digestData</span>,
+ <span class='ident'>Pkcs7_encryptedData</span>,
+ <span class='ident'>Pkcs3</span>,
+ <span class='ident'>DhKeyAgreement</span>,
+ <span class='ident'>DES_ECB</span>,
+ <span class='ident'>DES_CFB</span>,
+ <span class='ident'>DES_CBC</span>,
+ <span class='ident'>DES_EDE</span>,
+ <span class='ident'>DES_EDE3</span>,
+ <span class='ident'>IDEA_CBC</span>,
+ <span class='ident'>IDEA_ECB</span>,
+ <span class='ident'>RC2_CBC</span>,
+ <span class='ident'>RC2_ECB</span>,
+ <span class='ident'>RC2_CFB</span>,
+ <span class='ident'>RC2_OFB</span>,
+ <span class='ident'>SHA</span>,
+ <span class='ident'>RSA_SHA</span>,
+ <span class='ident'>DES_EDE_CBC</span>,
+ <span class='ident'>DES_EDE3_CBC</span>,
+ <span class='ident'>DES_OFB</span>,
+ <span class='ident'>IDEA_OFB</span>,
+ <span class='ident'>Pkcs9</span>,
+ <span class='ident'>Email</span>,
+ <span class='ident'>UnstructuredName</span>,
+ <span class='ident'>ContentType</span>,
+ <span class='ident'>MessageDigest</span>,
+ <span class='ident'>SigningTime</span>,
+ <span class='ident'>CounterSignature</span>,
+ <span class='ident'>UnstructuredAddress</span>,
+ <span class='ident'>ExtendedCertificateAttributes</span>,
+ <span class='ident'>Netscape</span>,
+ <span class='ident'>NetscapeCertExtention</span>,
+ <span class='ident'>NetscapeDatatype</span>,
+ <span class='ident'>DES_EDE_CFB64</span>,
+ <span class='ident'>DES_EDE3_CFB64</span>,
+ <span class='ident'>DES_EDE_OFB64</span>,
+ <span class='ident'>DES_EDE3_OFB64</span>,
+ <span class='ident'>SHA1</span>,
+ <span class='ident'>RSA_SHA1</span>,
+ <span class='ident'>DSA_SHA</span>,
+ <span class='ident'>DSA_OLD</span>,
+ <span class='ident'>PBE_SHA1_RC2_64</span>,
+ <span class='ident'>PBKDF2</span>,
+ <span class='ident'>DSA_SHA1_OLD</span>,
+ <span class='ident'>NetscapeCertType</span>,
+ <span class='ident'>NetscapeBaseUrl</span>,
+ <span class='ident'>NetscapeRevocationUrl</span>,
+ <span class='ident'>NetscapeCARevocationUrl</span>,
+ <span class='ident'>NetscapeRenewalUrl</span>,
+ <span class='ident'>NetscapeCAPolicyUrl</span>,
+ <span class='ident'>NetscapeSSLServerName</span>,
+ <span class='ident'>NetscapeComment</span>,
+ <span class='ident'>NetscapeCertSequence</span>,
+ <span class='ident'>DESX_CBC</span>,
+ <span class='ident'>ID_CE</span>,
+ <span class='ident'>SubjectKeyIdentifier</span>,
+ <span class='ident'>KeyUsage</span>,
+ <span class='ident'>PrivateKeyUsagePeriod</span>,
+ <span class='ident'>SubjectAltName</span>,
+ <span class='ident'>IssuerAltName</span>,
+ <span class='ident'>BasicConstraints</span>,
+ <span class='ident'>CrlNumber</span>,
+ <span class='ident'>CertificatePolicies</span>,
+ <span class='ident'>AuthorityKeyIdentifier</span>,
+ <span class='ident'>BF_CBC</span>,
+ <span class='ident'>BF_ECB</span>,
+ <span class='ident'>BF_OFB</span>,
+ <span class='ident'>MDC2</span>,
+ <span class='ident'>RSA_MDC2</span>,
+ <span class='ident'>RC4_40</span>,
+ <span class='ident'>RC2_40_CBC</span>,
+ <span class='ident'>G</span>,
+ <span class='ident'>S</span>,
+ <span class='ident'>I</span>,
+ <span class='ident'>UID</span>,
+ <span class='ident'>CrlDistributionPoints</span>,
+ <span class='ident'>RSA_NP_MD5</span>,
+ <span class='ident'>SN</span>,
+ <span class='ident'>T</span>,
+ <span class='ident'>D</span>,
+ <span class='ident'>CAST5_CBC</span>,
+ <span class='ident'>CAST5_ECB</span>,
+ <span class='ident'>CAST5_CFB</span>,
+ <span class='ident'>CAST5_OFB</span>,
+ <span class='ident'>PbeWithMD5AndCast5CBC</span>,
+ <span class='ident'>DSA_SHA1</span>,
+ <span class='ident'>MD5_SHA1</span>,
+ <span class='ident'>RSA_SHA1_2</span>,
+ <span class='ident'>DSA</span>,
+ <span class='ident'>RIPEMD160</span>,
+ <span class='ident'>RSA_RIPEMD160</span>,
+ <span class='ident'>RC5_CBC</span>,
+ <span class='ident'>RC5_ECB</span>,
+ <span class='ident'>RC5_CFB</span>,
+ <span class='ident'>RC5_OFB</span>,
+ <span class='ident'>RLE</span>,
+ <span class='ident'>ZLIB</span>,
+ <span class='ident'>ExtendedKeyUsage</span>,
+ <span class='ident'>PKIX</span>,
+ <span class='ident'>ID_KP</span>,
+ <span class='ident'>ServerAuth</span>,
+ <span class='ident'>ClientAuth</span>,
+ <span class='ident'>CodeSigning</span>,
+ <span class='ident'>EmailProtection</span>,
+ <span class='ident'>TimeStamping</span>,
+ <span class='ident'>MsCodeInd</span>,
+ <span class='ident'>MsCodeCom</span>,
+ <span class='ident'>MsCtlSigh</span>,
+ <span class='ident'>MsSGC</span>,
+ <span class='ident'>MsEFS</span>,
+ <span class='ident'>NsSGC</span>,
+ <span class='ident'>DeltaCRL</span>,
+ <span class='ident'>CRLReason</span>,
+ <span class='ident'>InvalidityDate</span>,
+ <span class='ident'>SXNetID</span>,
+ <span class='ident'>Pkcs12</span>,
+ <span class='ident'>PBE_SHA1_RC4_128</span>,
+ <span class='ident'>PBE_SHA1_RC4_40</span>,
+ <span class='ident'>PBE_SHA1_3DES</span>,
+ <span class='ident'>PBE_SHA1_2DES</span>,
+ <span class='ident'>PBE_SHA1_RC2_128</span>,
+ <span class='ident'>PBE_SHA1_RC2_40</span>,
+ <span class='ident'>KeyBag</span>,
+ <span class='ident'>Pkcs8ShroudedKeyBag</span>,
+ <span class='ident'>CertBag</span>,
+ <span class='ident'>CrlBag</span>,
+ <span class='ident'>SecretBag</span>,
+ <span class='ident'>SafeContentsBag</span>,
+ <span class='ident'>FriendlyName</span>,
+ <span class='ident'>LocalKeyID</span>,
+ <span class='ident'>X509Certificate</span>,
+ <span class='ident'>SdsiCertificate</span>,
+ <span class='ident'>X509Crl</span>,
+ <span class='ident'>PBES2</span>,
+ <span class='ident'>PBMAC1</span>,
+ <span class='ident'>HmacWithSha1</span>,
+ <span class='ident'>ID_QT_CPS</span>,
+ <span class='ident'>ID_QT_UNOTICE</span>,
+ <span class='ident'>RC2_64_CBC</span>,
+ <span class='ident'>SMIMECaps</span>
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/ssl/error.rs.html b/src/openssl/ssl/error.rs.html
new file mode 100644
index 0000000..683c375
--- /dev/null
+++ b/src/openssl/ssl/error.rs.html
@@ -0,0 +1,373 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/ssl/error.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>error.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+</pre><pre class='rust '>
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>SslError</span>::<span class='op'>*</span>;
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>OpensslError</span>::<span class='op'>*</span>;
+
+<span class='kw'>use</span> <span class='ident'>libc</span>::<span class='ident'>c_ulong</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>error</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::<span class='ident'>CStr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+
+<span class='doccomment'>/// An SSL error</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>SslError</span> {
+ <span class='doccomment'>/// The underlying stream reported an error</span>
+ <span class='ident'>StreamError</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>),
+ <span class='doccomment'>/// The SSL session has been closed by the other end</span>
+ <span class='ident'>SslSessionClosed</span>,
+ <span class='doccomment'>/// An error in the OpenSSL library</span>
+ <span class='ident'>OpenSslErrors</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>OpensslError</span><span class='op'>&gt;</span>)
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>SslError</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>fmt</span>.<span class='ident'>write_str</span>(<span class='ident'>error</span>::<span class='ident'>Error</span>::<span class='ident'>description</span>(<span class='self'>self</span>)));
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='ident'>OpenSslErrors</span>(<span class='kw-2'>ref</span> <span class='ident'>errs</span>) <span class='op'>=</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>first</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>for</span> <span class='ident'>err</span> <span class='kw'>in</span> <span class='ident'>errs</span> {
+ <span class='kw'>if</span> <span class='ident'>first</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>fmt</span>.<span class='ident'>write_str</span>(<span class='string'>&quot;: &quot;</span>));
+ <span class='ident'>first</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ } <span class='kw'>else</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>fmt</span>.<span class='ident'>write_str</span>(<span class='string'>&quot;, &quot;</span>));
+ }
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>err</span> {
+ <span class='ident'>UnknownError</span> { <span class='kw-2'>ref</span> <span class='ident'>reason</span>, .. } <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>fmt</span>.<span class='ident'>write_str</span>(<span class='ident'>reason</span>)),
+ }
+ }
+ }
+
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>error</span>::<span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>SslError</span> {
+ <span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StreamError</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;The underlying stream reported an error&quot;</span>,
+ <span class='ident'>SslSessionClosed</span> <span class='op'>=&gt;</span> <span class='string'>&quot;The SSL session has been closed by the other end&quot;</span>,
+ <span class='ident'>OpenSslErrors</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;An error in the OpenSSL library&quot;</span>,
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>cause</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='ident'>error</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StreamError</span>(<span class='kw-2'>ref</span> <span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>err</span> <span class='kw'>as</span> <span class='kw-2'>&amp;</span><span class='ident'>error</span>::<span class='ident'>Error</span>),
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='doccomment'>/// An error from the OpenSSL library</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>, <span class='ident'>Clone</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>OpensslError</span> {
+ <span class='doccomment'>/// An unknown error</span>
+ <span class='ident'>UnknownError</span> {
+ <span class='doccomment'>/// The library reporting the error</span>
+ <span class='ident'>library</span>: <span class='ident'>String</span>,
+ <span class='doccomment'>/// The function reporting the error</span>
+ <span class='ident'>function</span>: <span class='ident'>String</span>,
+ <span class='doccomment'>/// The reason for the error</span>
+ <span class='ident'>reason</span>: <span class='ident'>String</span>
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>get_lib</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>bytes</span> <span class='op'>=</span> <span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>ffi</span>::<span class='ident'>ERR_lib_error_string</span>(<span class='ident'>err</span>)).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>();
+ <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>bytes</span>).<span class='ident'>unwrap</span>()
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>get_func</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>bytes</span> <span class='op'>=</span> <span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>ffi</span>::<span class='ident'>ERR_func_error_string</span>(<span class='ident'>err</span>)).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>();
+ <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>bytes</span>).<span class='ident'>unwrap</span>()
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>get_reason</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>bytes</span> <span class='op'>=</span> <span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>ffi</span>::<span class='ident'>ERR_reason_error_string</span>(<span class='ident'>err</span>)).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>();
+ <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>bytes</span>).<span class='ident'>unwrap</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>SslError</span> {
+ <span class='doccomment'>/// Creates a new `OpenSslErrors` with the current contents of the error</span>
+ <span class='doccomment'>/// stack.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get</span>() <span class='op'>-&gt;</span> <span class='ident'>SslError</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>errs</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>();
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>ERR_get_error</span>() } {
+ <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>break</span>,
+ <span class='ident'>err</span> <span class='op'>=&gt;</span> <span class='ident'>errs</span>.<span class='ident'>push</span>(<span class='ident'>SslError</span>::<span class='ident'>from_error_code</span>(<span class='ident'>err</span>))
+ }
+ }
+ <span class='ident'>OpenSslErrors</span>(<span class='ident'>errs</span>)
+ }
+
+ <span class='doccomment'>/// Creates an `SslError` from the raw numeric error code.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_error</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>SslError</span> {
+ <span class='ident'>OpenSslErrors</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>SslError</span>::<span class='ident'>from_error_code</span>(<span class='ident'>err</span>)])
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>from_error_code</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>OpensslError</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+ <span class='ident'>UnknownError</span> {
+ <span class='ident'>library</span>: <span class='ident'>get_lib</span>(<span class='ident'>err</span>),
+ <span class='ident'>function</span>: <span class='ident'>get_func</span>(<span class='ident'>err</span>),
+ <span class='ident'>reason</span>: <span class='ident'>get_reason</span>(<span class='ident'>err</span>)
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>test</span>]</span>
+<span class='kw'>fn</span> <span class='ident'>test_uknown_error_should_have_correct_messages</span>() {
+ <span class='kw'>let</span> <span class='ident'>errs</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>SslError</span>::<span class='ident'>from_error</span>(<span class='number'>336032784</span>) {
+ <span class='ident'>OpenSslErrors</span>(<span class='ident'>errs</span>) <span class='op'>=&gt;</span> <span class='ident'>errs</span>,
+ _ <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;This should always be an `OpenSslErrors` variant.&quot;</span>)
+ };
+
+ <span class='kw'>let</span> <span class='ident'>UnknownError</span> { <span class='kw-2'>ref</span> <span class='ident'>library</span>, <span class='kw-2'>ref</span> <span class='ident'>function</span>, <span class='kw-2'>ref</span> <span class='ident'>reason</span> } <span class='op'>=</span> <span class='ident'>errs</span>[<span class='number'>0</span>];
+
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>library</span>[..], <span class='string'>&quot;SSL routines&quot;</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>function</span>[..], <span class='string'>&quot;SSL23_GET_SERVER_HELLO&quot;</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='kw-2'>&amp;</span><span class='ident'>reason</span>[..], <span class='string'>&quot;sslv3 alert handshake failure&quot;</span>);
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/ssl/mod.rs.html b/src/openssl/ssl/mod.rs.html
new file mode 100644
index 0000000..40cd850
--- /dev/null
+++ b/src/openssl/ssl/mod.rs.html
@@ -0,0 +1,2079 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/ssl/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+<span id="683">683</span>
+<span id="684">684</span>
+<span id="685">685</span>
+<span id="686">686</span>
+<span id="687">687</span>
+<span id="688">688</span>
+<span id="689">689</span>
+<span id="690">690</span>
+<span id="691">691</span>
+<span id="692">692</span>
+<span id="693">693</span>
+<span id="694">694</span>
+<span id="695">695</span>
+<span id="696">696</span>
+<span id="697">697</span>
+<span id="698">698</span>
+<span id="699">699</span>
+<span id="700">700</span>
+<span id="701">701</span>
+<span id="702">702</span>
+<span id="703">703</span>
+<span id="704">704</span>
+<span id="705">705</span>
+<span id="706">706</span>
+<span id="707">707</span>
+<span id="708">708</span>
+<span id="709">709</span>
+<span id="710">710</span>
+<span id="711">711</span>
+<span id="712">712</span>
+<span id="713">713</span>
+<span id="714">714</span>
+<span id="715">715</span>
+<span id="716">716</span>
+<span id="717">717</span>
+<span id="718">718</span>
+<span id="719">719</span>
+<span id="720">720</span>
+<span id="721">721</span>
+<span id="722">722</span>
+<span id="723">723</span>
+<span id="724">724</span>
+<span id="725">725</span>
+<span id="726">726</span>
+<span id="727">727</span>
+<span id="728">728</span>
+<span id="729">729</span>
+<span id="730">730</span>
+<span id="731">731</span>
+<span id="732">732</span>
+<span id="733">733</span>
+<span id="734">734</span>
+<span id="735">735</span>
+<span id="736">736</span>
+<span id="737">737</span>
+<span id="738">738</span>
+<span id="739">739</span>
+<span id="740">740</span>
+<span id="741">741</span>
+<span id="742">742</span>
+<span id="743">743</span>
+<span id="744">744</span>
+<span id="745">745</span>
+<span id="746">746</span>
+<span id="747">747</span>
+<span id="748">748</span>
+<span id="749">749</span>
+<span id="750">750</span>
+<span id="751">751</span>
+<span id="752">752</span>
+<span id="753">753</span>
+<span id="754">754</span>
+<span id="755">755</span>
+<span id="756">756</span>
+<span id="757">757</span>
+<span id="758">758</span>
+<span id="759">759</span>
+<span id="760">760</span>
+<span id="761">761</span>
+<span id="762">762</span>
+<span id="763">763</span>
+<span id="764">764</span>
+<span id="765">765</span>
+<span id="766">766</span>
+<span id="767">767</span>
+<span id="768">768</span>
+<span id="769">769</span>
+<span id="770">770</span>
+<span id="771">771</span>
+<span id="772">772</span>
+<span id="773">773</span>
+<span id="774">774</span>
+<span id="775">775</span>
+<span id="776">776</span>
+<span id="777">777</span>
+<span id="778">778</span>
+<span id="779">779</span>
+<span id="780">780</span>
+<span id="781">781</span>
+<span id="782">782</span>
+<span id="783">783</span>
+<span id="784">784</span>
+<span id="785">785</span>
+<span id="786">786</span>
+<span id="787">787</span>
+<span id="788">788</span>
+<span id="789">789</span>
+<span id="790">790</span>
+<span id="791">791</span>
+<span id="792">792</span>
+<span id="793">793</span>
+<span id="794">794</span>
+<span id="795">795</span>
+<span id="796">796</span>
+<span id="797">797</span>
+<span id="798">798</span>
+<span id="799">799</span>
+<span id="800">800</span>
+<span id="801">801</span>
+<span id="802">802</span>
+<span id="803">803</span>
+<span id="804">804</span>
+<span id="805">805</span>
+<span id="806">806</span>
+<span id="807">807</span>
+<span id="808">808</span>
+<span id="809">809</span>
+<span id="810">810</span>
+<span id="811">811</span>
+<span id="812">812</span>
+<span id="813">813</span>
+<span id="814">814</span>
+<span id="815">815</span>
+<span id="816">816</span>
+<span id="817">817</span>
+<span id="818">818</span>
+<span id="819">819</span>
+<span id="820">820</span>
+<span id="821">821</span>
+<span id="822">822</span>
+<span id="823">823</span>
+<span id="824">824</span>
+<span id="825">825</span>
+<span id="826">826</span>
+<span id="827">827</span>
+<span id="828">828</span>
+<span id="829">829</span>
+<span id="830">830</span>
+<span id="831">831</span>
+<span id="832">832</span>
+<span id="833">833</span>
+<span id="834">834</span>
+<span id="835">835</span>
+<span id="836">836</span>
+<span id="837">837</span>
+<span id="838">838</span>
+<span id="839">839</span>
+<span id="840">840</span>
+<span id="841">841</span>
+<span id="842">842</span>
+<span id="843">843</span>
+<span id="844">844</span>
+<span id="845">845</span>
+<span id="846">846</span>
+<span id="847">847</span>
+<span id="848">848</span>
+<span id="849">849</span>
+<span id="850">850</span>
+<span id="851">851</span>
+<span id="852">852</span>
+<span id="853">853</span>
+<span id="854">854</span>
+<span id="855">855</span>
+<span id="856">856</span>
+<span id="857">857</span>
+<span id="858">858</span>
+<span id="859">859</span>
+<span id="860">860</span>
+<span id="861">861</span>
+<span id="862">862</span>
+<span id="863">863</span>
+<span id="864">864</span>
+<span id="865">865</span>
+<span id="866">866</span>
+<span id="867">867</span>
+<span id="868">868</span>
+<span id="869">869</span>
+<span id="870">870</span>
+<span id="871">871</span>
+<span id="872">872</span>
+<span id="873">873</span>
+<span id="874">874</span>
+<span id="875">875</span>
+<span id="876">876</span>
+<span id="877">877</span>
+<span id="878">878</span>
+<span id="879">879</span>
+<span id="880">880</span>
+<span id="881">881</span>
+<span id="882">882</span>
+<span id="883">883</span>
+<span id="884">884</span>
+<span id="885">885</span>
+<span id="886">886</span>
+<span id="887">887</span>
+<span id="888">888</span>
+<span id="889">889</span>
+<span id="890">890</span>
+<span id="891">891</span>
+<span id="892">892</span>
+<span id="893">893</span>
+<span id="894">894</span>
+<span id="895">895</span>
+<span id="896">896</span>
+<span id="897">897</span>
+<span id="898">898</span>
+<span id="899">899</span>
+<span id="900">900</span>
+<span id="901">901</span>
+<span id="902">902</span>
+<span id="903">903</span>
+<span id="904">904</span>
+<span id="905">905</span>
+<span id="906">906</span>
+<span id="907">907</span>
+<span id="908">908</span>
+<span id="909">909</span>
+<span id="910">910</span>
+<span id="911">911</span>
+<span id="912">912</span>
+<span id="913">913</span>
+<span id="914">914</span>
+<span id="915">915</span>
+<span id="916">916</span>
+<span id="917">917</span>
+<span id="918">918</span>
+<span id="919">919</span>
+<span id="920">920</span>
+<span id="921">921</span>
+<span id="922">922</span>
+<span id="923">923</span>
+<span id="924">924</span>
+<span id="925">925</span>
+<span id="926">926</span>
+<span id="927">927</span>
+<span id="928">928</span>
+<span id="929">929</span>
+<span id="930">930</span>
+<span id="931">931</span>
+<span id="932">932</span>
+<span id="933">933</span>
+<span id="934">934</span>
+<span id="935">935</span>
+<span id="936">936</span>
+<span id="937">937</span>
+<span id="938">938</span>
+<span id="939">939</span>
+<span id="940">940</span>
+<span id="941">941</span>
+<span id="942">942</span>
+<span id="943">943</span>
+<span id="944">944</span>
+<span id="945">945</span>
+<span id="946">946</span>
+<span id="947">947</span>
+<span id="948">948</span>
+<span id="949">949</span>
+<span id="950">950</span>
+<span id="951">951</span>
+<span id="952">952</span>
+<span id="953">953</span>
+<span id="954">954</span>
+<span id="955">955</span>
+<span id="956">956</span>
+<span id="957">957</span>
+<span id="958">958</span>
+<span id="959">959</span>
+<span id="960">960</span>
+<span id="961">961</span>
+<span id="962">962</span>
+<span id="963">963</span>
+<span id="964">964</span>
+<span id="965">965</span>
+<span id="966">966</span>
+<span id="967">967</span>
+<span id="968">968</span>
+<span id="969">969</span>
+<span id="970">970</span>
+<span id="971">971</span>
+<span id="972">972</span>
+<span id="973">973</span>
+<span id="974">974</span>
+<span id="975">975</span>
+<span id="976">976</span>
+<span id="977">977</span>
+<span id="978">978</span>
+<span id="979">979</span>
+<span id="980">980</span>
+<span id="981">981</span>
+<span id="982">982</span>
+<span id="983">983</span>
+<span id="984">984</span>
+<span id="985">985</span>
+<span id="986">986</span>
+<span id="987">987</span>
+<span id="988">988</span>
+<span id="989">989</span>
+<span id="990">990</span>
+<span id="991">991</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_int</span>, <span class='ident'>c_void</span>, <span class='ident'>c_long</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>TypeId</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>HashMap</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::{<span class='ident'>CStr</span>, <span class='ident'>CString</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>net</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::<span class='ident'>Path</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{<span class='ident'>Once</span>, <span class='ident'>ONCE_INIT</span>, <span class='ident'>Arc</span>, <span class='ident'>Mutex</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::{<span class='ident'>Deref</span>, <span class='ident'>DerefMut</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>any</span>::<span class='ident'>Any</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_uchar</span>, <span class='ident'>c_uint</span>};
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>slice</span>;
+
+<span class='kw'>use</span> <span class='ident'>bio</span>::{<span class='ident'>MemBio</span>};
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>, <span class='ident'>SslSessionClosed</span>, <span class='ident'>StreamError</span>, <span class='ident'>OpenSslErrors</span>};
+<span class='kw'>use</span> <span class='ident'>x509</span>::{<span class='ident'>X509StoreContext</span>, <span class='ident'>X509FileType</span>, <span class='ident'>X509</span>};
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>pkey</span>::<span class='ident'>PKey</span>;
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>error</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span>;
+
+<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>VERIFY_IDX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+
+<span class='kw'>fn</span> <span class='ident'>init</span>() {
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>INIT</span>: <span class='ident'>Once</span> <span class='op'>=</span> <span class='ident'>ONCE_INIT</span>;
+
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>INIT</span>.<span class='ident'>call_once</span>(<span class='op'>||</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>verify_idx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_new_index</span>(<span class='number'>0</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>(), <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>verify_idx</span> <span class='op'>&gt;=</span> <span class='number'>0</span>);
+ <span class='ident'>VERIFY_IDX</span> <span class='op'>=</span> <span class='ident'>verify_idx</span>;
+ });
+ }
+}
+
+<span class='macro'>bitflags</span><span class='macro'>!</span> {
+ <span class='ident'>flags</span> <span class='ident'>SslContextOptions</span>: <span class='ident'>c_long</span> {
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_LEGACY_SERVER_CONNECT</span> <span class='op'>=</span> <span class='number'>0x00000004</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG</span> <span class='op'>=</span> <span class='number'>0x00000008</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_TLSEXT_PADDING</span> <span class='op'>=</span> <span class='number'>0x00000010</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER</span> <span class='op'>=</span> <span class='number'>0x00000020</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_SAFARI_ECDHE_ECDSA_BUG</span> <span class='op'>=</span> <span class='number'>0x00000040</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_SSLEAY_080_CLIENT_DH_BUG</span> <span class='op'>=</span> <span class='number'>0x00000080</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_TLS_D5_BUG</span> <span class='op'>=</span> <span class='number'>0x00000100</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_TLS_BLOCK_PADDING_BUG</span> <span class='op'>=</span> <span class='number'>0x00000200</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS</span> <span class='op'>=</span> <span class='number'>0x00000800</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_ALL</span> <span class='op'>=</span> <span class='number'>0x80000BFF</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_QUERY_MTU</span> <span class='op'>=</span> <span class='number'>0x00001000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_COOKIE_EXCHANGE</span> <span class='op'>=</span> <span class='number'>0x00002000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_TICKET</span> <span class='op'>=</span> <span class='number'>0x00004000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_CISCO_ANYCONNECT</span> <span class='op'>=</span> <span class='number'>0x00008000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION</span> <span class='op'>=</span> <span class='number'>0x00010000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_COMPRESSION</span> <span class='op'>=</span> <span class='number'>0x00020000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION</span> <span class='op'>=</span> <span class='number'>0x00040000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_SINGLE_ECDH_USE</span> <span class='op'>=</span> <span class='number'>0x00080000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_SINGLE_DH_USE</span> <span class='op'>=</span> <span class='number'>0x00100000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_CIPHER_SERVER_PREFERENCE</span> <span class='op'>=</span> <span class='number'>0x00400000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_TLS_ROLLBACK_BUG</span> <span class='op'>=</span> <span class='number'>0x00800000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_SSLV2</span> <span class='op'>=</span> <span class='number'>0x00000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_SSLV3</span> <span class='op'>=</span> <span class='number'>0x02000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_TLSV1</span> <span class='op'>=</span> <span class='number'>0x04000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_TLSV1_2</span> <span class='op'>=</span> <span class='number'>0x08000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_TLSV1_1</span> <span class='op'>=</span> <span class='number'>0x10000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_DTLSV1</span> <span class='op'>=</span> <span class='number'>0x04000000</span>,
+ <span class='kw'>const</span> <span class='ident'>SSL_OP_NO_DTLSV1_2</span> <span class='op'>=</span> <span class='number'>0x08000000</span>
+ }
+}
+
+<span class='doccomment'>/// Determines the SSL method supported</span>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>Hash</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>SslMethod</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;sslv2&quot;</span>)]</span>
+ <span class='doccomment'>/// Only support the SSLv2 protocol, requires the `sslv2` feature.</span>
+ <span class='ident'>Sslv2</span>,
+ <span class='doccomment'>/// Support the SSLv2, SSLv3 and TLSv1 protocols.</span>
+ <span class='ident'>Sslv23</span>,
+ <span class='doccomment'>/// Only support the SSLv3 protocol.</span>
+ <span class='ident'>Sslv3</span>,
+ <span class='doccomment'>/// Only support the TLSv1 protocol.</span>
+ <span class='ident'>Tlsv1</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_1&quot;</span>)]</span>
+ <span class='doccomment'>/// Support TLSv1.1 protocol, requires the `tlsv1_1` feature.</span>
+ <span class='ident'>Tlsv1_1</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_2&quot;</span>)]</span>
+ <span class='doccomment'>/// Support TLSv1.2 protocol, requires the `tlsv1_2` feature.</span>
+ <span class='ident'>Tlsv1_2</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1&quot;</span>)]</span>
+ <span class='doccomment'>/// Support DTLSv1 protocol, requires the `dtlsv1` feature.</span>
+ <span class='ident'>Dtlsv1</span>,
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1_2&quot;</span>)]</span>
+ <span class='doccomment'>/// Support DTLSv1.2 protocol, requires the `dtlsv1_2` feature.</span>
+ <span class='ident'>Dtlsv1_2</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>SslMethod</span> {
+ <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>to_raw</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_METHOD</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;sslv2&quot;</span>)]</span>
+ <span class='ident'>SslMethod</span>::<span class='ident'>Sslv2</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>SSLv2_method</span>(),
+ <span class='ident'>SslMethod</span>::<span class='ident'>Sslv3</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>SSLv3_method</span>(),
+ <span class='ident'>SslMethod</span>::<span class='ident'>Tlsv1</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>TLSv1_method</span>(),
+ <span class='ident'>SslMethod</span>::<span class='ident'>Sslv23</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>SSLv23_method</span>(),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_1&quot;</span>)]</span>
+ <span class='ident'>SslMethod</span>::<span class='ident'>Tlsv1_1</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>TLSv1_1_method</span>(),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_2&quot;</span>)]</span>
+ <span class='ident'>SslMethod</span>::<span class='ident'>Tlsv1_2</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>TLSv1_2_method</span>(),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1&quot;</span>)]</span>
+ <span class='ident'>SslMethod</span>::<span class='ident'>Dtlsv1</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>DTLSv1_method</span>(),
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1_2&quot;</span>)]</span>
+ <span class='ident'>SslMethod</span>::<span class='ident'>Dtlsv1_2</span> <span class='op'>=&gt;</span> <span class='ident'>ffi</span>::<span class='ident'>DTLSv1_2_method</span>(),
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_dtlsv1</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='op'>==</span> <span class='ident'>SslMethod</span>::<span class='ident'>Dtlsv1</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1_2&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_dtlsv1_2</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='op'>*</span><span class='self'>self</span> <span class='op'>==</span> <span class='ident'>SslMethod</span>::<span class='ident'>Dtlsv1_2</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_dtls</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>is_dtlsv1</span>() <span class='op'>||</span> <span class='self'>self</span>.<span class='ident'>is_dtlsv1_2</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_dtlsv1</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='boolval'>false</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1_2&quot;</span>))]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_dtlsv1_2</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='boolval'>false</span>
+ }
+}
+
+<span class='doccomment'>/// Determines the type of certificate verification used</span>
+<span class='macro'>bitflags</span><span class='macro'>!</span> {
+ <span class='ident'>flags</span> <span class='ident'>SslVerifyMode</span>: <span class='ident'>i32</span> {
+ <span class='doccomment'>/// Verify that the server&#39;s certificate is trusted</span>
+ <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_PEER</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_VERIFY_PEER</span>,
+ <span class='doccomment'>/// Do not verify the server&#39;s certificate</span>
+ <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_NONE</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_VERIFY_NONE</span>,
+ <span class='doccomment'>/// Terminate handshake if client did not return a certificate.</span>
+ <span class='doccomment'>/// Use together with SSL_VERIFY_PEER.</span>
+ <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_FAIL_IF_NO_PEER_CERT</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_VERIFY_FAIL_IF_NO_PEER_CERT</span>,
+ }
+}
+
+<span class='macro'>lazy_static</span><span class='macro'>!</span> {
+ <span class='kw'>static</span> <span class='kw-2'>ref</span> <span class='ident'>INDEXES</span>: <span class='ident'>Mutex</span><span class='op'>&lt;</span><span class='ident'>HashMap</span><span class='op'>&lt;</span><span class='ident'>TypeId</span>, <span class='ident'>c_int</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='ident'>Mutex</span>::<span class='ident'>new</span>(<span class='ident'>HashMap</span>::<span class='ident'>new</span>());
+}
+
+<span class='comment'>// Creates a static index for user data of type T</span>
+<span class='comment'>// Registers a destructor for the data which will be called</span>
+<span class='comment'>// when context is freed</span>
+<span class='kw'>fn</span> <span class='ident'>get_verify_data_idx</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Any</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span><span class='op'>&gt;</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>free_data_box</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>_parent</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>_ad</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_EX_DATA</span>, <span class='ident'>_idx</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>_argl</span>: <span class='ident'>c_long</span>, <span class='ident'>_argp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) {
+ <span class='kw'>if</span> <span class='ident'>ptr</span> <span class='op'>!=</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> _ {
+ <span class='kw'>let</span> _: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>ptr</span>) };
+ }
+ }
+
+ <span class='op'>*</span><span class='ident'>INDEXES</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>().<span class='ident'>entry</span>(<span class='ident'>TypeId</span>::<span class='ident'>of</span>::<span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>()).<span class='ident'>or_insert_with</span>(<span class='op'>||</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>f</span>: <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_EX_free</span> <span class='op'>=</span> <span class='ident'>free_data_box</span>::<span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>;
+ <span class='kw'>let</span> <span class='ident'>idx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_new_index</span>(<span class='number'>0</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>(), <span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>, <span class='prelude-val'>Some</span>(<span class='ident'>f</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>idx</span> <span class='op'>&gt;=</span> <span class='number'>0</span>);
+ <span class='ident'>idx</span>
+ }
+ })
+}
+
+<span class='doccomment'>/// Creates a static index for the list of NPN protocols.</span>
+<span class='doccomment'>/// Registers a destructor for the data which will be called</span>
+<span class='doccomment'>/// when the context is freed.</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>fn</span> <span class='ident'>get_npn_protos_idx</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>NPN_PROTOS_IDX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='op'>-</span><span class='number'>1</span>;
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>INIT</span>: <span class='ident'>Once</span> <span class='op'>=</span> <span class='ident'>ONCE_INIT</span>;
+
+ <span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>free_data_box</span>(<span class='ident'>_parent</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>_ad</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_EX_DATA</span>, <span class='ident'>_idx</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>_argl</span>: <span class='ident'>c_long</span>, <span class='ident'>_argp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>ptr</span>.<span class='ident'>is_null</span>() {
+ <span class='kw'>let</span> _: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>ptr</span>) };
+ }
+ }
+
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>INIT</span>.<span class='ident'>call_once</span>(<span class='op'>||</span> {
+ <span class='kw'>let</span> <span class='ident'>f</span>: <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_EX_free</span> <span class='op'>=</span> <span class='ident'>free_data_box</span>;
+ <span class='kw'>let</span> <span class='ident'>idx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_new_index</span>(<span class='number'>0</span>, <span class='ident'>ptr</span>::<span class='ident'>null</span>(), <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>None</span>, <span class='prelude-val'>Some</span>(<span class='ident'>f</span>));
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>idx</span> <span class='op'>&gt;=</span> <span class='number'>0</span>);
+ <span class='ident'>NPN_PROTOS_IDX</span> <span class='op'>=</span> <span class='ident'>idx</span>;
+ });
+ <span class='ident'>NPN_PROTOS_IDX</span>
+ }
+}
+
+<span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>raw_verify</span>(<span class='ident'>preverify_ok</span>: <span class='ident'>c_int</span>, <span class='ident'>x509_ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>idx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_ex_data_X509_STORE_CTX_idx</span>();
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX_get_ex_data</span>(<span class='ident'>x509_ctx</span>, <span class='ident'>idx</span>);
+ <span class='kw'>let</span> <span class='ident'>ssl_ctx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_SSL_CTX</span>(<span class='ident'>ssl</span>);
+ <span class='kw'>let</span> <span class='ident'>verify</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ssl_ctx</span>, <span class='ident'>VERIFY_IDX</span>);
+ <span class='kw'>let</span> <span class='ident'>verify</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>VerifyCallback</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>verify</span>);
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>X509StoreContext</span>::<span class='ident'>new</span>(<span class='ident'>x509_ctx</span>);
+
+ <span class='kw'>match</span> <span class='ident'>verify</span> {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>preverify_ok</span>,
+ <span class='prelude-val'>Some</span>(<span class='ident'>verify</span>) <span class='op'>=&gt;</span> <span class='ident'>verify</span>(<span class='ident'>preverify_ok</span> <span class='op'>!=</span> <span class='number'>0</span>, <span class='kw-2'>&amp;</span><span class='ident'>ctx</span>) <span class='kw'>as</span> <span class='ident'>c_int</span>
+ }
+ }
+}
+
+<span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>raw_verify_with_data</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>preverify_ok</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>x509_ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>
+ <span class='kw'>where</span> <span class='ident'>T</span>: <span class='ident'>Any</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>idx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_ex_data_X509_STORE_CTX_idx</span>();
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX_get_ex_data</span>(<span class='ident'>x509_ctx</span>, <span class='ident'>idx</span>);
+ <span class='kw'>let</span> <span class='ident'>ssl_ctx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_SSL_CTX</span>(<span class='ident'>ssl</span>);
+
+ <span class='kw'>let</span> <span class='ident'>verify</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ssl_ctx</span>, <span class='ident'>VERIFY_IDX</span>);
+ <span class='kw'>let</span> <span class='ident'>verify</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>VerifyCallbackData</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>verify</span>);
+
+ <span class='kw'>let</span> <span class='ident'>data</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ssl_ctx</span>, <span class='ident'>get_verify_data_idx</span>::<span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>());
+ <span class='kw'>let</span> <span class='ident'>data</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>data</span>);
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>X509StoreContext</span>::<span class='ident'>new</span>(<span class='ident'>x509_ctx</span>);
+
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>verify</span> {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>preverify_ok</span>,
+ <span class='prelude-val'>Some</span>(<span class='ident'>verify</span>) <span class='op'>=&gt;</span> <span class='ident'>verify</span>(<span class='ident'>preverify_ok</span> <span class='op'>!=</span> <span class='number'>0</span>, <span class='kw-2'>&amp;</span><span class='ident'>ctx</span>, <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>data</span>) <span class='kw'>as</span> <span class='ident'>c_int</span>
+ };
+
+ <span class='comment'>// Since data might be required on the next verification</span>
+ <span class='comment'>// it is time to forget about it and avoid dropping</span>
+ <span class='comment'>// data will be freed once OpenSSL considers it is time</span>
+ <span class='comment'>// to free all context data</span>
+ <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>data</span>);
+ <span class='ident'>res</span>
+ }
+}
+
+<span class='doccomment'>/// The function is given as the callback to `SSL_CTX_set_next_proto_select_cb`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It chooses the protocol that the client wishes to use, out of the given list of protocols</span>
+<span class='doccomment'>/// supported by the server. It achieves this by delegating to the `SSL_select_next_proto`</span>
+<span class='doccomment'>/// function. The list of protocols supported by the client is found in the extra data of the</span>
+<span class='doccomment'>/// OpenSSL context.</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>raw_next_proto_select_cb</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>SSL</span>,
+ <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>, <span class='ident'>outlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>inbuf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>, <span class='ident'>inlen</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>_arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='comment'>// First, get the list of protocols (that the client should support) saved in the context</span>
+ <span class='comment'>// extra data.</span>
+ <span class='kw'>let</span> <span class='ident'>ssl_ctx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_SSL_CTX</span>(<span class='ident'>ssl</span>);
+ <span class='kw'>let</span> <span class='ident'>protocols</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ssl_ctx</span>, <span class='ident'>get_npn_protos_idx</span>());
+ <span class='kw'>let</span> <span class='ident'>protocols</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>protocols</span>);
+ <span class='comment'>// Prepare the client list parameters to be passed to the OpenSSL function...</span>
+ <span class='kw'>let</span> <span class='ident'>client</span> <span class='op'>=</span> <span class='ident'>protocols</span>.<span class='ident'>as_ptr</span>();
+ <span class='kw'>let</span> <span class='ident'>client_len</span> <span class='op'>=</span> <span class='ident'>protocols</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>;
+ <span class='comment'>// Finally, let OpenSSL find a protocol to be used, by matching the given server and</span>
+ <span class='comment'>// client lists.</span>
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_select_next_proto</span>(<span class='ident'>out</span>, <span class='ident'>outlen</span>, <span class='ident'>inbuf</span>, <span class='ident'>inlen</span>, <span class='ident'>client</span>, <span class='ident'>client_len</span>);
+ }
+
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_TLSEXT_ERR_OK</span>
+}
+
+<span class='doccomment'>/// The function is given as the callback to `SSL_CTX_set_next_protos_advertised_cb`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It causes the parameter `out` to point at a `*const c_uchar` instance that</span>
+<span class='doccomment'>/// represents the list of protocols that the server should advertise as those</span>
+<span class='doccomment'>/// that it supports.</span>
+<span class='doccomment'>/// The list of supported protocols is found in the extra data of the OpenSSL</span>
+<span class='doccomment'>/// context.</span>
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>raw_next_protos_advertise_cb</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>SSL</span>,
+ <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>, <span class='ident'>outlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>_arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='comment'>// First, get the list of (supported) protocols saved in the context extra data.</span>
+ <span class='kw'>let</span> <span class='ident'>ssl_ctx</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_SSL_CTX</span>(<span class='ident'>ssl</span>);
+ <span class='kw'>let</span> <span class='ident'>protocols</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ssl_ctx</span>, <span class='ident'>get_npn_protos_idx</span>());
+ <span class='kw'>if</span> <span class='ident'>protocols</span>.<span class='ident'>is_null</span>() {
+ <span class='op'>*</span><span class='ident'>out</span> <span class='op'>=</span> <span class='string'>b&quot;&quot;</span>.<span class='ident'>as_ptr</span>();
+ <span class='op'>*</span><span class='ident'>outlen</span> <span class='op'>=</span> <span class='number'>0</span>;
+ } <span class='kw'>else</span> {
+ <span class='comment'>// If the pointer is valid, put the pointer to the actual byte array into the</span>
+ <span class='comment'>// output parameter `out`, as well as its length into `outlen`.</span>
+ <span class='kw'>let</span> <span class='ident'>protocols</span>: <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>protocols</span>);
+ <span class='op'>*</span><span class='ident'>out</span> <span class='op'>=</span> <span class='ident'>protocols</span>.<span class='ident'>as_ptr</span>();
+ <span class='op'>*</span><span class='ident'>outlen</span> <span class='op'>=</span> <span class='ident'>protocols</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_uint</span>;
+ }
+ }
+
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_TLSEXT_ERR_OK</span>
+}
+
+<span class='doccomment'>/// The signature of functions that can be used to manually verify certificates</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>VerifyCallback</span> <span class='op'>=</span> <span class='kw'>fn</span>(<span class='ident'>preverify_ok</span>: <span class='ident'>bool</span>,
+ <span class='ident'>x509_ctx</span>: <span class='kw-2'>&amp;</span><span class='ident'>X509StoreContext</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>;
+
+<span class='doccomment'>/// The signature of functions that can be used to manually verify certificates</span>
+<span class='doccomment'>/// when user-data should be carried for all verification process</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>VerifyCallbackData</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='kw'>fn</span>(<span class='ident'>preverify_ok</span>: <span class='ident'>bool</span>,
+ <span class='ident'>x509_ctx</span>: <span class='kw-2'>&amp;</span><span class='ident'>X509StoreContext</span>,
+ <span class='ident'>data</span>: <span class='kw-2'>&amp;</span><span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>;
+
+<span class='comment'>// FIXME: macro may be instead of inlining?</span>
+<span class='attribute'>#[<span class='ident'>inline</span>]</span>
+<span class='kw'>fn</span> <span class='ident'>wrap_ssl_result</span>(<span class='ident'>res</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>res</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+
+<span class='doccomment'>/// An SSL context object</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SslContext</span> {
+ <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX</span>
+}
+
+<span class='kw'>unsafe</span> <span class='kw'>impl</span> <span class='ident'>Send</span> <span class='kw'>for</span> <span class='ident'>SslContext</span> {}
+<span class='kw'>unsafe</span> <span class='kw'>impl</span> <span class='ident'>Sync</span> <span class='kw'>for</span> <span class='ident'>SslContext</span> {}
+
+<span class='comment'>// TODO: add useful info here</span>
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>SslContext</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;SslContext&quot;</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>SslContext</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_free</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>) }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>SslContext</span> {
+ <span class='doccomment'>/// Creates a new SSL context.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>method</span>: <span class='ident'>SslMethod</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslContext</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_new</span>(<span class='ident'>method</span>.<span class='ident'>to_raw</span>()) };
+ <span class='kw'>if</span> <span class='ident'>ctx</span> <span class='op'>==</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>());
+ }
+
+ <span class='kw'>let</span> <span class='ident'>ctx</span> <span class='op'>=</span> <span class='ident'>SslContext</span> { <span class='ident'>ctx</span>: <span class='ident'>ctx</span> };
+
+ <span class='kw'>if</span> <span class='ident'>method</span>.<span class='ident'>is_dtls</span>() {
+ <span class='ident'>ctx</span>.<span class='ident'>set_read_ahead</span>(<span class='number'>1</span>);
+ }
+
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ctx</span>)
+ }
+
+ <span class='doccomment'>/// Configures the certificate verification method for new connections.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_verify</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>mode</span>: <span class='ident'>SslVerifyMode</span>,
+ <span class='ident'>verify</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>VerifyCallback</span><span class='op'>&gt;</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_ex_data</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>VERIFY_IDX</span>,
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>verify</span>));
+ <span class='kw'>let</span> <span class='ident'>f</span>: <span class='kw'>extern</span> <span class='kw'>fn</span>(<span class='ident'>c_int</span>, <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> <span class='op'>=</span>
+ <span class='ident'>raw_verify</span>;
+
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_verify</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>mode</span>.<span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='prelude-val'>Some</span>(<span class='ident'>f</span>));
+ }
+ }
+
+ <span class='doccomment'>/// Configures the certificate verification method for new connections also</span>
+ <span class='doccomment'>/// carrying supplied data.</span>
+ <span class='comment'>// Note: no option because there is no point to set data without providing</span>
+ <span class='comment'>// a function handling it</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_verify_with_data</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>mode</span>: <span class='ident'>SslVerifyMode</span>,
+ <span class='ident'>verify</span>: <span class='ident'>VerifyCallbackData</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>,
+ <span class='ident'>data</span>: <span class='ident'>T</span>)
+ <span class='kw'>where</span> <span class='ident'>T</span>: <span class='ident'>Any</span> <span class='op'>+</span> <span class='lifetime'>&#39;static</span> {
+ <span class='kw'>let</span> <span class='ident'>data</span> <span class='op'>=</span> <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>data</span>);
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_ex_data</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>VERIFY_IDX</span>,
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='prelude-val'>Some</span>(<span class='ident'>verify</span>)));
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_ex_data</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>get_verify_data_idx</span>::<span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(),
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>data</span>));
+ <span class='kw'>let</span> <span class='ident'>f</span>: <span class='kw'>extern</span> <span class='kw'>fn</span>(<span class='ident'>c_int</span>, <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> <span class='op'>=</span>
+ <span class='ident'>raw_verify_with_data</span>::<span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>;
+
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_verify</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>mode</span>.<span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='prelude-val'>Some</span>(<span class='ident'>f</span>));
+ }
+ }
+
+ <span class='doccomment'>/// Sets verification depth</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_verify_depth</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>depth</span>: <span class='ident'>u32</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_verify_depth</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>depth</span> <span class='kw'>as</span> <span class='ident'>c_int</span>);
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_read_ahead</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>m</span>: <span class='ident'>u32</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_read_ahead</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>m</span> <span class='kw'>as</span> <span class='ident'>c_long</span>);
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_snake_case</span>)]</span>
+ <span class='doccomment'>/// Specifies the file that contains trusted CA certificates.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_CA_file</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>file</span>: <span class='ident'>P</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>file</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>file</span>.<span class='ident'>as_ref</span>().<span class='ident'>as_os_str</span>().<span class='ident'>to_str</span>().<span class='ident'>expect</span>(<span class='string'>&quot;invalid utf8&quot;</span>)).<span class='ident'>unwrap</span>();
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_load_verify_locations</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>file</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>ptr</span>::<span class='ident'>null</span>())
+ })
+ }
+
+ <span class='doccomment'>/// Specifies the file that contains certificate</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_certificate_file</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>file</span>: <span class='ident'>P</span>, <span class='ident'>file_type</span>: <span class='ident'>X509FileType</span>)
+ <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>file</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>file</span>.<span class='ident'>as_ref</span>().<span class='ident'>as_os_str</span>().<span class='ident'>to_str</span>().<span class='ident'>expect</span>(<span class='string'>&quot;invalid utf8&quot;</span>)).<span class='ident'>unwrap</span>();
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_use_certificate_file</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>file</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>file_type</span> <span class='kw'>as</span> <span class='ident'>c_int</span>)
+ })
+ }
+
+ <span class='doccomment'>/// Specifies the certificate</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_certificate</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cert</span>: <span class='kw-2'>&amp;</span><span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_use_certificate</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>cert</span>.<span class='ident'>get_handle</span>())
+ })
+ }
+
+ <span class='doccomment'>/// Adds a certificate to the certificate chain presented together with the</span>
+ <span class='doccomment'>/// certificate specified using set_certificate()</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>add_extra_chain_cert</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cert</span>: <span class='kw-2'>&amp;</span><span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_add_extra_chain_cert</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>cert</span>.<span class='ident'>get_handle</span>()) <span class='kw'>as</span> <span class='ident'>c_int</span>
+ })
+ }
+
+ <span class='doccomment'>/// Specifies the file that contains private key</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_private_key_file</span><span class='op'>&lt;</span><span class='ident'>P</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>Path</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>file</span>: <span class='ident'>P</span>,
+ <span class='ident'>file_type</span>: <span class='ident'>X509FileType</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>file</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>file</span>.<span class='ident'>as_ref</span>().<span class='ident'>as_os_str</span>().<span class='ident'>to_str</span>().<span class='ident'>expect</span>(<span class='string'>&quot;invalid utf8&quot;</span>)).<span class='ident'>unwrap</span>();
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_use_PrivateKey_file</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>file</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>file_type</span> <span class='kw'>as</span> <span class='ident'>c_int</span>)
+ })
+ }
+
+ <span class='doccomment'>/// Specifies the private key</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_private_key</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span><span class='ident'>PKey</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_use_PrivateKey</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>key</span>.<span class='ident'>get_handle</span>())
+ })
+ }
+
+ <span class='doccomment'>/// Check consistency of private key and certificate</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>check_private_key</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_check_private_key</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>)
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_cipher_list</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>cipher_list</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(),<span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>wrap_ssl_result</span>(
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>cipher_list</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>cipher_list</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_cipher_list</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>cipher_list</span>.<span class='ident'>as_ptr</span>())
+ })
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_options</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>option</span>: <span class='ident'>SslContextOptions</span>) <span class='op'>-&gt;</span> <span class='ident'>SslContextOptions</span> {
+ <span class='kw'>let</span> <span class='ident'>raw_bits</span> <span class='op'>=</span> <span class='ident'>option</span>.<span class='ident'>bits</span>();
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_options</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>raw_bits</span>)
+ };
+ <span class='ident'>SslContextOptions</span>::<span class='ident'>from_bits</span>(<span class='ident'>ret</span>).<span class='ident'>unwrap</span>()
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_options</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SslContextOptions</span> {
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_get_options</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>)
+ };
+ <span class='ident'>SslContextOptions</span>::<span class='ident'>from_bits</span>(<span class='ident'>ret</span>).<span class='ident'>unwrap</span>()
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>clear_options</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>option</span>: <span class='ident'>SslContextOptions</span>) <span class='op'>-&gt;</span> <span class='ident'>SslContextOptions</span> {
+ <span class='kw'>let</span> <span class='ident'>raw_bits</span> <span class='op'>=</span> <span class='ident'>option</span>.<span class='ident'>bits</span>();
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_clear_options</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>raw_bits</span>)
+ };
+ <span class='ident'>SslContextOptions</span>::<span class='ident'>from_bits</span>(<span class='ident'>ret</span>).<span class='ident'>unwrap</span>()
+ }
+
+ <span class='doccomment'>/// Set the protocols to be used during Next Protocol Negotiation (the protocols</span>
+ <span class='doccomment'>/// supported by the application).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method needs the `npn` feature.</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_npn_protocols</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>protocols</span>: <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]]) {
+ <span class='comment'>// Firstly, convert the list of protocols to a byte-array that can be passed to OpenSSL</span>
+ <span class='comment'>// APIs -- a list of length-prefixed strings.</span>
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>npn_protocols</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> <span class='ident'>protocol</span> <span class='kw'>in</span> <span class='ident'>protocols</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>protocol</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>u8</span>;
+ <span class='ident'>npn_protocols</span>.<span class='ident'>push</span>(<span class='ident'>len</span>);
+ <span class='comment'>// If the length is greater than the max `u8`, this truncates the protocol name.</span>
+ <span class='ident'>npn_protocols</span>.<span class='ident'>extend</span>(<span class='ident'>protocol</span>[..<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>to_vec</span>());
+ }
+ <span class='kw'>let</span> <span class='ident'>protocols</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>npn_protocols</span>);
+
+ <span class='kw'>unsafe</span> {
+ <span class='comment'>// Attach the protocol list to the OpenSSL context structure,</span>
+ <span class='comment'>// so that we can refer to it within the callback.</span>
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_ex_data</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>get_npn_protos_idx</span>(),
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>protocols</span>));
+ <span class='comment'>// Now register the callback that performs the default protocol</span>
+ <span class='comment'>// matching based on the client-supported list of protocols that</span>
+ <span class='comment'>// has been saved.</span>
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_next_proto_select_cb</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>raw_next_proto_select_cb</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+ <span class='comment'>// Also register the callback to advertise these protocols, if a server socket is</span>
+ <span class='comment'>// created with the context.</span>
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_CTX_set_next_protos_advertised_cb</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>, <span class='ident'>raw_next_protos_advertise_cb</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='kw'>struct</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ssl</span><span class='op'>&gt;</span> {
+ <span class='ident'>ssl</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;ssl</span> <span class='ident'>Ssl</span>,
+ <span class='ident'>bio</span>: <span class='ident'>MemBio</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ssl</span><span class='op'>&gt;</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ssl</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>MemBio</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>MemBio</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>bio</span>
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ssl</span><span class='op'>&gt;</span> <span class='ident'>DerefMut</span> <span class='kw'>for</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ssl</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>deref_mut</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>MemBio</span> {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>bio</span>
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Ssl</span> {
+ <span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>SSL</span>
+}
+
+<span class='kw'>unsafe</span> <span class='kw'>impl</span> <span class='ident'>Send</span> <span class='kw'>for</span> <span class='ident'>Ssl</span> {}
+<span class='kw'>unsafe</span> <span class='kw'>impl</span> <span class='ident'>Sync</span> <span class='kw'>for</span> <span class='ident'>Ssl</span> {}
+
+<span class='comment'>// TODO: put useful information here</span>
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>Ssl</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;Ssl&quot;</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>Ssl</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_free</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>) }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Ssl</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ctx</span>: <span class='kw-2'>&amp;</span><span class='ident'>SslContext</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Ssl</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_new</span>(<span class='ident'>ctx</span>.<span class='ident'>ctx</span>) };
+ <span class='kw'>if</span> <span class='ident'>ssl</span> <span class='op'>==</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>());
+ }
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='ident'>Ssl</span> { <span class='ident'>ssl</span>: <span class='ident'>ssl</span> };
+
+ <span class='kw'>let</span> <span class='ident'>rbio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='kw'>let</span> <span class='ident'>wbio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_set_bio</span>(<span class='ident'>ssl</span>.<span class='ident'>ssl</span>, <span class='ident'>rbio</span>.<span class='ident'>unwrap</span>(), <span class='ident'>wbio</span>.<span class='ident'>unwrap</span>()) }
+ <span class='prelude-val'>Ok</span>(<span class='ident'>ssl</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>get_rbio</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> { <span class='self'>self</span>.<span class='ident'>wrap_bio</span>(<span class='ident'>ffi</span>::<span class='ident'>SSL_get_rbio</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>)) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>get_wbio</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> { <span class='self'>self</span>.<span class='ident'>wrap_bio</span>(<span class='ident'>ffi</span>::<span class='ident'>SSL_get_wbio</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>)) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>wrap_bio</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>, <span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>BIO</span>) <span class='op'>-&gt;</span> <span class='ident'>MemBioRef</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>bio</span> <span class='op'>!=</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+ <span class='ident'>MemBioRef</span> {
+ <span class='ident'>ssl</span>: <span class='self'>self</span>,
+ <span class='ident'>bio</span>: <span class='ident'>MemBio</span>::<span class='ident'>borrowed</span>(<span class='ident'>bio</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>connect</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_connect</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>accept</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_accept</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>cmp</span>::<span class='ident'>min</span>(<span class='ident'>c_int</span>::<span class='ident'>max_value</span>() <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>buf</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>c_int</span>;
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_read</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>, <span class='ident'>buf</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>cmp</span>::<span class='ident'>min</span>(<span class='ident'>c_int</span>::<span class='ident'>max_value</span>() <span class='kw'>as</span> <span class='ident'>usize</span>, <span class='ident'>buf</span>.<span class='ident'>len</span>()) <span class='kw'>as</span> <span class='ident'>c_int</span>;
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_write</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>, <span class='ident'>buf</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>) }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>get_error</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>ret</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>LibSslError</span> {
+ <span class='kw'>let</span> <span class='ident'>err</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_get_error</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>, <span class='ident'>ret</span>) };
+ <span class='kw'>match</span> <span class='ident'>LibSslError</span>::<span class='ident'>from_i32</span>(<span class='ident'>err</span> <span class='kw'>as</span> <span class='ident'>i32</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='ident'>err</span>,
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>()
+ }
+ }
+
+ <span class='doccomment'>/// Set the host name to be used with SNI (Server Name Indication).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_hostname</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>hostname</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='comment'>// This is defined as a macro:</span>
+ <span class='comment'>// #define SSL_set_tlsext_host_name(s,name) \</span>
+ <span class='comment'>// SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name)</span>
+
+ <span class='kw'>let</span> <span class='ident'>hostname</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>hostname</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_ctrl</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>, <span class='ident'>ffi</span>::<span class='ident'>SSL_CTRL_SET_TLSEXT_HOSTNAME</span>,
+ <span class='ident'>ffi</span>::<span class='ident'>TLSEXT_NAMETYPE_host_name</span>,
+ <span class='ident'>hostname</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>)
+ };
+
+ <span class='comment'>// For this case, 0 indicates failure.</span>
+ <span class='kw'>if</span> <span class='ident'>ret</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Ok</span>(())
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_peer_certificate</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>X509</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>ptr</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>SSL_get_peer_certificate</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>);
+ <span class='kw'>if</span> <span class='ident'>ptr</span>.<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>X509</span>::<span class='ident'>new</span>(<span class='ident'>ptr</span>, <span class='boolval'>true</span>))
+ }
+ }
+ }
+
+ <span class='doccomment'>/// Returns the protocol selected by performing Next Protocol Negotiation, if any.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The protocol&#39;s name is returned is an opaque sequence of bytes. It is up to the client</span>
+ <span class='doccomment'>/// to interpret it.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method needs the `npn` feature.</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_selected_npn_protocol</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]<span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>data</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span> <span class='op'>=</span> <span class='ident'>ptr</span>::<span class='ident'>null</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>len</span>: <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='comment'>// Get the negotiated protocol from the SSL instance.</span>
+ <span class='comment'>// `data` will point at a `c_uchar` array; `len` will contain the length of this array.</span>
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_get0_next_proto_negotiated</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>data</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>len</span>);
+
+ <span class='kw'>if</span> <span class='ident'>data</span>.<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>slice</span>::<span class='ident'>from_raw_parts</span>(<span class='ident'>data</span>, <span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>))
+ }
+ }
+ }
+
+ <span class='doccomment'>/// pending() takes into account only bytes from the TLS/SSL record that is currently being processed (if any).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pending</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>SSL_pending</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>) <span class='kw'>as</span> <span class='ident'>usize</span>
+ }
+ }
+}
+
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>make_LibSslError</span> {
+ ($(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>variant</span>:<span class='ident'>ident</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>:<span class='ident'>ident</span>),<span class='op'>+</span>) <span class='op'>=&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>i32</span>)]</span>
+ <span class='kw'>enum</span> <span class='ident'>LibSslError</span> {
+ $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>variant</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span>),<span class='op'>+</span>
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>LibSslError</span> {
+ <span class='kw'>fn</span> <span class='ident'>from_i32</span>(<span class='ident'>val</span>: <span class='ident'>i32</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>LibSslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>val</span> {
+ $(<span class='ident'>ffi</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>value</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>LibSslError</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>variant</span>),)<span class='op'>+</span>
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+ }
+ }
+}
+
+<span class='macro'>make_LibSslError</span><span class='macro'>!</span> {
+ <span class='ident'>ErrorNone</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_NONE</span>,
+ <span class='ident'>ErrorSsl</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_SSL</span>,
+ <span class='ident'>ErrorWantRead</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_WANT_READ</span>,
+ <span class='ident'>ErrorWantWrite</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_WANT_WRITE</span>,
+ <span class='ident'>ErrorWantX509Lookup</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_WANT_X509_LOOKUP</span>,
+ <span class='ident'>ErrorSyscall</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_SYSCALL</span>,
+ <span class='ident'>ErrorZeroReturn</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_ZERO_RETURN</span>,
+ <span class='ident'>ErrorWantConnect</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_WANT_CONNECT</span>,
+ <span class='ident'>ErrorWantAccept</span> <span class='op'>=</span> <span class='ident'>SSL_ERROR_WANT_ACCEPT</span>
+}
+
+<span class='doccomment'>/// A stream wrapper which handles SSL encryption for an underlying stream.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='ident'>stream</span>: <span class='ident'>S</span>,
+ <span class='ident'>ssl</span>: <span class='ident'>Arc</span><span class='op'>&lt;</span><span class='ident'>Ssl</span><span class='op'>&gt;</span>,
+ <span class='ident'>buf</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>net</span>::<span class='ident'>TcpStream</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Create a new independently owned handle to the underlying socket.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>try_clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>net</span>::<span class='ident'>TcpStream</span><span class='op'>&gt;&gt;</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>SslStream</span> {
+ <span class='ident'>stream</span>: <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>stream</span>.<span class='ident'>try_clone</span>()),
+ <span class='ident'>ssl</span>: <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>buf</span>: <span class='self'>self</span>.<span class='ident'>buf</span>.<span class='ident'>clone</span>(),
+ })
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>fmt</span>::<span class='ident'>Debug</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>fmt</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>fmt</span>, <span class='string'>&quot;SslStream {{ stream: {:?}, ssl: {:?} }}&quot;</span>, <span class='self'>self</span>.<span class='ident'>stream</span>, <span class='self'>self</span>.<span class='ident'>ssl</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span><span class='op'>&gt;</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>new_base</span>(<span class='ident'>ssl</span>:<span class='ident'>Ssl</span>, <span class='ident'>stream</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='ident'>SslStream</span> {
+ <span class='ident'>stream</span>: <span class='ident'>stream</span>,
+ <span class='ident'>ssl</span>: <span class='ident'>Arc</span>::<span class='ident'>new</span>(<span class='ident'>ssl</span>),
+ <span class='comment'>// Maximum TLS record size is 16k</span>
+ <span class='comment'>// We&#39;re just using this as a buffer, so there&#39;s no reason to pay</span>
+ <span class='comment'>// to memset it</span>
+ <span class='ident'>buf</span>: {
+ <span class='kw'>const</span> <span class='ident'>CAP</span>: <span class='ident'>usize</span> <span class='op'>=</span> <span class='number'>16</span> <span class='op'>*</span> <span class='number'>1024</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>v</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>CAP</span>);
+ <span class='kw'>unsafe</span> { <span class='ident'>v</span>.<span class='ident'>set_len</span>(<span class='ident'>CAP</span>); }
+ <span class='ident'>v</span>
+ }
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_server_from</span>(<span class='ident'>ssl</span>: <span class='ident'>Ssl</span>, <span class='ident'>stream</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='ident'>SslStream</span>::<span class='ident'>new_base</span>(<span class='ident'>ssl</span>, <span class='ident'>stream</span>);
+ <span class='ident'>ssl</span>.<span class='ident'>in_retry_wrapper</span>(<span class='op'>|</span><span class='ident'>ssl</span><span class='op'>|</span> { <span class='ident'>ssl</span>.<span class='ident'>accept</span>() }).<span class='ident'>and</span>(<span class='prelude-val'>Ok</span>(<span class='ident'>ssl</span>))
+ }
+
+ <span class='doccomment'>/// Attempts to create a new SSL stream from a given `Ssl` instance.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_from</span>(<span class='ident'>ssl</span>: <span class='ident'>Ssl</span>, <span class='ident'>stream</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='ident'>SslStream</span>::<span class='ident'>new_base</span>(<span class='ident'>ssl</span>, <span class='ident'>stream</span>);
+ <span class='ident'>ssl</span>.<span class='ident'>in_retry_wrapper</span>(<span class='op'>|</span><span class='ident'>ssl</span><span class='op'>|</span> { <span class='ident'>ssl</span>.<span class='ident'>connect</span>() }).<span class='ident'>and</span>(<span class='prelude-val'>Ok</span>(<span class='ident'>ssl</span>))
+ }
+
+ <span class='doccomment'>/// Creates a new SSL stream</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ctx</span>: <span class='kw-2'>&amp;</span><span class='ident'>SslContext</span>, <span class='ident'>stream</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>Ssl</span>::<span class='ident'>new</span>(<span class='ident'>ctx</span>));
+ <span class='ident'>SslStream</span>::<span class='ident'>new_from</span>(<span class='ident'>ssl</span>, <span class='ident'>stream</span>)
+ }
+
+ <span class='doccomment'>/// Creates a new SSL server stream</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_server</span>(<span class='ident'>ctx</span>: <span class='kw-2'>&amp;</span><span class='ident'>SslContext</span>, <span class='ident'>stream</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ssl</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>Ssl</span>::<span class='ident'>new</span>(<span class='ident'>ctx</span>));
+ <span class='ident'>SslStream</span>::<span class='ident'>new_server_from</span>(<span class='ident'>ssl</span>, <span class='ident'>stream</span>)
+ }
+
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_inner</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>S</span> {
+ <span class='self'>self</span>.<span class='ident'>get_mut</span>()
+ }
+
+ <span class='doccomment'>/// Returns a reference to the underlying stream.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_ref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>S</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>stream</span>
+ }
+
+ <span class='doccomment'>/// Return the certificate of the peer</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_peer_certificate</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>X509</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_peer_certificate</span>()
+ }
+
+ <span class='doccomment'>/// Returns a mutable reference to the underlying stream.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ## Warning</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// It is inadvisable to read from or write to the underlying stream as it</span>
+ <span class='doccomment'>/// will most likely desynchronize the SSL session.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_mut</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>S</span> {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>stream</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>in_retry_wrapper</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>blk</span>: <span class='ident'>F</span>)
+ <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>c_int</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>FnMut</span>(<span class='kw-2'>&amp;</span><span class='ident'>Ssl</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span> {
+ <span class='kw'>loop</span> {
+ <span class='kw'>let</span> <span class='ident'>ret</span> <span class='op'>=</span> <span class='ident'>blk</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>ssl</span>);
+ <span class='kw'>if</span> <span class='ident'>ret</span> <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>ret</span>);
+ }
+
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_error</span>(<span class='ident'>ret</span>);
+ <span class='kw'>match</span> <span class='ident'>e</span> {
+ <span class='ident'>LibSslError</span>::<span class='ident'>ErrorWantRead</span> <span class='op'>=&gt;</span> {
+ <span class='macro'>try_ssl_stream</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>flush</span>());
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='macro'>try_ssl_stream</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>stream</span>.<span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>buf</span>[..]));
+ <span class='kw'>if</span> <span class='ident'>len</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_rbio</span>().<span class='ident'>set_eof</span>(<span class='boolval'>true</span>);
+ } <span class='kw'>else</span> {
+ <span class='macro'>try_ssl_stream</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_rbio</span>().<span class='ident'>write_all</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>buf</span>[..<span class='ident'>len</span>]));
+ }
+ }
+ <span class='ident'>LibSslError</span>::<span class='ident'>ErrorWantWrite</span> <span class='op'>=&gt;</span> { <span class='macro'>try_ssl_stream</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>flush</span>()) }
+ <span class='ident'>LibSslError</span>::<span class='ident'>ErrorZeroReturn</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>SslSessionClosed</span>),
+ <span class='ident'>LibSslError</span>::<span class='ident'>ErrorSsl</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>SslError</span>::<span class='ident'>get</span>()),
+ <span class='ident'>LibSslError</span>::<span class='ident'>ErrorSyscall</span> <span class='kw'>if</span> <span class='ident'>ret</span> <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='number'>0</span>),
+ <span class='ident'>err</span> <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;unexpected error {:?} with ret {}&quot;</span>, <span class='ident'>err</span>, <span class='ident'>ret</span>),
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>write_through</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_wbio</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>stream</span>).<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> ())
+ }
+
+ <span class='doccomment'>/// Get the compression currently in use. The result will be</span>
+ <span class='doccomment'>/// either None, indicating no compression is in use, or a string</span>
+ <span class='doccomment'>/// with the compression name.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_compression</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ptr</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_get_current_compression</span>(<span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>ssl</span>) };
+ <span class='kw'>if</span> <span class='ident'>ptr</span> <span class='op'>==</span> <span class='ident'>ptr</span>::<span class='ident'>null</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+
+ <span class='kw'>let</span> <span class='ident'>meth</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>SSL_COMP_get_name</span>(<span class='ident'>ptr</span>) };
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>meth</span>).<span class='ident'>to_bytes</span>().<span class='ident'>to_vec</span>()).<span class='ident'>unwrap</span>()
+ };
+
+ <span class='prelude-val'>Some</span>(<span class='ident'>s</span>)
+ }
+
+ <span class='doccomment'>/// Returns the protocol selected by performing Next Protocol Negotiation, if any.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The protocol&#39;s name is returned is an opaque sequence of bytes. It is up to the client</span>
+ <span class='doccomment'>/// to interpret it.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method needs the `npn` feature.</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_selected_npn_protocol</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]<span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>get_selected_npn_protocol</span>()
+ }
+
+ <span class='doccomment'>/// pending() takes into account only bytes from the TLS/SSL record that is currently being processed (if any).</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pending</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>ssl</span>.<span class='ident'>pending</span>()
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span><span class='op'>&gt;</span> <span class='ident'>Read</span> <span class='kw'>for</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>in_retry_wrapper</span>(<span class='op'>|</span><span class='ident'>ssl</span><span class='op'>|</span> { <span class='ident'>ssl</span>.<span class='ident'>read</span>(<span class='ident'>buf</span>) }) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>len</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Ok</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>),
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslSessionClosed</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Ok</span>(<span class='number'>0</span>),
+ <span class='prelude-val'>Err</span>(<span class='ident'>StreamError</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='ident'>e</span>),
+ <span class='prelude-val'>Err</span>(<span class='ident'>e</span> <span class='kw-2'>@</span> <span class='ident'>OpenSslErrors</span>(_)) <span class='op'>=&gt;</span> {
+ <span class='prelude-val'>Err</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>Other</span>, <span class='ident'>e</span>))
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span><span class='op'>&gt;</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>count</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>in_retry_wrapper</span>(<span class='op'>|</span><span class='ident'>ssl</span><span class='op'>|</span> <span class='ident'>ssl</span>.<span class='ident'>write</span>(<span class='ident'>buf</span>)) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>len</span>) <span class='op'>=&gt;</span> <span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>,
+ <span class='prelude-val'>Err</span>(<span class='ident'>SslSessionClosed</span>) <span class='op'>=&gt;</span> <span class='number'>0</span>,
+ <span class='prelude-val'>Err</span>(<span class='ident'>StreamError</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>e</span>),
+ <span class='prelude-val'>Err</span>(<span class='ident'>e</span> <span class='kw-2'>@</span> <span class='ident'>OpenSslErrors</span>(_)) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>io</span>::<span class='ident'>Error</span>::<span class='ident'>new</span>(<span class='ident'>io</span>::<span class='ident'>ErrorKind</span>::<span class='ident'>Other</span>, <span class='ident'>e</span>)),
+ };
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>write_through</span>());
+ <span class='prelude-val'>Ok</span>(<span class='ident'>count</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>write_through</span>());
+ <span class='self'>self</span>.<span class='ident'>stream</span>.<span class='ident'>flush</span>()
+ }
+}
+
+<span class='doccomment'>/// A utility type to help in cases where the use of SSL is decided at runtime.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>MaybeSslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span> {
+ <span class='doccomment'>/// A connection using SSL</span>
+ <span class='ident'>Ssl</span>(<span class='ident'>SslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span>),
+ <span class='doccomment'>/// A connection not using SSL</span>
+ <span class='ident'>Normal</span>(<span class='ident'>S</span>),
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='ident'>Read</span> <span class='kw'>for</span> <span class='ident'>MaybeSslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span> {
+ <span class='kw'>fn</span> <span class='ident'>read</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>read</span>(<span class='ident'>buf</span>),
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Normal</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>read</span>(<span class='ident'>buf</span>),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='ident'>Write</span> <span class='kw'>for</span> <span class='ident'>MaybeSslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span> {
+ <span class='kw'>fn</span> <span class='ident'>write</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>buf</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>u8</span>]) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>write</span>(<span class='ident'>buf</span>),
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Normal</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>write</span>(<span class='ident'>buf</span>),
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>flush</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>io</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>flush</span>(),
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Normal</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>flush</span>(),
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='ident'>MaybeSslStream</span><span class='op'>&lt;</span><span class='ident'>S</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>S</span>: <span class='ident'>Read</span><span class='op'>+</span><span class='ident'>Write</span> {
+ <span class='doccomment'>/// Returns a reference to the underlying stream.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_ref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>S</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>get_ref</span>(),
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Normal</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns a mutable reference to the underlying stream.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ## Warning</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// It is inadvisable to read from or write to the underlying stream.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_mut</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>S</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Ssl</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>get_mut</span>(),
+ <span class='ident'>MaybeSslStream</span>::<span class='ident'>Normal</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span> <span class='ident'>s</span>,
+ }
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl/x509/mod.rs.html b/src/openssl/x509/mod.rs.html
new file mode 100644
index 0000000..ea45241
--- /dev/null
+++ b/src/openssl/x509/mod.rs.html
@@ -0,0 +1,1461 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-0.6.3/src/x509/mod.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>mod.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+<span id="616">616</span>
+<span id="617">617</span>
+<span id="618">618</span>
+<span id="619">619</span>
+<span id="620">620</span>
+<span id="621">621</span>
+<span id="622">622</span>
+<span id="623">623</span>
+<span id="624">624</span>
+<span id="625">625</span>
+<span id="626">626</span>
+<span id="627">627</span>
+<span id="628">628</span>
+<span id="629">629</span>
+<span id="630">630</span>
+<span id="631">631</span>
+<span id="632">632</span>
+<span id="633">633</span>
+<span id="634">634</span>
+<span id="635">635</span>
+<span id="636">636</span>
+<span id="637">637</span>
+<span id="638">638</span>
+<span id="639">639</span>
+<span id="640">640</span>
+<span id="641">641</span>
+<span id="642">642</span>
+<span id="643">643</span>
+<span id="644">644</span>
+<span id="645">645</span>
+<span id="646">646</span>
+<span id="647">647</span>
+<span id="648">648</span>
+<span id="649">649</span>
+<span id="650">650</span>
+<span id="651">651</span>
+<span id="652">652</span>
+<span id="653">653</span>
+<span id="654">654</span>
+<span id="655">655</span>
+<span id="656">656</span>
+<span id="657">657</span>
+<span id="658">658</span>
+<span id="659">659</span>
+<span id="660">660</span>
+<span id="661">661</span>
+<span id="662">662</span>
+<span id="663">663</span>
+<span id="664">664</span>
+<span id="665">665</span>
+<span id="666">666</span>
+<span id="667">667</span>
+<span id="668">668</span>
+<span id="669">669</span>
+<span id="670">670</span>
+<span id="671">671</span>
+<span id="672">672</span>
+<span id="673">673</span>
+<span id="674">674</span>
+<span id="675">675</span>
+<span id="676">676</span>
+<span id="677">677</span>
+<span id="678">678</span>
+<span id="679">679</span>
+<span id="680">680</span>
+<span id="681">681</span>
+<span id="682">682</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_char</span>, <span class='ident'>c_int</span>, <span class='ident'>c_long</span>, <span class='ident'>c_ulong</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_void</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>io</span>::<span class='ident'>prelude</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::<span class='ident'>Ordering</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::{<span class='ident'>CString</span>, <span class='ident'>CStr</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>repeat</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>;
+
+<span class='kw'>use</span> <span class='ident'>asn1</span>::{<span class='ident'>Asn1Time</span>};
+<span class='kw'>use</span> <span class='ident'>bio</span>::{<span class='ident'>MemBio</span>};
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>;
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>hash</span>::<span class='ident'>Type</span> <span class='kw'>as</span> <span class='ident'>HashType</span>;
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>pkey</span>::{<span class='ident'>PKey</span>,<span class='ident'>Parts</span>};
+<span class='kw'>use</span> <span class='ident'>crypto</span>::<span class='ident'>rand</span>::<span class='ident'>rand_bytes</span>;
+<span class='kw'>use</span> <span class='ident'>ffi</span>;
+<span class='kw'>use</span> <span class='ident'>ssl</span>::<span class='ident'>error</span>::{<span class='ident'>SslError</span>, <span class='ident'>StreamError</span>};
+<span class='kw'>use</span> <span class='ident'>nid</span>;
+
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span>;
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SslString</span> {
+ <span class='ident'>s</span> : <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;s</span><span class='op'>&gt;</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>SslString</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>CRYPTO_free</span>(<span class='self'>self</span>.<span class='ident'>s</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>); }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>SslString</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>str</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>s</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>SslString</span> {
+ <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>SslString</span> {
+ <span class='ident'>SslString</span> {
+ <span class='ident'>s</span>: <span class='ident'>str</span>::<span class='ident'>from_utf8</span>(<span class='ident'>CStr</span>::<span class='ident'>from_ptr</span>(<span class='ident'>buf</span>).<span class='ident'>to_bytes</span>()).<span class='ident'>unwrap</span>()
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>SslString</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='ident'>fmt</span>::<span class='ident'>Display</span>::<span class='ident'>fmt</span>(<span class='self'>self</span>.<span class='ident'>s</span>, <span class='ident'>f</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>SslString</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='ident'>fmt</span>::<span class='ident'>Debug</span>::<span class='ident'>fmt</span>(<span class='self'>self</span>.<span class='ident'>s</span>, <span class='ident'>f</span>)
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>i32</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>X509FileType</span> {
+ <span class='ident'>PEM</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_FILETYPE_PEM</span>,
+ <span class='ident'>ASN1</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_FILETYPE_ASN1</span>,
+ <span class='ident'>Default</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_FILETYPE_DEFAULT</span>
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>missing_copy_implementations</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509StoreContext</span> {
+ <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>X509StoreContext</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>X509StoreContext</span> {
+ <span class='ident'>X509StoreContext</span> {
+ <span class='ident'>ctx</span>: <span class='ident'>ctx</span>
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_error</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>X509ValidationError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>err</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX_get_error</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>) };
+ <span class='ident'>X509ValidationError</span>::<span class='ident'>from_raw</span>(<span class='ident'>err</span>)
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_current_cert</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>ptr</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_STORE_CTX_get_current_cert</span>(<span class='self'>self</span>.<span class='ident'>ctx</span>) };
+
+ <span class='kw'>if</span> <span class='ident'>ptr</span>.<span class='ident'>is_null</span>() {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>X509</span> { <span class='ident'>ctx</span>: <span class='prelude-val'>Some</span>(<span class='self'>self</span>), <span class='ident'>handle</span>: <span class='ident'>ptr</span>, <span class='ident'>owned</span>: <span class='boolval'>false</span> })
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>trait</span> <span class='ident'>AsStr</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>as_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>str</span>;
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>KeyUsage</span> {
+ <span class='ident'>DigitalSignature</span>,
+ <span class='ident'>NonRepudiation</span>,
+ <span class='ident'>KeyEncipherment</span>,
+ <span class='ident'>DataEncipherment</span>,
+ <span class='ident'>KeyAgreement</span>,
+ <span class='ident'>KeyCertSign</span>,
+ <span class='ident'>CRLSign</span>,
+ <span class='ident'>EncipherOnly</span>,
+ <span class='ident'>DecipherOnly</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>AsStr</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>KeyUsage</span> {
+ <span class='kw'>fn</span> <span class='ident'>as_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> {
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>DigitalSignature</span> <span class='op'>=&gt;</span> <span class='string'>&quot;digitalSignature&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>NonRepudiation</span> <span class='op'>=&gt;</span> <span class='string'>&quot;nonRepudiation&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>KeyEncipherment</span> <span class='op'>=&gt;</span> <span class='string'>&quot;keyEncipherment&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>DataEncipherment</span> <span class='op'>=&gt;</span> <span class='string'>&quot;dataEncipherment&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>KeyAgreement</span> <span class='op'>=&gt;</span> <span class='string'>&quot;keyAgreement&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>KeyCertSign</span> <span class='op'>=&gt;</span> <span class='string'>&quot;keyCertSign&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>CRLSign</span> <span class='op'>=&gt;</span> <span class='string'>&quot;cRLSign&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>EncipherOnly</span> <span class='op'>=&gt;</span> <span class='string'>&quot;encipherOnly&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>KeyUsage</span>::<span class='ident'>DecipherOnly</span> <span class='op'>=&gt;</span> <span class='string'>&quot;decipherOnly&quot;</span>
+ }
+ }
+}
+
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>ExtKeyUsage</span> {
+ <span class='ident'>ServerAuth</span>,
+ <span class='ident'>ClientAuth</span>,
+ <span class='ident'>CodeSigning</span>,
+ <span class='ident'>EmailProtection</span>,
+ <span class='ident'>TimeStamping</span>,
+ <span class='ident'>MsCodeInd</span>,
+ <span class='ident'>MsCodeCom</span>,
+ <span class='ident'>MsCtlSign</span>,
+ <span class='ident'>MsSgc</span>,
+ <span class='ident'>MsEfs</span>,
+ <span class='ident'>NsSgc</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>AsStr</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>ExtKeyUsage</span> {
+ <span class='kw'>fn</span> <span class='ident'>as_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> {
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>ServerAuth</span> <span class='op'>=&gt;</span> <span class='string'>&quot;serverAuth&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>ClientAuth</span> <span class='op'>=&gt;</span> <span class='string'>&quot;clientAuth&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>CodeSigning</span> <span class='op'>=&gt;</span> <span class='string'>&quot;codeSigning&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>EmailProtection</span> <span class='op'>=&gt;</span> <span class='string'>&quot;emailProtection&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>TimeStamping</span> <span class='op'>=&gt;</span> <span class='string'>&quot;timeStamping&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>MsCodeInd</span> <span class='op'>=&gt;</span> <span class='string'>&quot;msCodeInd&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>MsCodeCom</span> <span class='op'>=&gt;</span> <span class='string'>&quot;msCodeCom&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>MsCtlSign</span> <span class='op'>=&gt;</span> <span class='string'>&quot;msCTLSign&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>MsSgc</span> <span class='op'>=&gt;</span> <span class='string'>&quot;msSGC&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>MsEfs</span> <span class='op'>=&gt;</span> <span class='string'>&quot;msEFS&quot;</span>,
+ <span class='kw-2'>&amp;</span><span class='ident'>ExtKeyUsage</span>::<span class='ident'>NsSgc</span> <span class='op'>=&gt;</span><span class='string'>&quot;nsSGC&quot;</span>
+ }
+ }
+}
+
+
+<span class='comment'>// FIXME: a dirty hack as there is no way to</span>
+<span class='comment'>// implement ToString for Vec as both are defined</span>
+<span class='comment'>// in another crate</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>trait</span> <span class='ident'>ToStr</span> {
+ <span class='kw'>fn</span> <span class='ident'>to_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span>;
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span>: <span class='ident'>AsStr</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;&gt;</span> <span class='ident'>ToStr</span> <span class='kw'>for</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>to_str</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='self'>self</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>fold</span>(<span class='ident'>String</span>::<span class='ident'>new</span>(), <span class='op'>|</span><span class='kw-2'>mut</span> <span class='ident'>acc</span>, (<span class='ident'>idx</span>, <span class='ident'>v</span>)<span class='op'>|</span> {
+ <span class='kw'>if</span> <span class='ident'>idx</span> <span class='op'>&gt;</span> <span class='number'>0</span> { <span class='ident'>acc</span>.<span class='ident'>push</span>(<span class='string'>&#39;,&#39;</span>) };
+ <span class='ident'>acc</span>.<span class='ident'>push_str</span>(<span class='ident'>v</span>.<span class='ident'>as_str</span>());
+ <span class='ident'>acc</span>
+ })
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_snake_case</span>)]</span>
+<span class='doccomment'>/// Generator of private key/certificate pairs</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Example</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>/// # #[allow(unstable)]</span>
+<span class='doccomment'>/// # fn main() {</span>
+<span class='doccomment'>/// use std::fs;</span>
+<span class='doccomment'>/// use std::fs::File;</span>
+<span class='doccomment'>/// use std::io::prelude::*;</span>
+<span class='doccomment'>/// use std::path::Path;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// use openssl::crypto::hash::Type;</span>
+<span class='doccomment'>/// use openssl::x509::{KeyUsage, X509Generator};</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// let gen = X509Generator::new()</span>
+<span class='doccomment'>/// .set_bitlength(2048)</span>
+<span class='doccomment'>/// .set_valid_period(365*2)</span>
+<span class='doccomment'>/// .set_CN(&quot;SuperMegaCorp Inc.&quot;)</span>
+<span class='doccomment'>/// .set_sign_hash(Type::SHA256)</span>
+<span class='doccomment'>/// .set_usage(&amp;[KeyUsage::DigitalSignature]);</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// let (cert, pkey) = gen.generate().unwrap();</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// let cert_path = &quot;doc_cert.pem&quot;;</span>
+<span class='doccomment'>/// let mut file = File::create(cert_path).unwrap();</span>
+<span class='doccomment'>/// assert!(cert.write_pem(&amp;mut file).is_ok());</span>
+<span class='doccomment'>/// # let _ = fs::remove_file(cert_path);</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// let pkey_path = &quot;doc_key.pem&quot;;</span>
+<span class='doccomment'>/// let mut file = File::create(pkey_path).unwrap();</span>
+<span class='doccomment'>/// assert!(pkey.write_pem(&amp;mut file).is_ok());</span>
+<span class='doccomment'>/// # let _ = fs::remove_file(pkey_path);</span>
+<span class='doccomment'>/// # }</span>
+<span class='doccomment'>/// ```</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509Generator</span> {
+ <span class='ident'>bits</span>: <span class='ident'>u32</span>,
+ <span class='ident'>days</span>: <span class='ident'>u32</span>,
+ <span class='ident'>CN</span>: <span class='ident'>String</span>,
+ <span class='ident'>key_usage</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>KeyUsage</span><span class='op'>&gt;</span>,
+ <span class='ident'>ext_key_usage</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ExtKeyUsage</span><span class='op'>&gt;</span>,
+ <span class='ident'>hash_type</span>: <span class='ident'>HashType</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>X509Generator</span> {
+ <span class='doccomment'>/// Creates a new generator with the following defaults:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// bit length: 1024</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// validity period: 365 days</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// CN: &quot;rust-openssl&quot;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// hash: SHA1</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='ident'>X509Generator</span> {
+ <span class='ident'>bits</span>: <span class='number'>1024</span>,
+ <span class='ident'>days</span>: <span class='number'>365</span>,
+ <span class='ident'>CN</span>: <span class='string'>&quot;rust-openssl&quot;</span>.<span class='ident'>to_string</span>(),
+ <span class='ident'>key_usage</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>ext_key_usage</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>hash_type</span>: <span class='ident'>HashType</span>::<span class='ident'>SHA1</span>
+ }
+ }
+
+ <span class='doccomment'>/// Sets desired bit length</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_bitlength</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>bits</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>bits</span> <span class='op'>=</span> <span class='ident'>bits</span>;
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Sets certificate validity period in days since today</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_valid_period</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>days</span>: <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>days</span> <span class='op'>=</span> <span class='ident'>days</span>;
+ <span class='self'>self</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>non_snake_case</span>)]</span>
+ <span class='doccomment'>/// Sets Common Name of certificate</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_CN</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>CN</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>CN</span> <span class='op'>=</span> <span class='ident'>CN</span>.<span class='ident'>to_string</span>();
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Sets what for certificate could be used</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_usage</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>purposes</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>KeyUsage</span>]) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>key_usage</span> <span class='op'>=</span> <span class='ident'>purposes</span>.<span class='ident'>to_vec</span>();
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Sets allowed extended usage of certificate</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_ext_usage</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>purposes</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>ExtKeyUsage</span>]) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>ext_key_usage</span> <span class='op'>=</span> <span class='ident'>purposes</span>.<span class='ident'>to_vec</span>();
+ <span class='self'>self</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>set_sign_hash</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>hash_type</span>: <span class='ident'>hash</span>::<span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Generator</span> {
+ <span class='self'>self</span>.<span class='ident'>hash_type</span> <span class='op'>=</span> <span class='ident'>hash_type</span>;
+ <span class='self'>self</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>add_extension</span>(<span class='ident'>x509</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509</span>, <span class='ident'>extension</span>: <span class='ident'>c_int</span>, <span class='ident'>value</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ctx</span>: <span class='ident'>ffi</span>::<span class='ident'>X509V3_CTX</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>zeroed</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>X509V3_set_ctx</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>ctx</span>, <span class='ident'>x509</span>, <span class='ident'>x509</span>,
+ <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(), <span class='number'>0</span>);
+ <span class='kw'>let</span> <span class='ident'>value</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>value</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>ext</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509V3_EXT_conf_nid</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(),
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='kw-2'>&amp;</span><span class='ident'>ctx</span>),
+ <span class='ident'>extension</span>,
+ <span class='ident'>value</span>.<span class='ident'>as_ptr</span>() <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>);
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>success</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>if</span> <span class='ident'>ext</span> <span class='op'>!=</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>() {
+ <span class='ident'>success</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_add_ext</span>(<span class='ident'>x509</span>, <span class='ident'>ext</span>, <span class='op'>-</span><span class='number'>1</span>) <span class='op'>!=</span> <span class='number'>0</span>;
+ <span class='ident'>ffi</span>::<span class='ident'>X509_EXTENSION_free</span>(<span class='ident'>ext</span>);
+ }
+ <span class='macro'>lift_ssl_if</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>success</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>add_name</span>(<span class='ident'>name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME</span>, <span class='ident'>key</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>value</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>value_len</span> <span class='op'>=</span> <span class='ident'>value</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>c_int</span>;
+ <span class='macro'>lift_ssl</span><span class='macro'>!</span>(<span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>key</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>key</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>value</span> <span class='op'>=</span> <span class='ident'>CString</span>::<span class='ident'>new</span>(<span class='ident'>value</span>.<span class='ident'>as_bytes</span>()).<span class='ident'>unwrap</span>();
+ <span class='ident'>ffi</span>::<span class='ident'>X509_NAME_add_entry_by_txt</span>(<span class='ident'>name</span>, <span class='ident'>key</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>ffi</span>::<span class='ident'>MBSTRING_UTF8</span>,
+ <span class='ident'>value</span>.<span class='ident'>as_ptr</span>(), <span class='ident'>value_len</span>, <span class='op'>-</span><span class='number'>1</span>, <span class='number'>0</span>)
+ })
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>random_serial</span>() <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>size_of</span>::<span class='op'>&lt;</span><span class='ident'>c_long</span><span class='op'>&gt;</span>();
+ <span class='kw'>let</span> <span class='ident'>bytes</span> <span class='op'>=</span> <span class='ident'>rand_bytes</span>(<span class='ident'>len</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>for</span> <span class='ident'>b</span> <span class='kw'>in</span> <span class='ident'>bytes</span>.<span class='ident'>iter</span>() {
+ <span class='ident'>res</span> <span class='op'>=</span> <span class='ident'>res</span> <span class='op'>&lt;&lt;</span> <span class='number'>8</span>;
+ <span class='ident'>res</span> <span class='op'>|=</span> (<span class='op'>*</span><span class='ident'>b</span> <span class='kw'>as</span> <span class='ident'>c_long</span>) <span class='kw-2'>&amp;</span> <span class='number'>0xff</span>;
+ }
+
+ <span class='comment'>// While OpenSSL is actually OK to have negative serials</span>
+ <span class='comment'>// other libraries (for example, Go crypto) can drop</span>
+ <span class='comment'>// such certificates as invalid, so we clear the high bit</span>
+ ((<span class='ident'>res</span> <span class='kw'>as</span> <span class='ident'>c_ulong</span>) <span class='op'>&gt;&gt;</span> <span class='number'>1</span>) <span class='kw'>as</span> <span class='ident'>c_long</span>
+ }
+
+ <span class='doccomment'>/// Generates a private key and a self-signed certificate and returns them</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>generate</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>PKey</span>), <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>p_key</span> <span class='op'>=</span> <span class='ident'>PKey</span>::<span class='ident'>new</span>();
+ <span class='ident'>p_key</span>.<span class='ident'>gen</span>(<span class='self'>self</span>.<span class='ident'>bits</span> <span class='kw'>as</span> <span class='ident'>usize</span>);
+
+ <span class='kw'>let</span> <span class='ident'>x509</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>sign</span>(<span class='kw-2'>&amp;</span><span class='ident'>p_key</span>));
+ <span class='prelude-val'>Ok</span>((<span class='ident'>x509</span>, <span class='ident'>p_key</span>))
+ }
+
+ <span class='doccomment'>/// Sets the certificate public-key, then self-sign and return it</span>
+ <span class='doccomment'>/// Note: That the bit-length of the private key is used (set_bitlength is ignored)</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>sign</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>p_key</span>: <span class='kw-2'>&amp;</span><span class='ident'>PKey</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>init</span>();
+
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>x509</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_new</span>();
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>x509</span>);
+
+ <span class='kw'>let</span> <span class='ident'>x509</span> <span class='op'>=</span> <span class='ident'>X509</span> { <span class='ident'>handle</span>: <span class='ident'>x509</span>, <span class='ident'>ctx</span>: <span class='prelude-val'>None</span>, <span class='ident'>owned</span>: <span class='boolval'>true</span>};
+
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_set_version</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='number'>2</span>));
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>ASN1_INTEGER_set</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_get_serialNumber</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>), <span class='ident'>X509Generator</span>::<span class='ident'>random_serial</span>()));
+
+ <span class='kw'>let</span> <span class='ident'>not_before</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>Asn1Time</span>::<span class='ident'>days_from_now</span>(<span class='number'>0</span>));
+ <span class='kw'>let</span> <span class='ident'>not_after</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>Asn1Time</span>::<span class='ident'>days_from_now</span>(<span class='self'>self</span>.<span class='ident'>days</span>));
+
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_set_notBefore</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>not_before</span>.<span class='ident'>get_handle</span>())));
+ <span class='comment'>// If prev line succeded - ownership should go to cert</span>
+ <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>not_before</span>);
+
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_set_notAfter</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>not_after</span>.<span class='ident'>get_handle</span>())));
+ <span class='comment'>// If prev line succeded - ownership should go to cert</span>
+ <span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>not_after</span>);
+
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_set_pubkey</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>p_key</span>.<span class='ident'>get_handle</span>()));
+
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_get_subject_name</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>);
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>name</span>);
+
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>X509Generator</span>::<span class='ident'>add_name</span>(<span class='ident'>name</span>, <span class='string'>&quot;CN&quot;</span>, <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>CN</span>));
+ <span class='ident'>ffi</span>::<span class='ident'>X509_set_issuer_name</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>name</span>);
+
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>key_usage</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>X509Generator</span>::<span class='ident'>add_extension</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>ffi</span>::<span class='ident'>NID_key_usage</span>,
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>key_usage</span>.<span class='ident'>to_str</span>()));
+ }
+
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>ext_key_usage</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>X509Generator</span>::<span class='ident'>add_extension</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>ffi</span>::<span class='ident'>NID_ext_key_usage</span>,
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>ext_key_usage</span>.<span class='ident'>to_str</span>()));
+ }
+
+ <span class='kw'>let</span> <span class='ident'>hash_fn</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>hash_type</span>.<span class='ident'>evp_md</span>();
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>X509_sign</span>(<span class='ident'>x509</span>.<span class='ident'>handle</span>, <span class='ident'>p_key</span>.<span class='ident'>get_handle</span>(), <span class='ident'>hash_fn</span>));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>x509</span>)
+ }
+ }
+
+ <span class='doccomment'>/// Obtain a certificate signing request (CSR)</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>request</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>p_key</span>: <span class='kw-2'>&amp;</span><span class='ident'>PKey</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>X509Req</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>cert</span><span class='op'>=</span><span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>sign</span>(<span class='ident'>p_key</span>) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span> <span class='ident'>c</span>,
+ <span class='prelude-val'>Err</span>(<span class='ident'>x</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>x</span>)
+ };
+
+ <span class='kw'>let</span> <span class='ident'>hash_fn</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>hash_type</span>.<span class='ident'>evp_md</span>();
+ <span class='kw'>let</span> <span class='ident'>req</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_to_X509_REQ</span>(<span class='ident'>cert</span>.<span class='ident'>handle</span>, <span class='ident'>p_key</span>.<span class='ident'>get_handle</span>(), <span class='ident'>hash_fn</span>) };
+ <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>req</span>);
+
+ <span class='prelude-val'>Ok</span>(<span class='ident'>X509Req</span>::<span class='ident'>new</span>(<span class='ident'>req</span>))
+ }
+}
+
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='doccomment'>/// A public key certificate</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> {
+ <span class='ident'>ctx</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;ctx</span> <span class='ident'>X509StoreContext</span><span class='op'>&gt;</span>,
+ <span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509</span>,
+ <span class='ident'>owned</span>: <span class='ident'>bool</span>
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Creates new from handle with desired ownership.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509</span>, <span class='ident'>owned</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> {
+ <span class='ident'>X509</span> {
+ <span class='ident'>ctx</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>handle</span>: <span class='ident'>handle</span>,
+ <span class='ident'>owned</span>: <span class='ident'>owned</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Creates a new certificate from context. Doesn&#39;t take ownership</span>
+ <span class='doccomment'>/// of handle.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new_in_ctx</span>(<span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509</span>, <span class='ident'>ctx</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;ctx</span> <span class='ident'>X509StoreContext</span>) <span class='op'>-&gt;</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> {
+ <span class='ident'>X509</span> {
+ <span class='ident'>ctx</span>: <span class='prelude-val'>Some</span>(<span class='ident'>ctx</span>),
+ <span class='ident'>handle</span>: <span class='ident'>handle</span>,
+ <span class='ident'>owned</span>: <span class='boolval'>false</span>
+ }
+ }
+
+ <span class='doccomment'>/// Reads certificate from PEM, takes ownership of handle</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_pem</span><span class='op'>&lt;</span><span class='ident'>R</span><span class='op'>&gt;</span>(<span class='ident'>reader</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>R</span>: <span class='ident'>Read</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='ident'>reader</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>));
+
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>handle</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_read_bio_X509</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(),
+ <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(),
+ <span class='prelude-val'>None</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>X509</span>::<span class='ident'>new</span>(<span class='ident'>handle</span>, <span class='boolval'>true</span>))
+ }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_handle</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509</span> {
+ <span class='self'>self</span>.<span class='ident'>handle</span>
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>subject_name</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Name</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_get_subject_name</span>(<span class='self'>self</span>.<span class='ident'>handle</span>) };
+ <span class='ident'>X509Name</span> { <span class='ident'>x509</span>: <span class='self'>self</span>, <span class='ident'>name</span>: <span class='ident'>name</span> }
+ }
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>public_key</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>PKey</span> {
+ <span class='kw'>let</span> <span class='ident'>pkey</span> <span class='op'>=</span> <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_get_pubkey</span>(<span class='self'>self</span>.<span class='ident'>handle</span>) };
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>pkey</span>.<span class='ident'>is_null</span>());
+
+ <span class='ident'>PKey</span>::<span class='ident'>from_handle</span>(<span class='ident'>pkey</span>, <span class='ident'>Parts</span>::<span class='ident'>Public</span>)
+ }
+
+ <span class='doccomment'>/// Returns certificate fingerprint calculated using provided hash</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>fingerprint</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>hash_type</span>: <span class='ident'>hash</span>::<span class='ident'>Type</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>evp</span> <span class='op'>=</span> <span class='ident'>hash_type</span>.<span class='ident'>evp_md</span>();
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>hash_type</span>.<span class='ident'>md_len</span>();
+ <span class='kw'>let</span> <span class='ident'>v</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>u8</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='ident'>repeat</span>(<span class='number'>0</span>).<span class='ident'>take</span>(<span class='ident'>len</span> <span class='kw'>as</span> <span class='ident'>usize</span>).<span class='ident'>collect</span>();
+ <span class='kw'>let</span> <span class='ident'>act_len</span>: <span class='ident'>c_uint</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>let</span> <span class='ident'>res</span> <span class='op'>=</span> <span class='kw'>unsafe</span> {
+ <span class='ident'>ffi</span>::<span class='ident'>X509_digest</span>(<span class='self'>self</span>.<span class='ident'>handle</span>, <span class='ident'>evp</span>, <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>v</span>.<span class='ident'>as_ptr</span>()),
+ <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='kw-2'>&amp;</span><span class='ident'>act_len</span>))
+ };
+
+ <span class='kw'>match</span> <span class='ident'>res</span> {
+ <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ _ <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>act_len</span> <span class='op'>=</span> <span class='ident'>act_len</span> <span class='kw'>as</span> <span class='ident'>usize</span>;
+ <span class='kw'>match</span> <span class='ident'>len</span>.<span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span><span class='ident'>act_len</span>) {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>v</span>),
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span> <span class='op'>=&gt;</span> <span class='macro'>panic</span><span class='macro'>!</span>(<span class='string'>&quot;Fingerprint buffer was corrupted!&quot;</span>)
+ }
+ }
+ }
+ }
+
+ <span class='doccomment'>/// Writes certificate as PEM</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write_pem</span><span class='op'>&lt;</span><span class='ident'>W</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>writer</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>W</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>W</span>: <span class='ident'>Write</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_write_bio_X509</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(),
+ <span class='self'>self</span>.<span class='ident'>handle</span>));
+ }
+ <span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>, <span class='ident'>writer</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>).<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> ())
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;ctx</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>owned</span> {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_free</span>(<span class='self'>self</span>.<span class='ident'>handle</span>) };
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509Name</span><span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span> {
+ <span class='ident'>x509</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;x</span> <span class='ident'>X509</span><span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span>,
+ <span class='ident'>name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME</span>
+}
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509NameEntry</span><span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span> {
+ <span class='ident'>x509_name</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;x</span> <span class='ident'>X509Name</span><span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span>,
+ <span class='ident'>ne</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME_ENTRY</span>
+}
+
+<span class='kw'>impl</span> <span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span> <span class='ident'>X509Name</span><span class='op'>&lt;</span><span class='lifetime'>&#39;x</span><span class='op'>&gt;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>text_by_nid</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>nid</span>: <span class='ident'>nid</span>::<span class='ident'>Nid</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>SslString</span><span class='op'>&gt;</span> {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>loc</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME_get_index_by_NID</span>(<span class='self'>self</span>.<span class='ident'>name</span>, <span class='ident'>nid</span> <span class='kw'>as</span> <span class='ident'>c_int</span>, <span class='op'>-</span><span class='number'>1</span>);
+ <span class='kw'>if</span> <span class='ident'>loc</span> <span class='op'>==</span> <span class='op'>-</span><span class='number'>1</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+
+ <span class='kw'>let</span> <span class='ident'>ne</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME_get_entry</span>(<span class='self'>self</span>.<span class='ident'>name</span>, <span class='ident'>loc</span>);
+ <span class='kw'>if</span> <span class='ident'>ne</span>.<span class='ident'>is_null</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+
+ <span class='kw'>let</span> <span class='ident'>asn1_str</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>X509_NAME_ENTRY_get_data</span>(<span class='ident'>ne</span>);
+ <span class='kw'>if</span> <span class='ident'>asn1_str</span>.<span class='ident'>is_null</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>str_from_asn1</span> : <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span> <span class='op'>=</span> <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>();
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>ffi</span>::<span class='ident'>ASN1_STRING_to_UTF8</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>str_from_asn1</span>, <span class='ident'>asn1_str</span>);
+
+ <span class='kw'>if</span> <span class='ident'>len</span> <span class='op'>&lt;</span> <span class='number'>0</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>str_from_asn1</span>.<span class='ident'>is_null</span>());
+
+ <span class='prelude-val'>Some</span>(<span class='ident'>SslString</span>::<span class='ident'>new</span>(<span class='ident'>str_from_asn1</span>))
+ }
+ }
+}
+
+<span class='doccomment'>/// A certificate signing request</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509Req</span> {
+ <span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_REQ</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>X509Req</span> {
+ <span class='doccomment'>/// Creates new from handle</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>handle</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ffi</span>::<span class='ident'>X509_REQ</span>) <span class='op'>-&gt;</span> <span class='ident'>X509Req</span> {
+ <span class='ident'>X509Req</span> {
+ <span class='ident'>handle</span>: <span class='ident'>handle</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Reads CSR from PEM</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_pem</span><span class='op'>&lt;</span><span class='ident'>R</span><span class='op'>&gt;</span>(<span class='ident'>reader</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>X509Req</span>, <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>R</span>: <span class='ident'>Read</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='ident'>reader</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>));
+
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>handle</span> <span class='op'>=</span> <span class='macro'>try_ssl_null</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_read_bio_X509_REQ</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(),
+ <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>(),
+ <span class='prelude-val'>None</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>X509Req</span>::<span class='ident'>new</span>(<span class='ident'>handle</span>))
+ }
+ }
+
+ <span class='doccomment'>/// Writes CSR as PEM</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>write_pem</span><span class='op'>&lt;</span><span class='ident'>W</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>writer</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>W</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='ident'>SslError</span><span class='op'>&gt;</span> <span class='kw'>where</span> <span class='ident'>W</span>: <span class='ident'>Write</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mem_bio</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>MemBio</span>::<span class='ident'>new</span>());
+ <span class='kw'>unsafe</span> {
+ <span class='macro'>try_ssl</span><span class='macro'>!</span>(<span class='ident'>ffi</span>::<span class='ident'>PEM_write_bio_X509_REQ</span>(<span class='ident'>mem_bio</span>.<span class='ident'>get_handle</span>(),
+ <span class='self'>self</span>.<span class='ident'>handle</span>));
+ }
+ <span class='ident'>io</span>::<span class='ident'>copy</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>mem_bio</span>, <span class='ident'>writer</span>).<span class='ident'>map_err</span>(<span class='ident'>StreamError</span>).<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> ())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Drop</span> <span class='kw'>for</span> <span class='ident'>X509Req</span> {
+ <span class='kw'>fn</span> <span class='ident'>drop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>unsafe</span> { <span class='ident'>ffi</span>::<span class='ident'>X509_REQ_free</span>(<span class='self'>self</span>.<span class='ident'>handle</span>) };
+ }
+}
+
+<span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>make_validation_error</span>(
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ok_val</span>:<span class='ident'>ident</span>, $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>:<span class='ident'>ident</span> <span class='op'>=</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>val</span>:<span class='ident'>ident</span>,)<span class='op'>+</span>) <span class='op'>=&gt;</span> (
+ <span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Copy</span>, <span class='ident'>Clone</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>X509ValidationError</span> {
+ $(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>,)<span class='op'>+</span>
+ <span class='ident'>X509UnknownError</span>(<span class='ident'>c_int</span>)
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>X509ValidationError</span> {
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_raw</span>(<span class='ident'>err</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>X509ValidationError</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>err</span> {
+ <span class='ident'>ffi</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>ok_val</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ $(<span class='ident'>ffi</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>val</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>X509ValidationError</span>::<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>),)<span class='op'>+</span>
+ <span class='ident'>err</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>X509ValidationError</span>::<span class='ident'>X509UnknownError</span>(<span class='ident'>err</span>))
+ }
+ }
+ }
+ )
+);
+
+<span class='macro'>make_validation_error</span><span class='macro'>!</span>(<span class='ident'>X509_V_OK</span>,
+ <span class='ident'>X509UnableToGetIssuerCert</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT</span>,
+ <span class='ident'>X509UnableToGetCrl</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_CRL</span>,
+ <span class='ident'>X509UnableToDecryptCertSignature</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE</span>,
+ <span class='ident'>X509UnableToDecryptCrlSignature</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE</span>,
+ <span class='ident'>X509UnableToDecodeIssuerPublicKey</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY</span>,
+ <span class='ident'>X509CertSignatureFailure</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_SIGNATURE_FAILURE</span>,
+ <span class='ident'>X509CrlSignatureFailure</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CRL_SIGNATURE_FAILURE</span>,
+ <span class='ident'>X509CertNotYetValid</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_NOT_YET_VALID</span>,
+ <span class='ident'>X509CertHasExpired</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_HAS_EXPIRED</span>,
+ <span class='ident'>X509CrlNotYetValid</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CRL_NOT_YET_VALID</span>,
+ <span class='ident'>X509CrlHasExpired</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CRL_HAS_EXPIRED</span>,
+ <span class='ident'>X509ErrorInCertNotBeforeField</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD</span>,
+ <span class='ident'>X509ErrorInCertNotAfterField</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD</span>,
+ <span class='ident'>X509ErrorInCrlLastUpdateField</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD</span>,
+ <span class='ident'>X509ErrorInCrlNextUpdateField</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD</span>,
+ <span class='ident'>X509OutOfMem</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_OUT_OF_MEM</span>,
+ <span class='ident'>X509DepthZeroSelfSignedCert</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT</span>,
+ <span class='ident'>X509SelfSignedCertInChain</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN</span>,
+ <span class='ident'>X509UnableToGetIssuerCertLocally</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY</span>,
+ <span class='ident'>X509UnableToVerifyLeafSignature</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE</span>,
+ <span class='ident'>X509CertChainTooLong</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_CHAIN_TOO_LONG</span>,
+ <span class='ident'>X509CertRevoked</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_REVOKED</span>,
+ <span class='ident'>X509InvalidCA</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_INVALID_CA</span>,
+ <span class='ident'>X509PathLengthExceeded</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_PATH_LENGTH_EXCEEDED</span>,
+ <span class='ident'>X509InvalidPurpose</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_INVALID_PURPOSE</span>,
+ <span class='ident'>X509CertUntrusted</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_UNTRUSTED</span>,
+ <span class='ident'>X509CertRejected</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_CERT_REJECTED</span>,
+ <span class='ident'>X509SubjectIssuerMismatch</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_SUBJECT_ISSUER_MISMATCH</span>,
+ <span class='ident'>X509AkidSkidMismatch</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_AKID_SKID_MISMATCH</span>,
+ <span class='ident'>X509AkidIssuerSerialMismatch</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH</span>,
+ <span class='ident'>X509KeyusageNoCertsign</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_CERTSIGN</span>,
+ <span class='ident'>X509UnableToGetCrlIssuer</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER</span>,
+ <span class='ident'>X509UnhandledCriticalExtension</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION</span>,
+ <span class='ident'>X509KeyusageNoCrlSign</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_CRL_SIGN</span>,
+ <span class='ident'>X509UnhandledCriticalCrlExtension</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION</span>,
+ <span class='ident'>X509InvalidNonCA</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_INVALID_NON_CA</span>,
+ <span class='ident'>X509ProxyPathLengthExceeded</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED</span>,
+ <span class='ident'>X509KeyusageNoDigitalSignature</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE</span>,
+ <span class='ident'>X509ProxyCertificatesNotAllowed</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED</span>,
+ <span class='ident'>X509InvalidExtension</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_INVALID_EXTENSION</span>,
+ <span class='ident'>X509InavlidPolicyExtension</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_INVALID_POLICY_EXTENSION</span>,
+ <span class='ident'>X509NoExplicitPolicy</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_NO_EXPLICIT_POLICY</span>,
+ <span class='ident'>X509DifferentCrlScope</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_DIFFERENT_CRL_SCOPE</span>,
+ <span class='ident'>X509UnsupportedExtensionFeature</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE</span>,
+ <span class='ident'>X509UnnestedResource</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNNESTED_RESOURCE</span>,
+ <span class='ident'>X509PermittedVolation</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_PERMITTED_VIOLATION</span>,
+ <span class='ident'>X509ExcludedViolation</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_EXCLUDED_VIOLATION</span>,
+ <span class='ident'>X509SubtreeMinmax</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_SUBTREE_MINMAX</span>,
+ <span class='ident'>X509UnsupportedConstraintType</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE</span>,
+ <span class='ident'>X509UnsupportedConstraintSyntax</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX</span>,
+ <span class='ident'>X509UnsupportedNameSyntax</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_NAME_SYNTAX</span>,
+ <span class='ident'>X509CrlPathValidationError</span><span class='op'>=</span> <span class='ident'>X509_V_ERR_CRL_PATH_VALIDATION_ERROR</span>,
+ <span class='ident'>X509ApplicationVerification</span> <span class='op'>=</span> <span class='ident'>X509_V_ERR_APPLICATION_VERIFICATION</span>,
+);
+
+
+<span class='attribute'>#[<span class='ident'>test</span>]</span>
+<span class='kw'>fn</span> <span class='ident'>test_negative_serial</span>() {
+ <span class='comment'>// I guess that&#39;s enough to get a random negative number</span>
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..<span class='number'>1000</span> {
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='ident'>X509Generator</span>::<span class='ident'>random_serial</span>() <span class='op'>&gt;</span> <span class='number'>0</span>, <span class='string'>&quot;All serials should be positive&quot;</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../../";
+ window.currentCrate = "openssl";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../../jquery.js"></script>
+ <script src="../../../main.js"></script>
+
+ <script async src="../../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl_sys/lib.rs.html b/src/openssl_sys/lib.rs.html
new file mode 100644
index 0000000..bd0937b
--- /dev/null
+++ b/src/openssl_sys/lib.rs.html
@@ -0,0 +1,1327 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-sys-0.6.3/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+<span id="560">560</span>
+<span id="561">561</span>
+<span id="562">562</span>
+<span id="563">563</span>
+<span id="564">564</span>
+<span id="565">565</span>
+<span id="566">566</span>
+<span id="567">567</span>
+<span id="568">568</span>
+<span id="569">569</span>
+<span id="570">570</span>
+<span id="571">571</span>
+<span id="572">572</span>
+<span id="573">573</span>
+<span id="574">574</span>
+<span id="575">575</span>
+<span id="576">576</span>
+<span id="577">577</span>
+<span id="578">578</span>
+<span id="579">579</span>
+<span id="580">580</span>
+<span id="581">581</span>
+<span id="582">582</span>
+<span id="583">583</span>
+<span id="584">584</span>
+<span id="585">585</span>
+<span id="586">586</span>
+<span id="587">587</span>
+<span id="588">588</span>
+<span id="589">589</span>
+<span id="590">590</span>
+<span id="591">591</span>
+<span id="592">592</span>
+<span id="593">593</span>
+<span id="594">594</span>
+<span id="595">595</span>
+<span id="596">596</span>
+<span id="597">597</span>
+<span id="598">598</span>
+<span id="599">599</span>
+<span id="600">600</span>
+<span id="601">601</span>
+<span id="602">602</span>
+<span id="603">603</span>
+<span id="604">604</span>
+<span id="605">605</span>
+<span id="606">606</span>
+<span id="607">607</span>
+<span id="608">608</span>
+<span id="609">609</span>
+<span id="610">610</span>
+<span id="611">611</span>
+<span id="612">612</span>
+<span id="613">613</span>
+<span id="614">614</span>
+<span id="615">615</span>
+</pre><pre class='rust '>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>non_camel_case_types</span>, <span class='ident'>non_upper_case_globals</span>, <span class='ident'>non_snake_case</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_root_url</span><span class='op'>=</span><span class='string'>&quot;https://sfackler.github.io/rust-openssl/doc/v0.6.3&quot;</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>libc</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>)]</span>
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>libressl_pnacl_sys</span>;
+
+<span class='kw'>use</span> <span class='ident'>libc</span>::{<span class='ident'>c_void</span>, <span class='ident'>c_int</span>, <span class='ident'>c_char</span>, <span class='ident'>c_ulong</span>, <span class='ident'>c_long</span>, <span class='ident'>c_uint</span>, <span class='ident'>c_uchar</span>, <span class='ident'>size_t</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{<span class='ident'>Mutex</span>, <span class='ident'>MutexGuard</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::{<span class='ident'>Once</span>, <span class='ident'>ONCE_INIT</span>};
+
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ASN1_INTEGER</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ASN1_STRING</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ASN1_TIME</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BIO</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BIO_METHOD</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>BN_CTX</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>COMP_METHOD</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CRYPTO_EX_DATA</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>ENGINE</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>EVP_CIPHER</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>EVP_CIPHER_CTX</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>EVP_MD</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>EVP_PKEY</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>EVP_PKEY_CTX</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>RSA</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>SSL</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>SSL_CTX</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>SSL_METHOD</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_CRL</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_EXTENSION</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_NAME</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_NAME_ENTRY</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_REQ</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>X509_STORE_CTX</span> <span class='op'>=</span> <span class='ident'>c_void</span>;
+
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>EVP_MD_CTX</span> {
+ <span class='ident'>digest</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD</span>,
+ <span class='ident'>engine</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>flags</span>: <span class='ident'>c_ulong</span>,
+ <span class='ident'>md_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>pctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY_CTX</span>,
+ <span class='ident'>update</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>EVP_MD_CTX</span> {}
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>EVP_MD_CTX</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>EVP_MD_CTX</span> { <span class='op'>*</span><span class='self'>self</span> }
+}
+
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>HMAC_CTX</span> {
+ <span class='ident'>md</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD</span>,
+ <span class='ident'>md_ctx</span>: <span class='ident'>EVP_MD_CTX</span>,
+ <span class='ident'>i_ctx</span>: <span class='ident'>EVP_MD_CTX</span>,
+ <span class='ident'>o_ctx</span>: <span class='ident'>EVP_MD_CTX</span>,
+ <span class='ident'>key_length</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>key</span>: [<span class='ident'>c_uchar</span>; <span class='number'>128</span>]
+}
+
+<span class='kw'>impl</span> <span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>HMAC_CTX</span> {}
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>HMAC_CTX</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>HMAC_CTX</span> { <span class='op'>*</span><span class='self'>self</span> }
+}
+
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>X509V3_CTX</span> {
+ <span class='ident'>flags</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>issuer_cert</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>subject_cert</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>subject_req</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>crl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>db_meth</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>db</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='comment'>// I like the last comment line, it is copied from OpenSSL sources:</span>
+ <span class='comment'>// Maybe more here</span>
+}
+
+<span class='kw'>impl</span> <span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>X509V3_CTX</span> {}
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>X509V3_CTX</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>X509V3_CTX</span> { <span class='op'>*</span><span class='self'>self</span> }
+}
+
+<span class='attribute'>#[<span class='ident'>repr</span>(<span class='ident'>C</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>BIGNUM</span> {
+ <span class='kw'>pub</span> <span class='ident'>d</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='kw'>pub</span> <span class='ident'>top</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>dmax</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>neg</span>: <span class='ident'>c_int</span>,
+ <span class='kw'>pub</span> <span class='ident'>flags</span>: <span class='ident'>c_int</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>BIGNUM</span> {}
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>BIGNUM</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>BIGNUM</span> { <span class='op'>*</span><span class='self'>self</span> }
+}
+
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CRYPTO_EX_new</span> <span class='op'>=</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>parent</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>ad</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>CRYPTO_EX_DATA</span>, <span class='ident'>idx</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>argl</span>: <span class='ident'>c_long</span>, <span class='ident'>argp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CRYPTO_EX_dup</span> <span class='op'>=</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>to</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>CRYPTO_EX_DATA</span>,
+ <span class='ident'>from</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>CRYPTO_EX_DATA</span>, <span class='ident'>from_d</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>idx</span>: <span class='ident'>c_int</span>, <span class='ident'>argl</span>: <span class='ident'>c_long</span>, <span class='ident'>argp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CRYPTO_EX_free</span> <span class='op'>=</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>parent</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>ptr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>,
+ <span class='ident'>ad</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>CRYPTO_EX_DATA</span>, <span class='ident'>idx</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>argl</span>: <span class='ident'>c_long</span>, <span class='ident'>argp</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>PasswordCallback</span> <span class='op'>=</span> <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>size</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>rwflag</span>: <span class='ident'>c_int</span>, <span class='ident'>user_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BIO_CTRL_EOF</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>BIO_C_SET_BUF_MEM_EOF_RETURN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>130</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>CRYPTO_LOCK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MBSTRING_ASC</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>MBSTRING_FLAG</span> <span class='op'>|</span> <span class='number'>1</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MBSTRING_BMP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>MBSTRING_FLAG</span> <span class='op'>|</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MBSTRING_FLAG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0x1000</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MBSTRING_UNIV</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>MBSTRING_FLAG</span> <span class='op'>|</span> <span class='number'>4</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>MBSTRING_UTF8</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='ident'>MBSTRING_FLAG</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>NID_ext_key_usage</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>126</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>NID_key_usage</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>83</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_CTRL_OPTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_CTRL_CLEAR_OPTIONS</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>77</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_CTRL_SET_TLSEXT_HOSTNAME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>55</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_CTRL_EXTRA_CHAIN_CERT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_CTRL_SET_READ_AHEAD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_NONE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_SSL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_SYSCALL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_WANT_ACCEPT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_WANT_CONNECT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_WANT_READ</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_WANT_WRITE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_WANT_X509_LOOKUP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_ERROR_ZERO_RETURN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_NONE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_PEER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_VERIFY_FAIL_IF_NO_PEER_CERT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>TLSEXT_NAMETYPE_host_name</span>: <span class='ident'>c_long</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_TLSEXT_ERR_OK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_TLSEXT_ERR_ALERT_WARNING</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_TLSEXT_ERR_ALERT_FATAL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>SSL_TLSEXT_ERR_NOACK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>OPENSSL_NPN_UNSUPPORTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>OPENSSL_NPN_NEGOTIATED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>OPENSSL_NPN_NO_OVERLAP</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>V_ASN1_GENERALIZEDTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>V_ASN1_UTCTIME</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_FILETYPE_ASN1</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_FILETYPE_DEFAULT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_FILETYPE_PEM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>1</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>31</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_AKID_SKID_MISMATCH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>30</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_APPLICATION_VERIFICATION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>50</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_CHAIN_TOO_LONG</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>22</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_HAS_EXPIRED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>10</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_NOT_YET_VALID</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>9</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_REJECTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>28</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_REVOKED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>23</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_SIGNATURE_FAILURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>7</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CERT_UNTRUSTED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>27</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CRL_HAS_EXPIRED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>12</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CRL_NOT_YET_VALID</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>11</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CRL_PATH_VALIDATION_ERROR</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>54</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_CRL_SIGNATURE_FAILURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>8</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>18</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_DIFFERENT_CRL_SCOPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>44</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>14</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>13</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>15</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>16</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_EXCLUDED_VIOLATION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>48</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_INVALID_CA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>24</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_INVALID_EXTENSION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>41</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_INVALID_NON_CA</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>37</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_INVALID_POLICY_EXTENSION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>42</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_INVALID_PURPOSE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>26</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_CERTSIGN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>32</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_CRL_SIGN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>35</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>39</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_NO_EXPLICIT_POLICY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>43</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_OUT_OF_MEM</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>17</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_PATH_LENGTH_EXCEEDED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>25</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_PERMITTED_VIOLATION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>47</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>40</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>38</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>19</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_SUBJECT_ISSUER_MISMATCH</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>29</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_SUBTREE_MINMAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>49</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>6</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>4</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>5</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_CRL</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>3</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>33</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>2</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>20</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>21</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>36</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>34</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNNESTED_RESOURCE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>46</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>52</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>51</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>45</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_ERR_UNSUPPORTED_NAME_SYNTAX</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>53</span>;
+<span class='kw'>pub</span> <span class='kw'>const</span> <span class='ident'>X509_V_OK</span>: <span class='ident'>c_int</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>MUTEXES</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Mutex</span><span class='op'>&lt;</span>()<span class='op'>&gt;&gt;</span> <span class='op'>=</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Mutex</span><span class='op'>&lt;</span>()<span class='op'>&gt;&gt;</span>;
+<span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>GUARDS</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MutexGuard</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span>, ()<span class='op'>&gt;&gt;</span><span class='op'>&gt;</span> <span class='op'>=</span> <span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MutexGuard</span><span class='op'>&lt;</span><span class='lifetime'>&#39;static</span>, ()<span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>;
+
+<span class='kw'>extern</span> <span class='kw'>fn</span> <span class='ident'>locking_function</span>(<span class='ident'>mode</span>: <span class='ident'>c_int</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>, <span class='ident'>_file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>_line</span>: <span class='ident'>c_int</span>) {
+ <span class='kw'>unsafe</span> {
+ <span class='kw'>let</span> <span class='ident'>mutex</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>MUTEXES</span>)[<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>usize</span>];
+
+ <span class='kw'>if</span> <span class='ident'>mode</span> <span class='kw-2'>&amp;</span> <span class='ident'>CRYPTO_LOCK</span> <span class='op'>!=</span> <span class='number'>0</span> {
+ (<span class='op'>*</span><span class='ident'>GUARDS</span>)[<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>usize</span>] <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>mutex</span>.<span class='ident'>lock</span>().<span class='ident'>unwrap</span>());
+ } <span class='kw'>else</span> {
+ <span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>GUARDS</span>)[<span class='ident'>n</span> <span class='kw'>as</span> <span class='ident'>usize</span>].<span class='ident'>take</span>();
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>init</span>() {
+ <span class='kw'>static</span> <span class='kw-2'>mut</span> <span class='ident'>INIT</span>: <span class='ident'>Once</span> <span class='op'>=</span> <span class='ident'>ONCE_INIT</span>;
+
+ <span class='kw'>unsafe</span> {
+ <span class='ident'>INIT</span>.<span class='ident'>call_once</span>(<span class='op'>||</span> {
+ <span class='ident'>SSL_library_init</span>();
+ <span class='ident'>SSL_load_error_strings</span>();
+
+ <span class='kw'>let</span> <span class='ident'>num_locks</span> <span class='op'>=</span> <span class='ident'>CRYPTO_num_locks</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>mutexes</span> <span class='op'>=</span> <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>Vec</span>::<span class='ident'>new</span>());
+ <span class='kw'>for</span> _ <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>num_locks</span> {
+ <span class='ident'>mutexes</span>.<span class='ident'>push</span>(<span class='ident'>Mutex</span>::<span class='ident'>new</span>(()));
+ }
+ <span class='ident'>MUTEXES</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>mutexes</span>);
+ <span class='kw'>let</span> <span class='ident'>guards</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MutexGuard</span><span class='op'>&lt;</span>()<span class='op'>&gt;&gt;</span><span class='op'>&gt;&gt;</span> <span class='op'>=</span>
+ <span class='ident'>Box</span>::<span class='ident'>new</span>((<span class='number'>0</span>..<span class='ident'>num_locks</span>).<span class='ident'>map</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='prelude-val'>None</span>).<span class='ident'>collect</span>());
+ <span class='ident'>GUARDS</span> <span class='op'>=</span> <span class='ident'>mem</span>::<span class='ident'>transmute</span>(<span class='ident'>guards</span>);
+
+ <span class='ident'>CRYPTO_set_locking_callback</span>(<span class='ident'>locking_function</span>);
+ })
+ }
+}
+
+<span class='comment'>// Functions converted from macros</span>
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>BIO_eof</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>BIO_ctrl</span>(<span class='ident'>b</span>, <span class='ident'>BIO_CTRL_EOF</span>, <span class='number'>0</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>()) <span class='op'>==</span> <span class='number'>1</span>
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_options</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>op</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ssl</span>, <span class='ident'>SSL_CTRL_OPTIONS</span>, <span class='ident'>op</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>BIO_set_mem_eof_return</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>v</span>: <span class='ident'>c_int</span>) {
+ <span class='ident'>BIO_ctrl</span>(<span class='ident'>b</span>, <span class='ident'>BIO_C_SET_BUF_MEM_EOF_RETURN</span>, <span class='ident'>v</span> <span class='kw'>as</span> <span class='ident'>c_long</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_get_options</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ssl</span>, <span class='ident'>SSL_CTRL_OPTIONS</span>, <span class='number'>0</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_clear_options</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>op</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ssl</span>, <span class='ident'>SSL_CTRL_CLEAR_OPTIONS</span>, (<span class='ident'>op</span>), <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_add_extra_chain_cert</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>cert</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ssl</span>, <span class='ident'>SSL_CTRL_EXTRA_CHAIN_CERT</span>, <span class='number'>0</span>, <span class='ident'>cert</span>)
+}
+
+<span class='kw'>pub</span> <span class='kw'>unsafe</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_read_ahead</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>m</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span> {
+ <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ctx</span>, <span class='ident'>SSL_CTRL_SET_READ_AHEAD</span>, <span class='ident'>m</span>, <span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
+}
+
+<span class='comment'>// True functions</span>
+<span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ASN1_INTEGER_set</span>(<span class='ident'>dest</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_INTEGER</span>, <span class='ident'>value</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ASN1_STRING_type_new</span>(<span class='ident'>ty</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_STRING</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ASN1_TIME_free</span>(<span class='ident'>tm</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_TIME</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_ctrl</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>cmd</span>: <span class='ident'>c_int</span>, <span class='ident'>larg</span>: <span class='ident'>c_long</span>, <span class='ident'>parg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_free_all</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_new</span>(<span class='ident'>type_</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>BIO_METHOD</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_read</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_write</span>(<span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BIO_s_mem</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>BIO_METHOD</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_new</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_dup</span>(<span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_clear_free</span>(<span class='ident'>bn</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_CTX_new</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_CTX_free</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_num_bits</span>(<span class='ident'>bn</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_set_negative</span>(<span class='ident'>bn</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_set_word</span>(<span class='ident'>bn</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Arithmetic operations on BIGNUMs */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_add</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_div</span>(<span class='ident'>dv</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>rem</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_exp</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_gcd</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_add</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_exp</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_inverse</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>BIGNUM</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_mul</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_sqr</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_sub</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mul</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_nnmod</span>(<span class='ident'>rem</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_add_word</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_sub_word</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mul_word</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_div_word</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mod_word</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>BIGNUM</span>, <span class='ident'>w</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_ulong</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_sqr</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_sub</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Bit operations on BIGNUMs */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_clear_bit</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_is_bit_set</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_lshift</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_lshift1</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_mask_bits</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_rshift</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_set_bit</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>n</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_rshift1</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Comparisons on BIGNUMs */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_cmp</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_ucmp</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Prime handling */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_generate_prime_ex</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>bits</span>: <span class='ident'>c_int</span>, <span class='ident'>safe</span>: <span class='ident'>c_int</span>, <span class='ident'>add</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>rem</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>cb</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_is_prime_ex</span>(<span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>checks</span>: <span class='ident'>c_int</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>, <span class='ident'>cb</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_is_prime_fasttest_ex</span>(<span class='ident'>p</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>checks</span>: <span class='ident'>c_int</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BN_CTX</span>, <span class='ident'>do_trial_division</span>: <span class='ident'>c_int</span>, <span class='ident'>cb</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Random number handling */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_rand</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>bits</span>: <span class='ident'>c_int</span>, <span class='ident'>top</span>: <span class='ident'>c_int</span>, <span class='ident'>bottom</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_pseudo_rand</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>bits</span>: <span class='ident'>c_int</span>, <span class='ident'>top</span>: <span class='ident'>c_int</span>, <span class='ident'>bottom</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_rand_range</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>range</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_pseudo_rand_range</span>(<span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>range</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Conversion from/to binary representation */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_bin2bn</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>size</span>: <span class='ident'>c_int</span>, <span class='ident'>ret</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_bn2bin</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>to</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>/* Conversion from/to decimal string representation */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_dec2bn</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_bn2dec</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+
+ <span class='comment'>/* Conversion from/to hexidecimal string representation */</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_hex2bn</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>, <span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>BN_bn2hex</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIGNUM</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CRYPTO_num_locks</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CRYPTO_set_locking_callback</span>(<span class='ident'>func</span>: <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>mode</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>n</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>line</span>: <span class='ident'>c_int</span>));
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CRYPTO_free</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>CRYPTO_memcmp</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>len</span>: <span class='ident'>size_t</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ERR_get_error</span>() <span class='op'>-&gt;</span> <span class='ident'>c_ulong</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ERR_lib_error_string</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ERR_func_error_string</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ERR_reason_error_string</span>(<span class='ident'>err</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ERR_load_crypto_strings</span>();
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_md5</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_ripemd160</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_sha1</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_sha224</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_sha256</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_sha384</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_sha512</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_128_cbc</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_128_ecb</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_128_xts</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='comment'>// fn EVP_aes_128_ctr() -&gt; EVP_CIPHER;</span>
+ <span class='comment'>// fn EVP_aes_128_gcm() -&gt; EVP_CIPHER;</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_256_cbc</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_256_ecb</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;aes_xts&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_aes_256_xts</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+ <span class='comment'>// fn EVP_aes_256_ctr() -&gt; EVP_CIPHER;</span>
+ <span class='comment'>// fn EVP_aes_256_gcm() -&gt; EVP_CIPHER;</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_rc4</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CIPHER_CTX_new</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CIPHER_CTX_set_padding</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>, <span class='ident'>padding</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CIPHER_CTX_free</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CipherInit</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>, <span class='ident'>evp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>,
+ <span class='ident'>key</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>iv</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CipherUpdate</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>, <span class='ident'>outbuf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>,
+ <span class='ident'>outlen</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>, <span class='ident'>inbuf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>inlen</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_CipherFinal</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_CIPHER_CTX</span>, <span class='ident'>res</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>len</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_DigestInit</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>typ</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_DigestInit_ex</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>typ</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>, <span class='ident'>imple</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ENGINE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_DigestUpdate</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>data</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_DigestFinal</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>res</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_DigestFinal_ex</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>res</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u32</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_MD_CTX_create</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_MD_CTX_copy_ex</span>(<span class='ident'>dst</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>, <span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_MD_CTX_destroy</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_MD_CTX</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_new</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_free</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_assign</span>(<span class='ident'>pkey</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>typ</span>: <span class='ident'>c_int</span>, <span class='ident'>key</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_get1_RSA</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_set1_RSA</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>r</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>EVP_PKEY_cmp</span>(<span class='ident'>a</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>b</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_PKEY</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_CTX_init</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_CTX_cleanup</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_CTX_copy</span>(<span class='ident'>dst</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>, <span class='ident'>src</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>HMAC_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='comment'>// Pre-1.0 versions of these didn&#39;t return anything, so the shims bridge that gap</span>
+ <span class='attribute'>#[<span class='ident'>cfg_attr</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;HMAC_Init_ex&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_Init_ex_shim</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>, <span class='ident'>key</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>keylen</span>: <span class='ident'>c_int</span>, <span class='ident'>md</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>, <span class='ident'>imple</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ENGINE</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>cfg_attr</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;HMAC_Final&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_Final_shim</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>, <span class='ident'>output</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>cfg_attr</span>(<span class='ident'>target_os</span> <span class='op'>=</span> <span class='string'>&quot;nacl&quot;</span>, <span class='ident'>link_name</span> <span class='op'>=</span> <span class='string'>&quot;HMAC_Update&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>HMAC_Update_shim</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>HMAC_CTX</span>, <span class='ident'>input</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>len</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_read_bio_X509</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>callback</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PasswordCallback</span><span class='op'>&gt;</span>,
+ <span class='ident'>user_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_read_bio_X509_REQ</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>, <span class='ident'>callback</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PasswordCallback</span><span class='op'>&gt;</span>,
+ <span class='ident'>user_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_read_bio_PrivateKey</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>callback</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PasswordCallback</span><span class='op'>&gt;</span>,
+ <span class='ident'>user_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_write_bio_PrivateKey</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>pkey</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>cipher</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_CIPHER</span>,
+ <span class='ident'>kstr</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>klen</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>callback</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PasswordCallback</span><span class='op'>&gt;</span>,
+ <span class='ident'>user_data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_write_bio_X509</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>x509</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PEM_write_bio_X509_REQ</span>(<span class='ident'>bio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>x509</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>PKCS5_PBKDF2_HMAC_SHA1</span>(<span class='ident'>pass</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>passlen</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>salt</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>saltlen</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>iter</span>: <span class='ident'>c_int</span>, <span class='ident'>keylen</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RAND_bytes</span>(<span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>num</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_generate_key</span>(<span class='ident'>modsz</span>: <span class='ident'>c_int</span>, <span class='ident'>e</span>: <span class='ident'>c_ulong</span>, <span class='ident'>cb</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>cbarg</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_private_decrypt</span>(<span class='ident'>flen</span>: <span class='ident'>c_int</span>, <span class='ident'>from</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>to</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>,
+ <span class='ident'>pad</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_public_encrypt</span>(<span class='ident'>flen</span>: <span class='ident'>c_int</span>, <span class='ident'>from</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>to</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>,
+ <span class='ident'>pad</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_sign</span>(<span class='ident'>t</span>: <span class='ident'>c_int</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>mlen</span>: <span class='ident'>c_uint</span>, <span class='ident'>sig</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>, <span class='ident'>siglen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_size</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>RSA_verify</span>(<span class='ident'>t</span>: <span class='ident'>c_int</span>, <span class='ident'>m</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>mlen</span>: <span class='ident'>c_uint</span>, <span class='ident'>sig</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>siglen</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_library_init</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_load_error_strings</span>();
+
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;sslv2&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSLv2_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSLv3_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>TLSv1_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_1&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>TLSv1_1_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;tlsv1_2&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>TLSv1_2_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>DTLSv1_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;dtlsv1_2&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>DTLSv1_2_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSLv23_method</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_new</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_pending</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_free</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_set_bio</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>, <span class='ident'>rbio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>, <span class='ident'>wbio</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_rbio</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_wbio</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>BIO</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_accept</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_connect</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_ctrl</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>, <span class='ident'>cmd</span>: <span class='ident'>c_int</span>, <span class='ident'>larg</span>: <span class='ident'>c_long</span>,
+ <span class='ident'>parg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_error</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>, <span class='ident'>ret</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_read</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>num</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_write</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>, <span class='ident'>num</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_ex_data_X509_STORE_CTX_idx</span>() <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_SSL_CTX</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_current_compression</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>COMP_METHOD</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get_peer_certificate</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_COMP_get_name</span>(<span class='ident'>comp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>COMP_METHOD</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_new</span>(<span class='ident'>method</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL_METHOD</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_free</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_verify</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>mode</span>: <span class='ident'>c_int</span>,
+ <span class='ident'>verify_callback</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw'>extern</span> <span class='kw'>fn</span>(<span class='ident'>c_int</span>, <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span><span class='op'>&gt;</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_verify_depth</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>depth</span>: <span class='ident'>c_int</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_load_verify_locations</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>CAfile</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>,
+ <span class='ident'>CApath</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_get_ex_new_index</span>(<span class='ident'>argl</span>: <span class='ident'>c_long</span>, <span class='ident'>argp</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_void</span>,
+ <span class='ident'>new_func</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CRYPTO_EX_new</span><span class='op'>&gt;</span>,
+ <span class='ident'>dup_func</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CRYPTO_EX_dup</span><span class='op'>&gt;</span>,
+ <span class='ident'>free_func</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CRYPTO_EX_free</span><span class='op'>&gt;</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_ex_data</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>idx</span>: <span class='ident'>c_int</span>, <span class='ident'>data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_get_ex_data</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>idx</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_use_certificate_file</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>cert_file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>file_type</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_use_certificate</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>cert</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_use_PrivateKey_file</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>key_file</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>file_type</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_use_PrivateKey</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>key</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_check_private_key</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_cipher_list</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_ctrl</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>, <span class='ident'>cmd</span>: <span class='ident'>c_int</span>, <span class='ident'>larg</span>: <span class='ident'>c_long</span>, <span class='ident'>parg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_long</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_next_protos_advertised_cb</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>,
+ <span class='ident'>cb</span>: <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>,
+ <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>outlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>,
+ <span class='ident'>arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>,
+ <span class='ident'>arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_CTX_set_next_proto_select_cb</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL_CTX</span>,
+ <span class='ident'>cb</span>: <span class='kw'>extern</span> <span class='string'>&quot;C&quot;</span> <span class='kw'>fn</span>(<span class='ident'>ssl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>SSL</span>,
+ <span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>outlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>inbuf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>inlen</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>,
+ <span class='ident'>arg</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>);
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_select_next_proto</span>(<span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>, <span class='ident'>outlen</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uchar</span>,
+ <span class='ident'>inbuf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>, <span class='ident'>inlen</span>: <span class='ident'>c_uint</span>,
+ <span class='ident'>client</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>, <span class='ident'>client_len</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;npn&quot;</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>SSL_get0_next_proto_negotiated</span>(<span class='ident'>s</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>SSL</span>, <span class='ident'>data</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_uchar</span>, <span class='ident'>len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_add_ext</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>ext</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_EXTENSION</span>, <span class='ident'>loc</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_digest</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>digest</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>len</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_free</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_REQ_free</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>);
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_get_serialNumber</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_INTEGER</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_get_subject_name</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_gmtime_adj</span>(<span class='ident'>time</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_TIME</span>, <span class='ident'>adj</span>: <span class='ident'>c_long</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_TIME</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_new</span>() <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_set_issuer_name</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>name</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_set_notAfter</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>tm</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ASN1_TIME</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_set_notBefore</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>tm</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>ASN1_TIME</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_set_version</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>version</span>: <span class='ident'>c_ulong</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_set_pubkey</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>pkey</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_sign</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>pkey</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>md</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_get_pubkey</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_to_X509_REQ</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>pkey</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>EVP_PKEY</span>, <span class='ident'>md</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>EVP_MD</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_EXTENSION_free</span>(<span class='ident'>ext</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_EXTENSION</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_NAME_add_entry_by_txt</span>(<span class='ident'>x</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>field</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>ty</span>: <span class='ident'>c_int</span>, <span class='ident'>bytes</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>c_char</span>, <span class='ident'>len</span>: <span class='ident'>c_int</span>, <span class='ident'>loc</span>: <span class='ident'>c_int</span>, <span class='ident'>set</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_NAME_get_index_by_NID</span>(<span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME</span>, <span class='ident'>nid</span>: <span class='ident'>c_int</span>, <span class='ident'>last_pos</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span><span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_NAME_get_entry</span>(<span class='ident'>n</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME</span>, <span class='ident'>loc</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME_ENTRY</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_NAME_ENTRY_get_data</span>(<span class='ident'>ne</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_NAME_ENTRY</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_STRING</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>ASN1_STRING_to_UTF8</span>(<span class='ident'>out</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>, <span class='ident'>s</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>ASN1_STRING</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_STORE_CTX_get_current_cert</span>(<span class='ident'>ct</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_STORE_CTX_get_error</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_STORE_CTX</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509_STORE_CTX_get_ex_data</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_STORE_CTX</span>, <span class='ident'>idx</span>: <span class='ident'>c_int</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>;
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509V3_EXT_conf_nid</span>(<span class='ident'>conf</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_void</span>, <span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509V3_CTX</span>, <span class='ident'>ext_nid</span>: <span class='ident'>c_int</span>, <span class='ident'>value</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>c_char</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_EXTENSION</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>X509V3_set_ctx</span>(<span class='ident'>ctx</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509V3_CTX</span>, <span class='ident'>issuer</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>subject</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509</span>, <span class='ident'>req</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_REQ</span>, <span class='ident'>crl</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>X509_CRL</span>, <span class='ident'>flags</span>: <span class='ident'>c_int</span>);
+
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>i2d_RSA_PUBKEY</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>d2i_RSA_PUBKEY</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>len</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>i2d_RSAPrivateKey</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>u8</span>) <span class='op'>-&gt;</span> <span class='ident'>c_int</span>;
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>d2i_RSAPrivateKey</span>(<span class='ident'>k</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>, <span class='ident'>buf</span>: <span class='op'>*</span><span class='kw'>const</span> <span class='op'>*</span><span class='kw'>const</span> <span class='ident'>u8</span>, <span class='ident'>len</span>: <span class='ident'>c_uint</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>RSA</span>;
+}
+
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>probe</span>;
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "openssl_sys";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/openssl_sys/probe.rs.html b/src/openssl_sys/probe.rs.html
new file mode 100644
index 0000000..402d897
--- /dev/null
+++ b/src/openssl_sys/probe.rs.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/openssl-sys-0.6.3/src/probe.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>probe.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10">10</span>
+<span id="11">11</span>
+<span id="12">12</span>
+<span id="13">13</span>
+<span id="14">14</span>
+<span id="15">15</span>
+<span id="16">16</span>
+<span id="17">17</span>
+<span id="18">18</span>
+<span id="19">19</span>
+<span id="20">20</span>
+<span id="21">21</span>
+<span id="22">22</span>
+<span id="23">23</span>
+<span id="24">24</span>
+<span id="25">25</span>
+<span id="26">26</span>
+<span id="27">27</span>
+<span id="28">28</span>
+<span id="29">29</span>
+<span id="30">30</span>
+<span id="31">31</span>
+<span id="32">32</span>
+<span id="33">33</span>
+<span id="34">34</span>
+<span id="35">35</span>
+<span id="36">36</span>
+<span id="37">37</span>
+<span id="38">38</span>
+<span id="39">39</span>
+<span id="40">40</span>
+<span id="41">41</span>
+<span id="42">42</span>
+<span id="43">43</span>
+<span id="44">44</span>
+<span id="45">45</span>
+<span id="46">46</span>
+<span id="47">47</span>
+<span id="48">48</span>
+<span id="49">49</span>
+<span id="50">50</span>
+<span id="51">51</span>
+<span id="52">52</span>
+<span id="53">53</span>
+<span id="54">54</span>
+<span id="55">55</span>
+<span id="56">56</span>
+<span id="57">57</span>
+<span id="58">58</span>
+<span id="59">59</span>
+<span id="60">60</span>
+<span id="61">61</span>
+<span id="62">62</span>
+<span id="63">63</span>
+<span id="64">64</span>
+<span id="65">65</span>
+<span id="66">66</span>
+<span id="67">67</span>
+<span id="68">68</span>
+<span id="69">69</span>
+<span id="70">70</span>
+<span id="71">71</span>
+<span id="72">72</span>
+<span id="73">73</span>
+</pre><pre class='rust '>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>env</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fs</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::<span class='ident'>PathBuf</span>;
+
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ProbeResult</span> {
+ <span class='kw'>pub</span> <span class='ident'>cert_file</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>cert_dir</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+}
+
+<span class='doccomment'>/// Probe the system for the directory in which CA certificates should likely be</span>
+<span class='doccomment'>/// found.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This will only search known system locations.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find_certs_dirs</span>() <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span> {
+ <span class='comment'>// see http://gagravarr.org/writing/openssl-certs/others.shtml</span>
+ [
+ <span class='string'>&quot;/var/ssl&quot;</span>,
+ <span class='string'>&quot;/usr/share/ssl&quot;</span>,
+ <span class='string'>&quot;/usr/local/ssl&quot;</span>,
+ <span class='string'>&quot;/usr/local/openssl&quot;</span>,
+ <span class='string'>&quot;/usr/local/share&quot;</span>,
+ <span class='string'>&quot;/usr/lib/ssl&quot;</span>,
+ <span class='string'>&quot;/usr/ssl&quot;</span>,
+ <span class='string'>&quot;/etc/openssl&quot;</span>,
+ <span class='string'>&quot;/etc/pki/tls&quot;</span>,
+ <span class='string'>&quot;/etc/ssl&quot;</span>,
+ ].<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='op'>*</span><span class='ident'>s</span>)).<span class='ident'>filter</span>(<span class='op'>|</span><span class='ident'>p</span><span class='op'>|</span> {
+ <span class='ident'>fs</span>::<span class='ident'>metadata</span>(<span class='ident'>p</span>).<span class='ident'>is_ok</span>()
+ }).<span class='ident'>collect</span>()
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>init_ssl_cert_env_vars</span>() {
+ <span class='kw'>let</span> <span class='ident'>ProbeResult</span> { <span class='ident'>cert_file</span>, <span class='ident'>cert_dir</span> } <span class='op'>=</span> <span class='ident'>probe</span>();
+ <span class='kw'>match</span> <span class='ident'>cert_file</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>path</span>) <span class='op'>=&gt;</span> <span class='ident'>put</span>(<span class='string'>&quot;SSL_CERT_FILE&quot;</span>, <span class='ident'>path</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {}
+ }
+ <span class='kw'>match</span> <span class='ident'>cert_dir</span> {
+ <span class='prelude-val'>Some</span>(<span class='ident'>path</span>) <span class='op'>=&gt;</span> <span class='ident'>put</span>(<span class='string'>&quot;SSL_CERT_DIR&quot;</span>, <span class='ident'>path</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {}
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>put</span>(<span class='ident'>var</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>path</span>: <span class='ident'>PathBuf</span>) {
+ <span class='comment'>// Don&#39;t stomp over what anyone else has set</span>
+ <span class='kw'>match</span> <span class='ident'>env</span>::<span class='ident'>var</span>(<span class='ident'>var</span>) {
+ <span class='prelude-val'>Ok</span>(..) <span class='op'>=&gt;</span> {}
+ <span class='prelude-val'>Err</span>(..) <span class='op'>=&gt;</span> <span class='ident'>env</span>::<span class='ident'>set_var</span>(<span class='ident'>var</span>, <span class='kw-2'>&amp;</span><span class='ident'>path</span>),
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>probe</span>() <span class='op'>-&gt;</span> <span class='ident'>ProbeResult</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>result</span> <span class='op'>=</span> <span class='ident'>ProbeResult</span> {
+ <span class='ident'>cert_file</span>: <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='string'>&quot;SSL_CERT_FILE&quot;</span>).<span class='ident'>map</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>),
+ <span class='ident'>cert_dir</span>: <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='string'>&quot;SSL_CERT_DIR&quot;</span>).<span class='ident'>map</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>),
+ };
+ <span class='kw'>for</span> <span class='ident'>certs_dir</span> <span class='kw'>in</span> <span class='ident'>find_certs_dirs</span>().<span class='ident'>iter</span>() {
+ <span class='comment'>// cert.pem looks to be an openssl 1.0.1 thing, while</span>
+ <span class='comment'>// certs/ca-certificates.crt appears to be a 0.9.8 thing</span>
+ <span class='ident'>try</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>result</span>.<span class='ident'>cert_file</span>, <span class='ident'>certs_dir</span>.<span class='ident'>join</span>(<span class='string'>&quot;cert.pem&quot;</span>));
+ <span class='ident'>try</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>result</span>.<span class='ident'>cert_file</span>, <span class='ident'>certs_dir</span>.<span class='ident'>join</span>(<span class='string'>&quot;certs/ca-certificates.crt&quot;</span>));
+ <span class='ident'>try</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>result</span>.<span class='ident'>cert_file</span>, <span class='ident'>certs_dir</span>.<span class='ident'>join</span>(<span class='string'>&quot;certs/ca-root-nss.crt&quot;</span>));
+
+ <span class='ident'>try</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>result</span>.<span class='ident'>cert_dir</span>, <span class='ident'>certs_dir</span>.<span class='ident'>join</span>(<span class='string'>&quot;certs&quot;</span>));
+ }
+ <span class='ident'>result</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>try</span>(<span class='ident'>dst</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>, <span class='ident'>val</span>: <span class='ident'>PathBuf</span>) {
+ <span class='kw'>if</span> <span class='ident'>dst</span>.<span class='ident'>is_none</span>() <span class='op'>&amp;&amp;</span> <span class='ident'>fs</span>::<span class='ident'>metadata</span>(<span class='kw-2'>&amp;</span><span class='ident'>val</span>).<span class='ident'>is_ok</span>() {
+ <span class='op'>*</span><span class='ident'>dst</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>val</span>);
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "openssl_sys";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/pkg_config/lib.rs.html b/src/pkg_config/lib.rs.html
new file mode 100644
index 0000000..250138e
--- /dev/null
+++ b/src/pkg_config/lib.rs.html
@@ -0,0 +1,679 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/pkg-config-0.3.5/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+</pre><pre class='rust '>
+<span class='doccomment'>//! A build dependency for Cargo libraries to find system artifacts through the</span>
+<span class='doccomment'>//! `pkg-config` utility.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This library will shell out to `pkg-config` as part of build scripts and</span>
+<span class='doccomment'>//! probe the system to determine how to link to a specified library. The</span>
+<span class='doccomment'>//! `Config` structure serves as a method of configuring how `pkg-config` is</span>
+<span class='doccomment'>//! invoked in a builder style.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! A number of environment variables are available to globally configure how</span>
+<span class='doccomment'>//! this crate will invoke `pkg-config`:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! * `PKG_CONFIG_ALLOW_CROSS` - if this variable is not set, then `pkg-config`</span>
+<span class='doccomment'>//! will automatically be disabled for all cross compiles.</span>
+<span class='doccomment'>//! * `FOO_NO_PKG_CONFIG` - if set, this will disable running `pkg-config` when</span>
+<span class='doccomment'>//! probing for the library named `foo`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! There are also a number of environment variables which can configure how a</span>
+<span class='doccomment'>//! library is linked to (dynamically vs statically). These variables control</span>
+<span class='doccomment'>//! whether the `--static` flag is passed. Note that this behavior can be</span>
+<span class='doccomment'>//! overridden by configuring explicitly on `Config`. The variables are checked</span>
+<span class='doccomment'>//! in the following order:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! * `FOO_STATIC` - pass `--static` for the library `foo`</span>
+<span class='doccomment'>//! * `FOO_DYNAMIC` - do not pass `--static` for the library `foo`</span>
+<span class='doccomment'>//! * `PKG_CONFIG_ALL_STATIC` - pass `--static` for all libraries</span>
+<span class='doccomment'>//! * `PKG_CONFIG_ALL_DYNAMIC` - do not pass `--static` for all libraries</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! After running `pkg-config` all appropriate Cargo metadata will be printed on</span>
+<span class='doccomment'>//! stdout if the search was successful.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Example</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Find the system library named `foo`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```no_run</span>
+<span class='doccomment'>//! extern crate pkg_config;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! pkg_config::find_library(&quot;foo&quot;).unwrap();</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Configure how library `foo` is linked to.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```no_run</span>
+<span class='doccomment'>//! extern crate pkg_config;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! pkg_config::Config::new().statik(true).find(&quot;foo&quot;).unwrap();</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://alexcrichton.com/pkg-config-rs&quot;</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>test</span>, <span class='ident'>deny</span>(<span class='ident'>warnings</span>))]</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ascii</span>::<span class='ident'>AsciiExt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>env</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ffi</span>::{<span class='ident'>OsStr</span>, <span class='ident'>OsString</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fs</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>path</span>::{<span class='ident'>PathBuf</span>, <span class='ident'>Path</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>process</span>::<span class='ident'>Command</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>;
+
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>target_supported</span>() <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>env</span>::<span class='ident'>var</span>(<span class='string'>&quot;HOST&quot;</span>) <span class='op'>==</span> <span class='ident'>env</span>::<span class='ident'>var</span>(<span class='string'>&quot;TARGET&quot;</span>) <span class='op'>||</span>
+ <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='string'>&quot;PKG_CONFIG_ALLOW_CROSS&quot;</span>).<span class='ident'>is_some</span>()
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Config</span> {
+ <span class='ident'>statik</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>bool</span><span class='op'>&gt;</span>,
+ <span class='ident'>atleast_version</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='ident'>extra_args</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>OsString</span><span class='op'>&gt;</span>,
+}
+
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Library</span> {
+ <span class='kw'>pub</span> <span class='ident'>libs</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>link_paths</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>frameworks</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>framework_paths</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>include_paths</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>PathBuf</span><span class='op'>&gt;</span>,
+ <span class='kw'>pub</span> <span class='ident'>version</span>: <span class='ident'>String</span>,
+ <span class='ident'>_priv</span>: (),
+}
+
+<span class='doccomment'>/// Simple shortcut for using all default options for finding a library.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find_library</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Library</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='ident'>Config</span>::<span class='ident'>new</span>().<span class='ident'>find</span>(<span class='ident'>name</span>)
+}
+
+<span class='kw'>impl</span> <span class='ident'>Config</span> {
+ <span class='doccomment'>/// Creates a new set of configuration options which are all initially set</span>
+ <span class='doccomment'>/// to &quot;blank&quot;.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Config</span> {
+ <span class='ident'>Config</span> {
+ <span class='ident'>statik</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>atleast_version</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>extra_args</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ }
+ }
+
+ <span class='doccomment'>/// Indicate whether the `--static` flag should be passed.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This will override the inference from environment variables described in</span>
+ <span class='doccomment'>/// the crate documentation.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>statik</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>statik</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>statik</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>statik</span>);
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Indicate that the library must be at least version `vers`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>atleast_version</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>vers</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>atleast_version</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>vers</span>.<span class='ident'>to_string</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Add an argument to pass to pkg-config.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// It&#39;s placed after all of the arguments generated by this library.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>arg</span><span class='op'>&lt;</span><span class='ident'>S</span>: <span class='ident'>AsRef</span><span class='op'>&lt;</span><span class='ident'>OsStr</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>arg</span>: <span class='ident'>S</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Config</span> {
+ <span class='self'>self</span>.<span class='ident'>extra_args</span>.<span class='ident'>push</span>(<span class='ident'>arg</span>.<span class='ident'>as_ref</span>().<span class='ident'>to_os_string</span>());
+ <span class='self'>self</span>
+ }
+
+ <span class='doccomment'>/// Run `pkg-config` to find the library `name`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This will use all configuration previously set to specify how</span>
+ <span class='doccomment'>/// `pkg-config` is run.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Library</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_NO_PKG_CONFIG&quot;</span>, <span class='ident'>envify</span>(<span class='ident'>name</span>))).<span class='ident'>is_some</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;pkg-config requested to be aborted for {}&quot;</span>, <span class='ident'>name</span>))
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>target_supported</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='string'>&quot;pkg-config doesn&#39;t handle cross compilation. Use \
+ PKG_CONFIG_ALLOW_CROSS=1 to override&quot;</span>.<span class='ident'>to_string</span>());
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>library</span> <span class='op'>=</span> <span class='ident'>Library</span>::<span class='ident'>new</span>();
+
+ <span class='kw'>let</span> <span class='ident'>output</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>run</span>(<span class='self'>self</span>.<span class='ident'>command</span>(<span class='ident'>name</span>, <span class='kw-2'>&amp;</span>[<span class='string'>&quot;--libs&quot;</span>, <span class='string'>&quot;--cflags&quot;</span>])));
+ <span class='ident'>library</span>.<span class='ident'>parse_libs_cflags</span>(<span class='ident'>name</span>, <span class='kw-2'>&amp;</span><span class='ident'>output</span>, <span class='self'>self</span>);
+
+ <span class='kw'>let</span> <span class='ident'>output</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>run</span>(<span class='self'>self</span>.<span class='ident'>command</span>(<span class='ident'>name</span>, <span class='kw-2'>&amp;</span>[<span class='string'>&quot;--modversion&quot;</span>])));
+ <span class='ident'>library</span>.<span class='ident'>parse_modversion</span>(<span class='kw-2'>&amp;</span><span class='ident'>output</span>);
+
+ <span class='prelude-val'>Ok</span>(<span class='ident'>library</span>)
+ }
+
+ <span class='doccomment'>/// Run `pkg-config` to get the value of a variable from a package using</span>
+ <span class='doccomment'>/// --variable.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>get_variable</span>(<span class='ident'>package</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>variable</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>String</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>arg</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;--variable={}&quot;</span>, <span class='ident'>variable</span>);
+ <span class='kw'>let</span> <span class='ident'>cfg</span> <span class='op'>=</span> <span class='ident'>Config</span>::<span class='ident'>new</span>();
+ <span class='prelude-val'>Ok</span>(<span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>run</span>(<span class='ident'>cfg</span>.<span class='ident'>command</span>(<span class='ident'>package</span>, <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span><span class='ident'>arg</span>]))).<span class='ident'>trim_right</span>().<span class='ident'>to_owned</span>())
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>is_static</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>statik</span>.<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> <span class='ident'>infer_static</span>(<span class='ident'>name</span>))
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>command</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>args</span>: <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span><span class='ident'>str</span>]) <span class='op'>-&gt;</span> <span class='ident'>Command</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cmd</span> <span class='op'>=</span> <span class='ident'>Command</span>::<span class='ident'>new</span>(<span class='string'>&quot;pkg-config&quot;</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>is_static</span>(<span class='ident'>name</span>) {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='string'>&quot;--static&quot;</span>);
+ }
+ <span class='ident'>cmd</span>.<span class='ident'>args</span>(<span class='ident'>args</span>)
+ .<span class='ident'>args</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>extra_args</span>)
+ .<span class='ident'>env</span>(<span class='string'>&quot;PKG_CONFIG_ALLOW_SYSTEM_LIBS&quot;</span>, <span class='string'>&quot;1&quot;</span>);
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>version</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>atleast_version</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{} &gt;= {}&quot;</span>, <span class='ident'>name</span>, <span class='ident'>version</span>));
+ } <span class='kw'>else</span> {
+ <span class='ident'>cmd</span>.<span class='ident'>arg</span>(<span class='ident'>name</span>);
+ }
+ <span class='ident'>cmd</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Library</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Library</span> {
+ <span class='ident'>Library</span> {
+ <span class='ident'>libs</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>link_paths</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>include_paths</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>frameworks</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>framework_paths</span>: <span class='ident'>Vec</span>::<span class='ident'>new</span>(),
+ <span class='ident'>version</span>: <span class='ident'>String</span>::<span class='ident'>new</span>(),
+ <span class='ident'>_priv</span>: (),
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>parse_libs_cflags</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>output</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>config</span>: <span class='kw-2'>&amp;</span><span class='ident'>Config</span>) {
+ <span class='kw'>let</span> <span class='ident'>parts</span> <span class='op'>=</span> <span class='ident'>output</span>.<span class='ident'>split</span>(<span class='string'>&#39; &#39;</span>)
+ .<span class='ident'>filter</span>(<span class='op'>|</span><span class='ident'>l</span><span class='op'>|</span> <span class='ident'>l</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>2</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>arg</span><span class='op'>|</span> (<span class='kw-2'>&amp;</span><span class='ident'>arg</span>[<span class='number'>0</span>..<span class='number'>2</span>], <span class='kw-2'>&amp;</span><span class='ident'>arg</span>[<span class='number'>2</span>..]))
+ .<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span>_<span class='op'>&gt;&gt;</span>();
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>dirs</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='ident'>statik</span> <span class='op'>=</span> <span class='ident'>config</span>.<span class='ident'>is_static</span>(<span class='ident'>name</span>);
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='ident'>flag</span>, <span class='ident'>val</span>) <span class='kw'>in</span> <span class='ident'>parts</span>.<span class='ident'>iter</span>() {
+ <span class='kw'>match</span> <span class='ident'>flag</span> {
+ <span class='string'>&quot;-L&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-search=native={}&quot;</span>, <span class='ident'>val</span>);
+ <span class='ident'>dirs</span>.<span class='ident'>push</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>val</span>));
+ <span class='self'>self</span>.<span class='ident'>link_paths</span>.<span class='ident'>push</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>val</span>));
+ }
+ <span class='string'>&quot;-F&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-search=framework={}&quot;</span>, <span class='ident'>val</span>);
+ <span class='self'>self</span>.<span class='ident'>framework_paths</span>.<span class='ident'>push</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>val</span>));
+ }
+ <span class='string'>&quot;-I&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>include_paths</span>.<span class='ident'>push</span>(<span class='ident'>PathBuf</span>::<span class='ident'>from</span>(<span class='ident'>val</span>));
+ }
+ <span class='string'>&quot;-l&quot;</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>libs</span>.<span class='ident'>push</span>(<span class='ident'>val</span>.<span class='ident'>to_string</span>());
+ <span class='kw'>if</span> <span class='ident'>statik</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='ident'>is_system</span>(<span class='ident'>val</span>, <span class='kw-2'>&amp;</span><span class='ident'>dirs</span>) {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-lib=static={}&quot;</span>, <span class='ident'>val</span>);
+ } <span class='kw'>else</span> {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-lib={}&quot;</span>, <span class='ident'>val</span>);
+ }
+ }
+ _ <span class='op'>=&gt;</span> {}
+ }
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>iter</span> <span class='op'>=</span> <span class='ident'>output</span>.<span class='ident'>split</span>(<span class='string'>&#39; &#39;</span>);
+ <span class='kw'>while</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>part</span>) <span class='op'>=</span> <span class='ident'>iter</span>.<span class='ident'>next</span>() {
+ <span class='kw'>if</span> <span class='ident'>part</span> <span class='op'>!=</span> <span class='string'>&quot;-framework&quot;</span> { <span class='kw'>continue</span> }
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>lib</span>) <span class='op'>=</span> <span class='ident'>iter</span>.<span class='ident'>next</span>() {
+ <span class='macro'>println</span><span class='macro'>!</span>(<span class='string'>&quot;cargo:rustc-link-lib=framework={}&quot;</span>, <span class='ident'>lib</span>);
+ <span class='self'>self</span>.<span class='ident'>frameworks</span>.<span class='ident'>push</span>(<span class='ident'>lib</span>.<span class='ident'>to_string</span>());
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>parse_modversion</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>output</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) {
+ <span class='self'>self</span>.<span class='ident'>version</span>.<span class='ident'>push_str</span>(<span class='ident'>output</span>.<span class='ident'>trim</span>());
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>infer_static</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='ident'>envify</span>(<span class='ident'>name</span>);
+ <span class='kw'>if</span> <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_STATIC&quot;</span>, <span class='ident'>name</span>)).<span class='ident'>is_some</span>() {
+ <span class='boolval'>true</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}_DYNAMIC&quot;</span>, <span class='ident'>name</span>)).<span class='ident'>is_some</span>() {
+ <span class='boolval'>false</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='string'>&quot;PKG_CONFIG_ALL_STATIC&quot;</span>).<span class='ident'>is_some</span>() {
+ <span class='boolval'>true</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>env</span>::<span class='ident'>var_os</span>(<span class='string'>&quot;PKG_CONFIG_ALL_DYNAMIC&quot;</span>).<span class='ident'>is_some</span>() {
+ <span class='boolval'>false</span>
+ } <span class='kw'>else</span> {
+ <span class='boolval'>false</span>
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>envify</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='ident'>name</span>.<span class='ident'>chars</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>to_ascii_uppercase</span>()).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> {
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>==</span> <span class='string'>&#39;-&#39;</span> {<span class='string'>&#39;_&#39;</span>} <span class='kw'>else</span> {<span class='ident'>c</span>}
+ }).<span class='ident'>collect</span>()
+}
+
+<span class='kw'>fn</span> <span class='ident'>is_system</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>dirs</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>PathBuf</span>]) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>libname</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;lib{}.a&quot;</span>, <span class='ident'>name</span>);
+ <span class='kw'>let</span> <span class='ident'>root</span> <span class='op'>=</span> <span class='ident'>Path</span>::<span class='ident'>new</span>(<span class='string'>&quot;/usr&quot;</span>);
+ <span class='op'>!</span><span class='ident'>dirs</span>.<span class='ident'>iter</span>().<span class='ident'>any</span>(<span class='op'>|</span><span class='ident'>d</span><span class='op'>|</span> {
+ <span class='op'>!</span><span class='ident'>d</span>.<span class='ident'>starts_with</span>(<span class='ident'>root</span>) <span class='op'>&amp;&amp;</span> <span class='ident'>fs</span>::<span class='ident'>metadata</span>(<span class='kw-2'>&amp;</span><span class='ident'>d</span>.<span class='ident'>join</span>(<span class='kw-2'>&amp;</span><span class='ident'>libname</span>)).<span class='ident'>is_ok</span>()
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>run</span>(<span class='kw-2'>mut</span> <span class='ident'>cmd</span>: <span class='ident'>Command</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>String</span>, <span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>out</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>cmd</span>.<span class='ident'>output</span>().<span class='ident'>map_err</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> {
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;failed to run `{:?}`: {}&quot;</span>, <span class='ident'>cmd</span>, <span class='ident'>e</span>)
+ }));
+
+ <span class='kw'>let</span> <span class='ident'>stdout</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>from_utf8</span>(<span class='ident'>out</span>.<span class='ident'>stdout</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>if</span> <span class='ident'>out</span>.<span class='ident'>status</span>.<span class='ident'>success</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>stdout</span>);
+ }
+
+ <span class='kw'>let</span> <span class='ident'>stderr</span> <span class='op'>=</span> <span class='ident'>str</span>::<span class='ident'>from_utf8</span>(<span class='kw-2'>&amp;</span><span class='ident'>out</span>.<span class='ident'>stderr</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>msg</span> <span class='op'>=</span> <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;`{:?}` did not exit successfully: {}&quot;</span>, <span class='ident'>cmd</span>, <span class='ident'>out</span>.<span class='ident'>status</span>);
+ <span class='kw'>if</span> <span class='ident'>stdout</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='ident'>msg</span>.<span class='ident'>push_str</span>(<span class='string'>&quot;\n--- stdout\n&quot;</span>);
+ <span class='ident'>msg</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>stdout</span>);
+ }
+ <span class='kw'>if</span> <span class='ident'>stderr</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='ident'>msg</span>.<span class='ident'>push_str</span>(<span class='string'>&quot;\n--- stderr\n&quot;</span>);
+ <span class='ident'>msg</span>.<span class='ident'>push_str</span>(<span class='ident'>stderr</span>);
+ }
+
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='ident'>msg</span>);
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "pkg_config";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex/char.rs.html b/src/regex/char.rs.html
new file mode 100644
index 0000000..f830f03
--- /dev/null
+++ b/src/regex/char.rs.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-0.1.38/src/char.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>char.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::<span class='ident'>Ordering</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>u32</span>;
+
+<span class='kw'>use</span> <span class='ident'>syntax</span>;
+
+<span class='doccomment'>/// An inline representation of `Option&lt;char&gt;`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This eliminates the need to do case analysis on `Option&lt;char&gt;` to determine</span>
+<span class='doccomment'>/// ordinality with other characters.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// (The `Option&lt;char&gt;` is not related to encoding. Instead, it is used in the</span>
+<span class='doccomment'>/// matching engines to represent the beginning and ending boundaries of the</span>
+<span class='doccomment'>/// search text.)</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Hash</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>, <span class='ident'>PartialOrd</span>, <span class='ident'>Ord</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Char</span>(<span class='ident'>u32</span>);
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>Char</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>match</span> <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='self'>self</span>.<span class='number'>0</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Empty&quot;</span>),
+ <span class='prelude-val'>Some</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{:?}&quot;</span>, <span class='ident'>c</span>),
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Char</span> {
+ <span class='doccomment'>/// Returns true iff the character is absent.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_none</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='self'>self</span>.<span class='number'>0</span> <span class='op'>==</span> <span class='ident'>u32</span>::<span class='ident'>MAX</span> }
+
+ <span class='doccomment'>/// Returns the length of the character&#39;s UTF-8 encoding.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the character is absent, then `0` is returned.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>len_utf8</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='self'>self</span>.<span class='number'>0</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>len_utf8</span>()).<span class='ident'>unwrap_or</span>(<span class='number'>0</span>)
+ }
+
+ <span class='doccomment'>/// Returns the simple case folding of this character.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the character is absent, then absence is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>case_fold</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Char</span> {
+ <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='self'>self</span>.<span class='number'>0</span>).<span class='ident'>map</span>(<span class='ident'>syntax</span>::<span class='ident'>simple_case_fold</span>).<span class='ident'>into</span>()
+ }
+
+ <span class='doccomment'>/// Returns true iff the character is a word character.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the character is absent, then false is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_word_char</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='self'>self</span>.<span class='number'>0</span>).<span class='ident'>map</span>(<span class='ident'>syntax</span>::<span class='ident'>is_word_char</span>).<span class='ident'>unwrap_or</span>(<span class='boolval'>false</span>)
+ }
+
+ <span class='doccomment'>/// Converts the character to a real primitive `char`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If the character is absent, then `None` is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>as_char</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> {
+ <span class='comment'>// This is only used in the `regex!` macro because it expands char</span>
+ <span class='comment'>// classes into `match` expressions (instead of binary search).</span>
+ <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='self'>self</span>.<span class='number'>0</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>Char</span> {
+ <span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>Char</span> { <span class='ident'>Char</span>(<span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u32</span>) }
+}
+
+<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;&gt;</span> <span class='kw'>for</span> <span class='ident'>Char</span> {
+ <span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>c</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Char</span> {
+ <span class='ident'>c</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>into</span>()).<span class='ident'>unwrap_or</span>(<span class='ident'>Char</span>(<span class='ident'>u32</span>::<span class='ident'>MAX</span>))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>Char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='self'>self</span>.<span class='number'>0</span> <span class='op'>==</span> <span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>u32</span> }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>Char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>Char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>u32</span> <span class='op'>==</span> <span class='ident'>other</span>.<span class='number'>0</span> }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>Char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='number'>0</span>.<span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span>(<span class='op'>*</span><span class='ident'>other</span> <span class='kw'>as</span> <span class='ident'>u32</span>))
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>Char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>Char</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ (<span class='op'>*</span><span class='self'>self</span> <span class='kw'>as</span> <span class='ident'>u32</span>).<span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='ident'>other</span>.<span class='number'>0</span>)
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex/input.rs.html b/src/regex/input.rs.html
new file mode 100644
index 0000000..dfe5571
--- /dev/null
+++ b/src/regex/input.rs.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-0.1.38/src/input.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>input.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>;
+
+<span class='kw'>use</span> <span class='ident'>char</span>::<span class='ident'>Char</span>;
+<span class='kw'>use</span> <span class='ident'>prefix</span>::<span class='ident'>Prefix</span>;
+
+<span class='doccomment'>/// Represents a location in the input.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>InputAt</span> {
+ <span class='ident'>pos</span>: <span class='ident'>usize</span>,
+ <span class='ident'>c</span>: <span class='ident'>Char</span>,
+ <span class='ident'>len</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>InputAt</span> {
+ <span class='doccomment'>/// Returns true iff this position is at the beginning of the input.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_beginning</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>pos</span> <span class='op'>==</span> <span class='number'>0</span>
+ }
+
+ <span class='doccomment'>/// Returns the character at this position.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If this position is just before or after the input, then an absent</span>
+ <span class='doccomment'>/// character is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>char</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Char</span> {
+ <span class='self'>self</span>.<span class='ident'>c</span>
+ }
+
+ <span class='doccomment'>/// Returns the UTF-8 width of the character at this position.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>len</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>len</span>
+ }
+
+ <span class='doccomment'>/// Returns the byte offset of this position.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pos</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>pos</span>
+ }
+
+ <span class='doccomment'>/// Returns the byte offset of the next position in the input.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>next_pos</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>pos</span> <span class='op'>+</span> <span class='self'>self</span>.<span class='ident'>len</span>
+ }
+}
+
+<span class='doccomment'>/// An abstraction over input used in the matching engines.</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Input</span> {
+ <span class='doccomment'>/// Return an encoding of the position at byte offset `i`.</span>
+ <span class='kw'>fn</span> <span class='ident'>at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>InputAt</span>;
+ <span class='doccomment'>/// Return an encoding of the char position just prior to byte offset `i`.</span>
+ <span class='kw'>fn</span> <span class='ident'>previous_at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>InputAt</span>;
+ <span class='doccomment'>/// Scan the input for a matching prefix.</span>
+ <span class='kw'>fn</span> <span class='ident'>prefix_at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>prefixes</span>: <span class='kw-2'>&amp;</span><span class='ident'>Prefix</span>, <span class='ident'>at</span>: <span class='ident'>InputAt</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>InputAt</span><span class='op'>&gt;</span>;
+}
+
+<span class='doccomment'>/// An input reader over characters.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// (This is the only implementation of `Input` at the moment.)</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>);
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='doccomment'>/// Return a new character input reader for the given string.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>CharInput</span>(<span class='ident'>s</span>)
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>ops</span>::<span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>str</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='number'>0</span>
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Input</span> <span class='kw'>for</span> <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='comment'>// This `inline(always)` increases throughput by almost 25% on the `hard`</span>
+ <span class='comment'>// benchmarks over a normal `inline` annotation.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// I&#39;m not sure why `#[inline]` isn&#39;t enough to convince LLVM, but it is</span>
+ <span class='comment'>// used *a lot* in the guts of the matching engines.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>InputAt</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='self'>self</span>[<span class='ident'>i</span>..].<span class='ident'>chars</span>().<span class='ident'>next</span>().<span class='ident'>into</span>();
+ <span class='ident'>InputAt</span> {
+ <span class='ident'>pos</span>: <span class='ident'>i</span>,
+ <span class='ident'>c</span>: <span class='ident'>c</span>,
+ <span class='ident'>len</span>: <span class='ident'>c</span>.<span class='ident'>len_utf8</span>(),
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>previous_at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>InputAt</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span>: <span class='ident'>Char</span> <span class='op'>=</span> <span class='self'>self</span>[..<span class='ident'>i</span>].<span class='ident'>chars</span>().<span class='ident'>rev</span>().<span class='ident'>next</span>().<span class='ident'>into</span>();
+ <span class='kw'>let</span> <span class='ident'>len</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>len_utf8</span>();
+ <span class='ident'>InputAt</span> {
+ <span class='ident'>pos</span>: <span class='ident'>i</span> <span class='op'>-</span> <span class='ident'>len</span>,
+ <span class='ident'>c</span>: <span class='ident'>c</span>,
+ <span class='ident'>len</span>: <span class='ident'>len</span>,
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>prefix_at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>prefixes</span>: <span class='kw-2'>&amp;</span><span class='ident'>Prefix</span>, <span class='ident'>at</span>: <span class='ident'>InputAt</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>InputAt</span><span class='op'>&gt;</span> {
+ <span class='ident'>prefixes</span>.<span class='ident'>find</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>[<span class='ident'>at</span>.<span class='ident'>pos</span>()..]).<span class='ident'>map</span>(<span class='op'>|</span>(<span class='ident'>s</span>, _)<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>at</span>(<span class='ident'>at</span>.<span class='ident'>pos</span>() <span class='op'>+</span> <span class='ident'>s</span>))
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex/lib.rs.html b/src/regex/lib.rs.html
new file mode 100644
index 0000000..8331db1
--- /dev/null
+++ b/src/regex/lib.rs.html
@@ -0,0 +1,959 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-0.1.38/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='doccomment'>//! This crate provides a native implementation of regular expressions that is</span>
+<span class='doccomment'>//! heavily based on RE2 both in syntax and in implementation. Notably,</span>
+<span class='doccomment'>//! backreferences and arbitrary lookahead/lookbehind assertions are not</span>
+<span class='doccomment'>//! provided. In return, regular expression searching provided by this package</span>
+<span class='doccomment'>//! has excellent worst-case performance. The specific syntax supported is</span>
+<span class='doccomment'>//! documented further down.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This crate&#39;s documentation provides some simple examples, describes Unicode</span>
+<span class='doccomment'>//! support and exhaustively lists the supported syntax. For more specific</span>
+<span class='doccomment'>//! details on the API, please see the documentation for the `Regex` type.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Usage</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This crate is [on crates.io](https://crates.io/crates/regex) and can be</span>
+<span class='doccomment'>//! used by adding `regex` to your dependencies in your project&#39;s `Cargo.toml`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```toml</span>
+<span class='doccomment'>//! [dependencies]</span>
+<span class='doccomment'>//! regex = &quot;0.1.8&quot;</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! and this to your crate root:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! extern crate regex;</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # First example: find a date</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! General use of regular expressions in this package involves compiling an</span>
+<span class='doccomment'>//! expression and then using it to search, split or replace text. For example,</span>
+<span class='doccomment'>//! to confirm that some text resembles a date:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! use regex::Regex;</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;^\d{4}-\d{2}-\d{2}$&quot;).unwrap();</span>
+<span class='doccomment'>//! assert!(re.is_match(&quot;2014-01-01&quot;));</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Notice the use of the `^` and `$` anchors. In this crate, every expression</span>
+<span class='doccomment'>//! is executed with an implicit `.*?` at the beginning and end, which allows</span>
+<span class='doccomment'>//! it to match anywhere in the text. Anchors can be used to ensure that the</span>
+<span class='doccomment'>//! full text matches an expression.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This example also demonstrates the utility of</span>
+<span class='doccomment'>//! [raw strings](http://doc.rust-lang.org/stable/reference.html#raw-byte-string-literals)</span>
+<span class='doccomment'>//! in Rust, which</span>
+<span class='doccomment'>//! are just like regular strings except they are prefixed with an `r` and do</span>
+<span class='doccomment'>//! not process any escape sequences. For example, `&quot;\\d&quot;` is the same</span>
+<span class='doccomment'>//! expression as `r&quot;\d&quot;`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # The `regex!` macro</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Rust&#39;s compile-time meta-programming facilities provide a way to write a</span>
+<span class='doccomment'>//! `regex!` macro which compiles regular expressions *when your program</span>
+<span class='doccomment'>//! compiles*. Said differently, if you only use `regex!` to build regular</span>
+<span class='doccomment'>//! expressions in your program, then your program cannot compile with an</span>
+<span class='doccomment'>//! invalid regular expression. Moreover, the `regex!` macro compiles the</span>
+<span class='doccomment'>//! given expression to native Rust code, which ideally makes it faster.</span>
+<span class='doccomment'>//! Unfortunately (or fortunately), the dynamic implementation has had a lot</span>
+<span class='doccomment'>//! more optimization work put it into it currently, so it is faster than</span>
+<span class='doccomment'>//! the `regex!` macro in most cases.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! To use the `regex!` macro, you must enable the `plugin` feature and import</span>
+<span class='doccomment'>//! the `regex_macros` crate as a syntax extension:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```ignore</span>
+<span class='doccomment'>//! #![feature(plugin)]</span>
+<span class='doccomment'>//! #![plugin(regex_macros)]</span>
+<span class='doccomment'>//! extern crate regex;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! fn main() {</span>
+<span class='doccomment'>//! let re = regex!(r&quot;^\d{4}-\d{2}-\d{2}$&quot;);</span>
+<span class='doccomment'>//! assert!(re.is_match(&quot;2014-01-01&quot;));</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! There are a few things worth mentioning about using the `regex!` macro.</span>
+<span class='doccomment'>//! Firstly, the `regex!` macro *only* accepts string *literals*.</span>
+<span class='doccomment'>//! Secondly, the `regex` crate *must* be linked with the name `regex` since</span>
+<span class='doccomment'>//! the generated code depends on finding symbols in the `regex` crate.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! One downside of using the `regex!` macro is that it can increase the</span>
+<span class='doccomment'>//! size of your program&#39;s binary since it generates specialized Rust code.</span>
+<span class='doccomment'>//! The extra size probably won&#39;t be significant for a small number of</span>
+<span class='doccomment'>//! expressions, but 100+ calls to `regex!` will probably result in a</span>
+<span class='doccomment'>//! noticeably bigger binary.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! **NOTE**: This is implemented using a compiler plugin, which is not</span>
+<span class='doccomment'>//! available on the Rust 1.0 beta/stable channels. Therefore, you&#39;ll only</span>
+<span class='doccomment'>//! be able to use `regex!` on the nightlies.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Example: iterating over capture groups</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This crate provides convenient iterators for matching an expression</span>
+<span class='doccomment'>//! repeatedly against a search string to find successive non-overlapping</span>
+<span class='doccomment'>//! matches. For example, to find all dates in a string and be able to access</span>
+<span class='doccomment'>//! them by their component pieces:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;(\d{4})-(\d{2})-(\d{2})&quot;).unwrap();</span>
+<span class='doccomment'>//! let text = &quot;2012-03-14, 2013-01-01 and 2014-07-05&quot;;</span>
+<span class='doccomment'>//! for cap in re.captures_iter(text) {</span>
+<span class='doccomment'>//! println!(&quot;Month: {} Day: {} Year: {}&quot;,</span>
+<span class='doccomment'>//! cap.at(2).unwrap_or(&quot;&quot;), cap.at(3).unwrap_or(&quot;&quot;),</span>
+<span class='doccomment'>//! cap.at(1).unwrap_or(&quot;&quot;));</span>
+<span class='doccomment'>//! }</span>
+<span class='doccomment'>//! // Output:</span>
+<span class='doccomment'>//! // Month: 03 Day: 14 Year: 2012</span>
+<span class='doccomment'>//! // Month: 01 Day: 01 Year: 2013</span>
+<span class='doccomment'>//! // Month: 07 Day: 05 Year: 2014</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Notice that the year is in the capture group indexed at `1`. This is</span>
+<span class='doccomment'>//! because the *entire match* is stored in the capture group at index `0`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Example: replacement with named capture groups</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Building on the previous example, perhaps we&#39;d like to rearrange the date</span>
+<span class='doccomment'>//! formats. This can be done with text replacement. But to make the code</span>
+<span class='doccomment'>//! clearer, we can *name* our capture groups and use those names as variables</span>
+<span class='doccomment'>//! in our replacement text:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;(?P&lt;y&gt;\d{4})-(?P&lt;m&gt;\d{2})-(?P&lt;d&gt;\d{2})&quot;).unwrap();</span>
+<span class='doccomment'>//! let before = &quot;2012-03-14, 2013-01-01 and 2014-07-05&quot;;</span>
+<span class='doccomment'>//! let after = re.replace_all(before, &quot;$m/$d/$y&quot;);</span>
+<span class='doccomment'>//! assert_eq!(after, &quot;03/14/2012, 01/01/2013 and 07/05/2014&quot;);</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The `replace` methods are actually polymorphic in the replacement, which</span>
+<span class='doccomment'>//! provides more flexibility than is seen here. (See the documentation for</span>
+<span class='doccomment'>//! `Regex::replace` for more details.)</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Note that if your regex gets complicated, you can use the `x` flag to</span>
+<span class='doccomment'>//! enable insigificant whitespace mode, which also lets you write comments:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;(?x)</span>
+<span class='doccomment'>//! (?P&lt;y&gt;\d{4}) # the year</span>
+<span class='doccomment'>//! -</span>
+<span class='doccomment'>//! (?P&lt;m&gt;\d{2}) # the month</span>
+<span class='doccomment'>//! -</span>
+<span class='doccomment'>//! (?P&lt;d&gt;\d{2}) # the day</span>
+<span class='doccomment'>//! &quot;).unwrap();</span>
+<span class='doccomment'>//! let before = &quot;2012-03-14, 2013-01-01 and 2014-07-05&quot;;</span>
+<span class='doccomment'>//! let after = re.replace_all(before, &quot;$m/$d/$y&quot;);</span>
+<span class='doccomment'>//! assert_eq!(after, &quot;03/14/2012, 01/01/2013 and 07/05/2014&quot;);</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Pay for what you use</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! With respect to searching text with a regular expression, there are three</span>
+<span class='doccomment'>//! questions that can be asked:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! 1. Does the text match this expression?</span>
+<span class='doccomment'>//! 2. If so, where does it match?</span>
+<span class='doccomment'>//! 3. Where are the submatches?</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Generally speaking, this crate could provide a function to answer only #3,</span>
+<span class='doccomment'>//! which would subsume #1 and #2 automatically. However, it can be</span>
+<span class='doccomment'>//! significantly more expensive to compute the location of submatches, so it&#39;s</span>
+<span class='doccomment'>//! best not to do it if you don&#39;t need to.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Therefore, only use what you need. For example, don&#39;t use `find` if you</span>
+<span class='doccomment'>//! only need to test if an expression matches a string. (Use `is_match`</span>
+<span class='doccomment'>//! instead.)</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Unicode</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This implementation executes regular expressions **only** on sequences of</span>
+<span class='doccomment'>//! Unicode scalar values while exposing match locations as byte indices into</span>
+<span class='doccomment'>//! the search string.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Currently, only simple case folding is supported. Namely, when matching</span>
+<span class='doccomment'>//! case-insensitively, the characters are first mapped using the</span>
+<span class='doccomment'>//! [simple case folding](ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt)</span>
+<span class='doccomment'>//! mapping.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Regular expressions themselves are also **only** interpreted as a sequence</span>
+<span class='doccomment'>//! of Unicode scalar values. This means you can use Unicode characters</span>
+<span class='doccomment'>//! directly in your expression:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;(?i)Δ+&quot;).unwrap();</span>
+<span class='doccomment'>//! assert_eq!(re.find(&quot;ΔδΔ&quot;), Some((0, 6)));</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Finally, Unicode general categories and scripts are available as character</span>
+<span class='doccomment'>//! classes. For example, you can match a sequence of numerals, Greek or</span>
+<span class='doccomment'>//! Cherokee letters:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;[\pN\p{Greek}\p{Cherokee}]+&quot;).unwrap();</span>
+<span class='doccomment'>//! assert_eq!(re.find(&quot;abcΔᎠβⅠᏴγδⅡxyz&quot;), Some((3, 23)));</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Syntax</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! The syntax supported in this crate is almost in an exact correspondence</span>
+<span class='doccomment'>//! with the syntax supported by RE2. It is documented below.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Note that the regular expression parser and abstract syntax are exposed in</span>
+<span class='doccomment'>//! a separate crate,</span>
+<span class='doccomment'>//! [`regex-syntax`](../regex_syntax/index.html).</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Matching one character</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! . any character except new line (includes new line with s flag)</span>
+<span class='doccomment'>//! [xyz] A character class matching either x, y or z.</span>
+<span class='doccomment'>//! [^xyz] A character class matching any character except x, y and z.</span>
+<span class='doccomment'>//! [a-z] A character class matching any character in range a-z.</span>
+<span class='doccomment'>//! \d digit (\p{Nd})</span>
+<span class='doccomment'>//! \D not digit</span>
+<span class='doccomment'>//! [:alpha:] ASCII character class ([A-Za-z])</span>
+<span class='doccomment'>//! [:^alpha:] Negated ASCII character class ([^A-Za-z])</span>
+<span class='doccomment'>//! \pN One-letter name Unicode character class</span>
+<span class='doccomment'>//! \p{Greek} Unicode character class (general category or script)</span>
+<span class='doccomment'>//! \PN Negated one-letter name Unicode character class</span>
+<span class='doccomment'>//! \P{Greek} negated Unicode character class (general category or script)</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Any named character class may appear inside a bracketed `[...]` character</span>
+<span class='doccomment'>//! class. For example, `[\p{Greek}\pN]` matches any Greek or numeral</span>
+<span class='doccomment'>//! character.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Composites</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! xy concatenation (x followed by y)</span>
+<span class='doccomment'>//! x|y alternation (x or y, prefer x)</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Repetitions</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! x* zero or more of x (greedy)</span>
+<span class='doccomment'>//! x+ one or more of x (greedy)</span>
+<span class='doccomment'>//! x? zero or one of x (greedy)</span>
+<span class='doccomment'>//! x*? zero or more of x (ungreedy)</span>
+<span class='doccomment'>//! x+? one or more of x (ungreedy)</span>
+<span class='doccomment'>//! x?? zero or one of x (ungreedy)</span>
+<span class='doccomment'>//! x{n,m} at least n x and at most m x (greedy)</span>
+<span class='doccomment'>//! x{n,} at least n x (greedy)</span>
+<span class='doccomment'>//! x{n} exactly n x</span>
+<span class='doccomment'>//! x{n,m}? at least n x and at most m x (ungreedy)</span>
+<span class='doccomment'>//! x{n,}? at least n x (ungreedy)</span>
+<span class='doccomment'>//! x{n}? exactly n x</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Empty matches</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! ^ the beginning of text (or start-of-line with multi-line mode)</span>
+<span class='doccomment'>//! $ the end of text (or end-of-line with multi-line mode)</span>
+<span class='doccomment'>//! \A only the beginning of text (even with multi-line mode enabled)</span>
+<span class='doccomment'>//! \z only the end of text (even with multi-line mode enabled)</span>
+<span class='doccomment'>//! \b a Unicode word boundary (\w on one side and \W, \A, or \z on other)</span>
+<span class='doccomment'>//! \B not a Unicode word boundary</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Grouping and flags</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! (exp) numbered capture group (indexed by opening parenthesis)</span>
+<span class='doccomment'>//! (?P&amp;lt;name&amp;gt;exp) named (also numbered) capture group (allowed chars: [_0-9a-zA-Z])</span>
+<span class='doccomment'>//! (?:exp) non-capturing group</span>
+<span class='doccomment'>//! (?flags) set flags within current group</span>
+<span class='doccomment'>//! (?flags:exp) set flags for exp (non-capturing)</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Flags are each a single character. For example, `(?x)` sets the flag `x`</span>
+<span class='doccomment'>//! and `(?-x)` clears the flag `x`. Multiple flags can be set or cleared at</span>
+<span class='doccomment'>//! the same time: `(?xy)` sets both the `x` and `y` flags and `(?x-y)` sets</span>
+<span class='doccomment'>//! the `x` flag and clears the `y` flag.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! All flags are by default disabled. They are:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! i case-insensitive</span>
+<span class='doccomment'>//! m multi-line mode: ^ and $ match begin/end of line</span>
+<span class='doccomment'>//! s allow . to match \n</span>
+<span class='doccomment'>//! U swap the meaning of x* and x*?</span>
+<span class='doccomment'>//! x ignore whitespace and allow line comments (starting with `#`)</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Here&#39;s an example that matches case-insensitively for only part of the</span>
+<span class='doccomment'>//! expression:</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ```rust</span>
+<span class='doccomment'>//! # extern crate regex; use regex::Regex;</span>
+<span class='doccomment'>//! # fn main() {</span>
+<span class='doccomment'>//! let re = Regex::new(r&quot;(?i)a+(?-i)b+&quot;).unwrap();</span>
+<span class='doccomment'>//! let cap = re.captures(&quot;AaAaAbbBBBb&quot;).unwrap();</span>
+<span class='doccomment'>//! assert_eq!(cap.at(0), Some(&quot;AaAaAbb&quot;));</span>
+<span class='doccomment'>//! # }</span>
+<span class='doccomment'>//! ```</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Notice that the `a+` matches either `a` or `A`, but the `b+` only matches</span>
+<span class='doccomment'>//! `b`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Escape sequences</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! \* literal *, works for any punctuation character: \.+*?()|[]{}^$</span>
+<span class='doccomment'>//! \a bell (\x07)</span>
+<span class='doccomment'>//! \f form feed (\x0C)</span>
+<span class='doccomment'>//! \t horizontal tab</span>
+<span class='doccomment'>//! \n new line</span>
+<span class='doccomment'>//! \r carriage return</span>
+<span class='doccomment'>//! \v vertical tab (\x0B)</span>
+<span class='doccomment'>//! \123 octal character code (up to three digits)</span>
+<span class='doccomment'>//! \x7F hex character code (exactly two digits)</span>
+<span class='doccomment'>//! \x{10FFFF} any hex character code corresponding to a Unicode code point</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## Perl character classes (Unicode friendly)</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! These classes are based on the definitions provided in</span>
+<span class='doccomment'>//! [UTS#18](http://www.unicode.org/reports/tr18/#Compatibility_Properties):</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! \d digit (\p{Nd})</span>
+<span class='doccomment'>//! \D not digit</span>
+<span class='doccomment'>//! \s whitespace (\p{White_Space})</span>
+<span class='doccomment'>//! \S not whitespace</span>
+<span class='doccomment'>//! \w word character (\p{Alphabetic} + \p{M} + \d + \p{Pc} + \p{Join_Control})</span>
+<span class='doccomment'>//! \W not word character</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! ## ASCII character classes</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! &lt;pre class=&quot;rust&quot;&gt;</span>
+<span class='doccomment'>//! [:alnum:] alphanumeric ([0-9A-Za-z])</span>
+<span class='doccomment'>//! [:alpha:] alphabetic ([A-Za-z])</span>
+<span class='doccomment'>//! [:ascii:] ASCII ([\x00-\x7F])</span>
+<span class='doccomment'>//! [:blank:] blank ([\t ])</span>
+<span class='doccomment'>//! [:cntrl:] control ([\x00-\x1F\x7F])</span>
+<span class='doccomment'>//! [:digit:] digits ([0-9])</span>
+<span class='doccomment'>//! [:graph:] graphical ([!-~])</span>
+<span class='doccomment'>//! [:lower:] lower case ([a-z])</span>
+<span class='doccomment'>//! [:print:] printable ([ -~])</span>
+<span class='doccomment'>//! [:punct:] punctuation ([!-/:-@[-`{-~])</span>
+<span class='doccomment'>//! [:space:] whitespace ([\t\n\v\f\r ])</span>
+<span class='doccomment'>//! [:upper:] upper case ([A-Z])</span>
+<span class='doccomment'>//! [:word:] word characters ([0-9A-Za-z_])</span>
+<span class='doccomment'>//! [:xdigit:] hex digit ([0-9A-Fa-f])</span>
+<span class='doccomment'>//! &lt;/pre&gt;</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! # Untrusted input</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! This crate can handle both untrusted regular expressions and untrusted</span>
+<span class='doccomment'>//! search text.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Untrusted regular expressions are handled by capping the size of a compiled</span>
+<span class='doccomment'>//! regular expression. (See `Regex::with_size_limit`.) Without this, it would</span>
+<span class='doccomment'>//! be trivial for an attacker to exhaust your system&#39;s memory with expressions</span>
+<span class='doccomment'>//! like `a{100}{100}{100}`.</span>
+<span class='doccomment'>//!</span>
+<span class='doccomment'>//! Untrusted search text is allowed because the matching engine(s) in this</span>
+<span class='doccomment'>//! crate have time complexity `O(mn)` (with `m ~ regex` and `n ~ search</span>
+<span class='doccomment'>//! text`), which means there&#39;s no way to cause exponential blow-up like with</span>
+<span class='doccomment'>//! some other regular expression engines. (We pay for this by disallowing</span>
+<span class='doccomment'>//! features like arbitrary look-ahead and back-references.)</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(<span class='ident'>missing_docs</span>)]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>test</span>, <span class='ident'>deny</span>(<span class='ident'>warnings</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>cfg_attr</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;pattern&quot;</span>, <span class='ident'>feature</span>(<span class='ident'>pattern</span>))]</span>
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_logo_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png&quot;</span>,
+ <span class='ident'>html_favicon_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/favicon.ico&quot;</span>,
+ <span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://doc.rust-lang.org/regex/&quot;</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>aho_corasick</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>memchr</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>regex_syntax</span> <span class='kw'>as</span> <span class='ident'>syntax</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>re</span>::{
+ <span class='ident'>Regex</span>, <span class='ident'>Error</span>, <span class='ident'>Captures</span>, <span class='ident'>SubCaptures</span>, <span class='ident'>SubCapturesPos</span>, <span class='ident'>SubCapturesNamed</span>,
+ <span class='ident'>FindCaptures</span>, <span class='ident'>FindMatches</span>,
+ <span class='ident'>Replacer</span>, <span class='ident'>NoExpand</span>, <span class='ident'>RegexSplits</span>, <span class='ident'>RegexSplitsN</span>,
+ <span class='ident'>quote</span>, <span class='ident'>is_match</span>,
+};
+
+<span class='kw'>mod</span> <span class='ident'>backtrack</span>;
+<span class='kw'>mod</span> <span class='ident'>char</span>;
+<span class='kw'>mod</span> <span class='ident'>compile</span>;
+<span class='kw'>mod</span> <span class='ident'>input</span>;
+<span class='kw'>mod</span> <span class='ident'>pool</span>;
+<span class='kw'>mod</span> <span class='ident'>prefix</span>;
+<span class='kw'>mod</span> <span class='ident'>program</span>;
+<span class='kw'>mod</span> <span class='ident'>nfa</span>;
+<span class='kw'>mod</span> <span class='ident'>re</span>;
+
+<span class='doccomment'>/// The `internal` module exists to support the `regex!` macro and other</span>
+<span class='doccomment'>/// suspicious activity, such as testing different matching engines.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>mod</span> <span class='ident'>internal</span> {
+ <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>char</span>::<span class='ident'>Char</span>;
+ <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>input</span>::{<span class='ident'>Input</span>, <span class='ident'>CharInput</span>, <span class='ident'>InputAt</span>};
+ <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>program</span>::{
+ <span class='ident'>Program</span>, <span class='ident'>MatchEngine</span>, <span class='ident'>CharRanges</span>, <span class='ident'>Inst</span>, <span class='ident'>LookInst</span>, <span class='ident'>OneChar</span>,
+ };
+ <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>re</span>::<span class='ident'>ExNative</span>;
+ <span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>re</span>::<span class='ident'>Regex</span>::{<span class='ident'>Dynamic</span>, <span class='ident'>Native</span>};
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex/program.rs.html b/src/regex/program.rs.html
new file mode 100644
index 0000000..8f6ed02
--- /dev/null
+++ b/src/regex/program.rs.html
@@ -0,0 +1,1057 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-0.1.38/src/program.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>program.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::{<span class='self'>self</span>, <span class='ident'>Ordering</span>};
+
+<span class='kw'>use</span> <span class='ident'>syntax</span>;
+
+<span class='kw'>use</span> <span class='ident'>Error</span>;
+<span class='kw'>use</span> <span class='ident'>backtrack</span>::{<span class='ident'>Backtrack</span>, <span class='ident'>BackMachine</span>};
+<span class='kw'>use</span> <span class='ident'>char</span>::<span class='ident'>Char</span>;
+<span class='kw'>use</span> <span class='ident'>compile</span>::<span class='ident'>Compiler</span>;
+<span class='kw'>use</span> <span class='ident'>nfa</span>::{<span class='ident'>Nfa</span>, <span class='ident'>NfaThreads</span>};
+<span class='kw'>use</span> <span class='ident'>pool</span>::<span class='ident'>Pool</span>;
+<span class='kw'>use</span> <span class='ident'>prefix</span>::<span class='ident'>Prefix</span>;
+<span class='kw'>use</span> <span class='ident'>re</span>::<span class='ident'>CaptureIdxs</span>;
+
+<span class='kw'>const</span> <span class='ident'>NUM_PREFIX_LIMIT</span>: <span class='ident'>usize</span> <span class='op'>=</span> <span class='number'>30</span>;
+<span class='kw'>const</span> <span class='ident'>PREFIX_LENGTH_LIMIT</span>: <span class='ident'>usize</span> <span class='op'>=</span> <span class='number'>15</span>;
+
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>InstIdx</span> <span class='op'>=</span> <span class='ident'>usize</span>;
+
+<span class='doccomment'>/// An instruction, the underlying unit of a compiled regular expression</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Inst</span> {
+ <span class='doccomment'>/// A match has occurred.</span>
+ <span class='doccomment'>/// This is always the last instruction and only occurs in a single spot.</span>
+ <span class='doccomment'>/// We could special case this in the code, but it is much clearer to</span>
+ <span class='doccomment'>/// handle it as a proper instruction.</span>
+ <span class='ident'>Match</span>,
+ <span class='doccomment'>/// Save the current location in the input into the given capture location.</span>
+ <span class='ident'>Save</span>(<span class='ident'>usize</span>),
+ <span class='doccomment'>/// Jump to the instruction given.</span>
+ <span class='ident'>Jump</span>(<span class='ident'>InstIdx</span>),
+ <span class='doccomment'>/// Match either instruction, preferring the first.</span>
+ <span class='ident'>Split</span>(<span class='ident'>InstIdx</span>, <span class='ident'>InstIdx</span>),
+ <span class='doccomment'>/// A zero-width instruction. When this instruction matches, the input</span>
+ <span class='doccomment'>/// is not advanced.</span>
+ <span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>),
+ <span class='doccomment'>/// Match a single possibly case insensitive character.</span>
+ <span class='ident'>Char</span>(<span class='ident'>OneChar</span>),
+ <span class='doccomment'>/// Match one or more possibly case insensitive character ranges.</span>
+ <span class='ident'>Ranges</span>(<span class='ident'>CharRanges</span>),
+}
+
+<span class='doccomment'>/// A single character instruction.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>OneChar</span> {
+ <span class='doccomment'>/// The character.</span>
+ <span class='kw'>pub</span> <span class='ident'>c</span>: <span class='ident'>char</span>,
+ <span class='doccomment'>/// True if the character should be matched case insensitively.</span>
+ <span class='doccomment'>/// (i.e., The input character will need to be case folded.)</span>
+ <span class='kw'>pub</span> <span class='ident'>casei</span>: <span class='ident'>bool</span>,
+}
+
+<span class='doccomment'>/// A multi-range character class instruction.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>CharRanges</span> {
+ <span class='doccomment'>/// Sorted sequence of non-overlapping ranges.</span>
+ <span class='kw'>pub</span> <span class='ident'>ranges</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span>(<span class='ident'>char</span>, <span class='ident'>char</span>)<span class='op'>&gt;</span>,
+ <span class='doccomment'>/// Whether to match case insensitively.</span>
+ <span class='kw'>pub</span> <span class='ident'>casei</span>: <span class='ident'>bool</span>,
+}
+
+<span class='doccomment'>/// The set of zero-width match instructions.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>LookInst</span> {
+ <span class='doccomment'>/// Start of line or input.</span>
+ <span class='ident'>StartLine</span>,
+ <span class='doccomment'>/// End of line or input.</span>
+ <span class='ident'>EndLine</span>,
+ <span class='doccomment'>/// Start of input.</span>
+ <span class='ident'>StartText</span>,
+ <span class='doccomment'>/// End of input.</span>
+ <span class='ident'>EndText</span>,
+ <span class='doccomment'>/// Word character on one side and non-word character on other.</span>
+ <span class='ident'>WordBoundary</span>,
+ <span class='doccomment'>/// Word character on both sides or non-word character on both sides.</span>
+ <span class='ident'>NotWordBoundary</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>OneChar</span> {
+ <span class='doccomment'>/// Tests whether the given input character matches this instruction.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span> <span class='comment'>// About ~5-15% more throughput then `#[inline]`</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>matches</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>c</span>: <span class='ident'>Char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>c</span> <span class='op'>==</span> <span class='ident'>c</span> <span class='op'>||</span> (<span class='self'>self</span>.<span class='ident'>casei</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>c</span> <span class='op'>==</span> <span class='ident'>c</span>.<span class='ident'>case_fold</span>())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>CharRanges</span> {
+ <span class='doccomment'>/// Emits a range specifically for the `.` expression.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>any</span>() <span class='op'>-&gt;</span> <span class='ident'>CharRanges</span> {
+ <span class='ident'>CharRanges</span> {
+ <span class='ident'>ranges</span>: <span class='macro'>vec</span><span class='macro'>!</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10ffff}&#39;</span>)],
+ <span class='ident'>casei</span>: <span class='boolval'>false</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Emits a range specifically for the `(?s).` expression.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>any_nonl</span>() <span class='op'>-&gt;</span> <span class='ident'>CharRanges</span> {
+ <span class='ident'>CharRanges</span> {
+ <span class='ident'>ranges</span>: <span class='macro'>vec</span><span class='macro'>!</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x09&#39;</span>), (<span class='string'>&#39;\x0B&#39;</span>, <span class='string'>&#39;\u{10ffff}&#39;</span>)],
+ <span class='ident'>casei</span>: <span class='boolval'>false</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Emits a range from the AST character class.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>from_class</span>(<span class='ident'>cls</span>: <span class='ident'>syntax</span>::<span class='ident'>CharClass</span>) <span class='op'>-&gt;</span> <span class='ident'>CharRanges</span> {
+ <span class='kw'>let</span> <span class='ident'>casei</span> <span class='op'>=</span> <span class='ident'>cls</span>.<span class='ident'>is_case_insensitive</span>();
+ <span class='ident'>CharRanges</span> {
+ <span class='ident'>ranges</span>: <span class='ident'>cls</span>.<span class='ident'>into_iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> (<span class='ident'>r</span>.<span class='ident'>start</span>, <span class='ident'>r</span>.<span class='ident'>end</span>)).<span class='ident'>collect</span>(),
+ <span class='ident'>casei</span>: <span class='ident'>casei</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Tests whether the given input character matches this instruction.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span> <span class='comment'>// About ~5-15% more throughput then `#[inline]`</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>matches</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>c</span>: <span class='ident'>Char</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>casei</span> {
+ <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>case_fold</span>();
+ }
+ <span class='comment'>// This speeds up the `match_class_unicode` benchmark by checking</span>
+ <span class='comment'>// some common cases quickly without binary search. e.g., Matching</span>
+ <span class='comment'>// a Unicode class on predominantly ASCII text.</span>
+ <span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>cmp</span>::<span class='ident'>min</span>(<span class='self'>self</span>.<span class='ident'>ranges</span>.<span class='ident'>len</span>(), <span class='number'>4</span>) {
+ <span class='kw'>let</span> <span class='ident'>r</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>ranges</span>[<span class='ident'>i</span>];
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>&lt;</span> <span class='ident'>r</span>.<span class='number'>0</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='ident'>r</span>.<span class='number'>1</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>Some</span>(<span class='ident'>i</span>);
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>ranges</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> {
+ <span class='kw'>if</span> <span class='ident'>r</span>.<span class='number'>1</span> <span class='op'>&lt;</span> <span class='ident'>c</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>r</span>.<span class='number'>0</span> <span class='op'>&gt;</span> <span class='ident'>c</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span>
+ }
+ }).<span class='ident'>ok</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>LookInst</span> {
+ <span class='doccomment'>/// Tests whether the pair of characters matches this zero-width</span>
+ <span class='doccomment'>/// instruction.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>matches</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>c1</span>: <span class='ident'>Char</span>, <span class='ident'>c2</span>: <span class='ident'>Char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>LookInst</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>StartLine</span> <span class='op'>=&gt;</span> <span class='ident'>c1</span>.<span class='ident'>is_none</span>() <span class='op'>||</span> <span class='ident'>c1</span> <span class='op'>==</span> <span class='string'>&#39;\n&#39;</span>,
+ <span class='ident'>EndLine</span> <span class='op'>=&gt;</span> <span class='ident'>c2</span>.<span class='ident'>is_none</span>() <span class='op'>||</span> <span class='ident'>c2</span> <span class='op'>==</span> <span class='string'>&#39;\n&#39;</span>,
+ <span class='ident'>StartText</span> <span class='op'>=&gt;</span> <span class='ident'>c1</span>.<span class='ident'>is_none</span>(),
+ <span class='ident'>EndText</span> <span class='op'>=&gt;</span> <span class='ident'>c2</span>.<span class='ident'>is_none</span>(),
+ <span class='kw-2'>ref</span> <span class='ident'>wbty</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> (<span class='ident'>w1</span>, <span class='ident'>w2</span>) <span class='op'>=</span> (<span class='ident'>c1</span>.<span class='ident'>is_word_char</span>(), <span class='ident'>c2</span>.<span class='ident'>is_word_char</span>());
+ (<span class='op'>*</span><span class='ident'>wbty</span> <span class='op'>==</span> <span class='ident'>WordBoundary</span> <span class='op'>&amp;&amp;</span> <span class='ident'>w1</span> <span class='op'>^</span> <span class='ident'>w2</span>)
+ <span class='op'>||</span> (<span class='op'>*</span><span class='ident'>wbty</span> <span class='op'>==</span> <span class='ident'>NotWordBoundary</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span>(<span class='ident'>w1</span> <span class='op'>^</span> <span class='ident'>w2</span>))
+ }
+ }
+ }
+}
+
+<span class='doccomment'>/// The matching engines offered by this regex implementation.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// N.B. This is exported for use in testing.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>MatchEngine</span> {
+ <span class='doccomment'>/// A bounded backtracking implementation. About twice as fast as the</span>
+ <span class='doccomment'>/// NFA, but can only work on small regexes and small input.</span>
+ <span class='ident'>Backtrack</span>,
+ <span class='doccomment'>/// A full NFA simulation. Can always be employed but almost always the</span>
+ <span class='doccomment'>/// slowest choice.</span>
+ <span class='ident'>Nfa</span>,
+ <span class='doccomment'>/// If the entire regex is a literal and no capture groups have been</span>
+ <span class='doccomment'>/// requested, then we can degrade to a simple substring match.</span>
+ <span class='ident'>Literals</span>,
+}
+
+<span class='doccomment'>/// Program represents a compiled regular expression. Once an expression is</span>
+<span class='doccomment'>/// compiled, its representation is immutable and will never change.</span>
+<span class='doccomment'>/// (Well, almost. In fact, the matching engines cache state that can be</span>
+<span class='doccomment'>/// reused on subsequent searches. But this is interior mutability that</span>
+<span class='doccomment'>/// shouldn&#39;t be observable by the caller.)</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Program</span> {
+ <span class='doccomment'>/// The original regular expression string.</span>
+ <span class='kw'>pub</span> <span class='ident'>original</span>: <span class='ident'>String</span>,
+ <span class='doccomment'>/// A sequence of instructions.</span>
+ <span class='kw'>pub</span> <span class='ident'>insts</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Inst</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// The sequence of capture group names. There is an entry for each capture</span>
+ <span class='doccomment'>/// group index and a name exists only if the capture group is named.</span>
+ <span class='kw'>pub</span> <span class='ident'>cap_names</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span>,
+ <span class='doccomment'>/// If the regular expression requires a literal prefix in order to have a</span>
+ <span class='doccomment'>/// match, that prefix is stored here as a DFA.</span>
+ <span class='kw'>pub</span> <span class='ident'>prefixes</span>: <span class='ident'>Prefix</span>,
+ <span class='doccomment'>/// True iff matching any literal prefix indicates a match.</span>
+ <span class='kw'>pub</span> <span class='ident'>prefixes_complete</span>: <span class='ident'>bool</span>,
+ <span class='doccomment'>/// True iff program is anchored at the beginning.</span>
+ <span class='kw'>pub</span> <span class='ident'>anchored_begin</span>: <span class='ident'>bool</span>,
+ <span class='doccomment'>/// True iff program is anchored at the end.</span>
+ <span class='kw'>pub</span> <span class='ident'>anchored_end</span>: <span class='ident'>bool</span>,
+ <span class='doccomment'>/// The type of matching engine to use.</span>
+ <span class='doccomment'>/// When `None` (the default), pick an engine automatically.</span>
+ <span class='kw'>pub</span> <span class='ident'>engine</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MatchEngine</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// Cached NFA threads.</span>
+ <span class='kw'>pub</span> <span class='ident'>nfa_threads</span>: <span class='ident'>Pool</span><span class='op'>&lt;</span><span class='ident'>NfaThreads</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// Cached backtracking memory.</span>
+ <span class='kw'>pub</span> <span class='ident'>backtrack</span>: <span class='ident'>Pool</span><span class='op'>&lt;</span><span class='ident'>BackMachine</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Program</span> {
+ <span class='doccomment'>/// Compiles a Regex.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(
+ <span class='ident'>engine</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MatchEngine</span><span class='op'>&gt;</span>,
+ <span class='ident'>size_limit</span>: <span class='ident'>usize</span>,
+ <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>,
+ ) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Program</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>expr</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>syntax</span>::<span class='ident'>Expr</span>::<span class='ident'>parse</span>(<span class='ident'>re</span>));
+ <span class='kw'>let</span> (<span class='ident'>insts</span>, <span class='ident'>cap_names</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>Compiler</span>::<span class='ident'>new</span>(<span class='ident'>size_limit</span>).<span class='ident'>compile</span>(<span class='ident'>expr</span>));
+ <span class='kw'>let</span> (<span class='ident'>insts_len</span>, <span class='ident'>ncaps</span>) <span class='op'>=</span> (<span class='ident'>insts</span>.<span class='ident'>len</span>(), <span class='ident'>num_captures</span>(<span class='kw-2'>&amp;</span><span class='ident'>insts</span>));
+ <span class='kw'>let</span> <span class='ident'>create_threads</span> <span class='op'>=</span> <span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>NfaThreads</span>::<span class='ident'>new</span>(<span class='ident'>insts_len</span>, <span class='ident'>ncaps</span>);
+ <span class='kw'>let</span> <span class='ident'>create_backtrack</span> <span class='op'>=</span> <span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>BackMachine</span>::<span class='ident'>new</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>prog</span> <span class='op'>=</span> <span class='ident'>Program</span> {
+ <span class='ident'>original</span>: <span class='ident'>re</span>.<span class='ident'>into</span>(),
+ <span class='ident'>insts</span>: <span class='ident'>insts</span>,
+ <span class='ident'>cap_names</span>: <span class='ident'>cap_names</span>,
+ <span class='ident'>prefixes</span>: <span class='ident'>Prefix</span>::<span class='ident'>Empty</span>,
+ <span class='ident'>prefixes_complete</span>: <span class='boolval'>false</span>,
+ <span class='ident'>anchored_begin</span>: <span class='boolval'>false</span>,
+ <span class='ident'>anchored_end</span>: <span class='boolval'>false</span>,
+ <span class='ident'>engine</span>: <span class='ident'>engine</span>,
+ <span class='ident'>nfa_threads</span>: <span class='ident'>Pool</span>::<span class='ident'>new</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>create_threads</span>)),
+ <span class='ident'>backtrack</span>: <span class='ident'>Pool</span>::<span class='ident'>new</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>create_backtrack</span>)),
+ };
+
+ <span class='ident'>prog</span>.<span class='ident'>find_prefixes</span>();
+ <span class='ident'>prog</span>.<span class='ident'>anchored_begin</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>prog</span>.<span class='ident'>insts</span>[<span class='number'>1</span>] {
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>StartText</span>) <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ };
+ <span class='ident'>prog</span>.<span class='ident'>anchored_end</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>prog</span>.<span class='ident'>insts</span>[<span class='ident'>prog</span>.<span class='ident'>insts</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='number'>3</span>] {
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>EndText</span>) <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ };
+ <span class='prelude-val'>Ok</span>(<span class='ident'>prog</span>)
+ }
+
+ <span class='doccomment'>/// Executes a compiled regex program.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>exec</span>(
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>,
+ <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>CaptureIdxs</span>,
+ <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>,
+ <span class='ident'>start</span>: <span class='ident'>usize</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>choose_engine</span>(<span class='ident'>caps</span>.<span class='ident'>len</span>(), <span class='ident'>text</span>) {
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Backtrack</span> <span class='op'>=&gt;</span> <span class='ident'>Backtrack</span>::<span class='ident'>exec</span>(<span class='self'>self</span>, <span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='ident'>start</span>),
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Nfa</span> <span class='op'>=&gt;</span> <span class='ident'>Nfa</span>::<span class='ident'>exec</span>(<span class='self'>self</span>, <span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='ident'>start</span>),
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Literals</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>prefixes</span>.<span class='ident'>find</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>start</span>..]) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>caps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>2</span> {
+ <span class='ident'>caps</span>[<span class='number'>0</span>] <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>start</span> <span class='op'>+</span> <span class='ident'>s</span>);
+ <span class='ident'>caps</span>[<span class='number'>1</span>] <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>start</span> <span class='op'>+</span> <span class='ident'>e</span>);
+ }
+ <span class='boolval'>true</span>
+ }
+ }
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>choose_engine</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>cap_len</span>: <span class='ident'>usize</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>MatchEngine</span> {
+ <span class='comment'>// If the engine is already chosen, then we use it.</span>
+ <span class='comment'>// But that might not be a good idea. e.g., What if `Literals` is</span>
+ <span class='comment'>// chosen and it can&#39;t work? I guess we should probably check whether</span>
+ <span class='comment'>// the chosen engine is appropriate or not.</span>
+ <span class='self'>self</span>.<span class='ident'>engine</span>.<span class='ident'>unwrap_or_else</span>(<span class='op'>||</span> {
+ <span class='kw'>if</span> <span class='ident'>cap_len</span> <span class='op'>&lt;=</span> <span class='number'>2</span>
+ <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>prefixes</span>.<span class='ident'>preserves_priority</span>()
+ <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>prefixes_complete</span> {
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Literals</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>Backtrack</span>::<span class='ident'>should_exec</span>(<span class='self'>self</span>, <span class='ident'>text</span>) {
+ <span class='comment'>// We&#39;re only here if the input and regex combined are small.</span>
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Backtrack</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>MatchEngine</span>::<span class='ident'>Nfa</span>
+ }
+ })
+ }
+
+ <span class='doccomment'>/// Returns the total number of capture groups in the regular expression.</span>
+ <span class='doccomment'>/// This includes the zeroth capture.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>num_captures</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='ident'>num_captures</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>insts</span>)
+ }
+
+ <span class='doccomment'>/// Allocate new capture groups.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>alloc_captures</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;&gt;</span> {
+ <span class='macro'>vec</span><span class='macro'>!</span>[<span class='prelude-val'>None</span>; <span class='number'>2</span> <span class='op'>*</span> <span class='self'>self</span>.<span class='ident'>num_captures</span>()]
+ }
+
+ <span class='doccomment'>/// Find and store a prefix machine for the current program.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find_prefixes</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Inst</span>::<span class='op'>*</span>;
+
+ <span class='kw'>let</span> (<span class='ident'>ps</span>, <span class='ident'>complete</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prefixes_from_insts</span>(<span class='number'>1</span>);
+ <span class='kw'>if</span> <span class='ident'>ps</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> {
+ <span class='self'>self</span>.<span class='ident'>prefixes</span> <span class='op'>=</span> <span class='ident'>Prefix</span>::<span class='ident'>new</span>(<span class='ident'>ps</span>);
+ <span class='self'>self</span>.<span class='ident'>prefixes_complete</span> <span class='op'>=</span> <span class='ident'>complete</span>;
+ <span class='kw'>return</span>;
+ }
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>pc</span> <span class='op'>=</span> <span class='number'>1</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>prefixes</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>pcomplete</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>while</span> <span class='kw'>let</span> <span class='ident'>Split</span>(<span class='ident'>x</span>, <span class='ident'>y</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>insts</span>[<span class='ident'>pc</span>] {
+ <span class='kw'>let</span> (<span class='ident'>xps</span>, <span class='ident'>xcomplete</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prefixes_from_insts</span>(<span class='ident'>x</span>);
+ <span class='kw'>let</span> (<span class='ident'>yps</span>, <span class='ident'>ycomplete</span>) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prefixes_from_insts</span>(<span class='ident'>y</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>done</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>match</span> (<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>insts</span>[<span class='ident'>x</span>], <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>insts</span>[<span class='ident'>y</span>]) {
+ <span class='comment'>// We should be able to support this. Add explicit stack. ---AG</span>
+ (<span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _), <span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _)) <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ (_, <span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _)) <span class='kw'>if</span> <span class='ident'>xps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ (_, <span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _)) <span class='op'>=&gt;</span> {
+ <span class='ident'>pcomplete</span> <span class='op'>=</span> <span class='ident'>pcomplete</span> <span class='op'>&amp;&amp;</span> <span class='ident'>xcomplete</span>;
+ <span class='ident'>prefixes</span>.<span class='ident'>extend</span>(<span class='ident'>xps</span>);
+ <span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>y</span>;
+ }
+ (<span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _), _) <span class='kw'>if</span> <span class='ident'>yps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ (<span class='kw-2'>&amp;</span><span class='ident'>Split</span>(_, _), _) <span class='op'>=&gt;</span> {
+ <span class='ident'>pcomplete</span> <span class='op'>=</span> <span class='ident'>pcomplete</span> <span class='op'>&amp;&amp;</span> <span class='ident'>ycomplete</span>;
+ <span class='ident'>prefixes</span>.<span class='ident'>extend</span>(<span class='ident'>yps</span>);
+ <span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>x</span>;
+ }
+ _ <span class='kw'>if</span> <span class='ident'>xps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>||</span> <span class='ident'>yps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> <span class='op'>=&gt;</span> <span class='kw'>return</span>,
+ <span class='comment'>// This is our base case. We&#39;ve followed splits the whole</span>
+ <span class='comment'>// way, which means both instructions lead to a match.</span>
+ _ <span class='op'>=&gt;</span> {
+ <span class='ident'>pcomplete</span> <span class='op'>=</span> <span class='ident'>pcomplete</span> <span class='op'>&amp;&amp;</span> <span class='ident'>xcomplete</span> <span class='op'>&amp;&amp;</span> <span class='ident'>ycomplete</span>;
+ <span class='ident'>prefixes</span>.<span class='ident'>extend</span>(<span class='ident'>xps</span>);
+ <span class='ident'>prefixes</span>.<span class='ident'>extend</span>(<span class='ident'>yps</span>);
+ <span class='ident'>done</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ }
+ }
+ <span class='comment'>// Arg. We&#39;ve over-extended ourselves, quit with nothing to</span>
+ <span class='comment'>// show for it.</span>
+ <span class='kw'>if</span> <span class='ident'>prefixes</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='ident'>NUM_PREFIX_LIMIT</span> {
+ <span class='kw'>return</span>;
+ }
+ <span class='kw'>if</span> <span class='ident'>done</span> { <span class='kw'>break</span>; }
+ }
+ <span class='self'>self</span>.<span class='ident'>prefixes</span> <span class='op'>=</span> <span class='ident'>Prefix</span>::<span class='ident'>new</span>(<span class='ident'>prefixes</span>);
+ <span class='self'>self</span>.<span class='ident'>prefixes_complete</span> <span class='op'>=</span> <span class='ident'>pcomplete</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>prefixes</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span>;
+ }
+
+ <span class='doccomment'>/// Find a prefix starting at the given instruction.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Returns `true` in the tuple if the end of the prefix leads trivially</span>
+ <span class='doccomment'>/// to a match. (This may report false negatives, but being conservative</span>
+ <span class='doccomment'>/// is OK.)</span>
+ <span class='kw'>fn</span> <span class='ident'>prefixes_from_insts</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>pc</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> (<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='ident'>bool</span>) {
+ <span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Inst</span>::<span class='op'>*</span>;
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>complete</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>alts</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>String</span>::<span class='ident'>new</span>()];
+ <span class='kw'>while</span> <span class='ident'>pc</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>insts</span>.<span class='ident'>len</span>() {
+ <span class='kw'>let</span> <span class='ident'>inst</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>insts</span>[<span class='ident'>pc</span>];
+
+ <span class='comment'>// Each iteration adds one character to every alternate prefix *or*</span>
+ <span class='comment'>// it stops. Thus, the prefix alternates grow in lock step, and it</span>
+ <span class='comment'>// suffices to check one of them to see if the prefix limit has been</span>
+ <span class='comment'>// exceeded.</span>
+ <span class='kw'>if</span> <span class='ident'>alts</span>[<span class='number'>0</span>].<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='ident'>PREFIX_LENGTH_LIMIT</span> {
+ <span class='ident'>complete</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>break</span>;
+ }
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>inst</span> {
+ <span class='ident'>Save</span>(_) <span class='op'>=&gt;</span> { <span class='ident'>pc</span> <span class='op'>+=</span> <span class='number'>1</span>; <span class='kw'>continue</span> } <span class='comment'>// completely ignore it</span>
+ <span class='ident'>Char</span>(<span class='ident'>OneChar</span> { <span class='ident'>c</span>, <span class='ident'>casei</span>: <span class='boolval'>false</span> }) <span class='op'>=&gt;</span> {
+ <span class='kw'>for</span> <span class='ident'>alt</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>alts</span> {
+ <span class='ident'>alt</span>.<span class='ident'>push</span>(<span class='ident'>c</span>);
+ }
+ <span class='ident'>pc</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ <span class='ident'>Ranges</span>(<span class='ident'>CharRanges</span> { <span class='kw-2'>ref</span> <span class='ident'>ranges</span>, <span class='ident'>casei</span>: <span class='boolval'>false</span> }) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>nchars</span> <span class='op'>=</span> <span class='ident'>num_chars_in_ranges</span>(<span class='ident'>ranges</span>);
+ <span class='kw'>if</span> <span class='ident'>alts</span>.<span class='ident'>len</span>() <span class='op'>*</span> <span class='ident'>nchars</span> <span class='op'>&gt;</span> <span class='ident'>NUM_PREFIX_LIMIT</span> {
+ <span class='ident'>complete</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>break</span>;
+ }
+
+ <span class='kw'>let</span> <span class='ident'>orig</span> <span class='op'>=</span> <span class='ident'>alts</span>;
+ <span class='ident'>alts</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>orig</span>.<span class='ident'>len</span>());
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='kw'>in</span> <span class='ident'>ranges</span> {
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> (<span class='ident'>s</span> <span class='kw'>as</span> <span class='ident'>u32</span>)..(<span class='ident'>e</span> <span class='kw'>as</span> <span class='ident'>u32</span> <span class='op'>+</span> <span class='number'>1</span>){
+ <span class='kw'>for</span> <span class='ident'>alt</span> <span class='kw'>in</span> <span class='kw-2'>&amp;</span><span class='ident'>orig</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>alt</span> <span class='op'>=</span> <span class='ident'>alt</span>.<span class='ident'>clone</span>();
+ <span class='ident'>alt</span>.<span class='ident'>push</span>(::<span class='ident'>std</span>::<span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>c</span>).<span class='ident'>unwrap</span>());
+ <span class='ident'>alts</span>.<span class='ident'>push</span>(<span class='ident'>alt</span>);
+ }
+ }
+ }
+ <span class='ident'>pc</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ }
+ <span class='ident'>Jump</span>(<span class='ident'>pc2</span>) <span class='op'>=&gt;</span> <span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>pc2</span>,
+ _ <span class='op'>=&gt;</span> { <span class='ident'>complete</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>leads_to_match</span>(<span class='ident'>pc</span>); <span class='kw'>break</span> }
+ }
+ }
+ <span class='kw'>if</span> <span class='ident'>alts</span>[<span class='number'>0</span>].<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> {
+ (<span class='macro'>vec</span><span class='macro'>!</span>[], <span class='boolval'>false</span>)
+ } <span class='kw'>else</span> {
+ (<span class='ident'>alts</span>, <span class='ident'>complete</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>leads_to_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>pc</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='comment'>// I&#39;m pretty sure this is conservative, so it might have some</span>
+ <span class='comment'>// false negatives.</span>
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>insts</span>[<span class='ident'>pc</span>] {
+ <span class='ident'>Inst</span>::<span class='ident'>Match</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='boolval'>true</span>,
+ <span class='ident'>Inst</span>::<span class='ident'>Save</span>(_) <span class='op'>=&gt;</span> <span class='ident'>pc</span> <span class='op'>+=</span> <span class='number'>1</span>,
+ <span class='ident'>Inst</span>::<span class='ident'>Jump</span>(<span class='ident'>pc2</span>) <span class='op'>=&gt;</span> <span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>pc2</span>,
+ _ <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='boolval'>false</span>,
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>Program</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Program</span> {
+ <span class='kw'>let</span> (<span class='ident'>insts_len</span>, <span class='ident'>ncaps</span>) <span class='op'>=</span> (<span class='self'>self</span>.<span class='ident'>insts</span>.<span class='ident'>len</span>(), <span class='self'>self</span>.<span class='ident'>num_captures</span>());
+ <span class='kw'>let</span> <span class='ident'>create_threads</span> <span class='op'>=</span> <span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>NfaThreads</span>::<span class='ident'>new</span>(<span class='ident'>insts_len</span>, <span class='ident'>ncaps</span>);
+ <span class='kw'>let</span> <span class='ident'>create_backtrack</span> <span class='op'>=</span> <span class='kw'>move</span> <span class='op'>||</span> <span class='ident'>BackMachine</span>::<span class='ident'>new</span>();
+ <span class='ident'>Program</span> {
+ <span class='ident'>original</span>: <span class='self'>self</span>.<span class='ident'>original</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>insts</span>: <span class='self'>self</span>.<span class='ident'>insts</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>cap_names</span>: <span class='self'>self</span>.<span class='ident'>cap_names</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>prefixes</span>: <span class='self'>self</span>.<span class='ident'>prefixes</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>prefixes_complete</span>: <span class='self'>self</span>.<span class='ident'>prefixes_complete</span>,
+ <span class='ident'>anchored_begin</span>: <span class='self'>self</span>.<span class='ident'>anchored_begin</span>,
+ <span class='ident'>anchored_end</span>: <span class='self'>self</span>.<span class='ident'>anchored_end</span>,
+ <span class='ident'>engine</span>: <span class='self'>self</span>.<span class='ident'>engine</span>,
+ <span class='ident'>nfa_threads</span>: <span class='ident'>Pool</span>::<span class='ident'>new</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>create_threads</span>)),
+ <span class='ident'>backtrack</span>: <span class='ident'>Pool</span>::<span class='ident'>new</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>create_backtrack</span>)),
+ }
+ }
+}
+
+<span class='doccomment'>/// Return the number of captures in the given sequence of instructions.</span>
+<span class='kw'>fn</span> <span class='ident'>num_captures</span>(<span class='ident'>insts</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>Inst</span>]) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>for</span> <span class='ident'>inst</span> <span class='kw'>in</span> <span class='ident'>insts</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>inst</span> {
+ <span class='ident'>Inst</span>::<span class='ident'>Save</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>cmp</span>::<span class='ident'>max</span>(<span class='ident'>n</span>, <span class='ident'>c</span><span class='op'>+</span><span class='number'>1</span>),
+ _ <span class='op'>=&gt;</span> {}
+ }
+ }
+ <span class='comment'>// There&#39;s exactly 2 Save slots for every capture.</span>
+ <span class='ident'>n</span> <span class='op'>/</span> <span class='number'>2</span>
+}
+
+<span class='doccomment'>/// Count the number of characters in the given range.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This is useful for pre-emptively limiting the number of prefix literals</span>
+<span class='doccomment'>/// we extract from a regex program.</span>
+<span class='kw'>fn</span> <span class='ident'>num_chars_in_ranges</span>(<span class='ident'>ranges</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='ident'>ranges</span>.<span class='ident'>iter</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, <span class='ident'>e</span>)<span class='op'>|</span> (<span class='ident'>e</span> <span class='kw'>as</span> <span class='ident'>u32</span>) <span class='op'>-</span> (<span class='ident'>s</span> <span class='kw'>as</span> <span class='ident'>u32</span>))
+ .<span class='ident'>fold</span>(<span class='number'>0</span>, <span class='op'>|</span><span class='ident'>acc</span>, <span class='ident'>len</span><span class='op'>|</span> <span class='ident'>acc</span> <span class='op'>+</span> <span class='ident'>len</span>) <span class='kw'>as</span> <span class='ident'>usize</span>
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex/re.rs.html b/src/regex/re.rs.html
new file mode 100644
index 0000000..3472b45
--- /dev/null
+++ b/src/regex/re.rs.html
@@ -0,0 +1,2393 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-0.1.38/src/re.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>re.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>borrow</span>::<span class='ident'>Cow</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>HashMap</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>collections</span>::<span class='ident'>hash_map</span>::<span class='ident'>Iter</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;pattern&quot;</span>)]</span>
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>::<span class='ident'>pattern</span>::{<span class='ident'>Pattern</span>, <span class='ident'>Searcher</span>, <span class='ident'>SearchStep</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>str</span>::<span class='ident'>FromStr</span>;
+
+<span class='kw'>use</span> <span class='ident'>program</span>::{<span class='ident'>Program</span>, <span class='ident'>MatchEngine</span>};
+<span class='kw'>use</span> <span class='ident'>syntax</span>;
+
+<span class='kw'>const</span> <span class='ident'>REPLACE_EXPAND</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span> <span class='op'>=</span> <span class='string'>r&quot;(?x)
+ (?P&lt;before&gt;^|\b|[^$]) # Ignore `$$name`.
+ \$
+ (?P&lt;name&gt; # Match the actual capture name. Can be...
+ [0-9]+ # A sequence of digits (for indexed captures), or...
+ |
+ [_a-zA-Z][_0-9a-zA-Z]* # A name for named captures.
+ )
+&quot;</span>;
+
+<span class='doccomment'>/// Type alias for representing capture indices.</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='ident'>CaptureIdxs</span> <span class='op'>=</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>];
+
+<span class='doccomment'>/// Escapes all regular expression meta characters in `text`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The string returned may be safely used as a literal in a regular</span>
+<span class='doccomment'>/// expression.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>quote</span>(<span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>quoted</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>with_capacity</span>(<span class='ident'>text</span>.<span class='ident'>len</span>());
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> <span class='ident'>text</span>.<span class='ident'>chars</span>() {
+ <span class='kw'>if</span> <span class='ident'>syntax</span>::<span class='ident'>is_punct</span>(<span class='ident'>c</span>) {
+ <span class='ident'>quoted</span>.<span class='ident'>push</span>(<span class='string'>&#39;\\&#39;</span>)
+ }
+ <span class='ident'>quoted</span>.<span class='ident'>push</span>(<span class='ident'>c</span>);
+ }
+ <span class='ident'>quoted</span>
+}
+
+<span class='doccomment'>/// Tests if the given regular expression matches somewhere in the text given.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// If there was a problem compiling the regular expression, an error is</span>
+<span class='doccomment'>/// returned.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// To find submatches, split or replace text, you&#39;ll need to compile an</span>
+<span class='doccomment'>/// expression first.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_match</span>(<span class='ident'>regex</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>bool</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>new</span>(<span class='ident'>regex</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>r</span><span class='op'>|</span> <span class='ident'>r</span>.<span class='ident'>is_match</span>(<span class='ident'>text</span>))
+}
+
+<span class='doccomment'>/// An error that occurred during parsing or compiling a regular expression.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Error</span> {
+ <span class='doccomment'>/// A syntax error.</span>
+ <span class='ident'>Syntax</span>(<span class='ident'>syntax</span>::<span class='ident'>Error</span>),
+ <span class='doccomment'>/// The compiled program exceeded the set size limit.</span>
+ <span class='doccomment'>/// The argument is the size limit imposed.</span>
+ <span class='ident'>CompiledTooBig</span>(<span class='ident'>usize</span>),
+ <span class='doccomment'>/// Hints that destructuring should not be exhaustive.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This enum may grow additional variants, so this makes sure clients</span>
+ <span class='doccomment'>/// don&#39;t count on exhaustive matching. (Otherwise, adding a new variant</span>
+ <span class='doccomment'>/// could break existing code.)</span>
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='ident'>__Nonexhaustive</span>,
+}
+
+<span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
+ <span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Error</span>::<span class='ident'>Syntax</span>(<span class='kw-2'>ref</span> <span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='ident'>err</span>.<span class='ident'>description</span>(),
+ <span class='ident'>Error</span>::<span class='ident'>CompiledTooBig</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;compiled program too big&quot;</span>,
+ <span class='ident'>Error</span>::<span class='ident'>__Nonexhaustive</span> <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>cause</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span>::<span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Error</span>::<span class='ident'>Syntax</span>(<span class='kw-2'>ref</span> <span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='ident'>err</span>),
+ _ <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Error</span>::<span class='ident'>Syntax</span>(<span class='kw-2'>ref</span> <span class='ident'>err</span>) <span class='op'>=&gt;</span> <span class='ident'>err</span>.<span class='ident'>fmt</span>(<span class='ident'>f</span>),
+ <span class='ident'>Error</span>::<span class='ident'>CompiledTooBig</span>(<span class='ident'>limit</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Compiled regex exceeds size limit of {} bytes.&quot;</span>,
+ <span class='ident'>limit</span>)
+ }
+ <span class='ident'>Error</span>::<span class='ident'>__Nonexhaustive</span> <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>From</span><span class='op'>&lt;</span><span class='ident'>syntax</span>::<span class='ident'>Error</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
+ <span class='kw'>fn</span> <span class='ident'>from</span>(<span class='ident'>err</span>: <span class='ident'>syntax</span>::<span class='ident'>Error</span>) <span class='op'>-&gt;</span> <span class='ident'>Error</span> {
+ <span class='ident'>Error</span>::<span class='ident'>Syntax</span>(<span class='ident'>err</span>)
+ }
+}
+
+<span class='doccomment'>/// A compiled regular expression</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It is represented as either a sequence of bytecode instructions (dynamic)</span>
+<span class='doccomment'>/// or as a specialized Rust function (native). It can be used to search, split</span>
+<span class='doccomment'>/// or replace text. All searching is done with an implicit `.*?` at the</span>
+<span class='doccomment'>/// beginning and end of an expression. To force an expression to match the</span>
+<span class='doccomment'>/// whole string (or a prefix or a suffix), you must use an anchor like `^` or</span>
+<span class='doccomment'>/// `$` (or `\A` and `\z`).</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// While this crate will handle Unicode strings (whether in the regular</span>
+<span class='doccomment'>/// expression or in the search text), all positions returned are **byte</span>
+<span class='doccomment'>/// indices**. Every byte index is guaranteed to be at a Unicode code point</span>
+<span class='doccomment'>/// boundary.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The lifetimes `&#39;r` and `&#39;t` in this crate correspond to the lifetime of a</span>
+<span class='doccomment'>/// compiled regular expression and text to search, respectively.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The only methods that allocate new strings are the string replacement</span>
+<span class='doccomment'>/// methods. All other methods (searching and splitting) return borrowed</span>
+<span class='doccomment'>/// pointers into the string given.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Examples</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Find the location of a US phone number:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```rust</span>
+<span class='doccomment'>/// # use regex::Regex;</span>
+<span class='doccomment'>/// let re = Regex::new(&quot;[0-9]{3}-[0-9]{3}-[0-9]{4}&quot;).unwrap();</span>
+<span class='doccomment'>/// assert_eq!(re.find(&quot;phone: 111-222-3333&quot;), Some((7, 19)));</span>
+<span class='doccomment'>/// ```</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// # Using the `std::str::StrExt` methods with `Regex`</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// &gt; **Note**: This section requires that this crate is currently compiled with</span>
+<span class='doccomment'>/// &gt; the `pattern` Cargo feature enabled.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Since `Regex` implements `Pattern`, you can use regexes with methods</span>
+<span class='doccomment'>/// defined on `std::str::StrExt`. For example, `is_match`, `find`, `find_iter`</span>
+<span class='doccomment'>/// and `split` can be replaced with `StrExt::contains`, `StrExt::find`,</span>
+<span class='doccomment'>/// `StrExt::match_indices` and `StrExt::split`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Here are some examples:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// ```rust,ignore</span>
+<span class='doccomment'>/// # use regex::Regex;</span>
+<span class='doccomment'>/// let re = Regex::new(r&quot;\d+&quot;).unwrap();</span>
+<span class='doccomment'>/// let haystack = &quot;a111b222c&quot;;</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// assert!(haystack.contains(&amp;re));</span>
+<span class='doccomment'>/// assert_eq!(haystack.find(&amp;re), Some(1));</span>
+<span class='doccomment'>/// assert_eq!(haystack.match_indices(&amp;re).collect::&lt;Vec&lt;_&gt;&gt;(),</span>
+<span class='doccomment'>/// vec![(1, 4), (5, 8)]);</span>
+<span class='doccomment'>/// assert_eq!(haystack.split(&amp;re).collect::&lt;Vec&lt;_&gt;&gt;(), vec![&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]);</span>
+<span class='doccomment'>/// ```</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Regex</span> {
+ <span class='comment'>// The representation of `Regex` is exported to support the `regex!`</span>
+ <span class='comment'>// syntax extension. Do not rely on it.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// See the comments for the `program` module in `lib.rs` for a more</span>
+ <span class='comment'>// detailed explanation for what `regex!` requires.</span>
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='ident'>Dynamic</span>(<span class='ident'>Program</span>),
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='ident'>Native</span>(<span class='ident'>ExNative</span>),
+}
+
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ExNative</span> {
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>original</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>,
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>names</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;</span>],
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='ident'>prog</span>: <span class='kw'>fn</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>CaptureIdxs</span>, <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Copy</span> <span class='kw'>for</span> <span class='ident'>ExNative</span> {}
+
+<span class='kw'>impl</span> <span class='ident'>Clone</span> <span class='kw'>for</span> <span class='ident'>ExNative</span> {
+ <span class='kw'>fn</span> <span class='ident'>clone</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>ExNative</span> {
+ <span class='op'>*</span><span class='self'>self</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Regex</span> {
+ <span class='doccomment'>/// Shows the original regular expression.</span>
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='self'>self</span>.<span class='ident'>as_str</span>())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Debug</span> <span class='kw'>for</span> <span class='ident'>Regex</span> {
+ <span class='doccomment'>/// Shows the original regular expression.</span>
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='ident'>fmt</span>::<span class='ident'>Display</span>::<span class='ident'>fmt</span>(<span class='self'>self</span>, <span class='ident'>f</span>)
+ }
+}
+
+<span class='doccomment'>/// Equality comparison is based on the original string. It is possible that</span>
+<span class='doccomment'>/// different regular expressions have the same matching behavior, but are</span>
+<span class='doccomment'>/// still compared unequal. For example, `\d+` and `\d\d*` match the same set</span>
+<span class='doccomment'>/// of strings, but are not considered equal.</span>
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span> <span class='kw'>for</span> <span class='ident'>Regex</span> {
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>Regex</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>as_str</span>() <span class='op'>==</span> <span class='ident'>other</span>.<span class='ident'>as_str</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Eq</span> <span class='kw'>for</span> <span class='ident'>Regex</span> {}
+
+<span class='kw'>impl</span> <span class='ident'>FromStr</span> <span class='kw'>for</span> <span class='ident'>Regex</span> {
+ <span class='kw'>type</span> <span class='prelude-val'>Err</span> <span class='op'>=</span> <span class='ident'>Error</span>;
+
+ <span class='doccomment'>/// Attempts to parse a string into a regular expression</span>
+ <span class='kw'>fn</span> <span class='ident'>from_str</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Regex</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>new</span>(<span class='ident'>s</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Regex</span> {
+ <span class='doccomment'>/// Compiles a dynamic regular expression. Once compiled, it can be</span>
+ <span class='doccomment'>/// used repeatedly to search, split or replace text in a string.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If an invalid expression is given, then an error is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Regex</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>with_size_limit</span>(<span class='number'>10</span> <span class='op'>*</span> (<span class='number'>1</span> <span class='op'>&lt;&lt;</span> <span class='number'>20</span>), <span class='ident'>re</span>)
+ }
+
+ <span class='doccomment'>/// Compiles a dynamic regular expression with the given size limit.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The size limit is applied to the size of the *compiled* data structure.</span>
+ <span class='doccomment'>/// If the data structure exceeds the size given, then an error is</span>
+ <span class='doccomment'>/// returned.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The default size limit used in `new` is 10MB.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_size_limit</span>(<span class='ident'>size</span>: <span class='ident'>usize</span>, <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Regex</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>with_engine</span>(<span class='prelude-val'>None</span>, <span class='ident'>size</span>, <span class='ident'>re</span>)
+ }
+
+ <span class='doccomment'>/// Compiles a dynamic regular expression and uses given matching engine.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is exposed for use in testing and shouldn&#39;t be used by clients.</span>
+ <span class='doccomment'>/// Instead, the regex program should choose the correct matching engine</span>
+ <span class='doccomment'>/// to use automatically. (Based on the regex, the size of the input and</span>
+ <span class='doccomment'>/// the type of search.)</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// A value of `None` means that the engine is automatically selected,</span>
+ <span class='doccomment'>/// which is the default behavior.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// **WARNING**: Passing an unsuitable engine for the given regex/input</span>
+ <span class='doccomment'>/// could lead to bad things. (Not unsafe things, but panics, incorrect</span>
+ <span class='doccomment'>/// matches and large memory use are all things that could happen.)</span>
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>with_engine</span>(
+ <span class='ident'>engine</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>MatchEngine</span><span class='op'>&gt;</span>,
+ <span class='ident'>size</span>: <span class='ident'>usize</span>,
+ <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>,
+ ) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Regex</span>, <span class='ident'>Error</span><span class='op'>&gt;</span> {
+ <span class='ident'>Program</span>::<span class='ident'>new</span>(<span class='ident'>engine</span>, <span class='ident'>size</span>, <span class='ident'>re</span>).<span class='ident'>map</span>(<span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>)
+ }
+
+
+ <span class='doccomment'>/// Returns true if and only if the regex matches the string given.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Test if some text contains at least one word with exactly 13</span>
+ <span class='doccomment'>/// characters:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let text = &quot;I categorically deny having triskaidekaphobia.&quot;;</span>
+ <span class='doccomment'>/// assert!(Regex::new(r&quot;\b\w{13}\b&quot;).unwrap().is_match(text));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_match</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>exec</span>(<span class='self'>self</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [], <span class='ident'>text</span>, <span class='number'>0</span>)
+ }
+
+ <span class='doccomment'>/// Returns the start and end byte range of the leftmost-first match in</span>
+ <span class='doccomment'>/// `text`. If no match exists, then `None` is returned.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that this should only be used if you want to discover the position</span>
+ <span class='doccomment'>/// of the match. Testing the existence of a match is faster if you use</span>
+ <span class='doccomment'>/// `is_match`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Find the start and end location of the first word with exactly 13</span>
+ <span class='doccomment'>/// characters:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let text = &quot;I categorically deny having triskaidekaphobia.&quot;;</span>
+ <span class='doccomment'>/// let pos = Regex::new(r&quot;\b\w{13}\b&quot;).unwrap().find(text);</span>
+ <span class='doccomment'>/// assert_eq!(pos, Some((2, 15)));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>caps</span> <span class='op'>=</span> [<span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>];
+ <span class='kw'>if</span> <span class='ident'>exec</span>(<span class='self'>self</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='number'>0</span>) {
+ <span class='prelude-val'>Some</span>((<span class='ident'>caps</span>[<span class='number'>0</span>].<span class='ident'>unwrap</span>(), <span class='ident'>caps</span>[<span class='number'>1</span>].<span class='ident'>unwrap</span>()))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator for each successive non-overlapping match in</span>
+ <span class='doccomment'>/// `text`, returning the start and end byte indices with respect to</span>
+ <span class='doccomment'>/// `text`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Find the start and end location of every word with exactly 13</span>
+ <span class='doccomment'>/// characters:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let text = &quot;Retroactively relinquishing remunerations is reprehensible.&quot;;</span>
+ <span class='doccomment'>/// for pos in Regex::new(r&quot;\b\w{13}\b&quot;).unwrap().find_iter(text) {</span>
+ <span class='doccomment'>/// println!(&quot;{:?}&quot;, pos);</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// // Output:</span>
+ <span class='doccomment'>/// // (0, 13)</span>
+ <span class='doccomment'>/// // (14, 27)</span>
+ <span class='doccomment'>/// // (28, 41)</span>
+ <span class='doccomment'>/// // (45, 58)</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>find_iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>FindMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>FindMatches</span> {
+ <span class='ident'>re</span>: <span class='self'>self</span>,
+ <span class='ident'>search</span>: <span class='ident'>text</span>,
+ <span class='ident'>last_end</span>: <span class='number'>0</span>,
+ <span class='ident'>last_match</span>: <span class='prelude-val'>None</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns the capture groups corresponding to the leftmost-first</span>
+ <span class='doccomment'>/// match in `text`. Capture group `0` always corresponds to the entire</span>
+ <span class='doccomment'>/// match. If no match is found, then `None` is returned.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// You should only use `captures` if you need access to submatches.</span>
+ <span class='doccomment'>/// Otherwise, `find` is faster for discovering the location of the overall</span>
+ <span class='doccomment'>/// match.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Examples</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Say you have some text with movie names and their release years,</span>
+ <span class='doccomment'>/// like &quot;&#39;Citizen Kane&#39; (1941)&quot;. It&#39;d be nice if we could search for text</span>
+ <span class='doccomment'>/// looking like that, while also extracting the movie name and its release</span>
+ <span class='doccomment'>/// year separately.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;&#39;([^&#39;]+)&#39;\s+\((\d{4})\)&quot;).unwrap();</span>
+ <span class='doccomment'>/// let text = &quot;Not my favorite movie: &#39;Citizen Kane&#39; (1941).&quot;;</span>
+ <span class='doccomment'>/// let caps = re.captures(text).unwrap();</span>
+ <span class='doccomment'>/// assert_eq!(caps.at(1), Some(&quot;Citizen Kane&quot;));</span>
+ <span class='doccomment'>/// assert_eq!(caps.at(2), Some(&quot;1941&quot;));</span>
+ <span class='doccomment'>/// assert_eq!(caps.at(0), Some(&quot;&#39;Citizen Kane&#39; (1941)&quot;));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that the full match is at capture group `0`. Each subsequent</span>
+ <span class='doccomment'>/// capture group is indexed by the order of its opening `(`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// We can make this example a bit clearer by using *named* capture groups:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;&#39;(?P&lt;title&gt;[^&#39;]+)&#39;\s+\((?P&lt;year&gt;\d{4})\)&quot;)</span>
+ <span class='doccomment'>/// .unwrap();</span>
+ <span class='doccomment'>/// let text = &quot;Not my favorite movie: &#39;Citizen Kane&#39; (1941).&quot;;</span>
+ <span class='doccomment'>/// let caps = re.captures(text).unwrap();</span>
+ <span class='doccomment'>/// assert_eq!(caps.name(&quot;title&quot;), Some(&quot;Citizen Kane&quot;));</span>
+ <span class='doccomment'>/// assert_eq!(caps.name(&quot;year&quot;), Some(&quot;1941&quot;));</span>
+ <span class='doccomment'>/// assert_eq!(caps.at(0), Some(&quot;&#39;Citizen Kane&#39; (1941)&quot;));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Here we name the capture groups, which we can access with the `name`</span>
+ <span class='doccomment'>/// method. Note that the named capture groups are still accessible with</span>
+ <span class='doccomment'>/// `at`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The `0`th capture group is always unnamed, so it must always be</span>
+ <span class='doccomment'>/// accessed with `at(0)`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>caps</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>alloc_captures</span>();
+ <span class='kw'>if</span> <span class='ident'>exec</span>(<span class='self'>self</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='number'>0</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>Captures</span>::<span class='ident'>new</span>(<span class='self'>self</span>, <span class='ident'>text</span>, <span class='ident'>caps</span>))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator over all the non-overlapping capture groups matched</span>
+ <span class='doccomment'>/// in `text`. This is operationally the same as `find_iter` (except it</span>
+ <span class='doccomment'>/// yields information about submatches).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// We can use this to find all movie titles and their release years in</span>
+ <span class='doccomment'>/// some text, where the movie is formatted like &quot;&#39;Title&#39; (xxxx)&quot;:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;&#39;(?P&lt;title&gt;[^&#39;]+)&#39;\s+\((?P&lt;year&gt;\d{4})\)&quot;)</span>
+ <span class='doccomment'>/// .unwrap();</span>
+ <span class='doccomment'>/// let text = &quot;&#39;Citizen Kane&#39; (1941), &#39;The Wizard of Oz&#39; (1939), &#39;M&#39; (1931).&quot;;</span>
+ <span class='doccomment'>/// for caps in re.captures_iter(text) {</span>
+ <span class='doccomment'>/// println!(&quot;Movie: {:?}, Released: {:?}&quot;, caps.name(&quot;title&quot;), caps.name(&quot;year&quot;));</span>
+ <span class='doccomment'>/// }</span>
+ <span class='doccomment'>/// // Output:</span>
+ <span class='doccomment'>/// // Movie: Citizen Kane, Released: 1941</span>
+ <span class='doccomment'>/// // Movie: The Wizard of Oz, Released: 1939</span>
+ <span class='doccomment'>/// // Movie: M, Released: 1931</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>captures_iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>FindCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>FindCaptures</span> {
+ <span class='ident'>re</span>: <span class='self'>self</span>,
+ <span class='ident'>search</span>: <span class='ident'>text</span>,
+ <span class='ident'>last_match</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>last_end</span>: <span class='number'>0</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator of substrings of `text` delimited by a match</span>
+ <span class='doccomment'>/// of the regular expression.</span>
+ <span class='doccomment'>/// Namely, each element of the iterator corresponds to text that *isn&#39;t*</span>
+ <span class='doccomment'>/// matched by the regular expression.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method will *not* copy the text given.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// To split a string delimited by arbitrary amounts of spaces or tabs:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;[ \t]+&quot;).unwrap();</span>
+ <span class='doccomment'>/// let fields: Vec&lt;&amp;str&gt; = re.split(&quot;a b \t c\td e&quot;).collect();</span>
+ <span class='doccomment'>/// assert_eq!(fields, vec!(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>split</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>RegexSplits</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>RegexSplits</span> {
+ <span class='ident'>finder</span>: <span class='self'>self</span>.<span class='ident'>find_iter</span>(<span class='ident'>text</span>),
+ <span class='ident'>last</span>: <span class='number'>0</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns an iterator of at most `limit` substrings of `text` delimited</span>
+ <span class='doccomment'>/// by a match of the regular expression. (A `limit` of `0` will return no</span>
+ <span class='doccomment'>/// substrings.)</span>
+ <span class='doccomment'>/// Namely, each element of the iterator corresponds to text that *isn&#39;t*</span>
+ <span class='doccomment'>/// matched by the regular expression.</span>
+ <span class='doccomment'>/// The remainder of the string that is not split will be the last element</span>
+ <span class='doccomment'>/// in the iterator.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This method will *not* copy the text given.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Example</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Get the first two words in some text:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;\W+&quot;).unwrap();</span>
+ <span class='doccomment'>/// let fields: Vec&lt;&amp;str&gt; = re.splitn(&quot;Hey! How are you?&quot;, 3).collect();</span>
+ <span class='doccomment'>/// assert_eq!(fields, vec!(&quot;Hey&quot;, &quot;How&quot;, &quot;are you?&quot;));</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>splitn</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>, <span class='ident'>limit</span>: <span class='ident'>usize</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>RegexSplitsN</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>RegexSplitsN</span> {
+ <span class='ident'>splits</span>: <span class='self'>self</span>.<span class='ident'>split</span>(<span class='ident'>text</span>),
+ <span class='ident'>cur</span>: <span class='number'>0</span>,
+ <span class='ident'>limit</span>: <span class='ident'>limit</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Replaces the leftmost-first match with the replacement provided.</span>
+ <span class='doccomment'>/// The replacement can be a regular string (where `$N` and `$name` are</span>
+ <span class='doccomment'>/// expanded to match capture groups) or a function that takes the matches&#39;</span>
+ <span class='doccomment'>/// `Captures` and returns the replaced string.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If no match is found, then a copy of the string is returned unchanged.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// # Examples</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that this function is polymorphic with respect to the replacement.</span>
+ <span class='doccomment'>/// In typical usage, this can just be a normal string:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(&quot;[^01]+&quot;).unwrap();</span>
+ <span class='doccomment'>/// assert_eq!(re.replace(&quot;1078910&quot;, &quot;&quot;), &quot;1010&quot;);</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// But anything satisfying the `Replacer` trait will work. For example,</span>
+ <span class='doccomment'>/// a closure of type `|&amp;Captures| -&gt; String` provides direct access to the</span>
+ <span class='doccomment'>/// captures corresponding to a match. This allows one to access</span>
+ <span class='doccomment'>/// submatches easily:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # use regex::Captures; fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;([^,\s]+),\s+(\S+)&quot;).unwrap();</span>
+ <span class='doccomment'>/// let result = re.replace(&quot;Springsteen, Bruce&quot;, |caps: &amp;Captures| {</span>
+ <span class='doccomment'>/// format!(&quot;{} {}&quot;, caps.at(2).unwrap_or(&quot;&quot;), caps.at(1).unwrap_or(&quot;&quot;))</span>
+ <span class='doccomment'>/// });</span>
+ <span class='doccomment'>/// assert_eq!(result, &quot;Bruce Springsteen&quot;);</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// But this is a bit cumbersome to use all the time. Instead, a simple</span>
+ <span class='doccomment'>/// syntax is supported that expands `$name` into the corresponding capture</span>
+ <span class='doccomment'>/// group. Here&#39;s the last example, but using this expansion technique</span>
+ <span class='doccomment'>/// with named capture groups:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;(?P&lt;last&gt;[^,\s]+),\s+(?P&lt;first&gt;\S+)&quot;).unwrap();</span>
+ <span class='doccomment'>/// let result = re.replace(&quot;Springsteen, Bruce&quot;, &quot;$first $last&quot;);</span>
+ <span class='doccomment'>/// assert_eq!(result, &quot;Bruce Springsteen&quot;);</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that using `$2` instead of `$first` or `$1` instead of `$last`</span>
+ <span class='doccomment'>/// would produce the same result. To write a literal `$` use `$$`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Finally, sometimes you just want to replace a literal string with no</span>
+ <span class='doccomment'>/// submatch expansion. This can be done by wrapping a string with</span>
+ <span class='doccomment'>/// `NoExpand`:</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// ```rust</span>
+ <span class='doccomment'>/// # extern crate regex; use regex::Regex;</span>
+ <span class='doccomment'>/// # fn main() {</span>
+ <span class='doccomment'>/// use regex::NoExpand;</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// let re = Regex::new(r&quot;(?P&lt;last&gt;[^,\s]+),\s+(\S+)&quot;).unwrap();</span>
+ <span class='doccomment'>/// let result = re.replace(&quot;Springsteen, Bruce&quot;, NoExpand(&quot;$2 $last&quot;));</span>
+ <span class='doccomment'>/// assert_eq!(result, &quot;$2 $last&quot;);</span>
+ <span class='doccomment'>/// # }</span>
+ <span class='doccomment'>/// ```</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>replace</span><span class='op'>&lt;</span><span class='ident'>R</span>: <span class='ident'>Replacer</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>rep</span>: <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='self'>self</span>.<span class='ident'>replacen</span>(<span class='ident'>text</span>, <span class='number'>1</span>, <span class='ident'>rep</span>)
+ }
+
+ <span class='doccomment'>/// Replaces all non-overlapping matches in `text` with the</span>
+ <span class='doccomment'>/// replacement provided. This is the same as calling `replacen` with</span>
+ <span class='doccomment'>/// `limit` set to `0`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// See the documentation for `replace` for details on how to access</span>
+ <span class='doccomment'>/// submatches in the replacement string.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>replace_all</span><span class='op'>&lt;</span><span class='ident'>R</span>: <span class='ident'>Replacer</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>rep</span>: <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='self'>self</span>.<span class='ident'>replacen</span>(<span class='ident'>text</span>, <span class='number'>0</span>, <span class='ident'>rep</span>)
+ }
+
+ <span class='doccomment'>/// Replaces at most `limit` non-overlapping matches in `text` with the</span>
+ <span class='doccomment'>/// replacement provided. If `limit` is 0, then all non-overlapping matches</span>
+ <span class='doccomment'>/// are replaced.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// See the documentation for `replace` for details on how to access</span>
+ <span class='doccomment'>/// submatches in the replacement string.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>replacen</span><span class='op'>&lt;</span><span class='ident'>R</span>: <span class='ident'>Replacer</span><span class='op'>&gt;</span>
+ (<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>limit</span>: <span class='ident'>usize</span>, <span class='kw-2'>mut</span> <span class='ident'>rep</span>: <span class='ident'>R</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>new</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>with_capacity</span>(<span class='ident'>text</span>.<span class='ident'>len</span>());
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>last_match</span> <span class='op'>=</span> <span class='number'>0</span>;
+
+ <span class='kw'>if</span> <span class='ident'>rep</span>.<span class='ident'>no_expand</span>().<span class='ident'>is_some</span>() {
+ <span class='comment'>// borrow checker pains. `rep` is borrowed mutably in the `else`</span>
+ <span class='comment'>// branch below.</span>
+ <span class='kw'>let</span> <span class='ident'>rep</span> <span class='op'>=</span> <span class='ident'>rep</span>.<span class='ident'>no_expand</span>().<span class='ident'>unwrap</span>();
+ <span class='kw'>for</span> (<span class='ident'>i</span>, (<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>find_iter</span>(<span class='ident'>text</span>).<span class='ident'>enumerate</span>() {
+ <span class='kw'>if</span> <span class='ident'>limit</span> <span class='op'>&gt;</span> <span class='number'>0</span> <span class='op'>&amp;&amp;</span> <span class='ident'>i</span> <span class='op'>&gt;=</span> <span class='ident'>limit</span> {
+ <span class='kw'>break</span>
+ }
+ <span class='ident'>new</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>last_match</span>..<span class='ident'>s</span>]);
+ <span class='ident'>new</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>rep</span>);
+ <span class='ident'>last_match</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ }
+ } <span class='kw'>else</span> {
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>cap</span>) <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>captures_iter</span>(<span class='ident'>text</span>).<span class='ident'>enumerate</span>() {
+ <span class='kw'>if</span> <span class='ident'>limit</span> <span class='op'>&gt;</span> <span class='number'>0</span> <span class='op'>&amp;&amp;</span> <span class='ident'>i</span> <span class='op'>&gt;=</span> <span class='ident'>limit</span> {
+ <span class='kw'>break</span>
+ }
+ <span class='comment'>// unwrap on 0 is OK because captures only reports matches</span>
+ <span class='kw'>let</span> (<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='op'>=</span> <span class='ident'>cap</span>.<span class='ident'>pos</span>(<span class='number'>0</span>).<span class='ident'>unwrap</span>();
+ <span class='ident'>new</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>last_match</span>..<span class='ident'>s</span>]);
+ <span class='ident'>new</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>rep</span>.<span class='ident'>reg_replace</span>(<span class='kw-2'>&amp;</span><span class='ident'>cap</span>));
+ <span class='ident'>last_match</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ }
+ }
+ <span class='ident'>new</span>.<span class='ident'>push_str</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='ident'>last_match</span>..]);
+ <span class='ident'>new</span>
+ }
+
+ <span class='doccomment'>/// Returns the original string of this regex.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>as_str</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>str</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>(<span class='ident'>Program</span> { <span class='kw-2'>ref</span> <span class='ident'>original</span>, .. }) <span class='op'>=&gt;</span> <span class='ident'>original</span>,
+ <span class='ident'>Regex</span>::<span class='ident'>Native</span>(<span class='ident'>ExNative</span> { <span class='kw-2'>ref</span> <span class='ident'>original</span>, .. }) <span class='op'>=&gt;</span> <span class='ident'>original</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>names_iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>NamesIter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>Native</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>) <span class='op'>=&gt;</span> <span class='ident'>NamesIter</span>::<span class='ident'>Native</span>(<span class='ident'>n</span>.<span class='ident'>names</span>.<span class='ident'>iter</span>()),
+ <span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='ident'>d</span>) <span class='op'>=&gt;</span> <span class='ident'>NamesIter</span>::<span class='ident'>Dynamic</span>(<span class='ident'>d</span>.<span class='ident'>cap_names</span>.<span class='ident'>iter</span>())
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>names_len</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>Native</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>) <span class='op'>=&gt;</span> <span class='ident'>n</span>.<span class='ident'>names</span>.<span class='ident'>len</span>(),
+ <span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='ident'>d</span>) <span class='op'>=&gt;</span> <span class='ident'>d</span>.<span class='ident'>cap_names</span>.<span class='ident'>len</span>()
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>alloc_captures</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>Native</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>) <span class='op'>=&gt;</span> <span class='macro'>vec</span><span class='macro'>!</span>[<span class='prelude-val'>None</span>; <span class='number'>2</span> <span class='op'>*</span> <span class='ident'>n</span>.<span class='ident'>names</span>.<span class='ident'>len</span>()],
+ <span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='ident'>d</span>) <span class='op'>=&gt;</span> <span class='ident'>d</span>.<span class='ident'>alloc_captures</span>(),
+ }
+ }
+}
+
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>NamesIter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>Native</span>(::<span class='ident'>std</span>::<span class='ident'>slice</span>::<span class='ident'>Iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;&gt;</span>),
+ <span class='ident'>Dynamic</span>(::<span class='ident'>std</span>::<span class='ident'>slice</span>::<span class='ident'>Iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span>)
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>NamesIter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span><span class='op'>=</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>NamesIter</span>::<span class='ident'>Native</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>i</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>i</span>.<span class='ident'>next</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>to_owned</span>())),
+ <span class='ident'>NamesIter</span>::<span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='kw-2'>mut</span> <span class='ident'>i</span>) <span class='op'>=&gt;</span>
+ <span class='ident'>i</span>.<span class='ident'>next</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>s</span><span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>to_owned</span>())),
+ }
+ }
+}
+
+<span class='doccomment'>/// NoExpand indicates literal string replacement.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It can be used with `replace` and `replace_all` to do a literal</span>
+<span class='doccomment'>/// string replacement without expanding `$name` to their corresponding</span>
+<span class='doccomment'>/// capture groups.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;r` is the lifetime of the literal text.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>NoExpand</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(<span class='kw'>pub</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>);
+
+<span class='doccomment'>/// Replacer describes types that can be used to replace matches in a string.</span>
+<span class='kw'>pub</span> <span class='kw'>trait</span> <span class='ident'>Replacer</span> {
+ <span class='doccomment'>/// Returns a possibly owned string that is used to replace the match</span>
+ <span class='doccomment'>/// corresponding to the `caps` capture group.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The `&#39;a` lifetime refers to the lifetime of a borrowed string when</span>
+ <span class='doccomment'>/// a new owned string isn&#39;t needed (e.g., for `NoExpand`).</span>
+ <span class='kw'>fn</span> <span class='ident'>reg_replace</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='ident'>Captures</span>) <span class='op'>-&gt;</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span>;
+
+ <span class='doccomment'>/// Returns a possibly owned string that never needs expansion.</span>
+ <span class='kw'>fn</span> <span class='ident'>no_expand</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;&gt;</span> { <span class='prelude-val'>None</span> }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Replacer</span> <span class='kw'>for</span> <span class='ident'>NoExpand</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>reg_replace</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>, _: <span class='kw-2'>&amp;</span><span class='ident'>Captures</span>) <span class='op'>-&gt;</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='number'>0</span>.<span class='ident'>into</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>no_expand</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;&gt;</span> {
+ <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='number'>0</span>.<span class='ident'>into</span>())
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Replacer</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span> {
+ <span class='kw'>fn</span> <span class='ident'>reg_replace</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='ident'>Captures</span>) <span class='op'>-&gt;</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='ident'>caps</span>.<span class='ident'>expand</span>(<span class='op'>*</span><span class='self'>self</span>).<span class='ident'>into</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>no_expand</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>re</span> <span class='op'>=</span> <span class='ident'>Regex</span>::<span class='ident'>new</span>(<span class='ident'>REPLACE_EXPAND</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>re</span>.<span class='ident'>is_match</span>(<span class='self'>self</span>) {
+ <span class='prelude-val'>Some</span>((<span class='op'>*</span><span class='self'>self</span>).<span class='ident'>into</span>())
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>F</span><span class='op'>&gt;</span> <span class='ident'>Replacer</span> <span class='kw'>for</span> <span class='ident'>F</span> <span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>FnMut</span>(<span class='kw-2'>&amp;</span><span class='ident'>Captures</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>fn</span> <span class='ident'>reg_replace</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='ident'>Captures</span>) <span class='op'>-&gt;</span> <span class='ident'>Cow</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>str</span><span class='op'>&gt;</span> {
+ (<span class='op'>*</span><span class='self'>self</span>)(<span class='ident'>caps</span>).<span class='ident'>into</span>()
+ }
+}
+
+<span class='doccomment'>/// Yields all substrings delimited by a regular expression match.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;r` is the lifetime of the compiled expression and `&#39;t` is the lifetime</span>
+<span class='doccomment'>/// of the string being split.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>RegexSplits</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>finder</span>: <span class='ident'>FindMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+ <span class='ident'>last</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>RegexSplits</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>text</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>finder</span>.<span class='ident'>search</span>;
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>finder</span>.<span class='ident'>next</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last</span> <span class='op'>&gt;=</span> <span class='ident'>text</span>.<span class='ident'>len</span>() {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>last</span>..];
+ <span class='self'>self</span>.<span class='ident'>last</span> <span class='op'>=</span> <span class='ident'>text</span>.<span class='ident'>len</span>();
+ <span class='prelude-val'>Some</span>(<span class='ident'>s</span>)
+ }
+ }
+ <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>matched</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>last</span>..<span class='ident'>s</span>];
+ <span class='self'>self</span>.<span class='ident'>last</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ <span class='prelude-val'>Some</span>(<span class='ident'>matched</span>)
+ }
+ }
+ }
+}
+
+<span class='doccomment'>/// Yields at most `N` substrings delimited by a regular expression match.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The last substring will be whatever remains after splitting.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;r` is the lifetime of the compiled expression and `&#39;t` is the lifetime</span>
+<span class='doccomment'>/// of the string being split.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>RegexSplitsN</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>splits</span>: <span class='ident'>RegexSplits</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+ <span class='ident'>cur</span>: <span class='ident'>usize</span>,
+ <span class='ident'>limit</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>RegexSplitsN</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>text</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>splits</span>.<span class='ident'>finder</span>.<span class='ident'>search</span>;
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>limit</span> {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>limit</span> {
+ <span class='prelude-val'>Some</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>[<span class='self'>self</span>.<span class='ident'>splits</span>.<span class='ident'>last</span>..])
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>splits</span>.<span class='ident'>next</span>()
+ }
+ }
+ }
+}
+
+<span class='doccomment'>/// Captures represents a group of captured strings for a single match.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The 0th capture always corresponds to the entire match. Each subsequent</span>
+<span class='doccomment'>/// index corresponds to the next capture group in the regex.</span>
+<span class='doccomment'>/// If a capture group is named, then the matched string is *also* available</span>
+<span class='doccomment'>/// via the `name` method. (Note that the 0th capture is always unnamed and so</span>
+<span class='doccomment'>/// must be accessed with the `at` method.)</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Positions returned from a capture group are always byte indices.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;t` is the lifetime of the matched text.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>,
+ <span class='ident'>locs</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>named</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>HashMap</span><span class='op'>&lt;</span><span class='ident'>String</span>, <span class='ident'>usize</span><span class='op'>&gt;&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>(
+ <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>Regex</span>,
+ <span class='ident'>search</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>,
+ <span class='ident'>locs</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;&gt;</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>named</span> <span class='op'>=</span>
+ <span class='kw'>if</span> <span class='ident'>re</span>.<span class='ident'>names_len</span>() <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>named</span> <span class='op'>=</span> <span class='ident'>HashMap</span>::<span class='ident'>new</span>();
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>name</span>) <span class='kw'>in</span> <span class='ident'>re</span>.<span class='ident'>names_iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>name</span>) <span class='op'>=</span> <span class='ident'>name</span> {
+ <span class='ident'>named</span>.<span class='ident'>insert</span>(<span class='ident'>name</span>, <span class='ident'>i</span>);
+ }
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>named</span>)
+ };
+ <span class='ident'>Captures</span> {
+ <span class='ident'>text</span>: <span class='ident'>search</span>,
+ <span class='ident'>locs</span>: <span class='ident'>locs</span>,
+ <span class='ident'>named</span>: <span class='ident'>named</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Returns the start and end positions of the Nth capture group.</span>
+ <span class='doccomment'>/// Returns `None` if `i` is not a valid capture group or if the capture</span>
+ <span class='doccomment'>/// group did not match anything.</span>
+ <span class='doccomment'>/// The positions returned are *always* byte indices with respect to the</span>
+ <span class='doccomment'>/// original string matched.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>pos</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> (<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='op'>=</span> (<span class='ident'>i</span> <span class='op'>*</span> <span class='number'>2</span>, <span class='ident'>i</span> <span class='op'>*</span> <span class='number'>2</span> <span class='op'>+</span> <span class='number'>1</span>);
+ <span class='kw'>if</span> <span class='ident'>e</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>locs</span>.<span class='ident'>len</span>() <span class='op'>||</span> <span class='self'>self</span>.<span class='ident'>locs</span>[<span class='ident'>s</span>].<span class='ident'>is_none</span>() {
+ <span class='comment'>// VM guarantees that each pair of locations are both Some or None.</span>
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+ <span class='prelude-val'>Some</span>((<span class='self'>self</span>.<span class='ident'>locs</span>[<span class='ident'>s</span>].<span class='ident'>unwrap</span>(), <span class='self'>self</span>.<span class='ident'>locs</span>[<span class='ident'>e</span>].<span class='ident'>unwrap</span>()))
+ }
+
+ <span class='doccomment'>/// Returns the matched string for the capture group `i`. If `i` isn&#39;t</span>
+ <span class='doccomment'>/// a valid capture group or didn&#39;t match anything, then `None` is</span>
+ <span class='doccomment'>/// returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>at</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>pos</span>(<span class='ident'>i</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>text</span>[<span class='ident'>s</span>..<span class='ident'>e</span>])
+ }
+ }
+
+ <span class='doccomment'>/// Returns the matched string for the capture group named `name`. If</span>
+ <span class='doccomment'>/// `name` isn&#39;t a valid capture group or didn&#39;t match anything, then</span>
+ <span class='doccomment'>/// `None` is returned.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>name</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>named</span> {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>h</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>h</span>.<span class='ident'>get</span>(<span class='ident'>name</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>Some</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>at</span>(<span class='op'>*</span><span class='ident'>i</span>),
+ }
+ }
+ }
+ }
+
+ <span class='doccomment'>/// Creates an iterator of all the capture groups in order of appearance</span>
+ <span class='doccomment'>/// in the regular expression.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>iter</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SubCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>SubCaptures</span> { <span class='ident'>idx</span>: <span class='number'>0</span>, <span class='ident'>caps</span>: <span class='self'>self</span>, }
+ }
+
+ <span class='doccomment'>/// Creates an iterator of all the capture group positions in order of</span>
+ <span class='doccomment'>/// appearance in the regular expression. Positions are byte indices</span>
+ <span class='doccomment'>/// in terms of the original string matched.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>iter_pos</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SubCapturesPos</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>SubCapturesPos</span> { <span class='ident'>idx</span>: <span class='number'>0</span>, <span class='ident'>caps</span>: <span class='self'>self</span>, }
+ }
+
+ <span class='doccomment'>/// Creates an iterator of all named groups as an tuple with the group</span>
+ <span class='doccomment'>/// name and the value. The iterator returns these values in arbitrary</span>
+ <span class='doccomment'>/// order.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>iter_named</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SubCapturesNamed</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>SubCapturesNamed</span> { <span class='ident'>caps</span>: <span class='self'>self</span>, <span class='ident'>inner</span>: <span class='self'>self</span>.<span class='ident'>named</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>n</span><span class='op'>|</span> <span class='ident'>n</span>.<span class='ident'>iter</span>()) }
+ }
+
+ <span class='doccomment'>/// Expands all instances of `$name` in `text` to the corresponding capture</span>
+ <span class='doccomment'>/// group `name`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// `name` may be an integer corresponding to the index of the</span>
+ <span class='doccomment'>/// capture group (counted by order of opening parenthesis where `0` is the</span>
+ <span class='doccomment'>/// entire match) or it can be a name (consisting of letters, digits or</span>
+ <span class='doccomment'>/// underscores) corresponding to a named capture group.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If `name` isn&#39;t a valid capture group (whether the name doesn&#39;t exist or</span>
+ <span class='doccomment'>/// isn&#39;t a valid index), then it is replaced with the empty string.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// To write a literal `$` use `$$`.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>expand</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='comment'>// How evil can you get?</span>
+ <span class='kw'>let</span> <span class='ident'>re</span> <span class='op'>=</span> <span class='ident'>Regex</span>::<span class='ident'>new</span>(<span class='ident'>REPLACE_EXPAND</span>).<span class='ident'>unwrap</span>();
+ <span class='kw'>let</span> <span class='ident'>text</span> <span class='op'>=</span> <span class='ident'>re</span>.<span class='ident'>replace_all</span>(<span class='ident'>text</span>, <span class='op'>|</span><span class='ident'>refs</span>: <span class='kw-2'>&amp;</span><span class='ident'>Captures</span><span class='op'>|</span> <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='ident'>before</span> <span class='op'>=</span> <span class='ident'>refs</span>.<span class='ident'>name</span>(<span class='string'>&quot;before&quot;</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>);
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='ident'>refs</span>.<span class='ident'>name</span>(<span class='string'>&quot;name&quot;</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>);
+ <span class='macro'>format</span><span class='macro'>!</span>(<span class='string'>&quot;{}{}&quot;</span>, <span class='ident'>before</span>, <span class='kw'>match</span> <span class='ident'>name</span>.<span class='ident'>parse</span>::<span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>() {
+ <span class='prelude-val'>Err</span>(_) <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>name</span>(<span class='ident'>name</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>).<span class='ident'>to_string</span>(),
+ <span class='prelude-val'>Ok</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>at</span>(<span class='ident'>i</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>).<span class='ident'>to_string</span>(),
+ })
+ });
+ <span class='kw'>let</span> <span class='ident'>re</span> <span class='op'>=</span> <span class='ident'>Regex</span>::<span class='ident'>new</span>(<span class='string'>r&quot;\$\$&quot;</span>).<span class='ident'>unwrap</span>();
+ <span class='ident'>re</span>.<span class='ident'>replace_all</span>(<span class='kw-2'>&amp;</span><span class='ident'>text</span>, <span class='ident'>NoExpand</span>(<span class='string'>&quot;$&quot;</span>))
+ }
+
+ <span class='doccomment'>/// Returns the number of captured groups.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>len</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> { <span class='self'>self</span>.<span class='ident'>locs</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='number'>2</span> }
+
+ <span class='doccomment'>/// Returns true if and only if there are no captured groups.</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_empty</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='self'>self</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> }
+}
+
+<span class='doccomment'>/// An iterator over capture groups for a particular match of a regular</span>
+<span class='doccomment'>/// expression.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;t` is the lifetime of the matched text.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SubCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>idx</span>: <span class='ident'>usize</span>,
+ <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>SubCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>caps</span>.<span class='ident'>len</span>() {
+ <span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>caps</span>.<span class='ident'>at</span>(<span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>-</span> <span class='number'>1</span>))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='doccomment'>/// An iterator over capture group positions for a particular match of a</span>
+<span class='doccomment'>/// regular expression.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Positions are byte indices in terms of the original string matched.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;t` is the lifetime of the matched text.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SubCapturesPos</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>idx</span>: <span class='ident'>usize</span>,
+ <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>SubCapturesPos</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>caps</span>.<span class='ident'>len</span>() {
+ <span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>caps</span>.<span class='ident'>pos</span>(<span class='self'>self</span>.<span class='ident'>idx</span> <span class='op'>-</span> <span class='number'>1</span>))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='doccomment'>/// An Iterator over named capture groups as a tuple with the group</span>
+<span class='doccomment'>/// name and the value.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;t` is the lifetime of the matched text.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>SubCapturesNamed</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>{
+ <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+ <span class='ident'>inner</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span>, <span class='ident'>String</span>, <span class='ident'>usize</span><span class='op'>&gt;&gt;</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>SubCapturesNamed</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> (<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span>);
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>, <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span><span class='op'>&gt;</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>inner</span>.<span class='ident'>as_mut</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>it</span><span class='op'>|</span> <span class='ident'>it</span>.<span class='ident'>next</span>()).<span class='ident'>unwrap_or</span>(<span class='prelude-val'>None</span>) {
+ <span class='prelude-val'>Some</span>((<span class='ident'>name</span>, <span class='ident'>pos</span>)) <span class='op'>=&gt;</span> <span class='prelude-val'>Some</span>((<span class='ident'>name</span>, <span class='self'>self</span>.<span class='ident'>caps</span>.<span class='ident'>at</span>(<span class='op'>*</span><span class='ident'>pos</span>))),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='doccomment'>/// An iterator that yields all non-overlapping capture groups matching a</span>
+<span class='doccomment'>/// particular regular expression.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The iterator stops when no more matches can be found.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;r` is the lifetime of the compiled expression and `&#39;t` is the lifetime</span>
+<span class='doccomment'>/// of the matched string.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>FindCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='ident'>Regex</span>,
+ <span class='ident'>search</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>,
+ <span class='ident'>last_match</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>,
+ <span class='ident'>last_end</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>FindCaptures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Captures</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>&gt;</span> <span class='self'>self</span>.<span class='ident'>search</span>.<span class='ident'>len</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>caps</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>re</span>.<span class='ident'>alloc_captures</span>();
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>exec</span>(<span class='self'>self</span>.<span class='ident'>re</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='self'>self</span>.<span class='ident'>search</span>, <span class='self'>self</span>.<span class='ident'>last_end</span>) {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+ <span class='kw'>let</span> (<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='op'>=</span> (<span class='ident'>caps</span>[<span class='number'>0</span>].<span class='ident'>unwrap</span>(), <span class='ident'>caps</span>[<span class='number'>1</span>].<span class='ident'>unwrap</span>());
+
+ <span class='comment'>// Don&#39;t accept empty matches immediately following a match.</span>
+ <span class='comment'>// i.e., no infinite loops please.</span>
+ <span class='kw'>if</span> <span class='ident'>e</span> <span class='op'>==</span> <span class='ident'>s</span> <span class='op'>&amp;&amp;</span> <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>last_end</span>) <span class='op'>==</span> <span class='self'>self</span>.<span class='ident'>last_match</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>search</span>.<span class='ident'>len</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+ <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>+=</span> <span class='self'>self</span>.<span class='ident'>search</span>[<span class='self'>self</span>.<span class='ident'>last_end</span>..].<span class='ident'>chars</span>()
+ .<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>len_utf8</span>();
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>next</span>()
+ }
+ <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ <span class='self'>self</span>.<span class='ident'>last_match</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>last_end</span>);
+ <span class='prelude-val'>Some</span>(<span class='ident'>Captures</span>::<span class='ident'>new</span>(<span class='self'>self</span>.<span class='ident'>re</span>, <span class='self'>self</span>.<span class='ident'>search</span>, <span class='ident'>caps</span>))
+ }
+}
+
+<span class='doccomment'>/// An iterator over all non-overlapping matches for a particular string.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The iterator yields a tuple of integers corresponding to the start and end</span>
+<span class='doccomment'>/// of the match. The indices are byte offsets. The iterator stops when no more</span>
+<span class='doccomment'>/// matches can be found.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// `&#39;r` is the lifetime of the compiled expression and `&#39;t` is the lifetime</span>
+<span class='doccomment'>/// of the matched string.</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>FindMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='ident'>Regex</span>,
+ <span class='ident'>search</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>,
+ <span class='ident'>last_match</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>,
+ <span class='ident'>last_end</span>: <span class='ident'>usize</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>FindMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> (<span class='ident'>usize</span>, <span class='ident'>usize</span>);
+
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>&gt;</span> <span class='self'>self</span>.<span class='ident'>search</span>.<span class='ident'>len</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>caps</span> <span class='op'>=</span> [<span class='prelude-val'>None</span>, <span class='prelude-val'>None</span>];
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>exec</span>(<span class='self'>self</span>.<span class='ident'>re</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='self'>self</span>.<span class='ident'>search</span>, <span class='self'>self</span>.<span class='ident'>last_end</span>) {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+ <span class='kw'>let</span> (<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='op'>=</span> (<span class='ident'>caps</span>[<span class='number'>0</span>].<span class='ident'>unwrap</span>(), <span class='ident'>caps</span>[<span class='number'>1</span>].<span class='ident'>unwrap</span>());
+
+ <span class='comment'>// Don&#39;t accept empty matches immediately following a match.</span>
+ <span class='comment'>// i.e., no infinite loops please.</span>
+ <span class='kw'>if</span> <span class='ident'>e</span> <span class='op'>==</span> <span class='ident'>s</span> <span class='op'>&amp;&amp;</span> <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>last_end</span>) <span class='op'>==</span> <span class='self'>self</span>.<span class='ident'>last_match</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>search</span>.<span class='ident'>len</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+ <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>+=</span> <span class='self'>self</span>.<span class='ident'>search</span>[<span class='self'>self</span>.<span class='ident'>last_end</span>..].<span class='ident'>chars</span>()
+ .<span class='ident'>next</span>().<span class='ident'>unwrap</span>().<span class='ident'>len_utf8</span>();
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>next</span>()
+ }
+ <span class='self'>self</span>.<span class='ident'>last_end</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ <span class='self'>self</span>.<span class='ident'>last_match</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>last_end</span>);
+ <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>))
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;pattern&quot;</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>RegexSearcher</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>it</span>: <span class='ident'>FindMatches</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+ <span class='ident'>last_step_end</span>: <span class='ident'>usize</span>,
+ <span class='ident'>next_match</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span>(<span class='ident'>usize</span>, <span class='ident'>usize</span>)<span class='op'>&gt;</span>,
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;pattern&quot;</span>)]</span>
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Pattern</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='ident'>Regex</span> {
+ <span class='kw'>type</span> <span class='ident'>Searcher</span> <span class='op'>=</span> <span class='ident'>RegexSearcher</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>;
+
+ <span class='kw'>fn</span> <span class='ident'>into_searcher</span>(<span class='self'>self</span>, <span class='ident'>haystack</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>RegexSearcher</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>RegexSearcher</span> {
+ <span class='ident'>it</span>: <span class='self'>self</span>.<span class='ident'>find_iter</span>(<span class='ident'>haystack</span>),
+ <span class='ident'>last_step_end</span>: <span class='number'>0</span>,
+ <span class='ident'>next_match</span>: <span class='prelude-val'>None</span>,
+ }
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;pattern&quot;</span>)]</span>
+<span class='kw'>unsafe</span> <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Searcher</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>RegexSearcher</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span>, <span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>haystack</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>it</span>.<span class='ident'>search</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>SearchStep</span> {
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>next_match</span> {
+ <span class='self'>self</span>.<span class='ident'>next_match</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='self'>self</span>.<span class='ident'>last_step_end</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ <span class='kw'>return</span> <span class='ident'>SearchStep</span>::<span class='ident'>Match</span>(<span class='ident'>s</span>, <span class='ident'>e</span>);
+ }
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>it</span>.<span class='ident'>next</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>last_step_end</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>haystack</span>().<span class='ident'>len</span>() {
+ <span class='kw'>let</span> <span class='ident'>last</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>last_step_end</span>;
+ <span class='self'>self</span>.<span class='ident'>last_step_end</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>haystack</span>().<span class='ident'>len</span>();
+ <span class='ident'>SearchStep</span>::<span class='ident'>Reject</span>(<span class='ident'>last</span>, <span class='self'>self</span>.<span class='ident'>haystack</span>().<span class='ident'>len</span>())
+ } <span class='kw'>else</span> {
+ <span class='ident'>SearchStep</span>::<span class='ident'>Done</span>
+ }
+ }
+ <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>)) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>s</span> <span class='op'>==</span> <span class='self'>self</span>.<span class='ident'>last_step_end</span> {
+ <span class='self'>self</span>.<span class='ident'>last_step_end</span> <span class='op'>=</span> <span class='ident'>e</span>;
+ <span class='ident'>SearchStep</span>::<span class='ident'>Match</span>(<span class='ident'>s</span>, <span class='ident'>e</span>)
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>next_match</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>((<span class='ident'>s</span>, <span class='ident'>e</span>));
+ <span class='kw'>let</span> <span class='ident'>last</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>last_step_end</span>;
+ <span class='self'>self</span>.<span class='ident'>last_step_end</span> <span class='op'>=</span> <span class='ident'>s</span>;
+ <span class='ident'>SearchStep</span>::<span class='ident'>Reject</span>(<span class='ident'>last</span>, <span class='ident'>s</span>)
+ }
+ }
+ }
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>exec</span>(<span class='ident'>re</span>: <span class='kw-2'>&amp;</span><span class='ident'>Regex</span>, <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>CaptureIdxs</span>, <span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>, <span class='ident'>start</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>re</span> {
+ <span class='ident'>Regex</span>::<span class='ident'>Native</span>(<span class='ident'>ExNative</span> { <span class='kw-2'>ref</span> <span class='ident'>prog</span>, .. }) <span class='op'>=&gt;</span> (<span class='op'>*</span><span class='ident'>prog</span>)(<span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='ident'>start</span>),
+ <span class='ident'>Regex</span>::<span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='ident'>prog</span>) <span class='op'>=&gt;</span> <span class='ident'>prog</span>.<span class='ident'>exec</span>(<span class='ident'>caps</span>, <span class='ident'>text</span>, <span class='ident'>start</span>),
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex_macros/lib.rs.html b/src/regex_macros/lib.rs.html
new file mode 100644
index 0000000..6a743da
--- /dev/null
+++ b/src/regex_macros/lib.rs.html
@@ -0,0 +1,1215 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex_macros-0.1.20/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+ <link rel="shortcut icon" href="http://www.rust-lang.org/favicon.ico">
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+ <a href='../../regex_macros/index.html'><img src='http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png' alt='' width='100'></a>
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100">100</span>
+<span id="101">101</span>
+<span id="102">102</span>
+<span id="103">103</span>
+<span id="104">104</span>
+<span id="105">105</span>
+<span id="106">106</span>
+<span id="107">107</span>
+<span id="108">108</span>
+<span id="109">109</span>
+<span id="110">110</span>
+<span id="111">111</span>
+<span id="112">112</span>
+<span id="113">113</span>
+<span id="114">114</span>
+<span id="115">115</span>
+<span id="116">116</span>
+<span id="117">117</span>
+<span id="118">118</span>
+<span id="119">119</span>
+<span id="120">120</span>
+<span id="121">121</span>
+<span id="122">122</span>
+<span id="123">123</span>
+<span id="124">124</span>
+<span id="125">125</span>
+<span id="126">126</span>
+<span id="127">127</span>
+<span id="128">128</span>
+<span id="129">129</span>
+<span id="130">130</span>
+<span id="131">131</span>
+<span id="132">132</span>
+<span id="133">133</span>
+<span id="134">134</span>
+<span id="135">135</span>
+<span id="136">136</span>
+<span id="137">137</span>
+<span id="138">138</span>
+<span id="139">139</span>
+<span id="140">140</span>
+<span id="141">141</span>
+<span id="142">142</span>
+<span id="143">143</span>
+<span id="144">144</span>
+<span id="145">145</span>
+<span id="146">146</span>
+<span id="147">147</span>
+<span id="148">148</span>
+<span id="149">149</span>
+<span id="150">150</span>
+<span id="151">151</span>
+<span id="152">152</span>
+<span id="153">153</span>
+<span id="154">154</span>
+<span id="155">155</span>
+<span id="156">156</span>
+<span id="157">157</span>
+<span id="158">158</span>
+<span id="159">159</span>
+<span id="160">160</span>
+<span id="161">161</span>
+<span id="162">162</span>
+<span id="163">163</span>
+<span id="164">164</span>
+<span id="165">165</span>
+<span id="166">166</span>
+<span id="167">167</span>
+<span id="168">168</span>
+<span id="169">169</span>
+<span id="170">170</span>
+<span id="171">171</span>
+<span id="172">172</span>
+<span id="173">173</span>
+<span id="174">174</span>
+<span id="175">175</span>
+<span id="176">176</span>
+<span id="177">177</span>
+<span id="178">178</span>
+<span id="179">179</span>
+<span id="180">180</span>
+<span id="181">181</span>
+<span id="182">182</span>
+<span id="183">183</span>
+<span id="184">184</span>
+<span id="185">185</span>
+<span id="186">186</span>
+<span id="187">187</span>
+<span id="188">188</span>
+<span id="189">189</span>
+<span id="190">190</span>
+<span id="191">191</span>
+<span id="192">192</span>
+<span id="193">193</span>
+<span id="194">194</span>
+<span id="195">195</span>
+<span id="196">196</span>
+<span id="197">197</span>
+<span id="198">198</span>
+<span id="199">199</span>
+<span id="200">200</span>
+<span id="201">201</span>
+<span id="202">202</span>
+<span id="203">203</span>
+<span id="204">204</span>
+<span id="205">205</span>
+<span id="206">206</span>
+<span id="207">207</span>
+<span id="208">208</span>
+<span id="209">209</span>
+<span id="210">210</span>
+<span id="211">211</span>
+<span id="212">212</span>
+<span id="213">213</span>
+<span id="214">214</span>
+<span id="215">215</span>
+<span id="216">216</span>
+<span id="217">217</span>
+<span id="218">218</span>
+<span id="219">219</span>
+<span id="220">220</span>
+<span id="221">221</span>
+<span id="222">222</span>
+<span id="223">223</span>
+<span id="224">224</span>
+<span id="225">225</span>
+<span id="226">226</span>
+<span id="227">227</span>
+<span id="228">228</span>
+<span id="229">229</span>
+<span id="230">230</span>
+<span id="231">231</span>
+<span id="232">232</span>
+<span id="233">233</span>
+<span id="234">234</span>
+<span id="235">235</span>
+<span id="236">236</span>
+<span id="237">237</span>
+<span id="238">238</span>
+<span id="239">239</span>
+<span id="240">240</span>
+<span id="241">241</span>
+<span id="242">242</span>
+<span id="243">243</span>
+<span id="244">244</span>
+<span id="245">245</span>
+<span id="246">246</span>
+<span id="247">247</span>
+<span id="248">248</span>
+<span id="249">249</span>
+<span id="250">250</span>
+<span id="251">251</span>
+<span id="252">252</span>
+<span id="253">253</span>
+<span id="254">254</span>
+<span id="255">255</span>
+<span id="256">256</span>
+<span id="257">257</span>
+<span id="258">258</span>
+<span id="259">259</span>
+<span id="260">260</span>
+<span id="261">261</span>
+<span id="262">262</span>
+<span id="263">263</span>
+<span id="264">264</span>
+<span id="265">265</span>
+<span id="266">266</span>
+<span id="267">267</span>
+<span id="268">268</span>
+<span id="269">269</span>
+<span id="270">270</span>
+<span id="271">271</span>
+<span id="272">272</span>
+<span id="273">273</span>
+<span id="274">274</span>
+<span id="275">275</span>
+<span id="276">276</span>
+<span id="277">277</span>
+<span id="278">278</span>
+<span id="279">279</span>
+<span id="280">280</span>
+<span id="281">281</span>
+<span id="282">282</span>
+<span id="283">283</span>
+<span id="284">284</span>
+<span id="285">285</span>
+<span id="286">286</span>
+<span id="287">287</span>
+<span id="288">288</span>
+<span id="289">289</span>
+<span id="290">290</span>
+<span id="291">291</span>
+<span id="292">292</span>
+<span id="293">293</span>
+<span id="294">294</span>
+<span id="295">295</span>
+<span id="296">296</span>
+<span id="297">297</span>
+<span id="298">298</span>
+<span id="299">299</span>
+<span id="300">300</span>
+<span id="301">301</span>
+<span id="302">302</span>
+<span id="303">303</span>
+<span id="304">304</span>
+<span id="305">305</span>
+<span id="306">306</span>
+<span id="307">307</span>
+<span id="308">308</span>
+<span id="309">309</span>
+<span id="310">310</span>
+<span id="311">311</span>
+<span id="312">312</span>
+<span id="313">313</span>
+<span id="314">314</span>
+<span id="315">315</span>
+<span id="316">316</span>
+<span id="317">317</span>
+<span id="318">318</span>
+<span id="319">319</span>
+<span id="320">320</span>
+<span id="321">321</span>
+<span id="322">322</span>
+<span id="323">323</span>
+<span id="324">324</span>
+<span id="325">325</span>
+<span id="326">326</span>
+<span id="327">327</span>
+<span id="328">328</span>
+<span id="329">329</span>
+<span id="330">330</span>
+<span id="331">331</span>
+<span id="332">332</span>
+<span id="333">333</span>
+<span id="334">334</span>
+<span id="335">335</span>
+<span id="336">336</span>
+<span id="337">337</span>
+<span id="338">338</span>
+<span id="339">339</span>
+<span id="340">340</span>
+<span id="341">341</span>
+<span id="342">342</span>
+<span id="343">343</span>
+<span id="344">344</span>
+<span id="345">345</span>
+<span id="346">346</span>
+<span id="347">347</span>
+<span id="348">348</span>
+<span id="349">349</span>
+<span id="350">350</span>
+<span id="351">351</span>
+<span id="352">352</span>
+<span id="353">353</span>
+<span id="354">354</span>
+<span id="355">355</span>
+<span id="356">356</span>
+<span id="357">357</span>
+<span id="358">358</span>
+<span id="359">359</span>
+<span id="360">360</span>
+<span id="361">361</span>
+<span id="362">362</span>
+<span id="363">363</span>
+<span id="364">364</span>
+<span id="365">365</span>
+<span id="366">366</span>
+<span id="367">367</span>
+<span id="368">368</span>
+<span id="369">369</span>
+<span id="370">370</span>
+<span id="371">371</span>
+<span id="372">372</span>
+<span id="373">373</span>
+<span id="374">374</span>
+<span id="375">375</span>
+<span id="376">376</span>
+<span id="377">377</span>
+<span id="378">378</span>
+<span id="379">379</span>
+<span id="380">380</span>
+<span id="381">381</span>
+<span id="382">382</span>
+<span id="383">383</span>
+<span id="384">384</span>
+<span id="385">385</span>
+<span id="386">386</span>
+<span id="387">387</span>
+<span id="388">388</span>
+<span id="389">389</span>
+<span id="390">390</span>
+<span id="391">391</span>
+<span id="392">392</span>
+<span id="393">393</span>
+<span id="394">394</span>
+<span id="395">395</span>
+<span id="396">396</span>
+<span id="397">397</span>
+<span id="398">398</span>
+<span id="399">399</span>
+<span id="400">400</span>
+<span id="401">401</span>
+<span id="402">402</span>
+<span id="403">403</span>
+<span id="404">404</span>
+<span id="405">405</span>
+<span id="406">406</span>
+<span id="407">407</span>
+<span id="408">408</span>
+<span id="409">409</span>
+<span id="410">410</span>
+<span id="411">411</span>
+<span id="412">412</span>
+<span id="413">413</span>
+<span id="414">414</span>
+<span id="415">415</span>
+<span id="416">416</span>
+<span id="417">417</span>
+<span id="418">418</span>
+<span id="419">419</span>
+<span id="420">420</span>
+<span id="421">421</span>
+<span id="422">422</span>
+<span id="423">423</span>
+<span id="424">424</span>
+<span id="425">425</span>
+<span id="426">426</span>
+<span id="427">427</span>
+<span id="428">428</span>
+<span id="429">429</span>
+<span id="430">430</span>
+<span id="431">431</span>
+<span id="432">432</span>
+<span id="433">433</span>
+<span id="434">434</span>
+<span id="435">435</span>
+<span id="436">436</span>
+<span id="437">437</span>
+<span id="438">438</span>
+<span id="439">439</span>
+<span id="440">440</span>
+<span id="441">441</span>
+<span id="442">442</span>
+<span id="443">443</span>
+<span id="444">444</span>
+<span id="445">445</span>
+<span id="446">446</span>
+<span id="447">447</span>
+<span id="448">448</span>
+<span id="449">449</span>
+<span id="450">450</span>
+<span id="451">451</span>
+<span id="452">452</span>
+<span id="453">453</span>
+<span id="454">454</span>
+<span id="455">455</span>
+<span id="456">456</span>
+<span id="457">457</span>
+<span id="458">458</span>
+<span id="459">459</span>
+<span id="460">460</span>
+<span id="461">461</span>
+<span id="462">462</span>
+<span id="463">463</span>
+<span id="464">464</span>
+<span id="465">465</span>
+<span id="466">466</span>
+<span id="467">467</span>
+<span id="468">468</span>
+<span id="469">469</span>
+<span id="470">470</span>
+<span id="471">471</span>
+<span id="472">472</span>
+<span id="473">473</span>
+<span id="474">474</span>
+<span id="475">475</span>
+<span id="476">476</span>
+<span id="477">477</span>
+<span id="478">478</span>
+<span id="479">479</span>
+<span id="480">480</span>
+<span id="481">481</span>
+<span id="482">482</span>
+<span id="483">483</span>
+<span id="484">484</span>
+<span id="485">485</span>
+<span id="486">486</span>
+<span id="487">487</span>
+<span id="488">488</span>
+<span id="489">489</span>
+<span id="490">490</span>
+<span id="491">491</span>
+<span id="492">492</span>
+<span id="493">493</span>
+<span id="494">494</span>
+<span id="495">495</span>
+<span id="496">496</span>
+<span id="497">497</span>
+<span id="498">498</span>
+<span id="499">499</span>
+<span id="500">500</span>
+<span id="501">501</span>
+<span id="502">502</span>
+<span id="503">503</span>
+<span id="504">504</span>
+<span id="505">505</span>
+<span id="506">506</span>
+<span id="507">507</span>
+<span id="508">508</span>
+<span id="509">509</span>
+<span id="510">510</span>
+<span id="511">511</span>
+<span id="512">512</span>
+<span id="513">513</span>
+<span id="514">514</span>
+<span id="515">515</span>
+<span id="516">516</span>
+<span id="517">517</span>
+<span id="518">518</span>
+<span id="519">519</span>
+<span id="520">520</span>
+<span id="521">521</span>
+<span id="522">522</span>
+<span id="523">523</span>
+<span id="524">524</span>
+<span id="525">525</span>
+<span id="526">526</span>
+<span id="527">527</span>
+<span id="528">528</span>
+<span id="529">529</span>
+<span id="530">530</span>
+<span id="531">531</span>
+<span id="532">532</span>
+<span id="533">533</span>
+<span id="534">534</span>
+<span id="535">535</span>
+<span id="536">536</span>
+<span id="537">537</span>
+<span id="538">538</span>
+<span id="539">539</span>
+<span id="540">540</span>
+<span id="541">541</span>
+<span id="542">542</span>
+<span id="543">543</span>
+<span id="544">544</span>
+<span id="545">545</span>
+<span id="546">546</span>
+<span id="547">547</span>
+<span id="548">548</span>
+<span id="549">549</span>
+<span id="550">550</span>
+<span id="551">551</span>
+<span id="552">552</span>
+<span id="553">553</span>
+<span id="554">554</span>
+<span id="555">555</span>
+<span id="556">556</span>
+<span id="557">557</span>
+<span id="558">558</span>
+<span id="559">559</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='doccomment'>//! This crate provides the `regex!` macro. Its use is documented in the</span>
+<span class='doccomment'>//! `regex` crate.</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>doc</span>(<span class='ident'>html_logo_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png&quot;</span>,
+ <span class='ident'>html_favicon_url</span> <span class='op'>=</span> <span class='string'>&quot;http://www.rust-lang.org/favicon.ico&quot;</span>,
+ <span class='ident'>html_root_url</span> <span class='op'>=</span> <span class='string'>&quot;http://doc.rust-lang.org/nightly/&quot;</span>)]</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>feature</span>(<span class='ident'>plugin_registrar</span>, <span class='ident'>quote</span>, <span class='ident'>rustc_private</span>)]</span>
+
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>regex</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>syntax</span>;
+<span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rustc</span>;
+
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>ast</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>codemap</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>ext</span>::<span class='ident'>build</span>::<span class='ident'>AstBuilder</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>ext</span>::<span class='ident'>base</span>::{<span class='ident'>ExtCtxt</span>, <span class='ident'>MacResult</span>, <span class='ident'>MacEager</span>, <span class='ident'>DummyResult</span>};
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>parse</span>::<span class='ident'>token</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>print</span>::<span class='ident'>pprust</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>fold</span>::<span class='ident'>Folder</span>;
+<span class='kw'>use</span> <span class='ident'>syntax</span>::<span class='ident'>ptr</span>::<span class='ident'>P</span>;
+
+<span class='kw'>use</span> <span class='ident'>rustc</span>::<span class='ident'>plugin</span>::<span class='ident'>Registry</span>;
+
+<span class='kw'>use</span> <span class='ident'>regex</span>::<span class='ident'>Regex</span>;
+<span class='kw'>use</span> <span class='ident'>regex</span>::<span class='ident'>internal</span>::{
+ <span class='ident'>Inst</span>, <span class='ident'>LookInst</span>, <span class='ident'>OneChar</span>, <span class='ident'>CharRanges</span>, <span class='ident'>Program</span>, <span class='ident'>Dynamic</span>, <span class='ident'>Native</span>,
+};
+
+<span class='doccomment'>/// For the `regex!` syntax extension. Do not use.</span>
+<span class='attribute'>#[<span class='ident'>plugin_registrar</span>]</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>plugin_registrar</span>(<span class='ident'>reg</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Registry</span>) {
+ <span class='ident'>reg</span>.<span class='ident'>register_macro</span>(<span class='string'>&quot;regex&quot;</span>, <span class='ident'>native</span>);
+}
+
+<span class='doccomment'>/// Generates specialized code for the Pike VM for a particular regular</span>
+<span class='doccomment'>/// expression.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// There are two primary differences between the code generated here and the</span>
+<span class='doccomment'>/// general code in vm.rs.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// 1. All heap allocation is removed. Sized vector types are used instead.</span>
+<span class='doccomment'>/// Care must be taken to make sure that these vectors are not copied</span>
+<span class='doccomment'>/// gratuitously. (If you&#39;re not sure, run the benchmarks. They will yell</span>
+<span class='doccomment'>/// at you if you do.)</span>
+<span class='doccomment'>/// 2. The main `match instruction { ... }` expressions are replaced with more</span>
+<span class='doccomment'>/// direct `match pc { ... }`. The generators can be found in</span>
+<span class='doccomment'>/// `step_insts` and `add_insts`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It is strongly recommended to read the dynamic implementation in vm.rs</span>
+<span class='doccomment'>/// first before trying to understand the code generator. The implementation</span>
+<span class='doccomment'>/// strategy is identical and vm.rs has comments and will be easier to follow.</span>
+<span class='kw'>fn</span> <span class='ident'>native</span>(<span class='ident'>cx</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>ExtCtxt</span>, <span class='ident'>sp</span>: <span class='ident'>codemap</span>::<span class='ident'>Span</span>, <span class='ident'>tts</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>ast</span>::<span class='ident'>TokenTree</span>])
+ <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>MacResult</span><span class='op'>+</span><span class='lifetime'>&#39;static</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>regex</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>parse</span>(<span class='ident'>cx</span>, <span class='ident'>tts</span>) {
+ <span class='prelude-val'>Some</span>(<span class='ident'>r</span>) <span class='op'>=&gt;</span> <span class='ident'>r</span>,
+ <span class='comment'>// error is logged in &#39;parse&#39; with cx.span_err</span>
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='ident'>DummyResult</span>::<span class='ident'>any</span>(<span class='ident'>sp</span>),
+ };
+ <span class='comment'>// We use the largest possible size limit because this is happening at</span>
+ <span class='comment'>// compile time. We trust the programmer.</span>
+ <span class='kw'>let</span> <span class='ident'>re</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>Regex</span>::<span class='ident'>with_size_limit</span>(::<span class='ident'>std</span>::<span class='ident'>usize</span>::<span class='ident'>MAX</span>, <span class='kw-2'>&amp;</span><span class='ident'>regex</span>) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>re</span>) <span class='op'>=&gt;</span> <span class='ident'>re</span>,
+ <span class='prelude-val'>Err</span>(<span class='ident'>err</span>) <span class='op'>=&gt;</span> {
+ <span class='ident'>cx</span>.<span class='ident'>span_err</span>(<span class='ident'>sp</span>, <span class='kw-2'>&amp;</span><span class='ident'>err</span>.<span class='ident'>to_string</span>());
+ <span class='kw'>return</span> <span class='ident'>DummyResult</span>::<span class='ident'>any</span>(<span class='ident'>sp</span>)
+ }
+ };
+ <span class='kw'>let</span> <span class='ident'>prog</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>re</span> {
+ <span class='ident'>Dynamic</span>(<span class='kw-2'>ref</span> <span class='ident'>prog</span>) <span class='op'>=&gt;</span> <span class='ident'>prog</span>.<span class='ident'>clone</span>(),
+ <span class='ident'>Native</span>(_) <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ };
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>gen</span> <span class='op'>=</span> <span class='ident'>NfaGen</span> {
+ <span class='ident'>cx</span>: <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>cx</span>, <span class='ident'>sp</span>: <span class='ident'>sp</span>, <span class='ident'>prog</span>: <span class='ident'>prog</span>,
+ <span class='ident'>names</span>: <span class='ident'>re</span>.<span class='ident'>names_iter</span>().<span class='ident'>collect</span>(), <span class='ident'>original</span>: <span class='ident'>re</span>.<span class='ident'>as_str</span>().<span class='ident'>to_string</span>(),
+ };
+ <span class='ident'>MacEager</span>::<span class='ident'>expr</span>(<span class='ident'>gen</span>.<span class='ident'>code</span>())
+}
+
+<span class='kw'>struct</span> <span class='ident'>NfaGen</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>cx</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>ExtCtxt</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>,
+ <span class='ident'>sp</span>: <span class='ident'>codemap</span>::<span class='ident'>Span</span>,
+ <span class='ident'>prog</span>: <span class='ident'>Program</span>,
+ <span class='ident'>names</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;&gt;</span>,
+ <span class='ident'>original</span>: <span class='ident'>String</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>NfaGen</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>code</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='comment'>// Most or all of the following things are used in the quasiquoted</span>
+ <span class='comment'>// expression returned.</span>
+ <span class='kw'>let</span> <span class='ident'>num_cap_locs</span> <span class='op'>=</span> <span class='number'>2</span> <span class='op'>*</span> <span class='self'>self</span>.<span class='ident'>prog</span>.<span class='ident'>num_captures</span>();
+ <span class='kw'>let</span> <span class='ident'>num_insts</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prog</span>.<span class='ident'>insts</span>.<span class='ident'>len</span>();
+ <span class='kw'>let</span> <span class='ident'>cap_names</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>vec_expr</span>(<span class='self'>self</span>.<span class='ident'>names</span>.<span class='ident'>iter</span>(),
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='op'>|</span><span class='ident'>cx</span>, <span class='ident'>name</span><span class='op'>|</span> <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>name</span> {
+ <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>name</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>name</span>;
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='ident'>cx</span>, <span class='prelude-val'>Some</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>name</span>))
+ }
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='ident'>cx</span>.<span class='ident'>expr_none</span>(<span class='self'>self</span>.<span class='ident'>sp</span>),
+ }
+ );
+ <span class='kw'>let</span> <span class='ident'>prefix_anchor</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prog</span>.<span class='ident'>anchored_begin</span>;
+
+ <span class='comment'>// let prefix_lit = Rc::new(self.prog.prefix.as_bytes().to_vec());</span>
+ <span class='comment'>// let prefix_bytes = self.cx.expr_lit(self.sp, ast::LitBinary(prefix_lit));</span>
+
+ <span class='comment'>// let check_prefix = self.check_prefix();</span>
+ <span class='kw'>let</span> <span class='ident'>step_insts</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>step_insts</span>();
+ <span class='kw'>let</span> <span class='ident'>add_insts</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>add_insts</span>();
+ <span class='kw'>let</span> <span class='ident'>regex</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='self'>self</span>.<span class='ident'>original</span>;
+
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+<span class='comment'>// When `regex!` is bound to a name that is not used, we have to make sure</span>
+<span class='comment'>// that dead_code warnings don&#39;t bubble up to the user from the generated</span>
+<span class='comment'>// code. Therefore, we suppress them by allowing dead_code. The effect is that</span>
+<span class='comment'>// the user is only warned about *their* unused variable/code, and not the</span>
+<span class='comment'>// unused code generated by regex!. See #14185 for an example.</span>
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='kw'>static</span> <span class='ident'>CAP_NAMES</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span><span class='op'>&gt;</span>] <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>cap_names</span>;
+
+<span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>dead_code</span>)]</span>
+<span class='kw'>fn</span> <span class='ident'>exec</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>(
+ <span class='kw-2'>mut</span> <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>],
+ <span class='ident'>input</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;t</span> <span class='ident'>str</span>,
+ <span class='ident'>start</span>: <span class='ident'>usize</span>,
+) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unused_imports</span>)]</span>
+ <span class='attribute'>#<span class='op'>!</span>[<span class='ident'>allow</span>(<span class='ident'>unused_mut</span>)]</span>
+
+ <span class='kw'>use</span> <span class='ident'>regex</span>::<span class='ident'>internal</span>::{<span class='ident'>Char</span>, <span class='ident'>CharInput</span>, <span class='ident'>InputAt</span>, <span class='ident'>Input</span>, <span class='ident'>Inst</span>};
+
+ <span class='kw'>let</span> <span class='ident'>input</span> <span class='op'>=</span> <span class='ident'>CharInput</span>::<span class='ident'>new</span>(<span class='ident'>input</span>);
+ <span class='kw'>let</span> <span class='ident'>at</span> <span class='op'>=</span> <span class='ident'>input</span>.<span class='ident'>at</span>(<span class='ident'>start</span>);
+ <span class='kw'>return</span> <span class='ident'>Nfa</span> {
+ <span class='ident'>input</span>: <span class='ident'>input</span>,
+ <span class='ident'>ncaps</span>: <span class='ident'>caps</span>.<span class='ident'>len</span>(),
+ }.<span class='ident'>exec</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>NfaThreads</span>::<span class='ident'>new</span>(), <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='ident'>at</span>);
+
+ <span class='kw'>struct</span> <span class='ident'>Nfa</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='ident'>input</span>: <span class='ident'>CharInput</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span>,
+ <span class='ident'>ncaps</span>: <span class='ident'>usize</span>,
+ }
+
+ <span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> <span class='ident'>Nfa</span><span class='op'>&lt;</span><span class='lifetime'>&#39;t</span><span class='op'>&gt;</span> {
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>unused_variables</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>exec</span>(
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>,
+ <span class='kw-2'>mut</span> <span class='ident'>q</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>NfaThreads</span>,
+ <span class='kw-2'>mut</span> <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>],
+ <span class='kw-2'>mut</span> <span class='ident'>at</span>: <span class='ident'>InputAt</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>matched</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>let</span> (<span class='kw-2'>mut</span> <span class='ident'>clist</span>, <span class='kw-2'>mut</span> <span class='ident'>nlist</span>) <span class='op'>=</span> (<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>q</span>.<span class='ident'>clist</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>q</span>.<span class='ident'>nlist</span>);
+ <span class='ident'>clist</span>.<span class='ident'>empty</span>(); <span class='ident'>nlist</span>.<span class='ident'>empty</span>();
+<span class='lifetime'>&#39;LOOP</span>: <span class='kw'>loop</span> {
+ <span class='kw'>if</span> <span class='ident'>clist</span>.<span class='ident'>size</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='kw'>if</span> <span class='ident'>matched</span> <span class='op'>||</span> (<span class='op'>!</span><span class='ident'>at</span>.<span class='ident'>is_beginning</span>() <span class='op'>&amp;&amp;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>prefix_anchor</span>) {
+ <span class='kw'>break</span>;
+ }
+ <span class='comment'>// TODO: Prefix matching... Hmm.</span>
+ <span class='comment'>// Prefix matching now uses a DFA, so I think this is</span>
+ <span class='comment'>// going to require encoding that DFA statically.</span>
+ }
+ <span class='kw'>if</span> <span class='ident'>clist</span>.<span class='ident'>size</span> <span class='op'>==</span> <span class='number'>0</span> <span class='op'>||</span> (<span class='op'>!</span><span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>prefix_anchor</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='ident'>matched</span>) {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>clist</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>caps</span>, <span class='number'>0</span>, <span class='ident'>at</span>);
+ }
+ <span class='kw'>let</span> <span class='ident'>at_next</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>input</span>.<span class='ident'>at</span>(<span class='ident'>at</span>.<span class='ident'>next_pos</span>());
+ <span class='kw'>for</span> <span class='ident'>i</span> <span class='kw'>in</span> <span class='number'>0</span>..<span class='ident'>clist</span>.<span class='ident'>size</span> {
+ <span class='kw'>let</span> <span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>clist</span>.<span class='ident'>pc</span>(<span class='ident'>i</span>);
+ <span class='kw'>let</span> <span class='ident'>tcaps</span> <span class='op'>=</span> <span class='ident'>clist</span>.<span class='ident'>caps</span>(<span class='ident'>i</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>step</span>(<span class='ident'>nlist</span>, <span class='ident'>caps</span>, <span class='ident'>tcaps</span>, <span class='ident'>pc</span>, <span class='ident'>at</span>, <span class='ident'>at_next</span>) {
+ <span class='ident'>matched</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>if</span> <span class='ident'>caps</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='kw'>break</span> <span class='lifetime'>&#39;LOOP</span>;
+ }
+ <span class='kw'>break</span>;
+ }
+ }
+ <span class='kw'>if</span> <span class='ident'>at</span>.<span class='ident'>char</span>().<span class='ident'>is_none</span>() {
+ <span class='kw'>break</span>;
+ }
+ <span class='ident'>at</span> <span class='op'>=</span> <span class='ident'>at_next</span>;
+ ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>clist</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>nlist</span>);
+ <span class='ident'>nlist</span>.<span class='ident'>empty</span>();
+ }
+ <span class='ident'>matched</span>
+ }
+
+ <span class='comment'>// Sometimes `nlist` is never used (for empty regexes).</span>
+ <span class='attribute'>#[<span class='ident'>allow</span>(<span class='ident'>unused_variables</span>)]</span>
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>step</span>(
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>,
+ <span class='ident'>nlist</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Threads</span>,
+ <span class='ident'>caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>],
+ <span class='ident'>thread_caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>],
+ <span class='ident'>pc</span>: <span class='ident'>usize</span>,
+ <span class='ident'>at</span>: <span class='ident'>InputAt</span>,
+ <span class='ident'>at_next</span>: <span class='ident'>InputAt</span>,
+ ) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>step_insts</span>;
+ <span class='boolval'>false</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>add</span>(
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>,
+ <span class='ident'>nlist</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Threads</span>,
+ <span class='ident'>thread_caps</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>],
+ <span class='ident'>pc</span>: <span class='ident'>usize</span>,
+ <span class='ident'>at</span>: <span class='ident'>InputAt</span>,
+ ) {
+ <span class='kw'>if</span> <span class='ident'>nlist</span>.<span class='ident'>contains</span>(<span class='ident'>pc</span>) {
+ <span class='kw'>return</span>;
+ }
+ <span class='kw'>let</span> <span class='ident'>ti</span> <span class='op'>=</span> <span class='ident'>nlist</span>.<span class='ident'>add</span>(<span class='ident'>pc</span>);
+ <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>add_insts</span>
+ }
+ }
+
+ <span class='kw'>struct</span> <span class='ident'>NfaThreads</span> {
+ <span class='ident'>clist</span>: <span class='ident'>Threads</span>,
+ <span class='ident'>nlist</span>: <span class='ident'>Threads</span>,
+ }
+
+ <span class='kw'>struct</span> <span class='ident'>Threads</span> {
+ <span class='ident'>dense</span>: [<span class='ident'>Thread</span>; <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>num_insts</span>],
+ <span class='ident'>sparse</span>: [<span class='ident'>usize</span>; <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>num_insts</span>],
+ <span class='ident'>size</span>: <span class='ident'>usize</span>,
+ }
+
+ <span class='kw'>struct</span> <span class='ident'>Thread</span> {
+ <span class='ident'>pc</span>: <span class='ident'>usize</span>,
+ <span class='ident'>caps</span>: [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>; <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>num_cap_locs</span>],
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>NfaThreads</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>NfaThreads</span> {
+ <span class='ident'>NfaThreads</span> {
+ <span class='ident'>clist</span>: <span class='ident'>Threads</span>::<span class='ident'>new</span>(),
+ <span class='ident'>nlist</span>: <span class='ident'>Threads</span>::<span class='ident'>new</span>(),
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>swap</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>clist</span>, <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>nlist</span>);
+ }
+ }
+
+ <span class='kw'>impl</span> <span class='ident'>Threads</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>() <span class='op'>-&gt;</span> <span class='ident'>Threads</span> {
+ <span class='ident'>Threads</span> {
+ <span class='comment'>// These unsafe blocks are used for performance reasons, as it</span>
+ <span class='comment'>// gives us a zero-cost initialization of a sparse set. The</span>
+ <span class='comment'>// trick is described in more detail here:</span>
+ <span class='comment'>// http://research.swtch.com/sparse</span>
+ <span class='comment'>// The idea here is to avoid initializing threads that never</span>
+ <span class='comment'>// need to be initialized, particularly for larger regexs with</span>
+ <span class='comment'>// a lot of instructions.</span>
+ <span class='ident'>dense</span>: <span class='kw'>unsafe</span> { ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>uninitialized</span>() },
+ <span class='ident'>sparse</span>: <span class='kw'>unsafe</span> { ::<span class='ident'>std</span>::<span class='ident'>mem</span>::<span class='ident'>uninitialized</span>() },
+ <span class='ident'>size</span>: <span class='number'>0</span>,
+ }
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>add</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>pc</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>let</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>size</span>;
+ <span class='self'>self</span>.<span class='ident'>dense</span>[<span class='ident'>i</span>].<span class='ident'>pc</span> <span class='op'>=</span> <span class='ident'>pc</span>;
+ <span class='self'>self</span>.<span class='ident'>sparse</span>[<span class='ident'>pc</span>] <span class='op'>=</span> <span class='ident'>i</span>;
+ <span class='self'>self</span>.<span class='ident'>size</span> <span class='op'>+=</span> <span class='number'>1</span>;
+ <span class='ident'>i</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>thread</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Thread</span> {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>dense</span>[<span class='ident'>i</span>]
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>contains</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>pc</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>sparse</span>[<span class='ident'>pc</span>];
+ <span class='ident'>s</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>size</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>dense</span>[<span class='ident'>s</span>].<span class='ident'>pc</span> <span class='op'>==</span> <span class='ident'>pc</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>empty</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='self'>self</span>.<span class='ident'>size</span> <span class='op'>=</span> <span class='number'>0</span>;
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>pc</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>dense</span>[<span class='ident'>i</span>].<span class='ident'>pc</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>caps</span><span class='op'>&lt;</span><span class='lifetime'>&#39;r</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>i</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;r</span> <span class='kw-2'>mut</span> [<span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>] {
+ <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>.<span class='ident'>dense</span>[<span class='ident'>i</span>].<span class='ident'>caps</span>
+ }
+ }
+}
+
+::<span class='ident'>regex</span>::<span class='ident'>internal</span>::<span class='ident'>Native</span>(::<span class='ident'>regex</span>::<span class='ident'>internal</span>::<span class='ident'>ExNative</span> {
+ <span class='ident'>original</span>: <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>regex</span>,
+ <span class='ident'>names</span>: <span class='kw-2'>&amp;</span><span class='ident'>CAP_NAMES</span>,
+ <span class='ident'>prog</span>: <span class='ident'>exec</span>,
+})
+ })
+ }
+
+ <span class='comment'>// Generates code for the `add` method, which is responsible for adding</span>
+ <span class='comment'>// zero-width states to the next queue of states to visit.</span>
+ <span class='kw'>fn</span> <span class='ident'>add_insts</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>arms</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prog</span>.<span class='ident'>insts</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>map</span>(<span class='op'>|</span>(<span class='ident'>pc</span>, <span class='ident'>inst</span>)<span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>nextpc</span> <span class='op'>=</span> <span class='ident'>pc</span> <span class='op'>+</span> <span class='number'>1</span>;
+ <span class='kw'>let</span> <span class='ident'>body</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>inst</span> {
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>StartLine</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>let</span> <span class='ident'>prev</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>input</span>.<span class='ident'>previous_at</span>(<span class='ident'>at</span>.<span class='ident'>pos</span>());
+ <span class='kw'>if</span> <span class='ident'>prev</span>.<span class='ident'>char</span>().<span class='ident'>is_none</span>() <span class='op'>||</span> <span class='ident'>prev</span>.<span class='ident'>char</span>() <span class='op'>==</span> <span class='string'>&#39;\n&#39;</span> {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ }
+ })
+ }
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>EndLine</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>if</span> <span class='ident'>at</span>.<span class='ident'>char</span>().<span class='ident'>is_none</span>() <span class='op'>||</span> <span class='ident'>at</span>.<span class='ident'>char</span>() <span class='op'>==</span> <span class='string'>&#39;\n&#39;</span> {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ }
+ })
+ }
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>StartText</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>let</span> <span class='ident'>prev</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>input</span>.<span class='ident'>previous_at</span>(<span class='ident'>at</span>.<span class='ident'>pos</span>());
+ <span class='kw'>if</span> <span class='ident'>prev</span>.<span class='ident'>char</span>().<span class='ident'>is_none</span>() {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ }
+ })
+ }
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='ident'>LookInst</span>::<span class='ident'>EndText</span>) <span class='op'>=&gt;</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>if</span> <span class='ident'>at</span>.<span class='ident'>char</span>().<span class='ident'>is_none</span>() {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ }
+ })
+ }
+ <span class='ident'>Inst</span>::<span class='ident'>EmptyLook</span>(<span class='kw-2'>ref</span> <span class='ident'>wbty</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>m</span> <span class='op'>=</span> <span class='kw'>if</span> <span class='op'>*</span><span class='ident'>wbty</span> <span class='op'>==</span> <span class='ident'>LookInst</span>::<span class='ident'>WordBoundary</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, { <span class='ident'>w1</span> <span class='op'>^</span> <span class='ident'>w2</span> })
+ } <span class='kw'>else</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, { <span class='op'>!</span>(<span class='ident'>w1</span> <span class='op'>^</span> <span class='ident'>w2</span>) })
+ };
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>let</span> <span class='ident'>prev</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>input</span>.<span class='ident'>previous_at</span>(<span class='ident'>at</span>.<span class='ident'>pos</span>());
+ <span class='kw'>let</span> <span class='ident'>w1</span> <span class='op'>=</span> <span class='ident'>prev</span>.<span class='ident'>char</span>().<span class='ident'>is_word_char</span>();
+ <span class='kw'>let</span> <span class='ident'>w2</span> <span class='op'>=</span> <span class='ident'>at</span>.<span class='ident'>char</span>().<span class='ident'>is_word_char</span>();
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>m</span> {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ }
+ })
+ }
+ <span class='ident'>Inst</span>::<span class='ident'>Save</span>(<span class='ident'>slot</span>) <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>slot</span> <span class='op'>&gt;=</span> <span class='self'>self</span>.<span class='ident'>ncaps</span> {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>old</span> <span class='op'>=</span> <span class='ident'>thread_caps</span>[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>slot</span>];
+ <span class='ident'>thread_caps</span>[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>slot</span>] <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>at</span>.<span class='ident'>pos</span>());
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at</span>);
+ <span class='ident'>thread_caps</span>[<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>slot</span>] <span class='op'>=</span> <span class='ident'>old</span>;
+ }
+ }),
+ <span class='ident'>Inst</span>::<span class='ident'>Jump</span>(<span class='ident'>to</span>) <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>to</span>, <span class='ident'>at</span>);
+ }),
+ <span class='ident'>Inst</span>::<span class='ident'>Split</span>(<span class='ident'>x</span>, <span class='ident'>y</span>) <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>x</span>, <span class='ident'>at</span>);
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>y</span>, <span class='ident'>at</span>);
+ }),
+ <span class='comment'>// For Match, OneChar, CharClass, Any, AnyNoNL</span>
+ _ <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>t</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>nlist</span>.<span class='ident'>thread</span>(<span class='ident'>ti</span>);
+ <span class='kw'>for</span> (<span class='ident'>slot</span>, <span class='ident'>val</span>) <span class='kw'>in</span> <span class='ident'>t</span>.<span class='ident'>caps</span>.<span class='ident'>iter_mut</span>().<span class='ident'>zip</span>(<span class='ident'>thread_caps</span>.<span class='ident'>iter</span>()) {
+ <span class='op'>*</span><span class='ident'>slot</span> <span class='op'>=</span> <span class='op'>*</span><span class='ident'>val</span>;
+ }
+ }),
+ };
+ <span class='self'>self</span>.<span class='ident'>arm_inst</span>(<span class='ident'>pc</span>, <span class='ident'>body</span>)
+ }).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Arm</span><span class='op'>&gt;&gt;</span>();
+ <span class='self'>self</span>.<span class='ident'>match_insts</span>(<span class='ident'>arms</span>)
+ }
+
+ <span class='comment'>// Generates the code for the `step` method, which processes all states</span>
+ <span class='comment'>// in the current queue that consume a single character.</span>
+ <span class='kw'>fn</span> <span class='ident'>step_insts</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>arms</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>prog</span>.<span class='ident'>insts</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>().<span class='ident'>map</span>(<span class='op'>|</span>(<span class='ident'>pc</span>, <span class='ident'>inst</span>)<span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>nextpc</span> <span class='op'>=</span> <span class='ident'>pc</span> <span class='op'>+</span> <span class='number'>1</span>;
+ <span class='kw'>let</span> <span class='ident'>body</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='op'>*</span><span class='ident'>inst</span> {
+ <span class='ident'>Inst</span>::<span class='ident'>Match</span> <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>for</span> (<span class='ident'>slot</span>, <span class='ident'>val</span>) <span class='kw'>in</span> <span class='ident'>caps</span>.<span class='ident'>iter_mut</span>().<span class='ident'>zip</span>(<span class='ident'>thread_caps</span>.<span class='ident'>iter</span>()) {
+ <span class='op'>*</span><span class='ident'>slot</span> <span class='op'>=</span> <span class='op'>*</span><span class='ident'>val</span>;
+ }
+ <span class='kw'>return</span> <span class='boolval'>true</span>;
+ }),
+ <span class='ident'>Inst</span>::<span class='ident'>Char</span>(<span class='ident'>OneChar</span> { <span class='ident'>c</span>, <span class='ident'>casei</span> }) <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span> <span class='op'>==</span> <span class='ident'>at</span>.<span class='ident'>char</span>() <span class='op'>||</span> (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>casei</span> <span class='op'>&amp;&amp;</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>c</span> <span class='op'>==</span> <span class='ident'>at</span>.<span class='ident'>char</span>().<span class='ident'>case_fold</span>()) {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at_next</span>);
+ }
+ <span class='kw'>return</span> <span class='boolval'>false</span>;
+ }),
+ <span class='ident'>Inst</span>::<span class='ident'>Ranges</span>(<span class='ident'>CharRanges</span> { <span class='kw-2'>ref</span> <span class='ident'>ranges</span>, <span class='ident'>casei</span> }) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>match_class</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>match_class</span>(<span class='ident'>ranges</span>);
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>at</span>.<span class='ident'>char</span>();
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>casei</span> {
+ <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>case_fold</span>();
+ }
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>c</span>) <span class='op'>=</span> <span class='ident'>c</span>.<span class='ident'>as_char</span>() {
+ <span class='kw'>if</span> <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>match_class</span> {
+ <span class='self'>self</span>.<span class='ident'>add</span>(<span class='ident'>nlist</span>, <span class='ident'>thread_caps</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>nextpc</span>, <span class='ident'>at_next</span>);
+ }
+ }
+ <span class='kw'>return</span> <span class='boolval'>false</span>;
+ })
+ }
+ <span class='comment'>// EmptyLook, Save, Jump, Split</span>
+ _ <span class='op'>=&gt;</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, { <span class='kw'>return</span> <span class='boolval'>false</span>; }),
+ };
+ <span class='self'>self</span>.<span class='ident'>arm_inst</span>(<span class='ident'>pc</span>, <span class='ident'>body</span>)
+ }).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Arm</span><span class='op'>&gt;&gt;</span>();
+
+ <span class='self'>self</span>.<span class='ident'>match_insts</span>(<span class='ident'>arms</span>)
+ }
+
+ <span class='comment'>// Translates a character class into a match expression.</span>
+ <span class='comment'>// This avoids a binary search (and is hopefully replaced by a jump</span>
+ <span class='comment'>// table).</span>
+ <span class='kw'>fn</span> <span class='ident'>match_class</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>ranges</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>arms</span> <span class='op'>=</span> <span class='ident'>ranges</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>start</span>, <span class='ident'>end</span>)<span class='op'>|</span> {
+ <span class='kw'>let</span> <span class='ident'>pat</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>pat</span>(
+ <span class='self'>self</span>.<span class='ident'>sp</span>, <span class='ident'>ast</span>::<span class='ident'>PatRange</span>(
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>start</span>), <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>end</span>)));
+ <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>arm</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='macro'>vec</span><span class='macro'>!</span>(<span class='ident'>pat</span>), <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='boolval'>true</span>))
+ }).<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Arm</span><span class='op'>&gt;&gt;</span>();
+
+ <span class='ident'>arms</span>.<span class='ident'>push</span>(<span class='self'>self</span>.<span class='ident'>wild_arm_expr</span>(<span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='boolval'>false</span>)));
+ <span class='kw'>let</span> <span class='ident'>match_on</span> <span class='op'>=</span> <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='ident'>c</span>);
+ <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>expr_match</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='ident'>match_on</span>, <span class='ident'>arms</span>)
+ }
+
+ <span class='comment'>// Generates code for checking a literal prefix of the search string.</span>
+ <span class='comment'>// The code is only generated if the regex *has* a literal prefix.</span>
+ <span class='comment'>// Otherwise, a no-op is returned.</span>
+ <span class='comment'>// fn check_prefix(&amp;self) -&gt; P&lt;ast::Expr&gt; {</span>
+ <span class='comment'>// if self.prog.prefixes.len() == 0 {</span>
+ <span class='comment'>// self.empty_block()</span>
+ <span class='comment'>// } else {</span>
+ <span class='comment'>// quote_expr!(self.cx,</span>
+ <span class='comment'>// if clist.size == 0 {</span>
+ <span class='comment'>// let haystack = &amp;self.input.as_bytes()[self.ic..];</span>
+ <span class='comment'>// match find_prefix(prefix_bytes, haystack) {</span>
+ <span class='comment'>// None =&gt; break,</span>
+ <span class='comment'>// Some(i) =&gt; {</span>
+ <span class='comment'>// self.ic += i;</span>
+ <span class='comment'>// next_ic = self.chars.set(self.ic);</span>
+ <span class='comment'>// }</span>
+ <span class='comment'>// }</span>
+ <span class='comment'>// }</span>
+ <span class='comment'>// )</span>
+ <span class='comment'>// }</span>
+ <span class='comment'>// }</span>
+
+ <span class='comment'>// Builds a `match pc { ... }` expression from a list of arms, specifically</span>
+ <span class='comment'>// for matching the current program counter with an instruction.</span>
+ <span class='comment'>// A wild-card arm is automatically added that executes a no-op. It will</span>
+ <span class='comment'>// never be used, but is added to satisfy the compiler complaining about</span>
+ <span class='comment'>// non-exhaustive patterns.</span>
+ <span class='kw'>fn</span> <span class='ident'>match_insts</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>arms</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Arm</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='ident'>arms</span>.<span class='ident'>push</span>(<span class='self'>self</span>.<span class='ident'>wild_arm_expr</span>(<span class='self'>self</span>.<span class='ident'>empty_block</span>()));
+ <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>expr_match</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='ident'>pc</span>), <span class='ident'>arms</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>empty_block</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, {})
+ }
+
+ <span class='comment'>// Creates a match arm for the instruction at `pc` with the expression</span>
+ <span class='comment'>// `body`.</span>
+ <span class='kw'>fn</span> <span class='ident'>arm_inst</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>pc</span>: <span class='ident'>usize</span>, <span class='ident'>body</span>: <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>ast</span>::<span class='ident'>Arm</span> {
+ <span class='kw'>let</span> <span class='ident'>pc_pat</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>pat_lit</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='macro'>quote_expr</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>pc</span>));
+
+ <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>arm</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='macro'>vec</span><span class='macro'>!</span>(<span class='ident'>pc_pat</span>), <span class='ident'>body</span>)
+ }
+
+ <span class='comment'>// Creates a wild-card match arm with the expression `body`.</span>
+ <span class='kw'>fn</span> <span class='ident'>wild_arm_expr</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>body</span>: <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>ast</span>::<span class='ident'>Arm</span> {
+ <span class='ident'>ast</span>::<span class='ident'>Arm</span> {
+ <span class='ident'>attrs</span>: <span class='macro'>vec</span><span class='macro'>!</span>(),
+ <span class='ident'>pats</span>: <span class='macro'>vec</span><span class='macro'>!</span>(<span class='ident'>P</span>(<span class='ident'>ast</span>::<span class='ident'>Pat</span>{
+ <span class='ident'>id</span>: <span class='ident'>ast</span>::<span class='ident'>DUMMY_NODE_ID</span>,
+ <span class='ident'>span</span>: <span class='self'>self</span>.<span class='ident'>sp</span>,
+ <span class='ident'>node</span>: <span class='ident'>ast</span>::<span class='ident'>PatWild</span>(<span class='ident'>ast</span>::<span class='ident'>PatWildSingle</span>),
+ })),
+ <span class='ident'>guard</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>body</span>: <span class='ident'>body</span>,
+ }
+ }
+
+ <span class='comment'>// Converts `xs` to a `[x1, x2, .., xN]` expression by calling `to_expr`</span>
+ <span class='comment'>// on each element in `xs`.</span>
+ <span class='kw'>fn</span> <span class='ident'>vec_expr</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>It</span>: <span class='ident'>Iterator</span><span class='op'>&lt;</span><span class='ident'>Item</span><span class='op'>=</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>xs</span>: <span class='ident'>It</span>,
+ <span class='ident'>to_expr</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>FnMut</span>(<span class='kw-2'>&amp;</span><span class='ident'>ExtCtxt</span>, <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span>)
+ <span class='op'>-&gt;</span> <span class='ident'>P</span><span class='op'>&lt;</span><span class='ident'>ast</span>::<span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>exprs</span> <span class='op'>=</span> <span class='ident'>xs</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>x</span><span class='op'>|</span> <span class='ident'>to_expr</span>(<span class='self'>self</span>.<span class='ident'>cx</span>, <span class='ident'>x</span>)).<span class='ident'>collect</span>();
+ <span class='self'>self</span>.<span class='ident'>cx</span>.<span class='ident'>expr_vec</span>(<span class='self'>self</span>.<span class='ident'>sp</span>, <span class='ident'>exprs</span>)
+ }
+}
+
+<span class='doccomment'>/// Looks for a single string literal and returns it.</span>
+<span class='doccomment'>/// Otherwise, logs an error with cx.span_err and returns None.</span>
+<span class='kw'>fn</span> <span class='ident'>parse</span>(<span class='ident'>cx</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>ExtCtxt</span>, <span class='ident'>tts</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>ast</span>::<span class='ident'>TokenTree</span>]) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>parser</span> <span class='op'>=</span> <span class='ident'>cx</span>.<span class='ident'>new_parser_from_tts</span>(<span class='ident'>tts</span>);
+ <span class='kw'>let</span> <span class='ident'>entry</span> <span class='op'>=</span> <span class='ident'>cx</span>.<span class='ident'>expander</span>().<span class='ident'>fold_expr</span>(<span class='ident'>parser</span>.<span class='ident'>parse_expr</span>());
+ <span class='kw'>let</span> <span class='ident'>regex</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>entry</span>.<span class='ident'>node</span> {
+ <span class='ident'>ast</span>::<span class='ident'>ExprLit</span>(<span class='kw-2'>ref</span> <span class='ident'>lit</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>match</span> <span class='ident'>lit</span>.<span class='ident'>node</span> {
+ <span class='ident'>ast</span>::<span class='ident'>LitStr</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>, _) <span class='op'>=&gt;</span> <span class='ident'>s</span>.<span class='ident'>to_string</span>(),
+ _ <span class='op'>=&gt;</span> {
+ <span class='ident'>cx</span>.<span class='ident'>span_err</span>(<span class='ident'>entry</span>.<span class='ident'>span</span>, <span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(
+ <span class='string'>&quot;expected string literal but got `{}`&quot;</span>,
+ <span class='ident'>pprust</span>::<span class='ident'>lit_to_string</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>lit</span>)));
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+ }
+ }
+ _ <span class='op'>=&gt;</span> {
+ <span class='ident'>cx</span>.<span class='ident'>span_err</span>(<span class='ident'>entry</span>.<span class='ident'>span</span>, <span class='kw-2'>&amp;</span><span class='macro'>format</span><span class='macro'>!</span>(
+ <span class='string'>&quot;expected string literal but got `{}`&quot;</span>,
+ <span class='ident'>pprust</span>::<span class='ident'>expr_to_string</span>(<span class='kw-2'>&amp;</span><span class='op'>*</span><span class='ident'>entry</span>)));
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>
+ }
+ };
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>parser</span>.<span class='ident'>eat</span>(<span class='kw-2'>&amp;</span><span class='ident'>token</span>::<span class='ident'>Eof</span>).<span class='ident'>ok</span>().<span class='ident'>unwrap</span>() {
+ <span class='ident'>cx</span>.<span class='ident'>span_err</span>(<span class='ident'>parser</span>.<span class='ident'>span</span>, <span class='string'>&quot;only one string literal allowed&quot;</span>);
+ <span class='kw'>return</span> <span class='prelude-val'>None</span>;
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>regex</span>)
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex_macros";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex_syntax/lib.rs.html b/src/regex_syntax/lib.rs.html
new file mode 100644
index 0000000..7c8b82b
--- /dev/null
+++ b/src/regex_syntax/lib.rs.html
@@ -0,0 +1,2465 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-syntax-0.1.2/src/lib.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>lib.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+<span id="1149">1149</span>
+<span id="1150">1150</span>
+<span id="1151">1151</span>
+<span id="1152">1152</span>
+<span id="1153">1153</span>
+<span id="1154">1154</span>
+<span id="1155">1155</span>
+<span id="1156">1156</span>
+<span id="1157">1157</span>
+<span id="1158">1158</span>
+<span id="1159">1159</span>
+<span id="1160">1160</span>
+<span id="1161">1161</span>
+<span id="1162">1162</span>
+<span id="1163">1163</span>
+<span id="1164">1164</span>
+<span id="1165">1165</span>
+<span id="1166">1166</span>
+<span id="1167">1167</span>
+<span id="1168">1168</span>
+<span id="1169">1169</span>
+<span id="1170">1170</span>
+<span id="1171">1171</span>
+<span id="1172">1172</span>
+<span id="1173">1173</span>
+<span id="1174">1174</span>
+<span id="1175">1175</span>
+<span id="1176">1176</span>
+<span id="1177">1177</span>
+<span id="1178">1178</span>
+<span id="1179">1179</span>
+<span id="1180">1180</span>
+<span id="1181">1181</span>
+<span id="1182">1182</span>
+<span id="1183">1183</span>
+<span id="1184">1184</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='doccomment'>/*!
+This crate provides a regular expression parser and an abstract syntax for
+regular expressions. The abstract syntax is defined by the `Expr` type. The
+concrete syntax is enumerated in the
+[`regex`](../regex/index.html#syntax)
+crate documentation.
+
+Note that since this crate is first and foremost an implementation detail for
+the `regex` crate, it may experience more frequent breaking changes. It is
+exposed as a separate crate so that others may use it to do analysis on regular
+expressions or even build their own matching engine.
+
+# Example: parsing an expression
+
+Parsing a regular expression can be done with the `Expr::parse` function.
+
+```rust
+use regex_syntax::Expr;
+
+assert_eq!(Expr::parse(r&quot;ab|yz&quot;).unwrap(), Expr::Alternate(vec![
+ Expr::Literal { chars: vec![&#39;a&#39;, &#39;b&#39;], casei: false },
+ Expr::Literal { chars: vec![&#39;y&#39;, &#39;z&#39;], casei: false },
+]));
+```
+
+# Example: inspecting an error
+
+The parser in this crate provides very detailed error values. For example,
+if an invalid character class range is given:
+
+```rust
+use regex_syntax::{Expr, ErrorKind};
+
+let err = Expr::parse(r&quot;[z-a]&quot;).unwrap_err();
+assert_eq!(err.position(), 4);
+assert_eq!(err.kind(), &amp;ErrorKind::InvalidClassRange {
+ start: &#39;z&#39;,
+ end: &#39;a&#39;,
+});
+```
+
+Or unbalanced parentheses:
+
+```rust
+use regex_syntax::{Expr, ErrorKind};
+
+let err = Expr::parse(r&quot;ab(cd&quot;).unwrap_err();
+assert_eq!(err.position(), 2);
+assert_eq!(err.kind(), &amp;ErrorKind::UnclosedParen);
+```
+*/</span>
+
+<span class='attribute'>#<span class='op'>!</span>[<span class='ident'>deny</span>(<span class='ident'>missing_docs</span>)]</span>
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>quickcheck</span>;
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span> <span class='kw'>extern</span> <span class='kw'>crate</span> <span class='ident'>rand</span>;
+
+<span class='kw'>mod</span> <span class='ident'>parser</span>;
+<span class='kw'>mod</span> <span class='ident'>unicode</span>;
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::{<span class='ident'>Ordering</span>, <span class='ident'>max</span>, <span class='ident'>min</span>};
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>fmt</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>iter</span>::<span class='ident'>IntoIterator</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ops</span>::<span class='ident'>Deref</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>slice</span>;
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>vec</span>;
+
+<span class='kw'>use</span> <span class='ident'>unicode</span>::<span class='ident'>case_folding</span>;
+
+<span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Expr</span>::<span class='op'>*</span>;
+<span class='kw'>use</span> <span class='self'>self</span>::<span class='ident'>Repeater</span>::<span class='op'>*</span>;
+
+<span class='kw'>pub</span> <span class='kw'>use</span> <span class='ident'>parser</span>::<span class='ident'>is_punct</span>;
+
+<span class='doccomment'>/// A regular expression abstract syntax tree.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// An `Expr` represents the abstract syntax of a regular expression.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Expr</span> {
+ <span class='doccomment'>/// An empty regex (which never matches any text).</span>
+ <span class='ident'>Empty</span>,
+ <span class='doccomment'>/// A sequence of one or more literal characters to be matched.</span>
+ <span class='ident'>Literal</span> {
+ <span class='doccomment'>/// The characters.</span>
+ <span class='ident'>chars</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// Whether to match case insensitively.</span>
+ <span class='ident'>casei</span>: <span class='ident'>bool</span>,
+ },
+ <span class='doccomment'>/// Match any character, excluding new line.</span>
+ <span class='ident'>AnyChar</span>,
+ <span class='doccomment'>/// Match any character.</span>
+ <span class='ident'>AnyCharNoNL</span>,
+ <span class='doccomment'>/// A character class.</span>
+ <span class='ident'>Class</span>(<span class='ident'>CharClass</span>),
+ <span class='doccomment'>/// Match the start of a line or beginning of input.</span>
+ <span class='ident'>StartLine</span>,
+ <span class='doccomment'>/// Match the end of a line or end of input.</span>
+ <span class='ident'>EndLine</span>,
+ <span class='doccomment'>/// Match the beginning of input.</span>
+ <span class='ident'>StartText</span>,
+ <span class='doccomment'>/// Match the end of input.</span>
+ <span class='ident'>EndText</span>,
+ <span class='doccomment'>/// Match a word boundary (word character on one side and a non-word</span>
+ <span class='doccomment'>/// character on the other).</span>
+ <span class='ident'>WordBoundary</span>,
+ <span class='doccomment'>/// Match a position that is not a word boundary (word or non-word</span>
+ <span class='doccomment'>/// characters on both sides).</span>
+ <span class='ident'>NotWordBoundary</span>,
+ <span class='doccomment'>/// A group, possibly non-capturing.</span>
+ <span class='ident'>Group</span> {
+ <span class='doccomment'>/// The expression inside the group.</span>
+ <span class='ident'>e</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// The capture index (starting at `1`) only for capturing groups.</span>
+ <span class='ident'>i</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// The capture name, only for capturing named groups.</span>
+ <span class='ident'>name</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>,
+ },
+ <span class='doccomment'>/// A repeat operator (`?`, `*`, `+` or `{m,n}`).</span>
+ <span class='ident'>Repeat</span> {
+ <span class='doccomment'>/// The expression to be repeated. Limited to literals, `.`, classes</span>
+ <span class='doccomment'>/// or grouped expressions.</span>
+ <span class='ident'>e</span>: <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>,
+ <span class='doccomment'>/// The type of repeat operator used.</span>
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>,
+ <span class='doccomment'>/// Whether the repeat is greedy (match the most) or not (match the</span>
+ <span class='doccomment'>/// least).</span>
+ <span class='ident'>greedy</span>: <span class='ident'>bool</span>,
+ },
+ <span class='doccomment'>/// A concatenation of expressions. Must be matched one after the other.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// N.B. A concat expression can only appear at the top-level or</span>
+ <span class='doccomment'>/// immediately inside a group expression.</span>
+ <span class='ident'>Concat</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>),
+ <span class='doccomment'>/// An alternation of expressions. Only one must match.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// N.B. An alternate expression can only appear at the top-level or</span>
+ <span class='doccomment'>/// immediately inside a group expression.</span>
+ <span class='ident'>Alternate</span>(<span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>),
+}
+
+<span class='kw'>type</span> <span class='ident'>CaptureIndex</span> <span class='op'>=</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>usize</span><span class='op'>&gt;</span>;
+
+<span class='kw'>type</span> <span class='ident'>CaptureName</span> <span class='op'>=</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>;
+
+<span class='doccomment'>/// The type of a repeat operator expression.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>Repeater</span> {
+ <span class='doccomment'>/// Match zero or one (`?`).</span>
+ <span class='ident'>ZeroOrOne</span>,
+ <span class='doccomment'>/// Match zero or more (`*`).</span>
+ <span class='ident'>ZeroOrMore</span>,
+ <span class='doccomment'>/// Match one or more (`+`).</span>
+ <span class='ident'>OneOrMore</span>,
+ <span class='doccomment'>/// Match for at least `min` and at most `max` (`{m,n}`).</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When `max` is `None`, there is no upper bound on the number of matches.</span>
+ <span class='ident'>Range</span> {
+ <span class='doccomment'>/// Lower bound on the number of matches.</span>
+ <span class='ident'>min</span>: <span class='ident'>u32</span>,
+ <span class='doccomment'>/// Optional upper bound on the number of matches.</span>
+ <span class='ident'>max</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>u32</span><span class='op'>&gt;</span>,
+ },
+}
+
+<span class='doccomment'>/// A character class.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// A character class has a canonical format that the parser guarantees. Its</span>
+<span class='doccomment'>/// canonical format is defined by the following invariants:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// 1. Given any Unicode scalar value, it is matched by *at most* one character</span>
+<span class='doccomment'>/// range in a canonical character class.</span>
+<span class='doccomment'>/// 2. Every adjacent character range is separated by at least one Unicode</span>
+<span class='doccomment'>/// scalar value.</span>
+<span class='doccomment'>/// 3. Given any pair of character ranges `r1` and `r2`, if</span>
+<span class='doccomment'>/// `r1.end &lt; r2.start`, then `r1` comes before `r2` in a canonical</span>
+<span class='doccomment'>/// character class.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// In sum, any `CharClass` produced by this crate&#39;s parser is a sorted</span>
+<span class='doccomment'>/// sequence of non-overlapping ranges. This makes it possible to test whether</span>
+<span class='doccomment'>/// a character is matched by a class with a binary search.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Additionally, a character class may be marked *case insensitive*. If it&#39;s</span>
+<span class='doccomment'>/// case insensitive, then:</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// 1. Simple case folding has been applied to all ranges.</span>
+<span class='doccomment'>/// 2. Simple case folding must be applied to a character before testing</span>
+<span class='doccomment'>/// whether it matches the character class.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>Eq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>CharClass</span> {
+ <span class='ident'>ranges</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span>,
+ <span class='ident'>casei</span>: <span class='ident'>bool</span>,
+}
+
+<span class='doccomment'>/// A single inclusive range in a character class.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Since range boundaries are defined by Unicode scalar values, the boundaries</span>
+<span class='doccomment'>/// can never be in the open interval `(0xD7FF, 0xE000)`. However, a range may</span>
+<span class='doccomment'>/// *cover* codepoints that are not scalar values.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Note that this has a few convenient impls on `PartialEq` and `PartialOrd`</span>
+<span class='doccomment'>/// for testing whether a character is contained inside a given range.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>, <span class='ident'>PartialOrd</span>, <span class='ident'>Eq</span>, <span class='ident'>Ord</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>ClassRange</span> {
+ <span class='doccomment'>/// The start character of the range.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This must be less than or equal to `end`.</span>
+ <span class='kw'>pub</span> <span class='ident'>start</span>: <span class='ident'>char</span>,
+
+ <span class='doccomment'>/// The end character of the range.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This must be greater than or equal to `end`.</span>
+ <span class='kw'>pub</span> <span class='ident'>end</span>: <span class='ident'>char</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Expr</span> {
+ <span class='doccomment'>/// Parses a string in a regular expression syntax tree.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>parse</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='ident'>parser</span>::<span class='ident'>Parser</span>::<span class='ident'>parse</span>(<span class='ident'>s</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>e</span>.<span class='ident'>simplify</span>())
+ }
+
+ <span class='doccomment'>/// Returns true iff the expression can be repeated by a quantifier.</span>
+ <span class='kw'>fn</span> <span class='ident'>can_repeat</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Literal</span>{..}
+ <span class='op'>|</span> <span class='ident'>AnyChar</span>
+ <span class='op'>|</span> <span class='ident'>AnyCharNoNL</span>
+ <span class='op'>|</span> <span class='ident'>Class</span>(_)
+ <span class='op'>|</span> <span class='ident'>StartLine</span> <span class='op'>|</span> <span class='ident'>EndLine</span> <span class='op'>|</span> <span class='ident'>StartText</span> <span class='op'>|</span> <span class='ident'>EndText</span>
+ <span class='op'>|</span> <span class='ident'>WordBoundary</span> <span class='op'>|</span> <span class='ident'>NotWordBoundary</span>
+ <span class='op'>|</span> <span class='ident'>Group</span>{..}
+ <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>simplify</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> {
+ <span class='kw'>fn</span> <span class='ident'>combine_literals</span>(<span class='ident'>es</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>, <span class='ident'>e</span>: <span class='ident'>Expr</span>) {
+ <span class='kw'>match</span> (<span class='ident'>es</span>.<span class='ident'>pop</span>(), <span class='ident'>e</span>) {
+ (<span class='prelude-val'>None</span>, <span class='ident'>e</span>) <span class='op'>=&gt;</span> <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>e</span>),
+ (<span class='prelude-val'>Some</span>(<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='kw-2'>mut</span> <span class='ident'>chars1</span>, <span class='ident'>casei</span>: <span class='ident'>casei1</span> }),
+ <span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='ident'>chars2</span>, <span class='ident'>casei</span>: <span class='ident'>casei2</span> }) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>casei1</span> <span class='op'>==</span> <span class='ident'>casei2</span> {
+ <span class='ident'>chars1</span>.<span class='ident'>extend</span>(<span class='ident'>chars2</span>);
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='ident'>chars1</span>, <span class='ident'>casei</span>: <span class='ident'>casei1</span> });
+ } <span class='kw'>else</span> {
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='ident'>chars1</span>, <span class='ident'>casei</span>: <span class='ident'>casei1</span> });
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='ident'>chars2</span>, <span class='ident'>casei</span>: <span class='ident'>casei2</span> });
+ }
+ }
+ (<span class='prelude-val'>Some</span>(<span class='ident'>e1</span>), <span class='ident'>e2</span>) <span class='op'>=&gt;</span> {
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>e1</span>);
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>e2</span>);
+ }
+ }
+ }
+ <span class='kw'>match</span> <span class='self'>self</span> {
+ <span class='ident'>Repeat</span> { <span class='ident'>e</span>, <span class='ident'>r</span>, <span class='ident'>greedy</span> } <span class='op'>=&gt;</span> <span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>e</span>.<span class='ident'>simplify</span>()),
+ <span class='ident'>r</span>: <span class='ident'>r</span>,
+ <span class='ident'>greedy</span>: <span class='ident'>greedy</span>,
+ },
+ <span class='ident'>Group</span> { <span class='ident'>e</span>, <span class='ident'>i</span>, <span class='ident'>name</span> } <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='ident'>e</span>.<span class='ident'>simplify</span>();
+ <span class='kw'>if</span> <span class='ident'>i</span>.<span class='ident'>is_none</span>() <span class='op'>&amp;&amp;</span> <span class='ident'>name</span>.<span class='ident'>is_none</span>() <span class='op'>&amp;&amp;</span> <span class='ident'>e</span>.<span class='ident'>can_repeat</span>() {
+ <span class='ident'>e</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Group</span> { <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>e</span>), <span class='ident'>i</span>: <span class='ident'>i</span>, <span class='ident'>name</span>: <span class='ident'>name</span> }
+ }
+ }
+ <span class='ident'>Concat</span>(<span class='ident'>es</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>new_es</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='ident'>es</span>.<span class='ident'>len</span>());
+ <span class='kw'>for</span> <span class='ident'>e</span> <span class='kw'>in</span> <span class='ident'>es</span> {
+ <span class='ident'>combine_literals</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>new_es</span>, <span class='ident'>e</span>.<span class='ident'>simplify</span>());
+ }
+ <span class='kw'>if</span> <span class='ident'>new_es</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='ident'>new_es</span>.<span class='ident'>pop</span>().<span class='ident'>unwrap</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>Concat</span>(<span class='ident'>new_es</span>)
+ }
+ }
+ <span class='ident'>Alternate</span>(<span class='ident'>es</span>) <span class='op'>=&gt;</span> <span class='ident'>Alternate</span>(<span class='ident'>es</span>.<span class='ident'>into_iter</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>e</span><span class='op'>|</span> <span class='ident'>e</span>.<span class='ident'>simplify</span>())
+ .<span class='ident'>collect</span>()),
+ <span class='ident'>e</span> <span class='op'>=&gt;</span> <span class='ident'>e</span>,
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Deref</span> <span class='kw'>for</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>type</span> <span class='ident'>Target</span> <span class='op'>=</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>deref</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span> { <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>ranges</span> }
+}
+
+<span class='kw'>impl</span> <span class='ident'>IntoIterator</span> <span class='kw'>for</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>ClassRange</span>;
+ <span class='kw'>type</span> <span class='ident'>IntoIter</span> <span class='op'>=</span> <span class='ident'>vec</span>::<span class='ident'>IntoIter</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>into_iter</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>vec</span>::<span class='ident'>IntoIter</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>ranges</span>.<span class='ident'>into_iter</span>() }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>IntoIterator</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>ClassRange</span>;
+ <span class='kw'>type</span> <span class='ident'>IntoIter</span> <span class='op'>=</span> <span class='ident'>slice</span>::<span class='ident'>Iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>ClassRange</span><span class='op'>&gt;</span>;
+ <span class='kw'>fn</span> <span class='ident'>into_iter</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>slice</span>::<span class='ident'>Iter</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>ClassRange</span><span class='op'>&gt;</span> { <span class='self'>self</span>.<span class='ident'>iter</span>() }
+}
+
+<span class='kw'>impl</span> <span class='ident'>CharClass</span> {
+ <span class='doccomment'>/// Create a new class from an existing set of ranges.</span>
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>ranges</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='ident'>CharClass</span> { <span class='ident'>ranges</span>: <span class='ident'>ranges</span>, <span class='ident'>casei</span>: <span class='boolval'>false</span> }
+ }
+
+ <span class='doccomment'>/// Create an empty class.</span>
+ <span class='kw'>fn</span> <span class='ident'>empty</span>() <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='ident'>CharClass</span>::<span class='ident'>new</span>(<span class='ident'>Vec</span>::<span class='ident'>new</span>())
+ }
+
+ <span class='doccomment'>/// Returns true if `c` is matched by this character class.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If this character class is case insensitive, then simple case folding</span>
+ <span class='doccomment'>/// is applied to `c` before checking for a match.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>matches</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='kw-2'>mut</span> <span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>is_case_insensitive</span>() {
+ <span class='ident'>c</span> <span class='op'>=</span> <span class='ident'>simple_case_fold</span>(<span class='ident'>c</span>)
+ }
+ <span class='self'>self</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='ident'>range</span><span class='op'>|</span> <span class='ident'>c</span>.<span class='ident'>partial_cmp</span>(<span class='ident'>range</span>).<span class='ident'>unwrap</span>()).<span class='ident'>is_ok</span>()
+ }
+
+ <span class='doccomment'>/// Returns true if this character class should be matched case</span>
+ <span class='doccomment'>/// insensitively.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// When `true`, simple case folding has already been applied to the</span>
+ <span class='doccomment'>/// class.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_case_insensitive</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>casei</span>
+ }
+
+ <span class='doccomment'>/// Create a new empty class from this one.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Namely, its capacity and case insensitive setting will be the same.</span>
+ <span class='kw'>fn</span> <span class='ident'>to_empty</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='ident'>CharClass</span> { <span class='ident'>ranges</span>: <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='self'>self</span>.<span class='ident'>len</span>()), <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>casei</span> }
+ }
+
+ <span class='doccomment'>/// Merge two classes and canonicalize them.</span>
+ <span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+ <span class='kw'>fn</span> <span class='ident'>merge</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>other</span>: <span class='ident'>CharClass</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='self'>self</span>.<span class='ident'>ranges</span>.<span class='ident'>extend</span>(<span class='ident'>other</span>);
+ <span class='self'>self</span>.<span class='ident'>canonicalize</span>()
+ }
+
+ <span class='doccomment'>/// Canonicalze any sequence of ranges.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This is responsible for enforcing the canonical format invariants</span>
+ <span class='doccomment'>/// as described on the docs for the `CharClass` type.</span>
+ <span class='kw'>fn</span> <span class='ident'>canonicalize</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='comment'>// TODO: Save some cycles here by checking if already canonicalized.</span>
+ <span class='self'>self</span>.<span class='ident'>ranges</span>.<span class='ident'>sort</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ordered</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>to_empty</span>(); <span class='comment'>// TODO: Do this in place?</span>
+ <span class='kw'>for</span> <span class='ident'>candidate</span> <span class='kw'>in</span> <span class='self'>self</span> {
+ <span class='comment'>// If the candidate overlaps with an existing range, then it must</span>
+ <span class='comment'>// be the most recent range added because we process the candidates</span>
+ <span class='comment'>// in order.</span>
+ <span class='kw'>if</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>or</span>) <span class='op'>=</span> <span class='ident'>ordered</span>.<span class='ident'>ranges</span>.<span class='ident'>last_mut</span>() {
+ <span class='kw'>if</span> <span class='ident'>or</span>.<span class='ident'>overlapping</span>(<span class='ident'>candidate</span>) {
+ <span class='op'>*</span><span class='ident'>or</span> <span class='op'>=</span> <span class='ident'>or</span>.<span class='ident'>merge</span>(<span class='ident'>candidate</span>);
+ <span class='kw'>continue</span>;
+ }
+ }
+ <span class='ident'>ordered</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>candidate</span>);
+ }
+ <span class='ident'>ordered</span>
+ }
+
+ <span class='doccomment'>/// Negates the character class.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// For all `c` where `c` is a Unicode scalar value, `c` matches `self`</span>
+ <span class='doccomment'>/// if and only if `c` does not match `self.negate()`.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Note that this cannot be called on a character class that has had</span>
+ <span class='doccomment'>/// case folding applied to it. (Because case folding turns on a flag</span>
+ <span class='doccomment'>/// and doesn&#39;t store every possible matching character. Therefore,</span>
+ <span class='doccomment'>/// its negation is tricky to get right. Turns out, we don&#39;t need it</span>
+ <span class='doccomment'>/// anyway!)</span>
+ <span class='kw'>fn</span> <span class='ident'>negate</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>fn</span> <span class='ident'>range</span>(<span class='ident'>s</span>: <span class='ident'>char</span>, <span class='ident'>e</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>ClassRange</span> { <span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>s</span>, <span class='ident'>e</span>) }
+
+ <span class='comment'>// Never allow negating of a class that has been case folded!</span>
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='self'>self</span>.<span class='ident'>casei</span>);
+
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>is_empty</span>() { <span class='kw'>return</span> <span class='self'>self</span>; }
+ <span class='self'>self</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>canonicalize</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>inv</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>to_empty</span>();
+ <span class='kw'>if</span> <span class='self'>self</span>[<span class='number'>0</span>].<span class='ident'>start</span> <span class='op'>&gt;</span> <span class='string'>&#39;\x00&#39;</span> {
+ <span class='ident'>inv</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>range</span>(<span class='string'>&#39;\x00&#39;</span>, <span class='ident'>dec_char</span>(<span class='self'>self</span>[<span class='number'>0</span>].<span class='ident'>start</span>)));
+ }
+ <span class='kw'>for</span> <span class='ident'>win</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>windows</span>(<span class='number'>2</span>) {
+ <span class='ident'>inv</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>range</span>(<span class='ident'>inc_char</span>(<span class='ident'>win</span>[<span class='number'>0</span>].<span class='ident'>end</span>),
+ <span class='ident'>dec_char</span>(<span class='ident'>win</span>[<span class='number'>1</span>].<span class='ident'>start</span>)));
+ }
+ <span class='kw'>if</span> <span class='self'>self</span>[<span class='self'>self</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='number'>1</span>].<span class='ident'>end</span> <span class='op'>&lt;</span> <span class='ident'>char</span>::<span class='ident'>MAX</span> {
+ <span class='ident'>inv</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>range</span>(<span class='ident'>inc_char</span>(<span class='self'>self</span>[<span class='self'>self</span>.<span class='ident'>len</span>() <span class='op'>-</span> <span class='number'>1</span>].<span class='ident'>end</span>),
+ <span class='ident'>char</span>::<span class='ident'>MAX</span>));
+ }
+ <span class='ident'>inv</span>
+ }
+
+ <span class='doccomment'>/// Apply case folding to this character class.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// One a class had been case folded, it cannot be negated.</span>
+ <span class='kw'>fn</span> <span class='ident'>case_fold</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>folded</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>to_empty</span>();
+ <span class='ident'>folded</span>.<span class='ident'>casei</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>for</span> <span class='ident'>r</span> <span class='kw'>in</span> <span class='self'>self</span> {
+ <span class='comment'>// Applying case folding to a range is expensive because *every*</span>
+ <span class='comment'>// character needed to be examined. Thus, we avoid that drudgery</span>
+ <span class='comment'>// if no character in the current range is in our case folding</span>
+ <span class='comment'>// table.</span>
+ <span class='kw'>if</span> <span class='ident'>r</span>.<span class='ident'>needs_case_folding</span>() {
+ <span class='ident'>folded</span>.<span class='ident'>ranges</span>.<span class='ident'>extend</span>(<span class='ident'>r</span>.<span class='ident'>case_fold</span>());
+ } <span class='kw'>else</span> {
+ <span class='ident'>folded</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>r</span>);
+ }
+ }
+ <span class='ident'>folded</span>.<span class='ident'>canonicalize</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>ClassRange</span> {
+ <span class='doccomment'>/// Create a new class range.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// If `end &lt; start`, then the two values are swapped so that</span>
+ <span class='doccomment'>/// the invariant `start &lt;= end` is preserved.</span>
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>start</span>: <span class='ident'>char</span>, <span class='ident'>end</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>ClassRange</span> {
+ <span class='kw'>if</span> <span class='ident'>start</span> <span class='op'>&lt;=</span> <span class='ident'>end</span> {
+ <span class='ident'>ClassRange</span> { <span class='ident'>start</span>: <span class='ident'>start</span>, <span class='ident'>end</span>: <span class='ident'>end</span> }
+ } <span class='kw'>else</span> {
+ <span class='ident'>ClassRange</span> { <span class='ident'>start</span>: <span class='ident'>end</span>, <span class='ident'>end</span>: <span class='ident'>start</span> }
+ }
+ }
+
+ <span class='doccomment'>/// Create a range of one character.</span>
+ <span class='kw'>fn</span> <span class='ident'>one</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>ClassRange</span> {
+ <span class='ident'>ClassRange</span> { <span class='ident'>start</span>: <span class='ident'>c</span>, <span class='ident'>end</span>: <span class='ident'>c</span> }
+ }
+
+ <span class='doccomment'>/// Returns true if and only if the two ranges are overlapping. Note that</span>
+ <span class='doccomment'>/// since ranges are inclusive, `a-c` and `d-f` are overlapping!</span>
+ <span class='kw'>fn</span> <span class='ident'>overlapping</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='ident'>ClassRange</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>max</span>(<span class='self'>self</span>.<span class='ident'>start</span>, <span class='ident'>other</span>.<span class='ident'>start</span>) <span class='op'>&lt;=</span> <span class='ident'>inc_char</span>(<span class='ident'>min</span>(<span class='self'>self</span>.<span class='ident'>end</span>, <span class='ident'>other</span>.<span class='ident'>end</span>))
+ }
+
+ <span class='doccomment'>/// Creates a new range representing the union of `self` and `other.</span>
+ <span class='kw'>fn</span> <span class='ident'>merge</span>(<span class='self'>self</span>, <span class='ident'>other</span>: <span class='ident'>ClassRange</span>) <span class='op'>-&gt;</span> <span class='ident'>ClassRange</span> {
+ <span class='ident'>ClassRange</span> {
+ <span class='ident'>start</span>: <span class='ident'>min</span>(<span class='self'>self</span>.<span class='ident'>start</span>, <span class='ident'>other</span>.<span class='ident'>start</span>),
+ <span class='ident'>end</span>: <span class='ident'>max</span>(<span class='self'>self</span>.<span class='ident'>end</span>, <span class='ident'>other</span>.<span class='ident'>end</span>),
+ }
+ }
+
+ <span class='doccomment'>/// Returns true if and only if this range contains a character that is</span>
+ <span class='doccomment'>/// in the case folding table.</span>
+ <span class='kw'>fn</span> <span class='ident'>needs_case_folding</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>
+ .<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>c</span>, _)<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='ident'>c</span>).<span class='ident'>unwrap</span>()).<span class='ident'>is_ok</span>()
+ }
+
+ <span class='doccomment'>/// Apply case folding to this range.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// Since case folding might add characters such that the range is no</span>
+ <span class='doccomment'>/// longer contiguous, this returns multiple class ranges. They are in</span>
+ <span class='doccomment'>/// canonical order.</span>
+ <span class='kw'>fn</span> <span class='ident'>case_fold</span>(<span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> (<span class='ident'>s</span>, <span class='ident'>e</span>) <span class='op'>=</span> (<span class='self'>self</span>.<span class='ident'>start</span> <span class='kw'>as</span> <span class='ident'>u32</span>, <span class='self'>self</span>.<span class='ident'>end</span> <span class='kw'>as</span> <span class='ident'>u32</span> <span class='op'>+</span> <span class='number'>1</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>start</span> <span class='op'>=</span> <span class='ident'>simple_case_fold</span>(<span class='self'>self</span>.<span class='ident'>start</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>end</span> <span class='op'>=</span> <span class='ident'>start</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>next_case_fold</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>start</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>ranges</span> <span class='op'>=</span> <span class='ident'>Vec</span>::<span class='ident'>with_capacity</span>(<span class='number'>100</span>);
+ <span class='kw'>for</span> <span class='kw-2'>mut</span> <span class='ident'>c</span> <span class='kw'>in</span> (<span class='ident'>s</span><span class='op'>+</span><span class='number'>1</span>..<span class='ident'>e</span>).<span class='ident'>filter_map</span>(<span class='ident'>char</span>::<span class='ident'>from_u32</span>) {
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='ident'>next_case_fold</span> {
+ <span class='ident'>c</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>simple_case_fold_result</span>(<span class='ident'>c</span>) {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>[<span class='ident'>i</span>].<span class='number'>1</span>,
+ <span class='prelude-val'>Err</span>(<span class='ident'>i</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>i</span> <span class='op'>&lt;</span> <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>.<span class='ident'>len</span>() {
+ <span class='ident'>next_case_fold</span> <span class='op'>=</span> <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>[<span class='ident'>i</span>].<span class='number'>0</span>;
+ } <span class='kw'>else</span> {
+ <span class='ident'>next_case_fold</span> <span class='op'>=</span> <span class='string'>&#39;\u{10FFFF}&#39;</span>
+ }
+ <span class='ident'>c</span>
+ }
+ };
+ }
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='ident'>inc_char</span>(<span class='ident'>end</span>) {
+ <span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>start</span>, <span class='ident'>end</span>));
+ <span class='ident'>start</span> <span class='op'>=</span> <span class='ident'>c</span>;
+ }
+ <span class='ident'>end</span> <span class='op'>=</span> <span class='ident'>c</span>;
+ }
+ <span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>start</span>, <span class='ident'>end</span>));
+ <span class='ident'>ranges</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>ClassRange</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='self'>self</span>.<span class='ident'>start</span> <span class='op'>&lt;=</span> <span class='op'>*</span><span class='ident'>other</span> <span class='op'>&amp;&amp;</span> <span class='op'>*</span><span class='ident'>other</span> <span class='op'>&lt;=</span> <span class='self'>self</span>.<span class='ident'>end</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialEq</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>eq</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>ClassRange</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>other</span>.<span class='ident'>eq</span>(<span class='self'>self</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>ClassRange</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='prelude-val'>Some</span>(<span class='kw'>if</span> <span class='self'>self</span> <span class='op'>==</span> <span class='ident'>other</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='op'>*</span><span class='ident'>other</span> <span class='op'>&gt;</span> <span class='self'>self</span>.<span class='ident'>end</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span>
+ })
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>PartialOrd</span><span class='op'>&lt;</span><span class='ident'>ClassRange</span><span class='op'>&gt;</span> <span class='kw'>for</span> <span class='ident'>char</span> {
+ <span class='attribute'>#[<span class='ident'>inline</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>partial_cmp</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>other</span>: <span class='kw-2'>&amp;</span><span class='ident'>ClassRange</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Ordering</span><span class='op'>&gt;</span> {
+ <span class='ident'>other</span>.<span class='ident'>partial_cmp</span>(<span class='self'>self</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>o</span><span class='op'>|</span> <span class='ident'>o</span>.<span class='ident'>reverse</span>())
+ }
+}
+
+<span class='doccomment'>/// This implementation of `Display` will write a regular expression from the</span>
+<span class='doccomment'>/// syntax tree. It does not write the original string parsed.</span>
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Expr</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Empty</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;&quot;</span>),
+ <span class='ident'>Literal</span> { <span class='kw-2'>ref</span> <span class='ident'>chars</span>, <span class='ident'>casei</span> } <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>casei</span> { <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?i:&quot;</span>)); }
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='ident'>c</span> <span class='kw'>in</span> <span class='ident'>chars</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>quote_char</span>(<span class='ident'>c</span>)));
+ }
+ <span class='kw'>if</span> <span class='ident'>casei</span> { <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;)&quot;</span>)); }
+ <span class='prelude-val'>Ok</span>(())
+ }
+ <span class='ident'>AnyChar</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?s:.)&quot;</span>),
+ <span class='ident'>AnyCharNoNL</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;.&quot;</span>),
+ <span class='ident'>Class</span>(<span class='kw-2'>ref</span> <span class='ident'>cls</span>) <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>cls</span>),
+ <span class='ident'>StartLine</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?m:^)&quot;</span>),
+ <span class='ident'>EndLine</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?m:$)&quot;</span>),
+ <span class='ident'>StartText</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>r&quot;^&quot;</span>),
+ <span class='ident'>EndText</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>r&quot;$&quot;</span>),
+ <span class='ident'>WordBoundary</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>r&quot;\b&quot;</span>),
+ <span class='ident'>NotWordBoundary</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>r&quot;\B&quot;</span>),
+ <span class='ident'>Group</span> { <span class='kw-2'>ref</span> <span class='ident'>e</span>, <span class='ident'>i</span>: <span class='prelude-val'>None</span>, <span class='ident'>name</span>: <span class='prelude-val'>None</span> } <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?:{})&quot;</span>, <span class='ident'>e</span>),
+ <span class='ident'>Group</span> { <span class='kw-2'>ref</span> <span class='ident'>e</span>, <span class='ident'>name</span>: <span class='prelude-val'>None</span>, .. } <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;({})&quot;</span>, <span class='ident'>e</span>),
+ <span class='ident'>Group</span> { <span class='kw-2'>ref</span> <span class='ident'>e</span>, <span class='ident'>name</span>: <span class='prelude-val'>Some</span>(<span class='kw-2'>ref</span> <span class='ident'>n</span>), .. } <span class='op'>=&gt;</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?P&lt;{}&gt;{})&quot;</span>, <span class='ident'>n</span>, <span class='ident'>e</span>)
+ }
+ <span class='ident'>Repeat</span> { <span class='kw-2'>ref</span> <span class='ident'>e</span>, <span class='ident'>r</span>, <span class='ident'>greedy</span> } <span class='op'>=&gt;</span> {
+ <span class='kw'>match</span> <span class='kw-2'>&amp;</span><span class='op'>*</span><span class='op'>*</span><span class='ident'>e</span> {
+ <span class='kw-2'>&amp;</span><span class='ident'>Literal</span> { <span class='kw-2'>ref</span> <span class='ident'>chars</span>, .. } <span class='kw'>if</span> <span class='ident'>chars</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>1</span> <span class='op'>=&gt;</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?:{}){}&quot;</span>, <span class='ident'>e</span>, <span class='ident'>r</span>))
+ }
+ _ <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}{}&quot;</span>, <span class='ident'>e</span>, <span class='ident'>r</span>)),
+ }
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>greedy</span> { <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;?&quot;</span>)); }
+ <span class='prelude-val'>Ok</span>(())
+ }
+ <span class='ident'>Concat</span>(<span class='kw-2'>ref</span> <span class='ident'>es</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>for</span> <span class='ident'>e</span> <span class='kw'>in</span> <span class='ident'>es</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>e</span>));
+ }
+ <span class='prelude-val'>Ok</span>(())
+ }
+ <span class='ident'>Alternate</span>(<span class='kw-2'>ref</span> <span class='ident'>es</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>for</span> (<span class='ident'>i</span>, <span class='ident'>e</span>) <span class='kw'>in</span> <span class='ident'>es</span>.<span class='ident'>iter</span>().<span class='ident'>enumerate</span>() {
+ <span class='kw'>if</span> <span class='ident'>i</span> <span class='op'>&gt;</span> <span class='number'>0</span> { <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;|&quot;</span>)); }
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>e</span>));
+ }
+ <span class='prelude-val'>Ok</span>(())
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Repeater</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>ZeroOrOne</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;?&quot;</span>),
+ <span class='ident'>ZeroOrMore</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;*&quot;</span>),
+ <span class='ident'>OneOrMore</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;+&quot;</span>),
+ <span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='ident'>s</span>, <span class='ident'>max</span>: <span class='prelude-val'>None</span> } <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{{{},}}&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='ident'>s</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='ident'>e</span>) } <span class='kw'>if</span> <span class='ident'>s</span> <span class='op'>==</span> <span class='ident'>e</span> <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{{{}}}&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='ident'>s</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='ident'>e</span>) } <span class='op'>=&gt;</span> <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{{{}, {}}}&quot;</span>, <span class='ident'>s</span>, <span class='ident'>e</span>),
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>casei</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;(?i:&quot;</span>));
+ }
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;[&quot;</span>));
+ <span class='kw'>for</span> <span class='ident'>range</span> <span class='kw'>in</span> <span class='self'>self</span>.<span class='ident'>iter</span>() {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}&quot;</span>, <span class='ident'>range</span>));
+ }
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;]&quot;</span>));
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>casei</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;)&quot;</span>));
+ }
+ <span class='prelude-val'>Ok</span>(())
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>ClassRange</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;{}-{}&quot;</span>, <span class='ident'>quote_char</span>(<span class='self'>self</span>.<span class='ident'>start</span>), <span class='ident'>quote_char</span>(<span class='self'>self</span>.<span class='ident'>end</span>))
+ }
+}
+
+<span class='doccomment'>/// An alias for computations that can return a `Error`.</span>
+<span class='kw'>pub</span> <span class='kw'>type</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='op'>=</span> ::<span class='ident'>std</span>::<span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>Error</span><span class='op'>&gt;</span>;
+
+<span class='doccomment'>/// A parse error.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This includes details about the specific type of error and a rough</span>
+<span class='doccomment'>/// approximation of where it occurred.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Error</span> {
+ <span class='ident'>pos</span>: <span class='ident'>usize</span>,
+ <span class='ident'>surround</span>: <span class='ident'>String</span>,
+ <span class='ident'>kind</span>: <span class='ident'>ErrorKind</span>,
+}
+
+<span class='doccomment'>/// The specific type of parse error that can occur.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Debug</span>, <span class='ident'>PartialEq</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>enum</span> <span class='ident'>ErrorKind</span> {
+ <span class='doccomment'>/// A negation symbol is used twice in flag settings.</span>
+ <span class='doccomment'>/// e.g., `(?-i-s)`.</span>
+ <span class='ident'>DoubleFlagNegation</span>,
+ <span class='doccomment'>/// The same capture name was used more than once.</span>
+ <span class='doccomment'>/// e.g., `(?P&lt;a&gt;.)(?P&lt;a&gt;.)`.</span>
+ <span class='ident'>DuplicateCaptureName</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// An alternate is empty. e.g., `(|a)`.</span>
+ <span class='ident'>EmptyAlternate</span>,
+ <span class='doccomment'>/// A capture group name is empty. e.g., `(?P&lt;&gt;a)`.</span>
+ <span class='ident'>EmptyCaptureName</span>,
+ <span class='doccomment'>/// A negation symbol was not proceded by any flags. e.g., `(?i-)`.</span>
+ <span class='ident'>EmptyFlagNegation</span>,
+ <span class='doccomment'>/// A group is empty. e.g., `()`.</span>
+ <span class='ident'>EmptyGroup</span>,
+ <span class='doccomment'>/// An invalid number was used in a counted repetition. e.g., `a{b}`.</span>
+ <span class='ident'>InvalidBase10</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// An invalid hexadecimal number was used in an escape sequence.</span>
+ <span class='doccomment'>/// e.g., `\xAG`.</span>
+ <span class='ident'>InvalidBase16</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// An invalid capture name was used. e.g., `(?P&lt;0a&gt;b)`.</span>
+ <span class='ident'>InvalidCaptureName</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// An invalid class range was givien. Specifically, when the start of the</span>
+ <span class='doccomment'>/// range is greater than the end. e.g., `[z-a]`.</span>
+ <span class='ident'>InvalidClassRange</span> {
+ <span class='doccomment'>/// The first character specified in the range.</span>
+ <span class='ident'>start</span>: <span class='ident'>char</span>,
+ <span class='doccomment'>/// The second character specified in the range.</span>
+ <span class='ident'>end</span>: <span class='ident'>char</span>,
+ },
+ <span class='doccomment'>/// An escape sequence was used in a character class where it is not</span>
+ <span class='doccomment'>/// allowed. e.g., `[a-\pN]` or `[\A]`.</span>
+ <span class='ident'>InvalidClassEscape</span>(<span class='ident'>Expr</span>),
+ <span class='doccomment'>/// An invalid counted repetition min/max was given. e.g., `a{2,1}`.</span>
+ <span class='ident'>InvalidRepeatRange</span> {
+ <span class='doccomment'>/// The first number specified in the repetition.</span>
+ <span class='ident'>min</span>: <span class='ident'>u32</span>,
+ <span class='doccomment'>/// The second number specified in the repetition.</span>
+ <span class='ident'>max</span>: <span class='ident'>u32</span>,
+ },
+ <span class='doccomment'>/// An invalid Unicode scalar value was used in a long hexadecimal</span>
+ <span class='doccomment'>/// sequence. e.g., `\x{D800}`.</span>
+ <span class='ident'>InvalidScalarValue</span>(<span class='ident'>u32</span>),
+ <span class='doccomment'>/// An empty counted repetition operator. e.g., `a{}`.</span>
+ <span class='ident'>MissingBase10</span>,
+ <span class='doccomment'>/// A repetition operator was not applied to an expression. e.g., `*`.</span>
+ <span class='ident'>RepeaterExpectsExpr</span>,
+ <span class='doccomment'>/// A repetition operator was applied to an expression that cannot be</span>
+ <span class='doccomment'>/// repeated. e.g., `a+*` or `a|*`.</span>
+ <span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>Expr</span>),
+ <span class='doccomment'>/// A capture group name that is never closed. e.g., `(?P&lt;a`.</span>
+ <span class='ident'>UnclosedCaptureName</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// An unclosed hexadecimal literal. e.g., `\x{a`.</span>
+ <span class='ident'>UnclosedHex</span>,
+ <span class='doccomment'>/// An unclosed parenthesis. e.g., `(a`.</span>
+ <span class='ident'>UnclosedParen</span>,
+ <span class='doccomment'>/// An unclosed counted repetition operator. e.g., `a{2`.</span>
+ <span class='ident'>UnclosedRepeat</span>,
+ <span class='doccomment'>/// An unclosed named Unicode class. e.g., `\p{Yi`.</span>
+ <span class='ident'>UnclosedUnicodeName</span>,
+ <span class='doccomment'>/// Saw end of regex before class was closed. e.g., `[a`.</span>
+ <span class='ident'>UnexpectedClassEof</span>,
+ <span class='doccomment'>/// Saw end of regex before escape sequence was closed. e.g., `\`.</span>
+ <span class='ident'>UnexpectedEscapeEof</span>,
+ <span class='doccomment'>/// Saw end of regex before flags were closed. e.g., `(?i`.</span>
+ <span class='ident'>UnexpectedFlagEof</span>,
+ <span class='doccomment'>/// Saw end of regex before two hexadecimal digits were seen. e.g., `\xA`.</span>
+ <span class='ident'>UnexpectedTwoDigitHexEof</span>,
+ <span class='doccomment'>/// Unopened parenthesis. e.g., `)`.</span>
+ <span class='ident'>UnopenedParen</span>,
+ <span class='doccomment'>/// Unrecognized escape sequence. e.g., `\q`.</span>
+ <span class='ident'>UnrecognizedEscape</span>(<span class='ident'>char</span>),
+ <span class='doccomment'>/// Unrecognized flag. e.g., `(?a)`.</span>
+ <span class='ident'>UnrecognizedFlag</span>(<span class='ident'>char</span>),
+ <span class='doccomment'>/// Unrecognized named Unicode class. e.g., `\p{Foo}`.</span>
+ <span class='ident'>UnrecognizedUnicodeClass</span>(<span class='ident'>String</span>),
+ <span class='doccomment'>/// Hints that destructuring should not be exhaustive.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// This enum may grow additional variants, so this makes sure clients</span>
+ <span class='doccomment'>/// don&#39;t count on exhaustive matching. (Otherwise, adding a new variant</span>
+ <span class='doccomment'>/// could break existing code.)</span>
+ <span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+ <span class='ident'>__Nonexhaustive</span>,
+}
+
+<span class='kw'>impl</span> <span class='ident'>Error</span> {
+ <span class='doccomment'>/// Returns an approximate *character* offset at which the error occurred.</span>
+ <span class='doccomment'>///</span>
+ <span class='doccomment'>/// The character offset may be equal to the number of characters in the</span>
+ <span class='doccomment'>/// string, in which case it should be interpreted as pointing to the end</span>
+ <span class='doccomment'>/// of the regex.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>position</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>pos</span>
+ }
+
+ <span class='doccomment'>/// Returns the type of the regex parse error.</span>
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>kind</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>ErrorKind</span> {
+ <span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>kind</span>
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>ErrorKind</span> {
+ <span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='kw'>use</span> <span class='ident'>ErrorKind</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>DoubleFlagNegation</span> <span class='op'>=&gt;</span> <span class='string'>&quot;double flag negation&quot;</span>,
+ <span class='ident'>DuplicateCaptureName</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;duplicate capture name&quot;</span>,
+ <span class='ident'>EmptyAlternate</span> <span class='op'>=&gt;</span> <span class='string'>&quot;empty alternate&quot;</span>,
+ <span class='ident'>EmptyCaptureName</span> <span class='op'>=&gt;</span> <span class='string'>&quot;empty capture name&quot;</span>,
+ <span class='ident'>EmptyFlagNegation</span> <span class='op'>=&gt;</span> <span class='string'>&quot;flag negation without any flags&quot;</span>,
+ <span class='ident'>EmptyGroup</span> <span class='op'>=&gt;</span> <span class='string'>&quot;empty group (e.g., &#39;()&#39;)&quot;</span>,
+ <span class='ident'>InvalidBase10</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;invalid base 10 number&quot;</span>,
+ <span class='ident'>InvalidBase16</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;invalid base 16 number&quot;</span>,
+ <span class='ident'>InvalidCaptureName</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;invalid capture name&quot;</span>,
+ <span class='ident'>InvalidClassRange</span>{..} <span class='op'>=&gt;</span> <span class='string'>&quot;invalid character class range&quot;</span>,
+ <span class='ident'>InvalidClassEscape</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;invalid escape sequence in class&quot;</span>,
+ <span class='ident'>InvalidRepeatRange</span>{..} <span class='op'>=&gt;</span> <span class='string'>&quot;invalid counted repetition range&quot;</span>,
+ <span class='ident'>InvalidScalarValue</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;invalid Unicode scalar value&quot;</span>,
+ <span class='ident'>MissingBase10</span> <span class='op'>=&gt;</span> <span class='string'>&quot;missing count in repetition operator&quot;</span>,
+ <span class='ident'>RepeaterExpectsExpr</span> <span class='op'>=&gt;</span> <span class='string'>&quot;repetition operator missing expression&quot;</span>,
+ <span class='ident'>RepeaterUnexpectedExpr</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;expression cannot be repeated&quot;</span>,
+ <span class='ident'>UnclosedCaptureName</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;unclosed capture group name&quot;</span>,
+ <span class='ident'>UnclosedHex</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unclosed hexadecimal literal&quot;</span>,
+ <span class='ident'>UnclosedParen</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unclosed parenthesis&quot;</span>,
+ <span class='ident'>UnclosedRepeat</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unclosed counted repetition operator&quot;</span>,
+ <span class='ident'>UnclosedUnicodeName</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unclosed Unicode class literal&quot;</span>,
+ <span class='ident'>UnexpectedClassEof</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unexpected EOF in character class&quot;</span>,
+ <span class='ident'>UnexpectedEscapeEof</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unexpected EOF in escape sequence&quot;</span>,
+ <span class='ident'>UnexpectedFlagEof</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unexpected EOF in flags&quot;</span>,
+ <span class='ident'>UnexpectedTwoDigitHexEof</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unexpected EOF in hex literal&quot;</span>,
+ <span class='ident'>UnopenedParen</span> <span class='op'>=&gt;</span> <span class='string'>&quot;unopened parenthesis&quot;</span>,
+ <span class='ident'>UnrecognizedEscape</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;unrecognized escape sequence&quot;</span>,
+ <span class='ident'>UnrecognizedFlag</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;unrecognized flag&quot;</span>,
+ <span class='ident'>UnrecognizedUnicodeClass</span>(_) <span class='op'>=&gt;</span> <span class='string'>&quot;unrecognized Unicode class name&quot;</span>,
+ <span class='ident'>__Nonexhaustive</span> <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ }
+ }
+}
+
+<span class='kw'>impl</span> ::<span class='ident'>std</span>::<span class='ident'>error</span>::<span class='ident'>Error</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
+ <span class='kw'>fn</span> <span class='ident'>description</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>str</span> {
+ <span class='self'>self</span>.<span class='ident'>kind</span>.<span class='ident'>description</span>()
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>Error</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Error parsing regex near &#39;{}&#39; at character offset {}: {}&quot;</span>,
+ <span class='self'>self</span>.<span class='ident'>surround</span>, <span class='self'>self</span>.<span class='ident'>pos</span>, <span class='self'>self</span>.<span class='ident'>kind</span>)
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>fmt</span>::<span class='ident'>Display</span> <span class='kw'>for</span> <span class='ident'>ErrorKind</span> {
+ <span class='kw'>fn</span> <span class='ident'>fmt</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>f</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>fmt</span>::<span class='ident'>Formatter</span>) <span class='op'>-&gt;</span> <span class='ident'>fmt</span>::<span class='prelude-ty'>Result</span> {
+ <span class='kw'>use</span> <span class='ident'>ErrorKind</span>::<span class='op'>*</span>;
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>DoubleFlagNegation</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Only one negation symbol is allowed in flags.&quot;</span>),
+ <span class='ident'>DuplicateCaptureName</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Capture name &#39;{}&#39; is used more than once.&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>EmptyAlternate</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Alternations cannot be empty.&quot;</span>),
+ <span class='ident'>EmptyCaptureName</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Capture names cannot be empty.&quot;</span>),
+ <span class='ident'>EmptyFlagNegation</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Flag negation requires setting at least one flag.&quot;</span>),
+ <span class='ident'>EmptyGroup</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Empty regex groups (e.g., &#39;()&#39;) are not allowed.&quot;</span>),
+ <span class='ident'>InvalidBase10</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Not a valid base 10 number: &#39;{}&#39;&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>InvalidBase16</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Not a valid base 16 number: &#39;{}&#39;&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>InvalidCaptureName</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Invalid capture name: &#39;{}&#39;. Capture names must \
+ consist of [_a-zA-Z0-9] and are not allowed to \
+ start with with a number.&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>InvalidClassRange</span> { <span class='ident'>start</span>, <span class='ident'>end</span> } <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Invalid character class range &#39;{}-{}&#39;. \
+ Character class ranges must start with the smaller \
+ character, but {} &gt; {}&quot;</span>, <span class='ident'>start</span>, <span class='ident'>end</span>, <span class='ident'>start</span>, <span class='ident'>end</span>),
+ <span class='ident'>InvalidClassEscape</span>(<span class='kw-2'>ref</span> <span class='ident'>e</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Invalid escape sequence in character \
+ class: &#39;{}&#39;.&quot;</span>, <span class='ident'>e</span>),
+ <span class='ident'>InvalidRepeatRange</span> { <span class='ident'>min</span>, <span class='ident'>max</span> } <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Invalid counted repetition range: {{{}, {}}}. \
+ Counted repetition ranges must start with the \
+ minimum, but {} &gt; {}&quot;</span>, <span class='ident'>min</span>, <span class='ident'>max</span>, <span class='ident'>min</span>, <span class='ident'>max</span>),
+ <span class='ident'>InvalidScalarValue</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Number does not correspond to a Unicode scalar \
+ value: &#39;{}&#39;.&quot;</span>, <span class='ident'>c</span>),
+ <span class='ident'>MissingBase10</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Missing maximum in counted reptition operator.&quot;</span>),
+ <span class='ident'>RepeaterExpectsExpr</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Missing expression for reptition operator.&quot;</span>),
+ <span class='ident'>RepeaterUnexpectedExpr</span>(<span class='kw-2'>ref</span> <span class='ident'>e</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Invalid application of reptition operator to: \
+ &#39;{}&#39;.&quot;</span>, <span class='ident'>e</span>),
+ <span class='ident'>UnclosedCaptureName</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Capture name group for &#39;{}&#39; is not closed. \
+ (Missing a &#39;&gt;&#39;.)&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>UnclosedHex</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unclosed hexadecimal literal (missing a &#39;}}&#39;).&quot;</span>),
+ <span class='ident'>UnclosedParen</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unclosed parenthesis.&quot;</span>),
+ <span class='ident'>UnclosedRepeat</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unclosed counted repetition (missing a &#39;}}&#39;).&quot;</span>),
+ <span class='ident'>UnclosedUnicodeName</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unclosed Unicode literal (missing a &#39;}}&#39;).&quot;</span>),
+ <span class='ident'>UnexpectedClassEof</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Character class was not closed before the end of \
+ the regex (missing a &#39;]&#39;).&quot;</span>),
+ <span class='ident'>UnexpectedEscapeEof</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Started an escape sequence that didn&#39;t finish \
+ before the end of the regex.&quot;</span>),
+ <span class='ident'>UnexpectedFlagEof</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Inline flag settings was not closed before the end \
+ of the regex (missing a &#39;)&#39; or &#39;:&#39;).&quot;</span>),
+ <span class='ident'>UnexpectedTwoDigitHexEof</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unexpected end of two digit hexadecimal literal.&quot;</span>),
+ <span class='ident'>UnopenedParen</span> <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unopened parenthesis.&quot;</span>),
+ <span class='ident'>UnrecognizedEscape</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unrecognized escape sequence: &#39;\\{}&#39;.&quot;</span>, <span class='ident'>c</span>),
+ <span class='ident'>UnrecognizedFlag</span>(<span class='ident'>c</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unrecognized flag: &#39;{}&#39;. \
+ (Allowed flags: i, s, m, U, x.)&quot;</span>, <span class='ident'>c</span>),
+ <span class='ident'>UnrecognizedUnicodeClass</span>(<span class='kw-2'>ref</span> <span class='ident'>s</span>) <span class='op'>=&gt;</span>
+ <span class='macro'>write</span><span class='macro'>!</span>(<span class='ident'>f</span>, <span class='string'>&quot;Unrecognized Unicode class name: &#39;{}&#39;.&quot;</span>, <span class='ident'>s</span>),
+ <span class='ident'>__Nonexhaustive</span> <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ }
+ }
+}
+
+<span class='doccomment'>/// Returns the Unicode *simple* case folding of `c`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// N.B. This is hidden because it really isn&#39;t the responsibility of this</span>
+<span class='doccomment'>/// crate to do simple case folding. One hopes that either another crate or</span>
+<span class='doccomment'>/// the standard library will be able to do this for us. In any case, we still</span>
+<span class='doccomment'>/// expose it because it is used inside the various Regex engines.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>simple_case_fold</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> {
+ <span class='ident'>simple_case_fold_result</span>(<span class='ident'>c</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>i</span><span class='op'>|</span> <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>[<span class='ident'>i</span>].<span class='number'>1</span>)
+ .<span class='ident'>unwrap_or</span>(<span class='ident'>c</span>)
+}
+
+<span class='doccomment'>/// The result of binary search on the simple case folding table.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// This level of detail is exposed so that we can do case folding on a</span>
+<span class='doccomment'>/// range of characters efficiently.</span>
+<span class='kw'>fn</span> <span class='ident'>simple_case_fold_result</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> ::<span class='ident'>std</span>::<span class='ident'>result</span>::<span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>usize</span>, <span class='ident'>usize</span><span class='op'>&gt;</span> {
+ <span class='ident'>case_folding</span>::<span class='ident'>C_plus_S_table</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>x</span>, _)<span class='op'>|</span> <span class='ident'>x</span>.<span class='ident'>cmp</span>(<span class='kw-2'>&amp;</span><span class='ident'>c</span>))
+}
+
+<span class='doccomment'>/// Escapes all regular expression meta characters in `text`.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// The string returned may be safely used as a literal in a regular</span>
+<span class='doccomment'>/// expression.</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>quote</span>(<span class='ident'>text</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>quoted</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>with_capacity</span>(<span class='ident'>text</span>.<span class='ident'>len</span>());
+ <span class='kw'>for</span> <span class='ident'>c</span> <span class='kw'>in</span> <span class='ident'>text</span>.<span class='ident'>chars</span>() {
+ <span class='kw'>if</span> <span class='ident'>parser</span>::<span class='ident'>is_punct</span>(<span class='ident'>c</span>) {
+ <span class='ident'>quoted</span>.<span class='ident'>push</span>(<span class='string'>&#39;\\&#39;</span>);
+ }
+ <span class='ident'>quoted</span>.<span class='ident'>push</span>(<span class='ident'>c</span>);
+ }
+ <span class='ident'>quoted</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>quote_char</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>new</span>();
+ <span class='kw'>if</span> <span class='ident'>parser</span>::<span class='ident'>is_punct</span>(<span class='ident'>c</span>) {
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='string'>&#39;\\&#39;</span>);
+ }
+ <span class='ident'>s</span>.<span class='ident'>push</span>(<span class='ident'>c</span>);
+ <span class='ident'>s</span>
+}
+
+<span class='kw'>fn</span> <span class='ident'>inc_char</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> {
+ <span class='kw'>match</span> <span class='ident'>c</span> {
+ <span class='ident'>char</span>::<span class='ident'>MAX</span> <span class='op'>=&gt;</span> <span class='ident'>char</span>::<span class='ident'>MAX</span>,
+ <span class='string'>&#39;\u{D7FF}&#39;</span> <span class='op'>=&gt;</span> <span class='string'>&#39;\u{E000}&#39;</span>,
+ <span class='ident'>c</span> <span class='op'>=&gt;</span> <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u32</span> <span class='op'>+</span> <span class='number'>1</span>).<span class='ident'>unwrap</span>(),
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>dec_char</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> {
+ <span class='kw'>match</span> <span class='ident'>c</span> {
+ <span class='string'>&#39;\x00&#39;</span> <span class='op'>=&gt;</span> <span class='string'>&#39;\x00&#39;</span>,
+ <span class='string'>&#39;\u{E000}&#39;</span> <span class='op'>=&gt;</span> <span class='string'>&#39;\u{D7FF}&#39;</span>,
+ <span class='ident'>c</span> <span class='op'>=&gt;</span> <span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>c</span> <span class='kw'>as</span> <span class='ident'>u32</span> <span class='op'>-</span> <span class='number'>1</span>).<span class='ident'>unwrap</span>(),
+ }
+}
+
+<span class='doccomment'>/// Returns true if and only if `c` is a word character.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_word_char</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='ident'>c</span> {
+ <span class='string'>&#39;_&#39;</span> <span class='op'>|</span> <span class='string'>&#39;0&#39;</span> ... <span class='string'>&#39;9&#39;</span> <span class='op'>|</span> <span class='string'>&#39;a&#39;</span> ... <span class='string'>&#39;z&#39;</span> <span class='op'>|</span> <span class='string'>&#39;A&#39;</span> ... <span class='string'>&#39;Z&#39;</span> <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> ::<span class='ident'>unicode</span>::<span class='ident'>regex</span>::<span class='ident'>PERLW</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>start</span>, <span class='ident'>end</span>)<span class='op'>|</span> {
+ <span class='kw'>if</span> <span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='ident'>start</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='ident'>end</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Equal</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>start</span> <span class='op'>&gt;</span> <span class='ident'>c</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Greater</span>
+ } <span class='kw'>else</span> {
+ <span class='ident'>Ordering</span>::<span class='ident'>Less</span>
+ }
+ }).<span class='ident'>is_ok</span>(),
+ }
+}
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>properties</span>;
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> {<span class='ident'>CharClass</span>, <span class='ident'>ClassRange</span>};
+
+ <span class='kw'>fn</span> <span class='ident'>class</span>(<span class='ident'>ranges</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='ident'>ranges</span> <span class='op'>=</span> <span class='ident'>ranges</span>.<span class='ident'>iter</span>().<span class='ident'>cloned</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span>(<span class='ident'>c1</span>, <span class='ident'>c2</span>)<span class='op'>|</span> <span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>c1</span>, <span class='ident'>c2</span>)).<span class='ident'>collect</span>();
+ <span class='ident'>CharClass</span>::<span class='ident'>new</span>(<span class='ident'>ranges</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>classi</span>(<span class='ident'>ranges</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='ident'>ranges</span>);
+ <span class='ident'>cls</span>.<span class='ident'>casei</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='ident'>cls</span>
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_no_change</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>), (<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>clone</span>().<span class='ident'>canonicalize</span>(), <span class='ident'>cls</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_unordered</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>), (<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_overlap</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>), (<span class='string'>&#39;w&#39;</span>, <span class='string'>&#39;y&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;w&#39;</span>, <span class='string'>&#39;z&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_overlap_many</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;c&#39;</span>, <span class='string'>&#39;f&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;g&#39;</span>), (<span class='string'>&#39;d&#39;</span>, <span class='string'>&#39;j&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>),
+ (<span class='string'>&#39;m&#39;</span>, <span class='string'>&#39;p&#39;</span>), (<span class='string'>&#39;l&#39;</span>, <span class='string'>&#39;s&#39;</span>),
+ ]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>clone</span>().<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;j&#39;</span>), (<span class='string'>&#39;l&#39;</span>, <span class='string'>&#39;s&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_overlap_many_case_fold</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;C&#39;</span>, <span class='string'>&#39;F&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;G&#39;</span>), (<span class='string'>&#39;D&#39;</span>, <span class='string'>&#39;J&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;C&#39;</span>),
+ (<span class='string'>&#39;M&#39;</span>, <span class='string'>&#39;P&#39;</span>), (<span class='string'>&#39;L&#39;</span>, <span class='string'>&#39;S&#39;</span>), (<span class='string'>&#39;c&#39;</span>, <span class='string'>&#39;f&#39;</span>),
+ ]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;j&#39;</span>), (<span class='string'>&#39;l&#39;</span>, <span class='string'>&#39;s&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_overlap_boundary</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>), (<span class='string'>&#39;u&#39;</span>, <span class='string'>&#39;w&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;u&#39;</span>, <span class='string'>&#39;z&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_extreme_edge_case</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>), (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_canon_singles</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>), (<span class='string'>&#39;b&#39;</span>, <span class='string'>&#39;b&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;b&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_single</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x60&#39;</span>), (<span class='string'>&#39;\x62&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_singles</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>), (<span class='string'>&#39;b&#39;</span>, <span class='string'>&#39;b&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x60&#39;</span>), (<span class='string'>&#39;\x63&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_multiples</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>), (<span class='string'>&#39;x&#39;</span>, <span class='string'>&#39;z&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x60&#39;</span>), (<span class='string'>&#39;\x64&#39;</span>, <span class='string'>&#39;\x77&#39;</span>), (<span class='string'>&#39;\x7b&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_min_scalar</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;a&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x62&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_max_scalar</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x60&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_everything</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_everything_sans_one</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{10FFFD}&#39;</span>), (<span class='string'>&#39;\u{10FFFF}&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)
+ ]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{10FFFE}&#39;</span>, <span class='string'>&#39;\u{10FFFE}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_surrogates_min</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{D7FF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{E000}&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_surrogates_min_edge</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{D7FE}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{D7FF}&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_surrogates_max</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\u{E000}&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{D7FF}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_negate_surrogates_max_edge</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\u{E001}&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\u{E000}&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_fold_retain_only_needed</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_fold_az</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_fold_a_underscore</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;A&#39;</span>), (<span class='string'>&#39;_&#39;</span>, <span class='string'>&#39;_&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>clone</span>().<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;A&#39;</span>), (<span class='string'>&#39;_&#39;</span>, <span class='string'>&#39;_&#39;</span>),
+ ]));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;_&#39;</span>, <span class='string'>&#39;_&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_fold_a_equals</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;A&#39;</span>), (<span class='string'>&#39;=&#39;</span>, <span class='string'>&#39;=&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>clone</span>().<span class='ident'>canonicalize</span>(), <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;=&#39;</span>, <span class='string'>&#39;=&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;A&#39;</span>),
+ ]));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;=&#39;</span>, <span class='string'>&#39;=&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_fold_no_folding_needed</span>() {
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x10&#39;</span>)]);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>cls</span>.<span class='ident'>case_fold</span>(), <span class='ident'>classi</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x10&#39;</span>),
+ ]));
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex_syntax";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file
diff --git a/src/regex_syntax/parser.rs.html b/src/regex_syntax/parser.rs.html
new file mode 100644
index 0000000..3f94959
--- /dev/null
+++ b/src/regex_syntax/parser.rs.html
@@ -0,0 +1,4751 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="generator" content="rustdoc">
+ <meta name="description" content="Source to the Rust file `/home/travis/.cargo/registry/src/github.com-0a35038f75765ae4/regex-syntax-0.1.2/src/parser.rs`.">
+ <meta name="keywords" content="rust, rustlang, rust-lang">
+
+ <title>parser.rs.html -- source</title>
+
+ <link rel="stylesheet" type="text/css" href="../../main.css">
+
+
+
+</head>
+<body class="rustdoc">
+ <!--[if lte IE 8]>
+ <div class="warning">
+ This old browser is unsupported and will most likely display funky
+ things.
+ </div>
+ <![endif]-->
+
+
+
+ <section class="sidebar">
+
+
+ </section>
+
+ <nav class="sub">
+ <form class="search-form js-only">
+ <div class="search-container">
+ <input class="search-input" name="search"
+ autocomplete="off"
+ placeholder="Click or press 'S' to search, '?' for more options..."
+ type="search">
+ </div>
+ </form>
+ </nav>
+
+ <section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
+<span id="2"> 2</span>
+<span id="3"> 3</span>
+<span id="4"> 4</span>
+<span id="5"> 5</span>
+<span id="6"> 6</span>
+<span id="7"> 7</span>
+<span id="8"> 8</span>
+<span id="9"> 9</span>
+<span id="10"> 10</span>
+<span id="11"> 11</span>
+<span id="12"> 12</span>
+<span id="13"> 13</span>
+<span id="14"> 14</span>
+<span id="15"> 15</span>
+<span id="16"> 16</span>
+<span id="17"> 17</span>
+<span id="18"> 18</span>
+<span id="19"> 19</span>
+<span id="20"> 20</span>
+<span id="21"> 21</span>
+<span id="22"> 22</span>
+<span id="23"> 23</span>
+<span id="24"> 24</span>
+<span id="25"> 25</span>
+<span id="26"> 26</span>
+<span id="27"> 27</span>
+<span id="28"> 28</span>
+<span id="29"> 29</span>
+<span id="30"> 30</span>
+<span id="31"> 31</span>
+<span id="32"> 32</span>
+<span id="33"> 33</span>
+<span id="34"> 34</span>
+<span id="35"> 35</span>
+<span id="36"> 36</span>
+<span id="37"> 37</span>
+<span id="38"> 38</span>
+<span id="39"> 39</span>
+<span id="40"> 40</span>
+<span id="41"> 41</span>
+<span id="42"> 42</span>
+<span id="43"> 43</span>
+<span id="44"> 44</span>
+<span id="45"> 45</span>
+<span id="46"> 46</span>
+<span id="47"> 47</span>
+<span id="48"> 48</span>
+<span id="49"> 49</span>
+<span id="50"> 50</span>
+<span id="51"> 51</span>
+<span id="52"> 52</span>
+<span id="53"> 53</span>
+<span id="54"> 54</span>
+<span id="55"> 55</span>
+<span id="56"> 56</span>
+<span id="57"> 57</span>
+<span id="58"> 58</span>
+<span id="59"> 59</span>
+<span id="60"> 60</span>
+<span id="61"> 61</span>
+<span id="62"> 62</span>
+<span id="63"> 63</span>
+<span id="64"> 64</span>
+<span id="65"> 65</span>
+<span id="66"> 66</span>
+<span id="67"> 67</span>
+<span id="68"> 68</span>
+<span id="69"> 69</span>
+<span id="70"> 70</span>
+<span id="71"> 71</span>
+<span id="72"> 72</span>
+<span id="73"> 73</span>
+<span id="74"> 74</span>
+<span id="75"> 75</span>
+<span id="76"> 76</span>
+<span id="77"> 77</span>
+<span id="78"> 78</span>
+<span id="79"> 79</span>
+<span id="80"> 80</span>
+<span id="81"> 81</span>
+<span id="82"> 82</span>
+<span id="83"> 83</span>
+<span id="84"> 84</span>
+<span id="85"> 85</span>
+<span id="86"> 86</span>
+<span id="87"> 87</span>
+<span id="88"> 88</span>
+<span id="89"> 89</span>
+<span id="90"> 90</span>
+<span id="91"> 91</span>
+<span id="92"> 92</span>
+<span id="93"> 93</span>
+<span id="94"> 94</span>
+<span id="95"> 95</span>
+<span id="96"> 96</span>
+<span id="97"> 97</span>
+<span id="98"> 98</span>
+<span id="99"> 99</span>
+<span id="100"> 100</span>
+<span id="101"> 101</span>
+<span id="102"> 102</span>
+<span id="103"> 103</span>
+<span id="104"> 104</span>
+<span id="105"> 105</span>
+<span id="106"> 106</span>
+<span id="107"> 107</span>
+<span id="108"> 108</span>
+<span id="109"> 109</span>
+<span id="110"> 110</span>
+<span id="111"> 111</span>
+<span id="112"> 112</span>
+<span id="113"> 113</span>
+<span id="114"> 114</span>
+<span id="115"> 115</span>
+<span id="116"> 116</span>
+<span id="117"> 117</span>
+<span id="118"> 118</span>
+<span id="119"> 119</span>
+<span id="120"> 120</span>
+<span id="121"> 121</span>
+<span id="122"> 122</span>
+<span id="123"> 123</span>
+<span id="124"> 124</span>
+<span id="125"> 125</span>
+<span id="126"> 126</span>
+<span id="127"> 127</span>
+<span id="128"> 128</span>
+<span id="129"> 129</span>
+<span id="130"> 130</span>
+<span id="131"> 131</span>
+<span id="132"> 132</span>
+<span id="133"> 133</span>
+<span id="134"> 134</span>
+<span id="135"> 135</span>
+<span id="136"> 136</span>
+<span id="137"> 137</span>
+<span id="138"> 138</span>
+<span id="139"> 139</span>
+<span id="140"> 140</span>
+<span id="141"> 141</span>
+<span id="142"> 142</span>
+<span id="143"> 143</span>
+<span id="144"> 144</span>
+<span id="145"> 145</span>
+<span id="146"> 146</span>
+<span id="147"> 147</span>
+<span id="148"> 148</span>
+<span id="149"> 149</span>
+<span id="150"> 150</span>
+<span id="151"> 151</span>
+<span id="152"> 152</span>
+<span id="153"> 153</span>
+<span id="154"> 154</span>
+<span id="155"> 155</span>
+<span id="156"> 156</span>
+<span id="157"> 157</span>
+<span id="158"> 158</span>
+<span id="159"> 159</span>
+<span id="160"> 160</span>
+<span id="161"> 161</span>
+<span id="162"> 162</span>
+<span id="163"> 163</span>
+<span id="164"> 164</span>
+<span id="165"> 165</span>
+<span id="166"> 166</span>
+<span id="167"> 167</span>
+<span id="168"> 168</span>
+<span id="169"> 169</span>
+<span id="170"> 170</span>
+<span id="171"> 171</span>
+<span id="172"> 172</span>
+<span id="173"> 173</span>
+<span id="174"> 174</span>
+<span id="175"> 175</span>
+<span id="176"> 176</span>
+<span id="177"> 177</span>
+<span id="178"> 178</span>
+<span id="179"> 179</span>
+<span id="180"> 180</span>
+<span id="181"> 181</span>
+<span id="182"> 182</span>
+<span id="183"> 183</span>
+<span id="184"> 184</span>
+<span id="185"> 185</span>
+<span id="186"> 186</span>
+<span id="187"> 187</span>
+<span id="188"> 188</span>
+<span id="189"> 189</span>
+<span id="190"> 190</span>
+<span id="191"> 191</span>
+<span id="192"> 192</span>
+<span id="193"> 193</span>
+<span id="194"> 194</span>
+<span id="195"> 195</span>
+<span id="196"> 196</span>
+<span id="197"> 197</span>
+<span id="198"> 198</span>
+<span id="199"> 199</span>
+<span id="200"> 200</span>
+<span id="201"> 201</span>
+<span id="202"> 202</span>
+<span id="203"> 203</span>
+<span id="204"> 204</span>
+<span id="205"> 205</span>
+<span id="206"> 206</span>
+<span id="207"> 207</span>
+<span id="208"> 208</span>
+<span id="209"> 209</span>
+<span id="210"> 210</span>
+<span id="211"> 211</span>
+<span id="212"> 212</span>
+<span id="213"> 213</span>
+<span id="214"> 214</span>
+<span id="215"> 215</span>
+<span id="216"> 216</span>
+<span id="217"> 217</span>
+<span id="218"> 218</span>
+<span id="219"> 219</span>
+<span id="220"> 220</span>
+<span id="221"> 221</span>
+<span id="222"> 222</span>
+<span id="223"> 223</span>
+<span id="224"> 224</span>
+<span id="225"> 225</span>
+<span id="226"> 226</span>
+<span id="227"> 227</span>
+<span id="228"> 228</span>
+<span id="229"> 229</span>
+<span id="230"> 230</span>
+<span id="231"> 231</span>
+<span id="232"> 232</span>
+<span id="233"> 233</span>
+<span id="234"> 234</span>
+<span id="235"> 235</span>
+<span id="236"> 236</span>
+<span id="237"> 237</span>
+<span id="238"> 238</span>
+<span id="239"> 239</span>
+<span id="240"> 240</span>
+<span id="241"> 241</span>
+<span id="242"> 242</span>
+<span id="243"> 243</span>
+<span id="244"> 244</span>
+<span id="245"> 245</span>
+<span id="246"> 246</span>
+<span id="247"> 247</span>
+<span id="248"> 248</span>
+<span id="249"> 249</span>
+<span id="250"> 250</span>
+<span id="251"> 251</span>
+<span id="252"> 252</span>
+<span id="253"> 253</span>
+<span id="254"> 254</span>
+<span id="255"> 255</span>
+<span id="256"> 256</span>
+<span id="257"> 257</span>
+<span id="258"> 258</span>
+<span id="259"> 259</span>
+<span id="260"> 260</span>
+<span id="261"> 261</span>
+<span id="262"> 262</span>
+<span id="263"> 263</span>
+<span id="264"> 264</span>
+<span id="265"> 265</span>
+<span id="266"> 266</span>
+<span id="267"> 267</span>
+<span id="268"> 268</span>
+<span id="269"> 269</span>
+<span id="270"> 270</span>
+<span id="271"> 271</span>
+<span id="272"> 272</span>
+<span id="273"> 273</span>
+<span id="274"> 274</span>
+<span id="275"> 275</span>
+<span id="276"> 276</span>
+<span id="277"> 277</span>
+<span id="278"> 278</span>
+<span id="279"> 279</span>
+<span id="280"> 280</span>
+<span id="281"> 281</span>
+<span id="282"> 282</span>
+<span id="283"> 283</span>
+<span id="284"> 284</span>
+<span id="285"> 285</span>
+<span id="286"> 286</span>
+<span id="287"> 287</span>
+<span id="288"> 288</span>
+<span id="289"> 289</span>
+<span id="290"> 290</span>
+<span id="291"> 291</span>
+<span id="292"> 292</span>
+<span id="293"> 293</span>
+<span id="294"> 294</span>
+<span id="295"> 295</span>
+<span id="296"> 296</span>
+<span id="297"> 297</span>
+<span id="298"> 298</span>
+<span id="299"> 299</span>
+<span id="300"> 300</span>
+<span id="301"> 301</span>
+<span id="302"> 302</span>
+<span id="303"> 303</span>
+<span id="304"> 304</span>
+<span id="305"> 305</span>
+<span id="306"> 306</span>
+<span id="307"> 307</span>
+<span id="308"> 308</span>
+<span id="309"> 309</span>
+<span id="310"> 310</span>
+<span id="311"> 311</span>
+<span id="312"> 312</span>
+<span id="313"> 313</span>
+<span id="314"> 314</span>
+<span id="315"> 315</span>
+<span id="316"> 316</span>
+<span id="317"> 317</span>
+<span id="318"> 318</span>
+<span id="319"> 319</span>
+<span id="320"> 320</span>
+<span id="321"> 321</span>
+<span id="322"> 322</span>
+<span id="323"> 323</span>
+<span id="324"> 324</span>
+<span id="325"> 325</span>
+<span id="326"> 326</span>
+<span id="327"> 327</span>
+<span id="328"> 328</span>
+<span id="329"> 329</span>
+<span id="330"> 330</span>
+<span id="331"> 331</span>
+<span id="332"> 332</span>
+<span id="333"> 333</span>
+<span id="334"> 334</span>
+<span id="335"> 335</span>
+<span id="336"> 336</span>
+<span id="337"> 337</span>
+<span id="338"> 338</span>
+<span id="339"> 339</span>
+<span id="340"> 340</span>
+<span id="341"> 341</span>
+<span id="342"> 342</span>
+<span id="343"> 343</span>
+<span id="344"> 344</span>
+<span id="345"> 345</span>
+<span id="346"> 346</span>
+<span id="347"> 347</span>
+<span id="348"> 348</span>
+<span id="349"> 349</span>
+<span id="350"> 350</span>
+<span id="351"> 351</span>
+<span id="352"> 352</span>
+<span id="353"> 353</span>
+<span id="354"> 354</span>
+<span id="355"> 355</span>
+<span id="356"> 356</span>
+<span id="357"> 357</span>
+<span id="358"> 358</span>
+<span id="359"> 359</span>
+<span id="360"> 360</span>
+<span id="361"> 361</span>
+<span id="362"> 362</span>
+<span id="363"> 363</span>
+<span id="364"> 364</span>
+<span id="365"> 365</span>
+<span id="366"> 366</span>
+<span id="367"> 367</span>
+<span id="368"> 368</span>
+<span id="369"> 369</span>
+<span id="370"> 370</span>
+<span id="371"> 371</span>
+<span id="372"> 372</span>
+<span id="373"> 373</span>
+<span id="374"> 374</span>
+<span id="375"> 375</span>
+<span id="376"> 376</span>
+<span id="377"> 377</span>
+<span id="378"> 378</span>
+<span id="379"> 379</span>
+<span id="380"> 380</span>
+<span id="381"> 381</span>
+<span id="382"> 382</span>
+<span id="383"> 383</span>
+<span id="384"> 384</span>
+<span id="385"> 385</span>
+<span id="386"> 386</span>
+<span id="387"> 387</span>
+<span id="388"> 388</span>
+<span id="389"> 389</span>
+<span id="390"> 390</span>
+<span id="391"> 391</span>
+<span id="392"> 392</span>
+<span id="393"> 393</span>
+<span id="394"> 394</span>
+<span id="395"> 395</span>
+<span id="396"> 396</span>
+<span id="397"> 397</span>
+<span id="398"> 398</span>
+<span id="399"> 399</span>
+<span id="400"> 400</span>
+<span id="401"> 401</span>
+<span id="402"> 402</span>
+<span id="403"> 403</span>
+<span id="404"> 404</span>
+<span id="405"> 405</span>
+<span id="406"> 406</span>
+<span id="407"> 407</span>
+<span id="408"> 408</span>
+<span id="409"> 409</span>
+<span id="410"> 410</span>
+<span id="411"> 411</span>
+<span id="412"> 412</span>
+<span id="413"> 413</span>
+<span id="414"> 414</span>
+<span id="415"> 415</span>
+<span id="416"> 416</span>
+<span id="417"> 417</span>
+<span id="418"> 418</span>
+<span id="419"> 419</span>
+<span id="420"> 420</span>
+<span id="421"> 421</span>
+<span id="422"> 422</span>
+<span id="423"> 423</span>
+<span id="424"> 424</span>
+<span id="425"> 425</span>
+<span id="426"> 426</span>
+<span id="427"> 427</span>
+<span id="428"> 428</span>
+<span id="429"> 429</span>
+<span id="430"> 430</span>
+<span id="431"> 431</span>
+<span id="432"> 432</span>
+<span id="433"> 433</span>
+<span id="434"> 434</span>
+<span id="435"> 435</span>
+<span id="436"> 436</span>
+<span id="437"> 437</span>
+<span id="438"> 438</span>
+<span id="439"> 439</span>
+<span id="440"> 440</span>
+<span id="441"> 441</span>
+<span id="442"> 442</span>
+<span id="443"> 443</span>
+<span id="444"> 444</span>
+<span id="445"> 445</span>
+<span id="446"> 446</span>
+<span id="447"> 447</span>
+<span id="448"> 448</span>
+<span id="449"> 449</span>
+<span id="450"> 450</span>
+<span id="451"> 451</span>
+<span id="452"> 452</span>
+<span id="453"> 453</span>
+<span id="454"> 454</span>
+<span id="455"> 455</span>
+<span id="456"> 456</span>
+<span id="457"> 457</span>
+<span id="458"> 458</span>
+<span id="459"> 459</span>
+<span id="460"> 460</span>
+<span id="461"> 461</span>
+<span id="462"> 462</span>
+<span id="463"> 463</span>
+<span id="464"> 464</span>
+<span id="465"> 465</span>
+<span id="466"> 466</span>
+<span id="467"> 467</span>
+<span id="468"> 468</span>
+<span id="469"> 469</span>
+<span id="470"> 470</span>
+<span id="471"> 471</span>
+<span id="472"> 472</span>
+<span id="473"> 473</span>
+<span id="474"> 474</span>
+<span id="475"> 475</span>
+<span id="476"> 476</span>
+<span id="477"> 477</span>
+<span id="478"> 478</span>
+<span id="479"> 479</span>
+<span id="480"> 480</span>
+<span id="481"> 481</span>
+<span id="482"> 482</span>
+<span id="483"> 483</span>
+<span id="484"> 484</span>
+<span id="485"> 485</span>
+<span id="486"> 486</span>
+<span id="487"> 487</span>
+<span id="488"> 488</span>
+<span id="489"> 489</span>
+<span id="490"> 490</span>
+<span id="491"> 491</span>
+<span id="492"> 492</span>
+<span id="493"> 493</span>
+<span id="494"> 494</span>
+<span id="495"> 495</span>
+<span id="496"> 496</span>
+<span id="497"> 497</span>
+<span id="498"> 498</span>
+<span id="499"> 499</span>
+<span id="500"> 500</span>
+<span id="501"> 501</span>
+<span id="502"> 502</span>
+<span id="503"> 503</span>
+<span id="504"> 504</span>
+<span id="505"> 505</span>
+<span id="506"> 506</span>
+<span id="507"> 507</span>
+<span id="508"> 508</span>
+<span id="509"> 509</span>
+<span id="510"> 510</span>
+<span id="511"> 511</span>
+<span id="512"> 512</span>
+<span id="513"> 513</span>
+<span id="514"> 514</span>
+<span id="515"> 515</span>
+<span id="516"> 516</span>
+<span id="517"> 517</span>
+<span id="518"> 518</span>
+<span id="519"> 519</span>
+<span id="520"> 520</span>
+<span id="521"> 521</span>
+<span id="522"> 522</span>
+<span id="523"> 523</span>
+<span id="524"> 524</span>
+<span id="525"> 525</span>
+<span id="526"> 526</span>
+<span id="527"> 527</span>
+<span id="528"> 528</span>
+<span id="529"> 529</span>
+<span id="530"> 530</span>
+<span id="531"> 531</span>
+<span id="532"> 532</span>
+<span id="533"> 533</span>
+<span id="534"> 534</span>
+<span id="535"> 535</span>
+<span id="536"> 536</span>
+<span id="537"> 537</span>
+<span id="538"> 538</span>
+<span id="539"> 539</span>
+<span id="540"> 540</span>
+<span id="541"> 541</span>
+<span id="542"> 542</span>
+<span id="543"> 543</span>
+<span id="544"> 544</span>
+<span id="545"> 545</span>
+<span id="546"> 546</span>
+<span id="547"> 547</span>
+<span id="548"> 548</span>
+<span id="549"> 549</span>
+<span id="550"> 550</span>
+<span id="551"> 551</span>
+<span id="552"> 552</span>
+<span id="553"> 553</span>
+<span id="554"> 554</span>
+<span id="555"> 555</span>
+<span id="556"> 556</span>
+<span id="557"> 557</span>
+<span id="558"> 558</span>
+<span id="559"> 559</span>
+<span id="560"> 560</span>
+<span id="561"> 561</span>
+<span id="562"> 562</span>
+<span id="563"> 563</span>
+<span id="564"> 564</span>
+<span id="565"> 565</span>
+<span id="566"> 566</span>
+<span id="567"> 567</span>
+<span id="568"> 568</span>
+<span id="569"> 569</span>
+<span id="570"> 570</span>
+<span id="571"> 571</span>
+<span id="572"> 572</span>
+<span id="573"> 573</span>
+<span id="574"> 574</span>
+<span id="575"> 575</span>
+<span id="576"> 576</span>
+<span id="577"> 577</span>
+<span id="578"> 578</span>
+<span id="579"> 579</span>
+<span id="580"> 580</span>
+<span id="581"> 581</span>
+<span id="582"> 582</span>
+<span id="583"> 583</span>
+<span id="584"> 584</span>
+<span id="585"> 585</span>
+<span id="586"> 586</span>
+<span id="587"> 587</span>
+<span id="588"> 588</span>
+<span id="589"> 589</span>
+<span id="590"> 590</span>
+<span id="591"> 591</span>
+<span id="592"> 592</span>
+<span id="593"> 593</span>
+<span id="594"> 594</span>
+<span id="595"> 595</span>
+<span id="596"> 596</span>
+<span id="597"> 597</span>
+<span id="598"> 598</span>
+<span id="599"> 599</span>
+<span id="600"> 600</span>
+<span id="601"> 601</span>
+<span id="602"> 602</span>
+<span id="603"> 603</span>
+<span id="604"> 604</span>
+<span id="605"> 605</span>
+<span id="606"> 606</span>
+<span id="607"> 607</span>
+<span id="608"> 608</span>
+<span id="609"> 609</span>
+<span id="610"> 610</span>
+<span id="611"> 611</span>
+<span id="612"> 612</span>
+<span id="613"> 613</span>
+<span id="614"> 614</span>
+<span id="615"> 615</span>
+<span id="616"> 616</span>
+<span id="617"> 617</span>
+<span id="618"> 618</span>
+<span id="619"> 619</span>
+<span id="620"> 620</span>
+<span id="621"> 621</span>
+<span id="622"> 622</span>
+<span id="623"> 623</span>
+<span id="624"> 624</span>
+<span id="625"> 625</span>
+<span id="626"> 626</span>
+<span id="627"> 627</span>
+<span id="628"> 628</span>
+<span id="629"> 629</span>
+<span id="630"> 630</span>
+<span id="631"> 631</span>
+<span id="632"> 632</span>
+<span id="633"> 633</span>
+<span id="634"> 634</span>
+<span id="635"> 635</span>
+<span id="636"> 636</span>
+<span id="637"> 637</span>
+<span id="638"> 638</span>
+<span id="639"> 639</span>
+<span id="640"> 640</span>
+<span id="641"> 641</span>
+<span id="642"> 642</span>
+<span id="643"> 643</span>
+<span id="644"> 644</span>
+<span id="645"> 645</span>
+<span id="646"> 646</span>
+<span id="647"> 647</span>
+<span id="648"> 648</span>
+<span id="649"> 649</span>
+<span id="650"> 650</span>
+<span id="651"> 651</span>
+<span id="652"> 652</span>
+<span id="653"> 653</span>
+<span id="654"> 654</span>
+<span id="655"> 655</span>
+<span id="656"> 656</span>
+<span id="657"> 657</span>
+<span id="658"> 658</span>
+<span id="659"> 659</span>
+<span id="660"> 660</span>
+<span id="661"> 661</span>
+<span id="662"> 662</span>
+<span id="663"> 663</span>
+<span id="664"> 664</span>
+<span id="665"> 665</span>
+<span id="666"> 666</span>
+<span id="667"> 667</span>
+<span id="668"> 668</span>
+<span id="669"> 669</span>
+<span id="670"> 670</span>
+<span id="671"> 671</span>
+<span id="672"> 672</span>
+<span id="673"> 673</span>
+<span id="674"> 674</span>
+<span id="675"> 675</span>
+<span id="676"> 676</span>
+<span id="677"> 677</span>
+<span id="678"> 678</span>
+<span id="679"> 679</span>
+<span id="680"> 680</span>
+<span id="681"> 681</span>
+<span id="682"> 682</span>
+<span id="683"> 683</span>
+<span id="684"> 684</span>
+<span id="685"> 685</span>
+<span id="686"> 686</span>
+<span id="687"> 687</span>
+<span id="688"> 688</span>
+<span id="689"> 689</span>
+<span id="690"> 690</span>
+<span id="691"> 691</span>
+<span id="692"> 692</span>
+<span id="693"> 693</span>
+<span id="694"> 694</span>
+<span id="695"> 695</span>
+<span id="696"> 696</span>
+<span id="697"> 697</span>
+<span id="698"> 698</span>
+<span id="699"> 699</span>
+<span id="700"> 700</span>
+<span id="701"> 701</span>
+<span id="702"> 702</span>
+<span id="703"> 703</span>
+<span id="704"> 704</span>
+<span id="705"> 705</span>
+<span id="706"> 706</span>
+<span id="707"> 707</span>
+<span id="708"> 708</span>
+<span id="709"> 709</span>
+<span id="710"> 710</span>
+<span id="711"> 711</span>
+<span id="712"> 712</span>
+<span id="713"> 713</span>
+<span id="714"> 714</span>
+<span id="715"> 715</span>
+<span id="716"> 716</span>
+<span id="717"> 717</span>
+<span id="718"> 718</span>
+<span id="719"> 719</span>
+<span id="720"> 720</span>
+<span id="721"> 721</span>
+<span id="722"> 722</span>
+<span id="723"> 723</span>
+<span id="724"> 724</span>
+<span id="725"> 725</span>
+<span id="726"> 726</span>
+<span id="727"> 727</span>
+<span id="728"> 728</span>
+<span id="729"> 729</span>
+<span id="730"> 730</span>
+<span id="731"> 731</span>
+<span id="732"> 732</span>
+<span id="733"> 733</span>
+<span id="734"> 734</span>
+<span id="735"> 735</span>
+<span id="736"> 736</span>
+<span id="737"> 737</span>
+<span id="738"> 738</span>
+<span id="739"> 739</span>
+<span id="740"> 740</span>
+<span id="741"> 741</span>
+<span id="742"> 742</span>
+<span id="743"> 743</span>
+<span id="744"> 744</span>
+<span id="745"> 745</span>
+<span id="746"> 746</span>
+<span id="747"> 747</span>
+<span id="748"> 748</span>
+<span id="749"> 749</span>
+<span id="750"> 750</span>
+<span id="751"> 751</span>
+<span id="752"> 752</span>
+<span id="753"> 753</span>
+<span id="754"> 754</span>
+<span id="755"> 755</span>
+<span id="756"> 756</span>
+<span id="757"> 757</span>
+<span id="758"> 758</span>
+<span id="759"> 759</span>
+<span id="760"> 760</span>
+<span id="761"> 761</span>
+<span id="762"> 762</span>
+<span id="763"> 763</span>
+<span id="764"> 764</span>
+<span id="765"> 765</span>
+<span id="766"> 766</span>
+<span id="767"> 767</span>
+<span id="768"> 768</span>
+<span id="769"> 769</span>
+<span id="770"> 770</span>
+<span id="771"> 771</span>
+<span id="772"> 772</span>
+<span id="773"> 773</span>
+<span id="774"> 774</span>
+<span id="775"> 775</span>
+<span id="776"> 776</span>
+<span id="777"> 777</span>
+<span id="778"> 778</span>
+<span id="779"> 779</span>
+<span id="780"> 780</span>
+<span id="781"> 781</span>
+<span id="782"> 782</span>
+<span id="783"> 783</span>
+<span id="784"> 784</span>
+<span id="785"> 785</span>
+<span id="786"> 786</span>
+<span id="787"> 787</span>
+<span id="788"> 788</span>
+<span id="789"> 789</span>
+<span id="790"> 790</span>
+<span id="791"> 791</span>
+<span id="792"> 792</span>
+<span id="793"> 793</span>
+<span id="794"> 794</span>
+<span id="795"> 795</span>
+<span id="796"> 796</span>
+<span id="797"> 797</span>
+<span id="798"> 798</span>
+<span id="799"> 799</span>
+<span id="800"> 800</span>
+<span id="801"> 801</span>
+<span id="802"> 802</span>
+<span id="803"> 803</span>
+<span id="804"> 804</span>
+<span id="805"> 805</span>
+<span id="806"> 806</span>
+<span id="807"> 807</span>
+<span id="808"> 808</span>
+<span id="809"> 809</span>
+<span id="810"> 810</span>
+<span id="811"> 811</span>
+<span id="812"> 812</span>
+<span id="813"> 813</span>
+<span id="814"> 814</span>
+<span id="815"> 815</span>
+<span id="816"> 816</span>
+<span id="817"> 817</span>
+<span id="818"> 818</span>
+<span id="819"> 819</span>
+<span id="820"> 820</span>
+<span id="821"> 821</span>
+<span id="822"> 822</span>
+<span id="823"> 823</span>
+<span id="824"> 824</span>
+<span id="825"> 825</span>
+<span id="826"> 826</span>
+<span id="827"> 827</span>
+<span id="828"> 828</span>
+<span id="829"> 829</span>
+<span id="830"> 830</span>
+<span id="831"> 831</span>
+<span id="832"> 832</span>
+<span id="833"> 833</span>
+<span id="834"> 834</span>
+<span id="835"> 835</span>
+<span id="836"> 836</span>
+<span id="837"> 837</span>
+<span id="838"> 838</span>
+<span id="839"> 839</span>
+<span id="840"> 840</span>
+<span id="841"> 841</span>
+<span id="842"> 842</span>
+<span id="843"> 843</span>
+<span id="844"> 844</span>
+<span id="845"> 845</span>
+<span id="846"> 846</span>
+<span id="847"> 847</span>
+<span id="848"> 848</span>
+<span id="849"> 849</span>
+<span id="850"> 850</span>
+<span id="851"> 851</span>
+<span id="852"> 852</span>
+<span id="853"> 853</span>
+<span id="854"> 854</span>
+<span id="855"> 855</span>
+<span id="856"> 856</span>
+<span id="857"> 857</span>
+<span id="858"> 858</span>
+<span id="859"> 859</span>
+<span id="860"> 860</span>
+<span id="861"> 861</span>
+<span id="862"> 862</span>
+<span id="863"> 863</span>
+<span id="864"> 864</span>
+<span id="865"> 865</span>
+<span id="866"> 866</span>
+<span id="867"> 867</span>
+<span id="868"> 868</span>
+<span id="869"> 869</span>
+<span id="870"> 870</span>
+<span id="871"> 871</span>
+<span id="872"> 872</span>
+<span id="873"> 873</span>
+<span id="874"> 874</span>
+<span id="875"> 875</span>
+<span id="876"> 876</span>
+<span id="877"> 877</span>
+<span id="878"> 878</span>
+<span id="879"> 879</span>
+<span id="880"> 880</span>
+<span id="881"> 881</span>
+<span id="882"> 882</span>
+<span id="883"> 883</span>
+<span id="884"> 884</span>
+<span id="885"> 885</span>
+<span id="886"> 886</span>
+<span id="887"> 887</span>
+<span id="888"> 888</span>
+<span id="889"> 889</span>
+<span id="890"> 890</span>
+<span id="891"> 891</span>
+<span id="892"> 892</span>
+<span id="893"> 893</span>
+<span id="894"> 894</span>
+<span id="895"> 895</span>
+<span id="896"> 896</span>
+<span id="897"> 897</span>
+<span id="898"> 898</span>
+<span id="899"> 899</span>
+<span id="900"> 900</span>
+<span id="901"> 901</span>
+<span id="902"> 902</span>
+<span id="903"> 903</span>
+<span id="904"> 904</span>
+<span id="905"> 905</span>
+<span id="906"> 906</span>
+<span id="907"> 907</span>
+<span id="908"> 908</span>
+<span id="909"> 909</span>
+<span id="910"> 910</span>
+<span id="911"> 911</span>
+<span id="912"> 912</span>
+<span id="913"> 913</span>
+<span id="914"> 914</span>
+<span id="915"> 915</span>
+<span id="916"> 916</span>
+<span id="917"> 917</span>
+<span id="918"> 918</span>
+<span id="919"> 919</span>
+<span id="920"> 920</span>
+<span id="921"> 921</span>
+<span id="922"> 922</span>
+<span id="923"> 923</span>
+<span id="924"> 924</span>
+<span id="925"> 925</span>
+<span id="926"> 926</span>
+<span id="927"> 927</span>
+<span id="928"> 928</span>
+<span id="929"> 929</span>
+<span id="930"> 930</span>
+<span id="931"> 931</span>
+<span id="932"> 932</span>
+<span id="933"> 933</span>
+<span id="934"> 934</span>
+<span id="935"> 935</span>
+<span id="936"> 936</span>
+<span id="937"> 937</span>
+<span id="938"> 938</span>
+<span id="939"> 939</span>
+<span id="940"> 940</span>
+<span id="941"> 941</span>
+<span id="942"> 942</span>
+<span id="943"> 943</span>
+<span id="944"> 944</span>
+<span id="945"> 945</span>
+<span id="946"> 946</span>
+<span id="947"> 947</span>
+<span id="948"> 948</span>
+<span id="949"> 949</span>
+<span id="950"> 950</span>
+<span id="951"> 951</span>
+<span id="952"> 952</span>
+<span id="953"> 953</span>
+<span id="954"> 954</span>
+<span id="955"> 955</span>
+<span id="956"> 956</span>
+<span id="957"> 957</span>
+<span id="958"> 958</span>
+<span id="959"> 959</span>
+<span id="960"> 960</span>
+<span id="961"> 961</span>
+<span id="962"> 962</span>
+<span id="963"> 963</span>
+<span id="964"> 964</span>
+<span id="965"> 965</span>
+<span id="966"> 966</span>
+<span id="967"> 967</span>
+<span id="968"> 968</span>
+<span id="969"> 969</span>
+<span id="970"> 970</span>
+<span id="971"> 971</span>
+<span id="972"> 972</span>
+<span id="973"> 973</span>
+<span id="974"> 974</span>
+<span id="975"> 975</span>
+<span id="976"> 976</span>
+<span id="977"> 977</span>
+<span id="978"> 978</span>
+<span id="979"> 979</span>
+<span id="980"> 980</span>
+<span id="981"> 981</span>
+<span id="982"> 982</span>
+<span id="983"> 983</span>
+<span id="984"> 984</span>
+<span id="985"> 985</span>
+<span id="986"> 986</span>
+<span id="987"> 987</span>
+<span id="988"> 988</span>
+<span id="989"> 989</span>
+<span id="990"> 990</span>
+<span id="991"> 991</span>
+<span id="992"> 992</span>
+<span id="993"> 993</span>
+<span id="994"> 994</span>
+<span id="995"> 995</span>
+<span id="996"> 996</span>
+<span id="997"> 997</span>
+<span id="998"> 998</span>
+<span id="999"> 999</span>
+<span id="1000">1000</span>
+<span id="1001">1001</span>
+<span id="1002">1002</span>
+<span id="1003">1003</span>
+<span id="1004">1004</span>
+<span id="1005">1005</span>
+<span id="1006">1006</span>
+<span id="1007">1007</span>
+<span id="1008">1008</span>
+<span id="1009">1009</span>
+<span id="1010">1010</span>
+<span id="1011">1011</span>
+<span id="1012">1012</span>
+<span id="1013">1013</span>
+<span id="1014">1014</span>
+<span id="1015">1015</span>
+<span id="1016">1016</span>
+<span id="1017">1017</span>
+<span id="1018">1018</span>
+<span id="1019">1019</span>
+<span id="1020">1020</span>
+<span id="1021">1021</span>
+<span id="1022">1022</span>
+<span id="1023">1023</span>
+<span id="1024">1024</span>
+<span id="1025">1025</span>
+<span id="1026">1026</span>
+<span id="1027">1027</span>
+<span id="1028">1028</span>
+<span id="1029">1029</span>
+<span id="1030">1030</span>
+<span id="1031">1031</span>
+<span id="1032">1032</span>
+<span id="1033">1033</span>
+<span id="1034">1034</span>
+<span id="1035">1035</span>
+<span id="1036">1036</span>
+<span id="1037">1037</span>
+<span id="1038">1038</span>
+<span id="1039">1039</span>
+<span id="1040">1040</span>
+<span id="1041">1041</span>
+<span id="1042">1042</span>
+<span id="1043">1043</span>
+<span id="1044">1044</span>
+<span id="1045">1045</span>
+<span id="1046">1046</span>
+<span id="1047">1047</span>
+<span id="1048">1048</span>
+<span id="1049">1049</span>
+<span id="1050">1050</span>
+<span id="1051">1051</span>
+<span id="1052">1052</span>
+<span id="1053">1053</span>
+<span id="1054">1054</span>
+<span id="1055">1055</span>
+<span id="1056">1056</span>
+<span id="1057">1057</span>
+<span id="1058">1058</span>
+<span id="1059">1059</span>
+<span id="1060">1060</span>
+<span id="1061">1061</span>
+<span id="1062">1062</span>
+<span id="1063">1063</span>
+<span id="1064">1064</span>
+<span id="1065">1065</span>
+<span id="1066">1066</span>
+<span id="1067">1067</span>
+<span id="1068">1068</span>
+<span id="1069">1069</span>
+<span id="1070">1070</span>
+<span id="1071">1071</span>
+<span id="1072">1072</span>
+<span id="1073">1073</span>
+<span id="1074">1074</span>
+<span id="1075">1075</span>
+<span id="1076">1076</span>
+<span id="1077">1077</span>
+<span id="1078">1078</span>
+<span id="1079">1079</span>
+<span id="1080">1080</span>
+<span id="1081">1081</span>
+<span id="1082">1082</span>
+<span id="1083">1083</span>
+<span id="1084">1084</span>
+<span id="1085">1085</span>
+<span id="1086">1086</span>
+<span id="1087">1087</span>
+<span id="1088">1088</span>
+<span id="1089">1089</span>
+<span id="1090">1090</span>
+<span id="1091">1091</span>
+<span id="1092">1092</span>
+<span id="1093">1093</span>
+<span id="1094">1094</span>
+<span id="1095">1095</span>
+<span id="1096">1096</span>
+<span id="1097">1097</span>
+<span id="1098">1098</span>
+<span id="1099">1099</span>
+<span id="1100">1100</span>
+<span id="1101">1101</span>
+<span id="1102">1102</span>
+<span id="1103">1103</span>
+<span id="1104">1104</span>
+<span id="1105">1105</span>
+<span id="1106">1106</span>
+<span id="1107">1107</span>
+<span id="1108">1108</span>
+<span id="1109">1109</span>
+<span id="1110">1110</span>
+<span id="1111">1111</span>
+<span id="1112">1112</span>
+<span id="1113">1113</span>
+<span id="1114">1114</span>
+<span id="1115">1115</span>
+<span id="1116">1116</span>
+<span id="1117">1117</span>
+<span id="1118">1118</span>
+<span id="1119">1119</span>
+<span id="1120">1120</span>
+<span id="1121">1121</span>
+<span id="1122">1122</span>
+<span id="1123">1123</span>
+<span id="1124">1124</span>
+<span id="1125">1125</span>
+<span id="1126">1126</span>
+<span id="1127">1127</span>
+<span id="1128">1128</span>
+<span id="1129">1129</span>
+<span id="1130">1130</span>
+<span id="1131">1131</span>
+<span id="1132">1132</span>
+<span id="1133">1133</span>
+<span id="1134">1134</span>
+<span id="1135">1135</span>
+<span id="1136">1136</span>
+<span id="1137">1137</span>
+<span id="1138">1138</span>
+<span id="1139">1139</span>
+<span id="1140">1140</span>
+<span id="1141">1141</span>
+<span id="1142">1142</span>
+<span id="1143">1143</span>
+<span id="1144">1144</span>
+<span id="1145">1145</span>
+<span id="1146">1146</span>
+<span id="1147">1147</span>
+<span id="1148">1148</span>
+<span id="1149">1149</span>
+<span id="1150">1150</span>
+<span id="1151">1151</span>
+<span id="1152">1152</span>
+<span id="1153">1153</span>
+<span id="1154">1154</span>
+<span id="1155">1155</span>
+<span id="1156">1156</span>
+<span id="1157">1157</span>
+<span id="1158">1158</span>
+<span id="1159">1159</span>
+<span id="1160">1160</span>
+<span id="1161">1161</span>
+<span id="1162">1162</span>
+<span id="1163">1163</span>
+<span id="1164">1164</span>
+<span id="1165">1165</span>
+<span id="1166">1166</span>
+<span id="1167">1167</span>
+<span id="1168">1168</span>
+<span id="1169">1169</span>
+<span id="1170">1170</span>
+<span id="1171">1171</span>
+<span id="1172">1172</span>
+<span id="1173">1173</span>
+<span id="1174">1174</span>
+<span id="1175">1175</span>
+<span id="1176">1176</span>
+<span id="1177">1177</span>
+<span id="1178">1178</span>
+<span id="1179">1179</span>
+<span id="1180">1180</span>
+<span id="1181">1181</span>
+<span id="1182">1182</span>
+<span id="1183">1183</span>
+<span id="1184">1184</span>
+<span id="1185">1185</span>
+<span id="1186">1186</span>
+<span id="1187">1187</span>
+<span id="1188">1188</span>
+<span id="1189">1189</span>
+<span id="1190">1190</span>
+<span id="1191">1191</span>
+<span id="1192">1192</span>
+<span id="1193">1193</span>
+<span id="1194">1194</span>
+<span id="1195">1195</span>
+<span id="1196">1196</span>
+<span id="1197">1197</span>
+<span id="1198">1198</span>
+<span id="1199">1199</span>
+<span id="1200">1200</span>
+<span id="1201">1201</span>
+<span id="1202">1202</span>
+<span id="1203">1203</span>
+<span id="1204">1204</span>
+<span id="1205">1205</span>
+<span id="1206">1206</span>
+<span id="1207">1207</span>
+<span id="1208">1208</span>
+<span id="1209">1209</span>
+<span id="1210">1210</span>
+<span id="1211">1211</span>
+<span id="1212">1212</span>
+<span id="1213">1213</span>
+<span id="1214">1214</span>
+<span id="1215">1215</span>
+<span id="1216">1216</span>
+<span id="1217">1217</span>
+<span id="1218">1218</span>
+<span id="1219">1219</span>
+<span id="1220">1220</span>
+<span id="1221">1221</span>
+<span id="1222">1222</span>
+<span id="1223">1223</span>
+<span id="1224">1224</span>
+<span id="1225">1225</span>
+<span id="1226">1226</span>
+<span id="1227">1227</span>
+<span id="1228">1228</span>
+<span id="1229">1229</span>
+<span id="1230">1230</span>
+<span id="1231">1231</span>
+<span id="1232">1232</span>
+<span id="1233">1233</span>
+<span id="1234">1234</span>
+<span id="1235">1235</span>
+<span id="1236">1236</span>
+<span id="1237">1237</span>
+<span id="1238">1238</span>
+<span id="1239">1239</span>
+<span id="1240">1240</span>
+<span id="1241">1241</span>
+<span id="1242">1242</span>
+<span id="1243">1243</span>
+<span id="1244">1244</span>
+<span id="1245">1245</span>
+<span id="1246">1246</span>
+<span id="1247">1247</span>
+<span id="1248">1248</span>
+<span id="1249">1249</span>
+<span id="1250">1250</span>
+<span id="1251">1251</span>
+<span id="1252">1252</span>
+<span id="1253">1253</span>
+<span id="1254">1254</span>
+<span id="1255">1255</span>
+<span id="1256">1256</span>
+<span id="1257">1257</span>
+<span id="1258">1258</span>
+<span id="1259">1259</span>
+<span id="1260">1260</span>
+<span id="1261">1261</span>
+<span id="1262">1262</span>
+<span id="1263">1263</span>
+<span id="1264">1264</span>
+<span id="1265">1265</span>
+<span id="1266">1266</span>
+<span id="1267">1267</span>
+<span id="1268">1268</span>
+<span id="1269">1269</span>
+<span id="1270">1270</span>
+<span id="1271">1271</span>
+<span id="1272">1272</span>
+<span id="1273">1273</span>
+<span id="1274">1274</span>
+<span id="1275">1275</span>
+<span id="1276">1276</span>
+<span id="1277">1277</span>
+<span id="1278">1278</span>
+<span id="1279">1279</span>
+<span id="1280">1280</span>
+<span id="1281">1281</span>
+<span id="1282">1282</span>
+<span id="1283">1283</span>
+<span id="1284">1284</span>
+<span id="1285">1285</span>
+<span id="1286">1286</span>
+<span id="1287">1287</span>
+<span id="1288">1288</span>
+<span id="1289">1289</span>
+<span id="1290">1290</span>
+<span id="1291">1291</span>
+<span id="1292">1292</span>
+<span id="1293">1293</span>
+<span id="1294">1294</span>
+<span id="1295">1295</span>
+<span id="1296">1296</span>
+<span id="1297">1297</span>
+<span id="1298">1298</span>
+<span id="1299">1299</span>
+<span id="1300">1300</span>
+<span id="1301">1301</span>
+<span id="1302">1302</span>
+<span id="1303">1303</span>
+<span id="1304">1304</span>
+<span id="1305">1305</span>
+<span id="1306">1306</span>
+<span id="1307">1307</span>
+<span id="1308">1308</span>
+<span id="1309">1309</span>
+<span id="1310">1310</span>
+<span id="1311">1311</span>
+<span id="1312">1312</span>
+<span id="1313">1313</span>
+<span id="1314">1314</span>
+<span id="1315">1315</span>
+<span id="1316">1316</span>
+<span id="1317">1317</span>
+<span id="1318">1318</span>
+<span id="1319">1319</span>
+<span id="1320">1320</span>
+<span id="1321">1321</span>
+<span id="1322">1322</span>
+<span id="1323">1323</span>
+<span id="1324">1324</span>
+<span id="1325">1325</span>
+<span id="1326">1326</span>
+<span id="1327">1327</span>
+<span id="1328">1328</span>
+<span id="1329">1329</span>
+<span id="1330">1330</span>
+<span id="1331">1331</span>
+<span id="1332">1332</span>
+<span id="1333">1333</span>
+<span id="1334">1334</span>
+<span id="1335">1335</span>
+<span id="1336">1336</span>
+<span id="1337">1337</span>
+<span id="1338">1338</span>
+<span id="1339">1339</span>
+<span id="1340">1340</span>
+<span id="1341">1341</span>
+<span id="1342">1342</span>
+<span id="1343">1343</span>
+<span id="1344">1344</span>
+<span id="1345">1345</span>
+<span id="1346">1346</span>
+<span id="1347">1347</span>
+<span id="1348">1348</span>
+<span id="1349">1349</span>
+<span id="1350">1350</span>
+<span id="1351">1351</span>
+<span id="1352">1352</span>
+<span id="1353">1353</span>
+<span id="1354">1354</span>
+<span id="1355">1355</span>
+<span id="1356">1356</span>
+<span id="1357">1357</span>
+<span id="1358">1358</span>
+<span id="1359">1359</span>
+<span id="1360">1360</span>
+<span id="1361">1361</span>
+<span id="1362">1362</span>
+<span id="1363">1363</span>
+<span id="1364">1364</span>
+<span id="1365">1365</span>
+<span id="1366">1366</span>
+<span id="1367">1367</span>
+<span id="1368">1368</span>
+<span id="1369">1369</span>
+<span id="1370">1370</span>
+<span id="1371">1371</span>
+<span id="1372">1372</span>
+<span id="1373">1373</span>
+<span id="1374">1374</span>
+<span id="1375">1375</span>
+<span id="1376">1376</span>
+<span id="1377">1377</span>
+<span id="1378">1378</span>
+<span id="1379">1379</span>
+<span id="1380">1380</span>
+<span id="1381">1381</span>
+<span id="1382">1382</span>
+<span id="1383">1383</span>
+<span id="1384">1384</span>
+<span id="1385">1385</span>
+<span id="1386">1386</span>
+<span id="1387">1387</span>
+<span id="1388">1388</span>
+<span id="1389">1389</span>
+<span id="1390">1390</span>
+<span id="1391">1391</span>
+<span id="1392">1392</span>
+<span id="1393">1393</span>
+<span id="1394">1394</span>
+<span id="1395">1395</span>
+<span id="1396">1396</span>
+<span id="1397">1397</span>
+<span id="1398">1398</span>
+<span id="1399">1399</span>
+<span id="1400">1400</span>
+<span id="1401">1401</span>
+<span id="1402">1402</span>
+<span id="1403">1403</span>
+<span id="1404">1404</span>
+<span id="1405">1405</span>
+<span id="1406">1406</span>
+<span id="1407">1407</span>
+<span id="1408">1408</span>
+<span id="1409">1409</span>
+<span id="1410">1410</span>
+<span id="1411">1411</span>
+<span id="1412">1412</span>
+<span id="1413">1413</span>
+<span id="1414">1414</span>
+<span id="1415">1415</span>
+<span id="1416">1416</span>
+<span id="1417">1417</span>
+<span id="1418">1418</span>
+<span id="1419">1419</span>
+<span id="1420">1420</span>
+<span id="1421">1421</span>
+<span id="1422">1422</span>
+<span id="1423">1423</span>
+<span id="1424">1424</span>
+<span id="1425">1425</span>
+<span id="1426">1426</span>
+<span id="1427">1427</span>
+<span id="1428">1428</span>
+<span id="1429">1429</span>
+<span id="1430">1430</span>
+<span id="1431">1431</span>
+<span id="1432">1432</span>
+<span id="1433">1433</span>
+<span id="1434">1434</span>
+<span id="1435">1435</span>
+<span id="1436">1436</span>
+<span id="1437">1437</span>
+<span id="1438">1438</span>
+<span id="1439">1439</span>
+<span id="1440">1440</span>
+<span id="1441">1441</span>
+<span id="1442">1442</span>
+<span id="1443">1443</span>
+<span id="1444">1444</span>
+<span id="1445">1445</span>
+<span id="1446">1446</span>
+<span id="1447">1447</span>
+<span id="1448">1448</span>
+<span id="1449">1449</span>
+<span id="1450">1450</span>
+<span id="1451">1451</span>
+<span id="1452">1452</span>
+<span id="1453">1453</span>
+<span id="1454">1454</span>
+<span id="1455">1455</span>
+<span id="1456">1456</span>
+<span id="1457">1457</span>
+<span id="1458">1458</span>
+<span id="1459">1459</span>
+<span id="1460">1460</span>
+<span id="1461">1461</span>
+<span id="1462">1462</span>
+<span id="1463">1463</span>
+<span id="1464">1464</span>
+<span id="1465">1465</span>
+<span id="1466">1466</span>
+<span id="1467">1467</span>
+<span id="1468">1468</span>
+<span id="1469">1469</span>
+<span id="1470">1470</span>
+<span id="1471">1471</span>
+<span id="1472">1472</span>
+<span id="1473">1473</span>
+<span id="1474">1474</span>
+<span id="1475">1475</span>
+<span id="1476">1476</span>
+<span id="1477">1477</span>
+<span id="1478">1478</span>
+<span id="1479">1479</span>
+<span id="1480">1480</span>
+<span id="1481">1481</span>
+<span id="1482">1482</span>
+<span id="1483">1483</span>
+<span id="1484">1484</span>
+<span id="1485">1485</span>
+<span id="1486">1486</span>
+<span id="1487">1487</span>
+<span id="1488">1488</span>
+<span id="1489">1489</span>
+<span id="1490">1490</span>
+<span id="1491">1491</span>
+<span id="1492">1492</span>
+<span id="1493">1493</span>
+<span id="1494">1494</span>
+<span id="1495">1495</span>
+<span id="1496">1496</span>
+<span id="1497">1497</span>
+<span id="1498">1498</span>
+<span id="1499">1499</span>
+<span id="1500">1500</span>
+<span id="1501">1501</span>
+<span id="1502">1502</span>
+<span id="1503">1503</span>
+<span id="1504">1504</span>
+<span id="1505">1505</span>
+<span id="1506">1506</span>
+<span id="1507">1507</span>
+<span id="1508">1508</span>
+<span id="1509">1509</span>
+<span id="1510">1510</span>
+<span id="1511">1511</span>
+<span id="1512">1512</span>
+<span id="1513">1513</span>
+<span id="1514">1514</span>
+<span id="1515">1515</span>
+<span id="1516">1516</span>
+<span id="1517">1517</span>
+<span id="1518">1518</span>
+<span id="1519">1519</span>
+<span id="1520">1520</span>
+<span id="1521">1521</span>
+<span id="1522">1522</span>
+<span id="1523">1523</span>
+<span id="1524">1524</span>
+<span id="1525">1525</span>
+<span id="1526">1526</span>
+<span id="1527">1527</span>
+<span id="1528">1528</span>
+<span id="1529">1529</span>
+<span id="1530">1530</span>
+<span id="1531">1531</span>
+<span id="1532">1532</span>
+<span id="1533">1533</span>
+<span id="1534">1534</span>
+<span id="1535">1535</span>
+<span id="1536">1536</span>
+<span id="1537">1537</span>
+<span id="1538">1538</span>
+<span id="1539">1539</span>
+<span id="1540">1540</span>
+<span id="1541">1541</span>
+<span id="1542">1542</span>
+<span id="1543">1543</span>
+<span id="1544">1544</span>
+<span id="1545">1545</span>
+<span id="1546">1546</span>
+<span id="1547">1547</span>
+<span id="1548">1548</span>
+<span id="1549">1549</span>
+<span id="1550">1550</span>
+<span id="1551">1551</span>
+<span id="1552">1552</span>
+<span id="1553">1553</span>
+<span id="1554">1554</span>
+<span id="1555">1555</span>
+<span id="1556">1556</span>
+<span id="1557">1557</span>
+<span id="1558">1558</span>
+<span id="1559">1559</span>
+<span id="1560">1560</span>
+<span id="1561">1561</span>
+<span id="1562">1562</span>
+<span id="1563">1563</span>
+<span id="1564">1564</span>
+<span id="1565">1565</span>
+<span id="1566">1566</span>
+<span id="1567">1567</span>
+<span id="1568">1568</span>
+<span id="1569">1569</span>
+<span id="1570">1570</span>
+<span id="1571">1571</span>
+<span id="1572">1572</span>
+<span id="1573">1573</span>
+<span id="1574">1574</span>
+<span id="1575">1575</span>
+<span id="1576">1576</span>
+<span id="1577">1577</span>
+<span id="1578">1578</span>
+<span id="1579">1579</span>
+<span id="1580">1580</span>
+<span id="1581">1581</span>
+<span id="1582">1582</span>
+<span id="1583">1583</span>
+<span id="1584">1584</span>
+<span id="1585">1585</span>
+<span id="1586">1586</span>
+<span id="1587">1587</span>
+<span id="1588">1588</span>
+<span id="1589">1589</span>
+<span id="1590">1590</span>
+<span id="1591">1591</span>
+<span id="1592">1592</span>
+<span id="1593">1593</span>
+<span id="1594">1594</span>
+<span id="1595">1595</span>
+<span id="1596">1596</span>
+<span id="1597">1597</span>
+<span id="1598">1598</span>
+<span id="1599">1599</span>
+<span id="1600">1600</span>
+<span id="1601">1601</span>
+<span id="1602">1602</span>
+<span id="1603">1603</span>
+<span id="1604">1604</span>
+<span id="1605">1605</span>
+<span id="1606">1606</span>
+<span id="1607">1607</span>
+<span id="1608">1608</span>
+<span id="1609">1609</span>
+<span id="1610">1610</span>
+<span id="1611">1611</span>
+<span id="1612">1612</span>
+<span id="1613">1613</span>
+<span id="1614">1614</span>
+<span id="1615">1615</span>
+<span id="1616">1616</span>
+<span id="1617">1617</span>
+<span id="1618">1618</span>
+<span id="1619">1619</span>
+<span id="1620">1620</span>
+<span id="1621">1621</span>
+<span id="1622">1622</span>
+<span id="1623">1623</span>
+<span id="1624">1624</span>
+<span id="1625">1625</span>
+<span id="1626">1626</span>
+<span id="1627">1627</span>
+<span id="1628">1628</span>
+<span id="1629">1629</span>
+<span id="1630">1630</span>
+<span id="1631">1631</span>
+<span id="1632">1632</span>
+<span id="1633">1633</span>
+<span id="1634">1634</span>
+<span id="1635">1635</span>
+<span id="1636">1636</span>
+<span id="1637">1637</span>
+<span id="1638">1638</span>
+<span id="1639">1639</span>
+<span id="1640">1640</span>
+<span id="1641">1641</span>
+<span id="1642">1642</span>
+<span id="1643">1643</span>
+<span id="1644">1644</span>
+<span id="1645">1645</span>
+<span id="1646">1646</span>
+<span id="1647">1647</span>
+<span id="1648">1648</span>
+<span id="1649">1649</span>
+<span id="1650">1650</span>
+<span id="1651">1651</span>
+<span id="1652">1652</span>
+<span id="1653">1653</span>
+<span id="1654">1654</span>
+<span id="1655">1655</span>
+<span id="1656">1656</span>
+<span id="1657">1657</span>
+<span id="1658">1658</span>
+<span id="1659">1659</span>
+<span id="1660">1660</span>
+<span id="1661">1661</span>
+<span id="1662">1662</span>
+<span id="1663">1663</span>
+<span id="1664">1664</span>
+<span id="1665">1665</span>
+<span id="1666">1666</span>
+<span id="1667">1667</span>
+<span id="1668">1668</span>
+<span id="1669">1669</span>
+<span id="1670">1670</span>
+<span id="1671">1671</span>
+<span id="1672">1672</span>
+<span id="1673">1673</span>
+<span id="1674">1674</span>
+<span id="1675">1675</span>
+<span id="1676">1676</span>
+<span id="1677">1677</span>
+<span id="1678">1678</span>
+<span id="1679">1679</span>
+<span id="1680">1680</span>
+<span id="1681">1681</span>
+<span id="1682">1682</span>
+<span id="1683">1683</span>
+<span id="1684">1684</span>
+<span id="1685">1685</span>
+<span id="1686">1686</span>
+<span id="1687">1687</span>
+<span id="1688">1688</span>
+<span id="1689">1689</span>
+<span id="1690">1690</span>
+<span id="1691">1691</span>
+<span id="1692">1692</span>
+<span id="1693">1693</span>
+<span id="1694">1694</span>
+<span id="1695">1695</span>
+<span id="1696">1696</span>
+<span id="1697">1697</span>
+<span id="1698">1698</span>
+<span id="1699">1699</span>
+<span id="1700">1700</span>
+<span id="1701">1701</span>
+<span id="1702">1702</span>
+<span id="1703">1703</span>
+<span id="1704">1704</span>
+<span id="1705">1705</span>
+<span id="1706">1706</span>
+<span id="1707">1707</span>
+<span id="1708">1708</span>
+<span id="1709">1709</span>
+<span id="1710">1710</span>
+<span id="1711">1711</span>
+<span id="1712">1712</span>
+<span id="1713">1713</span>
+<span id="1714">1714</span>
+<span id="1715">1715</span>
+<span id="1716">1716</span>
+<span id="1717">1717</span>
+<span id="1718">1718</span>
+<span id="1719">1719</span>
+<span id="1720">1720</span>
+<span id="1721">1721</span>
+<span id="1722">1722</span>
+<span id="1723">1723</span>
+<span id="1724">1724</span>
+<span id="1725">1725</span>
+<span id="1726">1726</span>
+<span id="1727">1727</span>
+<span id="1728">1728</span>
+<span id="1729">1729</span>
+<span id="1730">1730</span>
+<span id="1731">1731</span>
+<span id="1732">1732</span>
+<span id="1733">1733</span>
+<span id="1734">1734</span>
+<span id="1735">1735</span>
+<span id="1736">1736</span>
+<span id="1737">1737</span>
+<span id="1738">1738</span>
+<span id="1739">1739</span>
+<span id="1740">1740</span>
+<span id="1741">1741</span>
+<span id="1742">1742</span>
+<span id="1743">1743</span>
+<span id="1744">1744</span>
+<span id="1745">1745</span>
+<span id="1746">1746</span>
+<span id="1747">1747</span>
+<span id="1748">1748</span>
+<span id="1749">1749</span>
+<span id="1750">1750</span>
+<span id="1751">1751</span>
+<span id="1752">1752</span>
+<span id="1753">1753</span>
+<span id="1754">1754</span>
+<span id="1755">1755</span>
+<span id="1756">1756</span>
+<span id="1757">1757</span>
+<span id="1758">1758</span>
+<span id="1759">1759</span>
+<span id="1760">1760</span>
+<span id="1761">1761</span>
+<span id="1762">1762</span>
+<span id="1763">1763</span>
+<span id="1764">1764</span>
+<span id="1765">1765</span>
+<span id="1766">1766</span>
+<span id="1767">1767</span>
+<span id="1768">1768</span>
+<span id="1769">1769</span>
+<span id="1770">1770</span>
+<span id="1771">1771</span>
+<span id="1772">1772</span>
+<span id="1773">1773</span>
+<span id="1774">1774</span>
+<span id="1775">1775</span>
+<span id="1776">1776</span>
+<span id="1777">1777</span>
+<span id="1778">1778</span>
+<span id="1779">1779</span>
+<span id="1780">1780</span>
+<span id="1781">1781</span>
+<span id="1782">1782</span>
+<span id="1783">1783</span>
+<span id="1784">1784</span>
+<span id="1785">1785</span>
+<span id="1786">1786</span>
+<span id="1787">1787</span>
+<span id="1788">1788</span>
+<span id="1789">1789</span>
+<span id="1790">1790</span>
+<span id="1791">1791</span>
+<span id="1792">1792</span>
+<span id="1793">1793</span>
+<span id="1794">1794</span>
+<span id="1795">1795</span>
+<span id="1796">1796</span>
+<span id="1797">1797</span>
+<span id="1798">1798</span>
+<span id="1799">1799</span>
+<span id="1800">1800</span>
+<span id="1801">1801</span>
+<span id="1802">1802</span>
+<span id="1803">1803</span>
+<span id="1804">1804</span>
+<span id="1805">1805</span>
+<span id="1806">1806</span>
+<span id="1807">1807</span>
+<span id="1808">1808</span>
+<span id="1809">1809</span>
+<span id="1810">1810</span>
+<span id="1811">1811</span>
+<span id="1812">1812</span>
+<span id="1813">1813</span>
+<span id="1814">1814</span>
+<span id="1815">1815</span>
+<span id="1816">1816</span>
+<span id="1817">1817</span>
+<span id="1818">1818</span>
+<span id="1819">1819</span>
+<span id="1820">1820</span>
+<span id="1821">1821</span>
+<span id="1822">1822</span>
+<span id="1823">1823</span>
+<span id="1824">1824</span>
+<span id="1825">1825</span>
+<span id="1826">1826</span>
+<span id="1827">1827</span>
+<span id="1828">1828</span>
+<span id="1829">1829</span>
+<span id="1830">1830</span>
+<span id="1831">1831</span>
+<span id="1832">1832</span>
+<span id="1833">1833</span>
+<span id="1834">1834</span>
+<span id="1835">1835</span>
+<span id="1836">1836</span>
+<span id="1837">1837</span>
+<span id="1838">1838</span>
+<span id="1839">1839</span>
+<span id="1840">1840</span>
+<span id="1841">1841</span>
+<span id="1842">1842</span>
+<span id="1843">1843</span>
+<span id="1844">1844</span>
+<span id="1845">1845</span>
+<span id="1846">1846</span>
+<span id="1847">1847</span>
+<span id="1848">1848</span>
+<span id="1849">1849</span>
+<span id="1850">1850</span>
+<span id="1851">1851</span>
+<span id="1852">1852</span>
+<span id="1853">1853</span>
+<span id="1854">1854</span>
+<span id="1855">1855</span>
+<span id="1856">1856</span>
+<span id="1857">1857</span>
+<span id="1858">1858</span>
+<span id="1859">1859</span>
+<span id="1860">1860</span>
+<span id="1861">1861</span>
+<span id="1862">1862</span>
+<span id="1863">1863</span>
+<span id="1864">1864</span>
+<span id="1865">1865</span>
+<span id="1866">1866</span>
+<span id="1867">1867</span>
+<span id="1868">1868</span>
+<span id="1869">1869</span>
+<span id="1870">1870</span>
+<span id="1871">1871</span>
+<span id="1872">1872</span>
+<span id="1873">1873</span>
+<span id="1874">1874</span>
+<span id="1875">1875</span>
+<span id="1876">1876</span>
+<span id="1877">1877</span>
+<span id="1878">1878</span>
+<span id="1879">1879</span>
+<span id="1880">1880</span>
+<span id="1881">1881</span>
+<span id="1882">1882</span>
+<span id="1883">1883</span>
+<span id="1884">1884</span>
+<span id="1885">1885</span>
+<span id="1886">1886</span>
+<span id="1887">1887</span>
+<span id="1888">1888</span>
+<span id="1889">1889</span>
+<span id="1890">1890</span>
+<span id="1891">1891</span>
+<span id="1892">1892</span>
+<span id="1893">1893</span>
+<span id="1894">1894</span>
+<span id="1895">1895</span>
+<span id="1896">1896</span>
+<span id="1897">1897</span>
+<span id="1898">1898</span>
+<span id="1899">1899</span>
+<span id="1900">1900</span>
+<span id="1901">1901</span>
+<span id="1902">1902</span>
+<span id="1903">1903</span>
+<span id="1904">1904</span>
+<span id="1905">1905</span>
+<span id="1906">1906</span>
+<span id="1907">1907</span>
+<span id="1908">1908</span>
+<span id="1909">1909</span>
+<span id="1910">1910</span>
+<span id="1911">1911</span>
+<span id="1912">1912</span>
+<span id="1913">1913</span>
+<span id="1914">1914</span>
+<span id="1915">1915</span>
+<span id="1916">1916</span>
+<span id="1917">1917</span>
+<span id="1918">1918</span>
+<span id="1919">1919</span>
+<span id="1920">1920</span>
+<span id="1921">1921</span>
+<span id="1922">1922</span>
+<span id="1923">1923</span>
+<span id="1924">1924</span>
+<span id="1925">1925</span>
+<span id="1926">1926</span>
+<span id="1927">1927</span>
+<span id="1928">1928</span>
+<span id="1929">1929</span>
+<span id="1930">1930</span>
+<span id="1931">1931</span>
+<span id="1932">1932</span>
+<span id="1933">1933</span>
+<span id="1934">1934</span>
+<span id="1935">1935</span>
+<span id="1936">1936</span>
+<span id="1937">1937</span>
+<span id="1938">1938</span>
+<span id="1939">1939</span>
+<span id="1940">1940</span>
+<span id="1941">1941</span>
+<span id="1942">1942</span>
+<span id="1943">1943</span>
+<span id="1944">1944</span>
+<span id="1945">1945</span>
+<span id="1946">1946</span>
+<span id="1947">1947</span>
+<span id="1948">1948</span>
+<span id="1949">1949</span>
+<span id="1950">1950</span>
+<span id="1951">1951</span>
+<span id="1952">1952</span>
+<span id="1953">1953</span>
+<span id="1954">1954</span>
+<span id="1955">1955</span>
+<span id="1956">1956</span>
+<span id="1957">1957</span>
+<span id="1958">1958</span>
+<span id="1959">1959</span>
+<span id="1960">1960</span>
+<span id="1961">1961</span>
+<span id="1962">1962</span>
+<span id="1963">1963</span>
+<span id="1964">1964</span>
+<span id="1965">1965</span>
+<span id="1966">1966</span>
+<span id="1967">1967</span>
+<span id="1968">1968</span>
+<span id="1969">1969</span>
+<span id="1970">1970</span>
+<span id="1971">1971</span>
+<span id="1972">1972</span>
+<span id="1973">1973</span>
+<span id="1974">1974</span>
+<span id="1975">1975</span>
+<span id="1976">1976</span>
+<span id="1977">1977</span>
+<span id="1978">1978</span>
+<span id="1979">1979</span>
+<span id="1980">1980</span>
+<span id="1981">1981</span>
+<span id="1982">1982</span>
+<span id="1983">1983</span>
+<span id="1984">1984</span>
+<span id="1985">1985</span>
+<span id="1986">1986</span>
+<span id="1987">1987</span>
+<span id="1988">1988</span>
+<span id="1989">1989</span>
+<span id="1990">1990</span>
+<span id="1991">1991</span>
+<span id="1992">1992</span>
+<span id="1993">1993</span>
+<span id="1994">1994</span>
+<span id="1995">1995</span>
+<span id="1996">1996</span>
+<span id="1997">1997</span>
+<span id="1998">1998</span>
+<span id="1999">1999</span>
+<span id="2000">2000</span>
+<span id="2001">2001</span>
+<span id="2002">2002</span>
+<span id="2003">2003</span>
+<span id="2004">2004</span>
+<span id="2005">2005</span>
+<span id="2006">2006</span>
+<span id="2007">2007</span>
+<span id="2008">2008</span>
+<span id="2009">2009</span>
+<span id="2010">2010</span>
+<span id="2011">2011</span>
+<span id="2012">2012</span>
+<span id="2013">2013</span>
+<span id="2014">2014</span>
+<span id="2015">2015</span>
+<span id="2016">2016</span>
+<span id="2017">2017</span>
+<span id="2018">2018</span>
+<span id="2019">2019</span>
+<span id="2020">2020</span>
+<span id="2021">2021</span>
+<span id="2022">2022</span>
+<span id="2023">2023</span>
+<span id="2024">2024</span>
+<span id="2025">2025</span>
+<span id="2026">2026</span>
+<span id="2027">2027</span>
+<span id="2028">2028</span>
+<span id="2029">2029</span>
+<span id="2030">2030</span>
+<span id="2031">2031</span>
+<span id="2032">2032</span>
+<span id="2033">2033</span>
+<span id="2034">2034</span>
+<span id="2035">2035</span>
+<span id="2036">2036</span>
+<span id="2037">2037</span>
+<span id="2038">2038</span>
+<span id="2039">2039</span>
+<span id="2040">2040</span>
+<span id="2041">2041</span>
+<span id="2042">2042</span>
+<span id="2043">2043</span>
+<span id="2044">2044</span>
+<span id="2045">2045</span>
+<span id="2046">2046</span>
+<span id="2047">2047</span>
+<span id="2048">2048</span>
+<span id="2049">2049</span>
+<span id="2050">2050</span>
+<span id="2051">2051</span>
+<span id="2052">2052</span>
+<span id="2053">2053</span>
+<span id="2054">2054</span>
+<span id="2055">2055</span>
+<span id="2056">2056</span>
+<span id="2057">2057</span>
+<span id="2058">2058</span>
+<span id="2059">2059</span>
+<span id="2060">2060</span>
+<span id="2061">2061</span>
+<span id="2062">2062</span>
+<span id="2063">2063</span>
+<span id="2064">2064</span>
+<span id="2065">2065</span>
+<span id="2066">2066</span>
+<span id="2067">2067</span>
+<span id="2068">2068</span>
+<span id="2069">2069</span>
+<span id="2070">2070</span>
+<span id="2071">2071</span>
+<span id="2072">2072</span>
+<span id="2073">2073</span>
+<span id="2074">2074</span>
+<span id="2075">2075</span>
+<span id="2076">2076</span>
+<span id="2077">2077</span>
+<span id="2078">2078</span>
+<span id="2079">2079</span>
+<span id="2080">2080</span>
+<span id="2081">2081</span>
+<span id="2082">2082</span>
+<span id="2083">2083</span>
+<span id="2084">2084</span>
+<span id="2085">2085</span>
+<span id="2086">2086</span>
+<span id="2087">2087</span>
+<span id="2088">2088</span>
+<span id="2089">2089</span>
+<span id="2090">2090</span>
+<span id="2091">2091</span>
+<span id="2092">2092</span>
+<span id="2093">2093</span>
+<span id="2094">2094</span>
+<span id="2095">2095</span>
+<span id="2096">2096</span>
+<span id="2097">2097</span>
+<span id="2098">2098</span>
+<span id="2099">2099</span>
+<span id="2100">2100</span>
+<span id="2101">2101</span>
+<span id="2102">2102</span>
+<span id="2103">2103</span>
+<span id="2104">2104</span>
+<span id="2105">2105</span>
+<span id="2106">2106</span>
+<span id="2107">2107</span>
+<span id="2108">2108</span>
+<span id="2109">2109</span>
+<span id="2110">2110</span>
+<span id="2111">2111</span>
+<span id="2112">2112</span>
+<span id="2113">2113</span>
+<span id="2114">2114</span>
+<span id="2115">2115</span>
+<span id="2116">2116</span>
+<span id="2117">2117</span>
+<span id="2118">2118</span>
+<span id="2119">2119</span>
+<span id="2120">2120</span>
+<span id="2121">2121</span>
+<span id="2122">2122</span>
+<span id="2123">2123</span>
+<span id="2124">2124</span>
+<span id="2125">2125</span>
+<span id="2126">2126</span>
+<span id="2127">2127</span>
+<span id="2128">2128</span>
+<span id="2129">2129</span>
+<span id="2130">2130</span>
+<span id="2131">2131</span>
+<span id="2132">2132</span>
+<span id="2133">2133</span>
+<span id="2134">2134</span>
+<span id="2135">2135</span>
+<span id="2136">2136</span>
+<span id="2137">2137</span>
+<span id="2138">2138</span>
+<span id="2139">2139</span>
+<span id="2140">2140</span>
+<span id="2141">2141</span>
+<span id="2142">2142</span>
+<span id="2143">2143</span>
+<span id="2144">2144</span>
+<span id="2145">2145</span>
+<span id="2146">2146</span>
+<span id="2147">2147</span>
+<span id="2148">2148</span>
+<span id="2149">2149</span>
+<span id="2150">2150</span>
+<span id="2151">2151</span>
+<span id="2152">2152</span>
+<span id="2153">2153</span>
+<span id="2154">2154</span>
+<span id="2155">2155</span>
+<span id="2156">2156</span>
+<span id="2157">2157</span>
+<span id="2158">2158</span>
+<span id="2159">2159</span>
+<span id="2160">2160</span>
+<span id="2161">2161</span>
+<span id="2162">2162</span>
+<span id="2163">2163</span>
+<span id="2164">2164</span>
+<span id="2165">2165</span>
+<span id="2166">2166</span>
+<span id="2167">2167</span>
+<span id="2168">2168</span>
+<span id="2169">2169</span>
+<span id="2170">2170</span>
+<span id="2171">2171</span>
+<span id="2172">2172</span>
+<span id="2173">2173</span>
+<span id="2174">2174</span>
+<span id="2175">2175</span>
+<span id="2176">2176</span>
+<span id="2177">2177</span>
+<span id="2178">2178</span>
+<span id="2179">2179</span>
+<span id="2180">2180</span>
+<span id="2181">2181</span>
+<span id="2182">2182</span>
+<span id="2183">2183</span>
+<span id="2184">2184</span>
+<span id="2185">2185</span>
+<span id="2186">2186</span>
+<span id="2187">2187</span>
+<span id="2188">2188</span>
+<span id="2189">2189</span>
+<span id="2190">2190</span>
+<span id="2191">2191</span>
+<span id="2192">2192</span>
+<span id="2193">2193</span>
+<span id="2194">2194</span>
+<span id="2195">2195</span>
+<span id="2196">2196</span>
+<span id="2197">2197</span>
+<span id="2198">2198</span>
+<span id="2199">2199</span>
+<span id="2200">2200</span>
+<span id="2201">2201</span>
+<span id="2202">2202</span>
+<span id="2203">2203</span>
+<span id="2204">2204</span>
+<span id="2205">2205</span>
+<span id="2206">2206</span>
+<span id="2207">2207</span>
+<span id="2208">2208</span>
+<span id="2209">2209</span>
+<span id="2210">2210</span>
+<span id="2211">2211</span>
+<span id="2212">2212</span>
+<span id="2213">2213</span>
+<span id="2214">2214</span>
+<span id="2215">2215</span>
+<span id="2216">2216</span>
+<span id="2217">2217</span>
+<span id="2218">2218</span>
+<span id="2219">2219</span>
+<span id="2220">2220</span>
+<span id="2221">2221</span>
+<span id="2222">2222</span>
+<span id="2223">2223</span>
+<span id="2224">2224</span>
+<span id="2225">2225</span>
+<span id="2226">2226</span>
+<span id="2227">2227</span>
+<span id="2228">2228</span>
+<span id="2229">2229</span>
+<span id="2230">2230</span>
+<span id="2231">2231</span>
+<span id="2232">2232</span>
+<span id="2233">2233</span>
+<span id="2234">2234</span>
+<span id="2235">2235</span>
+<span id="2236">2236</span>
+<span id="2237">2237</span>
+<span id="2238">2238</span>
+<span id="2239">2239</span>
+<span id="2240">2240</span>
+<span id="2241">2241</span>
+<span id="2242">2242</span>
+<span id="2243">2243</span>
+<span id="2244">2244</span>
+<span id="2245">2245</span>
+<span id="2246">2246</span>
+<span id="2247">2247</span>
+<span id="2248">2248</span>
+<span id="2249">2249</span>
+<span id="2250">2250</span>
+<span id="2251">2251</span>
+<span id="2252">2252</span>
+<span id="2253">2253</span>
+<span id="2254">2254</span>
+<span id="2255">2255</span>
+<span id="2256">2256</span>
+<span id="2257">2257</span>
+<span id="2258">2258</span>
+<span id="2259">2259</span>
+<span id="2260">2260</span>
+<span id="2261">2261</span>
+<span id="2262">2262</span>
+<span id="2263">2263</span>
+<span id="2264">2264</span>
+<span id="2265">2265</span>
+<span id="2266">2266</span>
+<span id="2267">2267</span>
+<span id="2268">2268</span>
+<span id="2269">2269</span>
+<span id="2270">2270</span>
+<span id="2271">2271</span>
+<span id="2272">2272</span>
+<span id="2273">2273</span>
+<span id="2274">2274</span>
+<span id="2275">2275</span>
+<span id="2276">2276</span>
+<span id="2277">2277</span>
+<span id="2278">2278</span>
+<span id="2279">2279</span>
+<span id="2280">2280</span>
+<span id="2281">2281</span>
+<span id="2282">2282</span>
+<span id="2283">2283</span>
+<span id="2284">2284</span>
+<span id="2285">2285</span>
+<span id="2286">2286</span>
+<span id="2287">2287</span>
+<span id="2288">2288</span>
+<span id="2289">2289</span>
+<span id="2290">2290</span>
+<span id="2291">2291</span>
+<span id="2292">2292</span>
+<span id="2293">2293</span>
+<span id="2294">2294</span>
+<span id="2295">2295</span>
+<span id="2296">2296</span>
+<span id="2297">2297</span>
+<span id="2298">2298</span>
+<span id="2299">2299</span>
+<span id="2300">2300</span>
+<span id="2301">2301</span>
+<span id="2302">2302</span>
+<span id="2303">2303</span>
+<span id="2304">2304</span>
+<span id="2305">2305</span>
+<span id="2306">2306</span>
+<span id="2307">2307</span>
+<span id="2308">2308</span>
+<span id="2309">2309</span>
+<span id="2310">2310</span>
+<span id="2311">2311</span>
+<span id="2312">2312</span>
+<span id="2313">2313</span>
+<span id="2314">2314</span>
+<span id="2315">2315</span>
+<span id="2316">2316</span>
+<span id="2317">2317</span>
+<span id="2318">2318</span>
+<span id="2319">2319</span>
+<span id="2320">2320</span>
+<span id="2321">2321</span>
+<span id="2322">2322</span>
+<span id="2323">2323</span>
+<span id="2324">2324</span>
+<span id="2325">2325</span>
+<span id="2326">2326</span>
+<span id="2327">2327</span>
+</pre><pre class='rust '>
+<span class='comment'>// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT</span>
+<span class='comment'>// file at the top-level directory of this distribution and at</span>
+<span class='comment'>// http://rust-lang.org/COPYRIGHT.</span>
+<span class='comment'>//</span>
+<span class='comment'>// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
+<span class='comment'>// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
+<span class='comment'>// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
+<span class='comment'>// option. This file may not be copied, modified, or distributed</span>
+<span class='comment'>// except according to those terms.</span>
+
+<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>cmp</span>::{<span class='ident'>max</span>, <span class='ident'>min</span>};
+
+<span class='kw'>use</span> <span class='ident'>unicode</span>::<span class='ident'>regex</span>::<span class='ident'>UNICODE_CLASSES</span>;
+
+<span class='kw'>use</span> {
+ <span class='ident'>Expr</span>, <span class='ident'>Repeater</span>, <span class='ident'>CharClass</span>, <span class='ident'>ClassRange</span>, <span class='ident'>CaptureIndex</span>, <span class='ident'>CaptureName</span>,
+ <span class='ident'>Error</span>, <span class='ident'>ErrorKind</span>, <span class='prelude-ty'>Result</span>,
+};
+
+<span class='doccomment'>/// Parser state.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Keeps the entire input in memory and maintains a cursor (char offset).</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// It also keeps an expression stack, which is responsible for managing</span>
+<span class='doccomment'>/// grouped expressions and flag state.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Parser</span> {
+ <span class='ident'>chars</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span>,
+ <span class='ident'>chari</span>: <span class='ident'>usize</span>,
+ <span class='ident'>stack</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span>,
+ <span class='ident'>caps</span>: <span class='ident'>usize</span>,
+ <span class='ident'>names</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>, <span class='comment'>// to check for duplicates</span>
+ <span class='ident'>flags</span>: <span class='ident'>Flags</span>,
+}
+
+<span class='doccomment'>/// An empheral type for representing the expression stack.</span>
+<span class='doccomment'>///</span>
+<span class='doccomment'>/// Everything on the stack is either a regular expression or a marker</span>
+<span class='doccomment'>/// indicating the opening of a group (possibly non-capturing). The opening</span>
+<span class='doccomment'>/// of a group copies the current flag state, which is reset on the parser</span>
+<span class='doccomment'>/// state once the group closes.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Debug</span>)]</span>
+<span class='kw'>enum</span> <span class='ident'>Build</span> {
+ <span class='ident'>Expr</span>(<span class='ident'>Expr</span>),
+ <span class='ident'>LeftParen</span> {
+ <span class='ident'>i</span>: <span class='ident'>CaptureIndex</span>,
+ <span class='ident'>name</span>: <span class='ident'>CaptureName</span>,
+ <span class='ident'>chari</span>: <span class='ident'>usize</span>,
+ <span class='ident'>old_flags</span>: <span class='ident'>Flags</span>,
+ },
+}
+
+<span class='doccomment'>/// Flag state.</span>
+<span class='attribute'>#[<span class='ident'>derive</span>(<span class='ident'>Clone</span>, <span class='ident'>Copy</span>, <span class='ident'>Debug</span>)]</span>
+<span class='kw'>struct</span> <span class='ident'>Flags</span> {
+ <span class='ident'>casei</span>: <span class='ident'>bool</span>,
+ <span class='ident'>multi</span>: <span class='ident'>bool</span>,
+ <span class='ident'>dotnl</span>: <span class='ident'>bool</span>,
+ <span class='ident'>swap_greed</span>: <span class='ident'>bool</span>,
+ <span class='ident'>ignore_space</span>: <span class='ident'>bool</span>,
+}
+
+<span class='comment'>// Primary expression parsing routines.</span>
+<span class='kw'>impl</span> <span class='ident'>Parser</span> {
+ <span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>parse</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='ident'>Parser</span> {
+ <span class='ident'>chars</span>: <span class='ident'>s</span>.<span class='ident'>chars</span>().<span class='ident'>collect</span>(),
+ <span class='ident'>chari</span>: <span class='number'>0</span>,
+ <span class='ident'>stack</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ <span class='ident'>caps</span>: <span class='number'>0</span>,
+ <span class='ident'>names</span>: <span class='macro'>vec</span><span class='macro'>!</span>[],
+ <span class='ident'>flags</span>: <span class='ident'>Flags</span> {
+ <span class='ident'>casei</span>: <span class='boolval'>false</span>,
+ <span class='ident'>multi</span>: <span class='boolval'>false</span>,
+ <span class='ident'>dotnl</span>: <span class='boolval'>false</span>,
+ <span class='ident'>swap_greed</span>: <span class='boolval'>false</span>,
+ <span class='ident'>ignore_space</span>: <span class='boolval'>false</span>,
+ },
+ }.<span class='ident'>parse_expr</span>()
+ }
+
+ <span class='comment'>// Top-level expression parser.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Starts at the beginning of the input and consumes until either the end</span>
+ <span class='comment'>// of input or an error.</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_expr</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>while</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='kw'>let</span> <span class='ident'>build_expr</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>cur</span>() {
+ <span class='string'>&#39;\\&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_escape</span>()),
+ <span class='string'>&#39;|&#39;</span> <span class='op'>=&gt;</span> { <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>alternate</span>()); <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='ident'>e</span> }
+ <span class='string'>&#39;?&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_simple_repeat</span>(<span class='ident'>Repeater</span>::<span class='ident'>ZeroOrOne</span>)),
+ <span class='string'>&#39;*&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_simple_repeat</span>(<span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>)),
+ <span class='string'>&#39;+&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_simple_repeat</span>(<span class='ident'>Repeater</span>::<span class='ident'>OneOrMore</span>)),
+ <span class='string'>&#39;{&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_counted_repeat</span>()),
+ <span class='string'>&#39;[&#39;</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>maybe_parse_ascii</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_class</span>()),
+ <span class='prelude-val'>Some</span>(<span class='ident'>cls</span>) <span class='op'>=&gt;</span> <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>)),
+ },
+ <span class='string'>&#39;^&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>multi</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>StartLine</span>)
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>StartText</span>)
+ }
+ }
+ <span class='string'>&#39;$&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>multi</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>EndLine</span>)
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>EndText</span>)
+ }
+ }
+ <span class='string'>&#39;.&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>dotnl</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>AnyChar</span>)
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_one</span>(<span class='ident'>Expr</span>::<span class='ident'>AnyCharNoNL</span>)
+ }
+ }
+ <span class='string'>&#39;(&#39;</span> <span class='op'>=&gt;</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_group</span>()),
+ <span class='string'>&#39;)&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> (<span class='ident'>old_flags</span>, <span class='ident'>e</span>) <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>close_paren</span>());
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='self'>self</span>.<span class='ident'>flags</span> <span class='op'>=</span> <span class='ident'>old_flags</span>;
+ <span class='ident'>e</span>
+ }
+ _ <span class='op'>=&gt;</span> <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> {
+ <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='self'>self</span>.<span class='ident'>bump</span>()],
+ <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span>,
+ }),
+ };
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>build_expr</span>.<span class='ident'>is_empty</span>() {
+ <span class='kw'>let</span> <span class='ident'>build_expr</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>maybe_class_case_fold</span>(<span class='ident'>build_expr</span>);
+ <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>push</span>(<span class='ident'>build_expr</span>);
+ }
+ }
+ <span class='self'>self</span>.<span class='ident'>finish_concat</span>()
+ }
+
+ <span class='comment'>// Parses an escape sequence, e.g., \Ax</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `\`</span>
+ <span class='comment'>// End: `x`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_escape</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedEscapeEof</span>));
+ }
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cur</span>();
+ <span class='kw'>if</span> <span class='ident'>is_punct</span>(<span class='ident'>c</span>) {
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> {
+ <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='self'>self</span>.<span class='ident'>bump</span>()],
+ <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span>,
+ }));
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>lit</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>Build</span> {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>c</span>], <span class='ident'>casei</span>: <span class='boolval'>false</span> })
+ }
+ <span class='kw'>match</span> <span class='ident'>c</span> {
+ <span class='string'>&#39;a&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\x07&#39;</span>)) }
+ <span class='string'>&#39;f&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\x0C&#39;</span>)) }
+ <span class='string'>&#39;t&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\t&#39;</span>)) }
+ <span class='string'>&#39;n&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\n&#39;</span>)) }
+ <span class='string'>&#39;r&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\r&#39;</span>)) }
+ <span class='string'>&#39;v&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>lit</span>(<span class='string'>&#39;\x0B&#39;</span>)) }
+ <span class='string'>&#39;A&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>StartText</span>)) }
+ <span class='string'>&#39;z&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>EndText</span>)) }
+ <span class='string'>&#39;b&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>WordBoundary</span>)) }
+ <span class='string'>&#39;B&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>NotWordBoundary</span>)) }
+ <span class='string'>&#39;0&#39;</span><span class='op'>|</span><span class='string'>&#39;1&#39;</span><span class='op'>|</span><span class='string'>&#39;2&#39;</span><span class='op'>|</span><span class='string'>&#39;3&#39;</span><span class='op'>|</span><span class='string'>&#39;4&#39;</span><span class='op'>|</span><span class='string'>&#39;5&#39;</span><span class='op'>|</span><span class='string'>&#39;6&#39;</span><span class='op'>|</span><span class='string'>&#39;7&#39;</span> <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>parse_octal</span>(),
+ <span class='string'>&#39;x&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='self'>self</span>.<span class='ident'>parse_hex</span>() }
+ <span class='string'>&#39;p&#39;</span><span class='op'>|</span><span class='string'>&#39;P&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='self'>self</span>.<span class='ident'>parse_unicode_class</span>(<span class='ident'>c</span> <span class='op'>==</span> <span class='string'>&#39;P&#39;</span>)
+ .<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>cls</span><span class='op'>|</span> <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>)))
+ }
+ <span class='string'>&#39;d&#39;</span><span class='op'>|</span><span class='string'>&#39;s&#39;</span><span class='op'>|</span><span class='string'>&#39;w&#39;</span><span class='op'>|</span><span class='string'>&#39;D&#39;</span><span class='op'>|</span><span class='string'>&#39;S&#39;</span><span class='op'>|</span><span class='string'>&#39;W&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='self'>self</span>.<span class='ident'>parse_perl_class</span>(<span class='ident'>c</span>))))
+ }
+ <span class='ident'>c</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedEscape</span>(<span class='ident'>c</span>))),
+ }
+ }
+
+ <span class='comment'>// Parses a group, e.g., `(abc)`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `(`</span>
+ <span class='comment'>// End: `a`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// A more interesting example, `(?P&lt;foo&gt;abc)`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `(`</span>
+ <span class='comment'>// End: `a`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_group</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>chari</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>chari</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>name</span>: <span class='ident'>CaptureName</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&quot;?P&lt;&quot;</span>) {
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_group_name</span>());
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>names</span>.<span class='ident'>iter</span>().<span class='ident'>any</span>(<span class='op'>|</span><span class='ident'>n2</span><span class='op'>|</span> <span class='ident'>n2</span> <span class='op'>==</span> <span class='kw-2'>&amp;</span><span class='ident'>n</span>) {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>DuplicateCaptureName</span>(<span class='ident'>n</span>)));
+ }
+ <span class='self'>self</span>.<span class='ident'>names</span>.<span class='ident'>push</span>(<span class='ident'>n</span>.<span class='ident'>clone</span>());
+ <span class='ident'>name</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>n</span>);
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&quot;?&quot;</span>) {
+ <span class='comment'>// This can never be capturing. It&#39;s either setting flags for</span>
+ <span class='comment'>// the current group, or it&#39;s opening a non-capturing group or</span>
+ <span class='comment'>// it&#39;s opening a group with a specific set of flags (which is</span>
+ <span class='comment'>// also non-capturing).</span>
+ <span class='comment'>// Anything else is an error.</span>
+ <span class='kw'>return</span> <span class='self'>self</span>.<span class='ident'>parse_group_flags</span>(<span class='ident'>chari</span>);
+ }
+ <span class='self'>self</span>.<span class='ident'>caps</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>caps</span>, <span class='number'>1</span>);
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span> {
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='self'>self</span>.<span class='ident'>caps</span>),
+ <span class='ident'>name</span>: <span class='ident'>name</span>,
+ <span class='ident'>chari</span>: <span class='ident'>chari</span>,
+ <span class='ident'>old_flags</span>: <span class='self'>self</span>.<span class='ident'>flags</span>, <span class='comment'>// no flags changed if we&#39;re here</span>
+ })
+ }
+
+ <span class='comment'>// Parses flags (inline or grouped), e.g., `(?s-i:abc)`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `s`</span>
+ <span class='comment'>// End: `a`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Another example, `(?s-i)a`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `s`</span>
+ <span class='comment'>// End: `a`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_group_flags</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>opening_chari</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>old_flags</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>flags</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>sign</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='kw'>loop</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='comment'>// e.g., (?i</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedFlagEof</span>));
+ }
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>cur</span>() {
+ <span class='string'>&#39;i&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span> <span class='op'>=</span> <span class='ident'>sign</span>; <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>true</span> }
+ <span class='string'>&#39;m&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>multi</span> <span class='op'>=</span> <span class='ident'>sign</span>; <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>true</span> }
+ <span class='string'>&#39;s&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>dotnl</span> <span class='op'>=</span> <span class='ident'>sign</span>; <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>true</span> }
+ <span class='string'>&#39;U&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>swap_greed</span> <span class='op'>=</span> <span class='ident'>sign</span>; <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>true</span> }
+ <span class='string'>&#39;x&#39;</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>ignore_space</span> <span class='op'>=</span> <span class='ident'>sign</span>; <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>true</span> }
+ <span class='string'>&#39;-&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>sign</span> {
+ <span class='comment'>// e.g., (?-i-s)</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>DoubleFlagNegation</span>));
+ }
+ <span class='ident'>sign</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ <span class='ident'>saw_flag</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ }
+ <span class='string'>&#39;)&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>saw_flag</span> {
+ <span class='comment'>// e.g., (?)</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyFlagNegation</span>));
+ }
+ <span class='comment'>// At this point, we&#39;re just changing the flags inside</span>
+ <span class='comment'>// the current group, which means the old flags have</span>
+ <span class='comment'>// been saved elsewhere. Our modifications in place are</span>
+ <span class='comment'>// okey dokey!</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This particular flag expression only has a stateful</span>
+ <span class='comment'>// impact on a regex&#39;s AST, so nothing gets explicitly</span>
+ <span class='comment'>// added.</span>
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Empty</span>));
+ }
+ <span class='string'>&#39;:&#39;</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>sign</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='ident'>saw_flag</span> {
+ <span class='comment'>// e.g., (?i-:a)</span>
+ <span class='comment'>// Note that if there&#39;s no negation, it&#39;s OK not</span>
+ <span class='comment'>// to see flag, because you end up with a regular</span>
+ <span class='comment'>// non-capturing group: `(?:a)`.</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyFlagNegation</span>));
+ }
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span> {
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>chari</span>: <span class='ident'>opening_chari</span>,
+ <span class='ident'>old_flags</span>: <span class='ident'>old_flags</span>,
+ });
+ }
+ <span class='comment'>// e.g., (?z:a)</span>
+ <span class='ident'>c</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedFlag</span>(<span class='ident'>c</span>))),
+ }
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ }
+ }
+
+ <span class='comment'>// Parses a group name, e.g., `foo` in `(?P&lt;foo&gt;abc)`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `f`</span>
+ <span class='comment'>// End: `a`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_group_name</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='ident'>String</span>::<span class='ident'>new</span>();
+ <span class='kw'>while</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>eof</span>() <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>peek_is</span>(<span class='string'>&#39;&gt;&#39;</span>) {
+ <span class='ident'>name</span>.<span class='ident'>push</span>(<span class='self'>self</span>.<span class='ident'>bump</span>());
+ }
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='comment'>// e.g., (?P&lt;a</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedCaptureName</span>(<span class='ident'>name</span>)));
+ }
+ <span class='kw'>let</span> <span class='ident'>all_valid</span> <span class='op'>=</span> <span class='ident'>name</span>.<span class='ident'>chars</span>().<span class='ident'>all</span>(<span class='ident'>is_valid_capture_char</span>);
+ <span class='kw'>match</span> <span class='ident'>name</span>.<span class='ident'>chars</span>().<span class='ident'>next</span>() {
+ <span class='comment'>// e.g., (?P&lt;&gt;a)</span>
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyCaptureName</span>)),
+ <span class='prelude-val'>Some</span>(<span class='ident'>c</span>) <span class='kw'>if</span> (<span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='string'>&#39;0&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='string'>&#39;9&#39;</span>) <span class='op'>||</span> <span class='op'>!</span><span class='ident'>all_valid</span> <span class='op'>=&gt;</span> {
+ <span class='comment'>// e.g., (?P&lt;a#&gt;x)</span>
+ <span class='comment'>// e.g., (?P&lt;1a&gt;x)</span>
+ <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidCaptureName</span>(<span class='ident'>name</span>)))
+ }
+ _ <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='comment'>// for `&gt;`</span>
+ <span class='prelude-val'>Ok</span>(<span class='ident'>name</span>)
+ }
+ }
+ }
+
+ <span class='comment'>// Parses a counted repeition operator, e.g., `a{2,4}?z`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `{`</span>
+ <span class='comment'>// End: `z`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_counted_repeat</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>pop</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterExpectsExpr</span>)); <span class='comment'>// e.g., ({5}</span>
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>e</span>.<span class='ident'>can_repeat</span>() {
+ <span class='comment'>// e.g., a*{5}</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>e</span>)));
+ }
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>let</span> <span class='ident'>min</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_decimal</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;,&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;}&#39;</span>));
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>max_opt</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>min</span>);
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;,&#39;</span>) {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>peek_is</span>(<span class='string'>&#39;}&#39;</span>) {
+ <span class='ident'>max_opt</span> <span class='op'>=</span> <span class='prelude-val'>None</span>;
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>max</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_decimal</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;}&#39;</span>));
+ <span class='kw'>if</span> <span class='ident'>min</span> <span class='op'>&gt;</span> <span class='ident'>max</span> {
+ <span class='comment'>// e.g., a{2,1}</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidRepeatRange</span> {
+ <span class='ident'>min</span>: <span class='ident'>min</span>,
+ <span class='ident'>max</span>: <span class='ident'>max</span>,
+ }));
+ }
+ <span class='ident'>max_opt</span> <span class='op'>=</span> <span class='prelude-val'>Some</span>(<span class='ident'>max</span>);
+ }
+ }
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;}&#39;</span>) {
+ <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedRepeat</span>))
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>e</span>),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='ident'>min</span>, <span class='ident'>max</span>: <span class='ident'>max_opt</span> },
+ <span class='ident'>greedy</span>: <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;?&#39;</span>) <span class='op'>^</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>swap_greed</span>,
+ }))
+ }
+ }
+
+ <span class='comment'>// Parses a simple repetition operator, e.g., `a+?z`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `+`</span>
+ <span class='comment'>// End: `z`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// N.B. &quot;simple&quot; in this context means &quot;not min/max repetition&quot;,</span>
+ <span class='comment'>// e.g., `a{1,2}`.</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_simple_repeat</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>rep</span>: <span class='ident'>Repeater</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>pop</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterExpectsExpr</span>)); <span class='comment'>// e.g., (*</span>
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>e</span>.<span class='ident'>can_repeat</span>() {
+ <span class='comment'>// e.g., a**</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>e</span>)));
+ }
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>e</span>),
+ <span class='ident'>r</span>: <span class='ident'>rep</span>,
+ <span class='ident'>greedy</span>: <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;?&#39;</span>) <span class='op'>^</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>swap_greed</span>,
+ }))
+ }
+
+ <span class='comment'>// Parses a decimal number until the given character, e.g., `a{123,456}`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `1`</span>
+ <span class='comment'>// End: `,` (where `until == &#39;,&#39;`)</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_decimal</span><span class='op'>&lt;</span><span class='ident'>B</span>: <span class='ident'>Bumpable</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>until</span>: <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>u32</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>bump_get</span>(<span class='ident'>until</span>) {
+ <span class='comment'>// e.g., a{}</span>
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>MissingBase10</span>)),
+ <span class='prelude-val'>Some</span>(<span class='ident'>n</span>) <span class='op'>=&gt;</span> {
+ <span class='comment'>// e.g., a{xyz</span>
+ <span class='comment'>// e.g., a{9999999999}</span>
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>n</span>.<span class='ident'>trim</span>();
+ <span class='ident'>u32</span>::<span class='ident'>from_str_radix</span>(<span class='ident'>n</span>, <span class='number'>10</span>)
+ .<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='ident'>n</span>.<span class='ident'>into</span>())))
+ }
+ }
+ }
+
+ <span class='comment'>// Parses an octal number, up to 3 digits, e.g., `a\123b`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `1`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_octal</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>;
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='number'>0</span>; <span class='comment'>// counter for limiting octal to 3 digits.</span>
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>bump_get</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> { <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span>; <span class='ident'>i</span> <span class='op'>&lt;=</span> <span class='number'>3</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='string'>&#39;0&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='string'>&#39;7&#39;</span> })
+ .<span class='ident'>expect</span>(<span class='string'>&quot;octal string&quot;</span>); <span class='comment'>// guaranteed at least 1 digit</span>
+ <span class='comment'>// I think both of the following unwraps are impossible to fail.</span>
+ <span class='comment'>// We limit it to a three digit octal number, which maxes out at</span>
+ <span class='comment'>// `0777` or `511` in decimal. Since all digits are in `0...7`, we&#39;ll</span>
+ <span class='comment'>// always have a valid `u32` number. Moreover, since all numbers in</span>
+ <span class='comment'>// the range `0...511` are valid Unicode scalar values, it will always</span>
+ <span class='comment'>// be a valid `char`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Hence, we `unwrap` with reckless abandon.</span>
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>u32</span>::<span class='ident'>from_str_radix</span>(<span class='kw-2'>&amp;</span><span class='ident'>n</span>, <span class='number'>8</span>).<span class='ident'>ok</span>().<span class='ident'>expect</span>(<span class='string'>&quot;valid octal number&quot;</span>);
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> {
+ <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>n</span>).<span class='ident'>expect</span>(<span class='string'>&quot;Unicode scalar value&quot;</span>)],
+ <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span>,
+ }))
+ }
+
+ <span class='comment'>// Parses a hex number, e.g., `a\x5ab`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `5`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// And also, `a\x{2603}b`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `{`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_hex</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;{&#39;</span>) {
+ <span class='self'>self</span>.<span class='ident'>parse_hex_many_digits</span>()
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>parse_hex_two_digits</span>()
+ }
+ }
+
+ <span class='comment'>// Parses a many-digit hex number, e.g., `a\x{2603}b`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `2`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_hex_many_digits</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>;
+
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>bump_get</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;}&#39;</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>.<span class='ident'>into</span>());
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>u32</span>::<span class='ident'>from_str_radix</span>(<span class='kw-2'>&amp;</span><span class='ident'>s</span>, <span class='number'>16</span>)
+ .<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='ident'>s</span>))));
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>n</span>)
+ .<span class='ident'>ok_or</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidScalarValue</span>(<span class='ident'>n</span>))));
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;}&#39;</span>) {
+ <span class='comment'>// e.g., a\x{d</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedHex</span>));
+ }
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> {
+ <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>c</span>],
+ <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span>,
+ }))
+ }
+
+ <span class='comment'>// Parses a two-digit hex number, e.g., `a\x5ab`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `5`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_hex_two_digits</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>char</span>;
+
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>i</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>bump_get</span>(<span class='op'>|</span>_<span class='op'>|</span> { <span class='ident'>i</span> <span class='op'>+=</span> <span class='number'>1</span>; <span class='ident'>i</span> <span class='op'>&lt;=</span> <span class='number'>2</span> }).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>.<span class='ident'>into</span>());
+ <span class='kw'>if</span> <span class='ident'>s</span>.<span class='ident'>len</span>() <span class='op'>&lt;</span> <span class='number'>2</span> {
+ <span class='comment'>// e.g., a\x</span>
+ <span class='comment'>// e.g., a\xf</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedTwoDigitHexEof</span>));
+ }
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='ident'>u32</span>::<span class='ident'>from_str_radix</span>(<span class='kw-2'>&amp;</span><span class='ident'>s</span>, <span class='number'>16</span>)
+ .<span class='ident'>map_err</span>(<span class='op'>|</span>_<span class='op'>|</span> <span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='ident'>s</span>))));
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> {
+ <span class='comment'>// Because 0...255 are all valid Unicode scalar values.</span>
+ <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>char</span>::<span class='ident'>from_u32</span>(<span class='ident'>n</span>).<span class='ident'>expect</span>(<span class='string'>&quot;Unicode scalar value&quot;</span>)],
+ <span class='ident'>casei</span>: <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span>,
+ }))
+ }
+
+ <span class='comment'>// Parses a character class, e.g., `[^a-zA-Z0-9]+`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `[`</span>
+ <span class='comment'>// End: `+`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_class</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='kw'>let</span> <span class='ident'>negated</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;^&#39;</span>);
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>class</span> <span class='op'>=</span> <span class='ident'>CharClass</span>::<span class='ident'>empty</span>();
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;-&#39;</span>) {
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>one</span>(<span class='string'>&#39;-&#39;</span>));
+ }
+ <span class='kw'>loop</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='comment'>// e.g., [a</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>));
+ }
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>cur</span>() {
+ <span class='comment'>// If no ranges have been added, then `]` is the first</span>
+ <span class='comment'>// character (sans, perhaps, the `^` symbol), so it should</span>
+ <span class='comment'>// be interpreted as a `]` instead of a closing class bracket.</span>
+ <span class='string'>&#39;]&#39;</span> <span class='kw'>if</span> <span class='ident'>class</span>.<span class='ident'>len</span>() <span class='op'>&gt;</span> <span class='number'>0</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>bump</span>(); <span class='kw'>break</span> }
+ <span class='string'>&#39;[&#39;</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>maybe_parse_ascii</span>() {
+ <span class='prelude-val'>Some</span>(<span class='ident'>class2</span>) <span class='op'>=&gt;</span> <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>extend</span>(<span class='ident'>class2</span>),
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_class_range</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>class</span>, <span class='string'>&#39;[&#39;</span>))
+ }
+ },
+ <span class='string'>&#39;\\&#39;</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_escape</span>()) {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class2</span>)) <span class='op'>=&gt;</span> {
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>extend</span>(<span class='ident'>class2</span>);
+ }
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>, .. }) <span class='op'>=&gt;</span> {
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_class_range</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>class</span>, <span class='ident'>chars</span>[<span class='number'>0</span>]));
+ }
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>err</span> <span class='op'>=</span> <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>e</span>);
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>err</span>));
+ }
+ <span class='comment'>// Because `parse_escape` can never return `LeftParen`.</span>
+ _ <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ },
+ <span class='ident'>start</span> <span class='op'>=&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_class_range</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>class</span>, <span class='ident'>start</span>));
+ }
+ }
+ }
+ <span class='kw'>if</span> <span class='ident'>negated</span> {
+ <span class='ident'>class</span> <span class='op'>=</span> <span class='ident'>class</span>.<span class='ident'>negate</span>();
+ }
+ <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>.<span class='ident'>canonicalize</span>())))
+ }
+
+ <span class='comment'>// Parses a single range in a character class.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Since this is a helper for `parse_class`, its signature sticks out.</span>
+ <span class='comment'>// Namely, it requires the start character of the range and the char</span>
+ <span class='comment'>// class to mutate.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// e.g., `[a-z]`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `-` (with start == `a`)</span>
+ <span class='comment'>// End: `]`</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_class_range</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>class</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>CharClass</span>, <span class='ident'>start</span>: <span class='ident'>char</span>)
+ <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>()<span class='op'>&gt;</span> {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;-&#39;</span>) {
+ <span class='comment'>// Not a range, so just push a singleton range.</span>
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>one</span>(<span class='ident'>start</span>));
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(());
+ }
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='comment'>// e.g., [a-</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>));
+ }
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>peek_is</span>(<span class='string'>&#39;]&#39;</span>) {
+ <span class='comment'>// This is the end of the class, so we permit use of `-` as a</span>
+ <span class='comment'>// regular char (just like we do in the beginning).</span>
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>one</span>(<span class='ident'>start</span>));
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>one</span>(<span class='string'>&#39;-&#39;</span>));
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(());
+ }
+
+ <span class='comment'>// We have a real range. Just need to check to parse literal and</span>
+ <span class='comment'>// make sure it&#39;s a valid range.</span>
+ <span class='kw'>let</span> <span class='ident'>end</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>cur</span>() {
+ <span class='string'>&#39;\\&#39;</span> <span class='op'>=&gt;</span> <span class='kw'>match</span> <span class='macro'>try</span><span class='macro'>!</span>(<span class='self'>self</span>.<span class='ident'>parse_escape</span>()) {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>, .. }) <span class='op'>=&gt;</span> <span class='ident'>chars</span>[<span class='number'>0</span>],
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>) <span class='op'>=&gt;</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>e</span>)));
+ }
+ <span class='comment'>// Because `parse_escape` can never return `LeftParen`.</span>
+ _ <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ },
+ _ <span class='op'>=&gt;</span> <span class='self'>self</span>.<span class='ident'>bump</span>(),
+ };
+ <span class='kw'>if</span> <span class='ident'>end</span> <span class='op'>&lt;</span> <span class='ident'>start</span> {
+ <span class='comment'>// e.g., [z-a]</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassRange</span> {
+ <span class='ident'>start</span>: <span class='ident'>start</span>,
+ <span class='ident'>end</span>: <span class='ident'>end</span>,
+ }));
+ }
+ <span class='ident'>class</span>.<span class='ident'>ranges</span>.<span class='ident'>push</span>(<span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>start</span>, <span class='ident'>end</span>));
+ <span class='prelude-val'>Ok</span>(())
+ }
+
+ <span class='comment'>// Parses an ASCII class, e.g., `[:alnum:]+`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `[`</span>
+ <span class='comment'>// End: `+`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Also supports negation, e.g., `[:^alnum:]`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This parsing routine is distinct from the others in that it doesn&#39;t</span>
+ <span class='comment'>// actually report any errors. Namely, if it fails, then the parser should</span>
+ <span class='comment'>// fall back to parsing a regular class.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This method will only make progress in the parser if it succeeds.</span>
+ <span class='comment'>// Otherwise, the input remains where it started.</span>
+ <span class='kw'>fn</span> <span class='ident'>maybe_parse_ascii</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CharClass</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>parse</span>(<span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='ident'>Parser</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CharClass</span><span class='op'>&gt;</span> {
+ <span class='ident'>p</span>.<span class='ident'>bump</span>(); <span class='comment'>// the `[`</span>
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>p</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;:&#39;</span>) { <span class='kw'>return</span> <span class='prelude-val'>None</span>; }
+ <span class='kw'>let</span> <span class='ident'>negate</span> <span class='op'>=</span> <span class='ident'>p</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;^&#39;</span>);
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span> <span class='kw'>match</span> <span class='ident'>p</span>.<span class='ident'>bump_get</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;:&#39;</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>None</span>,
+ <span class='prelude-val'>Some</span>(<span class='ident'>name</span>) <span class='op'>=&gt;</span> <span class='ident'>name</span>,
+ };
+ <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>p</span>.<span class='ident'>bump_if</span>(<span class='string'>&quot;:]&quot;</span>) { <span class='kw'>return</span> <span class='prelude-val'>None</span>; }
+ <span class='ident'>ascii_class</span>(<span class='kw-2'>&amp;</span><span class='ident'>name</span>).<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='kw'>if</span> <span class='op'>!</span><span class='ident'>negate</span> { <span class='ident'>c</span> } <span class='kw'>else</span> { <span class='ident'>c</span>.<span class='ident'>negate</span>() })
+ }
+ <span class='kw'>let</span> <span class='ident'>start</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>chari</span>;
+ <span class='kw'>match</span> <span class='ident'>parse</span>(<span class='self'>self</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> { <span class='self'>self</span>.<span class='ident'>chari</span> <span class='op'>=</span> <span class='ident'>start</span>; <span class='prelude-val'>None</span> }
+ <span class='ident'>result</span> <span class='op'>=&gt;</span> <span class='ident'>result</span>,
+ }
+ }
+
+ <span class='comment'>// Parses a Uncode class name, e.g., `a\pLb`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `L`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// And also, `a\p{Greek}b`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Start: `{`</span>
+ <span class='comment'>// End: `b`</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// `negate` is true when the class name is used with `\P`.</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_unicode_class</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>neg</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>CharClass</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>name</span> <span class='op'>=</span>
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;{&#39;</span>) {
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>bump_get</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>!=</span> <span class='string'>&#39;}&#39;</span>).<span class='ident'>unwrap_or</span>(<span class='string'>&quot;&quot;</span>.<span class='ident'>into</span>());
+ <span class='kw'>if</span> <span class='ident'>n</span>.<span class='ident'>is_empty</span>() <span class='op'>||</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>bump_if</span>(<span class='string'>&#39;}&#39;</span>) {
+ <span class='comment'>// e.g., \p{Greek</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedUnicodeName</span>));
+ }
+ <span class='ident'>n</span>
+ } <span class='kw'>else</span> {
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>eof</span>() {
+ <span class='comment'>// e.g., \p</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedEscapeEof</span>));
+ }
+ <span class='self'>self</span>.<span class='ident'>bump</span>().<span class='ident'>to_string</span>()
+ };
+ <span class='kw'>match</span> <span class='ident'>unicode_class</span>(<span class='kw-2'>&amp;</span><span class='ident'>name</span>) {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedUnicodeClass</span>(<span class='ident'>name</span>))),
+ <span class='prelude-val'>Some</span>(<span class='ident'>cls</span>) <span class='op'>=&gt;</span> <span class='kw'>if</span> <span class='ident'>neg</span> { <span class='prelude-val'>Ok</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>()) } <span class='kw'>else</span> { <span class='prelude-val'>Ok</span>(<span class='ident'>cls</span>) },
+ }
+ }
+
+ <span class='comment'>// Parses a perl character class with Unicode support.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// `name` must be one of d, s, w, D, S, W. If not, this function panics.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// No parser state is changed.</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_perl_class</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>name</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>use</span> <span class='ident'>unicode</span>::<span class='ident'>regex</span>::{<span class='ident'>PERLD</span>, <span class='ident'>PERLS</span>, <span class='ident'>PERLW</span>};
+ <span class='kw'>match</span> <span class='ident'>name</span> {
+ <span class='string'>&#39;d&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLD</span>),
+ <span class='string'>&#39;D&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>(),
+ <span class='string'>&#39;s&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLS</span>),
+ <span class='string'>&#39;S&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLS</span>).<span class='ident'>negate</span>(),
+ <span class='string'>&#39;w&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLW</span>),
+ <span class='string'>&#39;W&#39;</span> <span class='op'>=&gt;</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>PERLW</span>).<span class='ident'>negate</span>(),
+ _ <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ }
+ }
+
+ <span class='comment'>// Always bump to the next input and return the given expression as a</span>
+ <span class='comment'>// `Build`.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This is mostly for convenience when the surrounding context implies</span>
+ <span class='comment'>// that the next character corresponds to the given expression.</span>
+ <span class='kw'>fn</span> <span class='ident'>parse_one</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>e</span>: <span class='ident'>Expr</span>) <span class='op'>-&gt;</span> <span class='ident'>Build</span> {
+ <span class='self'>self</span>.<span class='ident'>bump</span>();
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>)
+ }
+}
+
+<span class='comment'>// Auxiliary helper methods.</span>
+<span class='kw'>impl</span> <span class='ident'>Parser</span> {
+ <span class='kw'>fn</span> <span class='ident'>chars</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>Chars</span> {
+ <span class='ident'>Chars</span>::<span class='ident'>new</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>.<span class='ident'>chars</span>[<span class='self'>self</span>.<span class='ident'>chari</span>..], <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>ignore_space</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>bump</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>cur</span>();
+ <span class='self'>self</span>.<span class='ident'>chari</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>chari</span>, <span class='self'>self</span>.<span class='ident'>chars</span>().<span class='ident'>next_count</span>());
+ <span class='ident'>c</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>cur</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> { <span class='self'>self</span>.<span class='ident'>chars</span>().<span class='ident'>next</span>().<span class='ident'>unwrap</span>() }
+
+ <span class='kw'>fn</span> <span class='ident'>eof</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> { <span class='self'>self</span>.<span class='ident'>chars</span>().<span class='ident'>next</span>().<span class='ident'>is_none</span>() }
+
+ <span class='kw'>fn</span> <span class='ident'>bump_get</span><span class='op'>&lt;</span><span class='ident'>B</span>: <span class='ident'>Bumpable</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>match_end</span>(<span class='self'>self</span>);
+ <span class='kw'>if</span> <span class='ident'>n</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='prelude-val'>None</span>
+ } <span class='kw'>else</span> {
+ <span class='kw'>let</span> <span class='ident'>end</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>chari</span>, <span class='ident'>n</span>);
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>chars</span>[<span class='self'>self</span>.<span class='ident'>chari</span>..<span class='ident'>end</span>]
+ .<span class='ident'>iter</span>().<span class='ident'>cloned</span>().<span class='ident'>collect</span>::<span class='op'>&lt;</span><span class='ident'>String</span><span class='op'>&gt;</span>();
+ <span class='self'>self</span>.<span class='ident'>chari</span> <span class='op'>=</span> <span class='ident'>end</span>;
+ <span class='prelude-val'>Some</span>(<span class='ident'>s</span>)
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>bump_if</span><span class='op'>&lt;</span><span class='ident'>B</span>: <span class='ident'>Bumpable</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>s</span>: <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>let</span> <span class='ident'>n</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>match_end</span>(<span class='self'>self</span>);
+ <span class='kw'>if</span> <span class='ident'>n</span> <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='boolval'>false</span>
+ } <span class='kw'>else</span> {
+ <span class='self'>self</span>.<span class='ident'>chari</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>chari</span>, <span class='ident'>n</span>);
+ <span class='boolval'>true</span>
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>peek_is</span><span class='op'>&lt;</span><span class='ident'>B</span>: <span class='ident'>Bumpable</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>s</span>: <span class='ident'>B</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>s</span>.<span class='ident'>match_end</span>(<span class='self'>self</span>) <span class='op'>&gt;</span> <span class='number'>0</span>
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>err</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>kind</span>: <span class='ident'>ErrorKind</span>) <span class='op'>-&gt;</span> <span class='ident'>Error</span> {
+ <span class='self'>self</span>.<span class='ident'>errat</span>(<span class='self'>self</span>.<span class='ident'>chari</span>, <span class='ident'>kind</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>errat</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>pos</span>: <span class='ident'>usize</span>, <span class='ident'>kind</span>: <span class='ident'>ErrorKind</span>) <span class='op'>-&gt;</span> <span class='ident'>Error</span> {
+ <span class='ident'>Error</span> { <span class='ident'>pos</span>: <span class='ident'>pos</span>, <span class='ident'>surround</span>: <span class='self'>self</span>.<span class='ident'>windowat</span>(<span class='ident'>pos</span>), <span class='ident'>kind</span>: <span class='ident'>kind</span> }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>windowat</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>pos</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>String</span> {
+ <span class='kw'>let</span> <span class='ident'>s</span> <span class='op'>=</span> <span class='ident'>max</span>(<span class='number'>5</span>, <span class='ident'>pos</span>) <span class='op'>-</span> <span class='number'>5</span>;
+ <span class='kw'>let</span> <span class='ident'>e</span> <span class='op'>=</span> <span class='ident'>min</span>(<span class='self'>self</span>.<span class='ident'>chars</span>.<span class='ident'>len</span>(), <span class='ident'>checkadd</span>(<span class='ident'>pos</span>, <span class='number'>5</span>));
+ <span class='self'>self</span>.<span class='ident'>chars</span>[<span class='ident'>s</span>..<span class='ident'>e</span>].<span class='ident'>iter</span>().<span class='ident'>cloned</span>().<span class='ident'>collect</span>()
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>pop</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>expected</span>: <span class='ident'>ErrorKind</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>pop</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>|</span> <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span>{..}) <span class='op'>=&gt;</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>expected</span>)),
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> <span class='prelude-val'>Ok</span>(<span class='ident'>e</span>),
+ }
+ }
+
+ <span class='comment'>// If the current contexts calls for case insensitivity and if the expr</span>
+ <span class='comment'>// given is a character class, do case folding on it and return the new</span>
+ <span class='comment'>// class.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Otherwise, return the expression unchanged.</span>
+ <span class='kw'>fn</span> <span class='ident'>maybe_class_case_fold</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>bexpr</span>: <span class='ident'>Build</span>) <span class='op'>-&gt;</span> <span class='ident'>Build</span> {
+ <span class='kw'>match</span> <span class='ident'>bexpr</span> {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>)) <span class='op'>=&gt;</span> {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>flags</span>.<span class='ident'>casei</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='ident'>cls</span>.<span class='ident'>casei</span> {
+ <span class='ident'>cls</span>.<span class='ident'>case_fold</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>cls</span>
+ }
+ ))
+ }
+ <span class='ident'>bexpr</span> <span class='op'>=&gt;</span> <span class='ident'>bexpr</span>,
+ }
+ }
+}
+
+<span class='kw'>struct</span> <span class='ident'>Chars</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='ident'>chars</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> [<span class='ident'>char</span>],
+ <span class='ident'>cur</span>: <span class='ident'>usize</span>,
+ <span class='ident'>ignore_space</span>: <span class='ident'>bool</span>,
+ <span class='ident'>in_comment</span>: <span class='ident'>bool</span>,
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Iterator</span> <span class='kw'>for</span> <span class='ident'>Chars</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>type</span> <span class='ident'>Item</span> <span class='op'>=</span> <span class='ident'>char</span>;
+ <span class='kw'>fn</span> <span class='ident'>next</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>char</span><span class='op'>&gt;</span> {
+ <span class='self'>self</span>.<span class='ident'>skip</span>();
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>chars</span>.<span class='ident'>len</span>() {
+ <span class='kw'>let</span> <span class='ident'>c</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>chars</span>[<span class='self'>self</span>.<span class='ident'>cur</span>];
+ <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>cur</span>, <span class='number'>1</span>);
+ <span class='prelude-val'>Some</span>(<span class='ident'>c</span>)
+ } <span class='kw'>else</span> {
+ <span class='prelude-val'>None</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Chars</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> {
+ <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>chars</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>char</span>], <span class='ident'>ignore_space</span>: <span class='ident'>bool</span>) <span class='op'>-&gt;</span> <span class='ident'>Chars</span> {
+ <span class='ident'>Chars</span> {
+ <span class='ident'>chars</span>: <span class='ident'>chars</span>,
+ <span class='ident'>cur</span>: <span class='number'>0</span>,
+ <span class='ident'>ignore_space</span>: <span class='ident'>ignore_space</span>,
+ <span class='ident'>in_comment</span>: <span class='boolval'>false</span>,
+ }
+ }
+
+ <span class='doccomment'>/// Skip line comments and whitespace</span>
+ <span class='kw'>fn</span> <span class='ident'>skip</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>ignore_space</span> { <span class='kw'>return</span>; }
+ <span class='kw'>while</span> <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>chars</span>.<span class='ident'>len</span>() {
+ <span class='comment'>// Handle escaping of `#`, i.e. don&#39;t start a comment with `\#`.</span>
+ <span class='kw'>let</span> <span class='ident'>next_cur</span> <span class='op'>=</span> <span class='ident'>checkadd</span>(<span class='self'>self</span>.<span class='ident'>cur</span>, <span class='number'>1</span>);
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>c</span>() <span class='op'>==</span> <span class='string'>&#39;\\&#39;</span>
+ <span class='op'>&amp;&amp;</span> <span class='ident'>next_cur</span> <span class='op'>&lt;</span> <span class='self'>self</span>.<span class='ident'>chars</span>.<span class='ident'>len</span>()
+ <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>chars</span>[<span class='ident'>next_cur</span>] <span class='op'>==</span> <span class='string'>&#39;#&#39;</span>
+ {
+ <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>next_cur</span>;
+ <span class='kw'>break</span>;
+ }
+
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>c</span>() <span class='op'>==</span> <span class='string'>&#39;#&#39;</span> {
+ <span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>=</span> <span class='boolval'>true</span>;
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>&amp;&amp;</span> <span class='self'>self</span>.<span class='ident'>c</span>() <span class='op'>==</span> <span class='string'>&#39;\n&#39;</span> {
+ <span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>=</span> <span class='boolval'>false</span>;
+ }
+
+ <span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>in_comment</span> <span class='op'>||</span> <span class='self'>self</span>.<span class='ident'>c</span>().<span class='ident'>is_whitespace</span>() {
+ <span class='self'>self</span>.<span class='ident'>cur</span> <span class='op'>=</span> <span class='ident'>next_cur</span>;
+ } <span class='kw'>else</span> {
+ <span class='kw'>break</span>;
+ }
+ }
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>c</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>char</span> {
+ <span class='self'>self</span>.<span class='ident'>chars</span>[<span class='self'>self</span>.<span class='ident'>cur</span>]
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>next_count</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='self'>self</span>.<span class='ident'>next</span>();
+ <span class='self'>self</span>.<span class='ident'>cur</span>
+ }
+}
+
+<span class='comment'>// Auxiliary methods for manipulating the expression stack.</span>
+<span class='kw'>impl</span> <span class='ident'>Parser</span> {
+ <span class='comment'>// Called whenever an alternate (`|`) is found.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This pops the expression stack until:</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// 1. The stack is empty. Pushes an alternation with one arm.</span>
+ <span class='comment'>// 2. An opening parenthesis is found. Leave the parenthesis</span>
+ <span class='comment'>// on the stack and push an alternation with one arm.</span>
+ <span class='comment'>// 3. An alternate (`|`) is found. Pop the existing alternation,</span>
+ <span class='comment'>// add an arm and push the modified alternation.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Each &quot;arm&quot; in the above corresponds to the concatenation of all</span>
+ <span class='comment'>// popped expressions.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// In the first two cases, the stack is left in an invalid state</span>
+ <span class='comment'>// because an alternation with one arm is not allowed. This</span>
+ <span class='comment'>// particular state will be detected by `finish_concat` and an</span>
+ <span class='comment'>// error will be reported.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// In none of the cases is an empty arm allowed. If an empty arm</span>
+ <span class='comment'>// is found, an error is reported.</span>
+ <span class='kw'>fn</span> <span class='ident'>alternate</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Build</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>concat</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>let</span> <span class='ident'>alts</span> <span class='op'>=</span> <span class='op'>|</span><span class='ident'>es</span><span class='op'>|</span> <span class='prelude-val'>Ok</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='ident'>es</span>)));
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>pop</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., |a</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>));
+ }
+ <span class='kw'>return</span> <span class='ident'>alts</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>)]);
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>e</span> <span class='kw-2'>@</span> <span class='ident'>Build</span>::<span class='ident'>LeftParen</span>{..}) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., (|a)</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>));
+ }
+ <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>push</span>(<span class='ident'>e</span>);
+ <span class='kw'>return</span> <span class='ident'>alts</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>)]);
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='kw-2'>mut</span> <span class='ident'>es</span>))) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., a||</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>));
+ }
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>));
+ <span class='kw'>return</span> <span class='ident'>alts</span>(<span class='ident'>es</span>);
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> { <span class='ident'>concat</span>.<span class='ident'>push</span>(<span class='ident'>e</span>); }
+ }
+ }
+ }
+
+ <span class='comment'>// Called whenever a closing parenthesis (`)`) is found.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This pops the expression stack until:</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// 1. The stack is empty. An error is reported because this</span>
+ <span class='comment'>// indicates an unopened parenthesis.</span>
+ <span class='comment'>// 2. An opening parenthesis is found. Pop the opening parenthesis</span>
+ <span class='comment'>// and push a `Group` expression.</span>
+ <span class='comment'>// 3. An alternate (`|`) is found. Pop the existing alternation</span>
+ <span class='comment'>// and an arm to it in place. Pop one more item from the stack.</span>
+ <span class='comment'>// If the stack was empty, then report an unopened parenthesis</span>
+ <span class='comment'>// error, otherwise assume it is an opening parenthesis and</span>
+ <span class='comment'>// push a `Group` expression with the popped alternation.</span>
+ <span class='comment'>// (We can assume this is an opening parenthesis because an</span>
+ <span class='comment'>// alternation either corresponds to the entire Regex or it</span>
+ <span class='comment'>// corresponds to an entire group. This is guaranteed by the</span>
+ <span class='comment'>// `alternate` method.)</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Each &quot;arm&quot; in the above corresponds to the concatenation of all</span>
+ <span class='comment'>// popped expressions.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// Empty arms nor empty groups are allowed.</span>
+ <span class='kw'>fn</span> <span class='ident'>close_paren</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(<span class='ident'>Flags</span>, <span class='ident'>Build</span>)<span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>concat</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>pop</span>() {
+ <span class='comment'>// e.g., )</span>
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnopenedParen</span>)),
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span> { <span class='ident'>i</span>, <span class='ident'>name</span>, <span class='ident'>old_flags</span>, .. }) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., ()</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyGroup</span>));
+ }
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>((<span class='ident'>old_flags</span>, <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>)),
+ <span class='ident'>i</span>: <span class='ident'>i</span>,
+ <span class='ident'>name</span>: <span class='ident'>name</span>,
+ })));
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='kw-2'>mut</span> <span class='ident'>es</span>))) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., (a|)</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>));
+ }
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>));
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>pop</span>() {
+ <span class='comment'>// e.g., a|b)</span>
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>UnopenedParen</span>)),
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(_)) <span class='op'>=&gt;</span> <span class='macro'>unreachable</span><span class='macro'>!</span>(),
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span> { <span class='ident'>i</span>, <span class='ident'>name</span>, <span class='ident'>old_flags</span>, .. }) <span class='op'>=&gt;</span> {
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>((<span class='ident'>old_flags</span>, <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='ident'>es</span>)),
+ <span class='ident'>i</span>: <span class='ident'>i</span>,
+ <span class='ident'>name</span>: <span class='ident'>name</span>,
+ })));
+ }
+ }
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> { <span class='ident'>concat</span>.<span class='ident'>push</span>(<span class='ident'>e</span>); }
+ }
+ }
+ }
+
+ <span class='comment'>// Called only when the parser reaches the end of input.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// This pops the expression stack until:</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// 1. The stack is empty. Return concatenation of popped</span>
+ <span class='comment'>// expressions. This concatenation may be empty!</span>
+ <span class='comment'>// 2. An alternation is found. Pop the alternation and push</span>
+ <span class='comment'>// a new arm. Return the alternation as the entire Regex.</span>
+ <span class='comment'>//</span>
+ <span class='comment'>// If an opening parenthesis is popped, then an error is</span>
+ <span class='comment'>// returned since it indicates an unclosed parenthesis.</span>
+ <span class='kw'>fn</span> <span class='ident'>finish_concat</span>(<span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> <span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>concat</span> <span class='op'>=</span> <span class='macro'>vec</span><span class='macro'>!</span>[];
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> <span class='self'>self</span>.<span class='ident'>stack</span>.<span class='ident'>pop</span>() {
+ <span class='prelude-val'>None</span> <span class='op'>=&gt;</span> { <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>)); }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>LeftParen</span>{ <span class='ident'>chari</span>, ..}) <span class='op'>=&gt;</span> {
+ <span class='comment'>// e.g., a(b</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>errat</span>(<span class='ident'>chari</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedParen</span>));
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='kw-2'>mut</span> <span class='ident'>es</span>))) <span class='op'>=&gt;</span> {
+ <span class='kw'>if</span> <span class='ident'>concat</span>.<span class='ident'>is_empty</span>() {
+ <span class='comment'>// e.g., a|</span>
+ <span class='kw'>return</span> <span class='prelude-val'>Err</span>(<span class='self'>self</span>.<span class='ident'>err</span>(<span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>));
+ }
+ <span class='ident'>es</span>.<span class='ident'>push</span>(<span class='ident'>rev_concat</span>(<span class='ident'>concat</span>));
+ <span class='kw'>return</span> <span class='prelude-val'>Ok</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='ident'>es</span>));
+ }
+ <span class='prelude-val'>Some</span>(<span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>e</span>)) <span class='op'>=&gt;</span> { <span class='ident'>concat</span>.<span class='ident'>push</span>(<span class='ident'>e</span>); }
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span> <span class='ident'>Build</span> {
+ <span class='kw'>fn</span> <span class='ident'>is_empty</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='op'>*</span><span class='self'>self</span> {
+ <span class='ident'>Build</span>::<span class='ident'>Expr</span>(<span class='ident'>Expr</span>::<span class='ident'>Empty</span>) <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ }
+ }
+}
+
+<span class='comment'>// Make it ergonomic to conditionally bump the parser.</span>
+<span class='comment'>// i.e., `bump_if(&#39;a&#39;)` or `bump_if(&quot;abc&quot;)`.</span>
+<span class='kw'>trait</span> <span class='ident'>Bumpable</span> {
+ <span class='kw'>fn</span> <span class='ident'>match_end</span>(<span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>Parser</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span>;
+}
+
+<span class='kw'>impl</span> <span class='ident'>Bumpable</span> <span class='kw'>for</span> <span class='ident'>char</span> {
+ <span class='kw'>fn</span> <span class='ident'>match_end</span>(<span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>Parser</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>chars</span> <span class='op'>=</span> <span class='ident'>p</span>.<span class='ident'>chars</span>();
+ <span class='kw'>if</span> <span class='ident'>chars</span>.<span class='ident'>next</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>c</span><span class='op'>|</span> <span class='ident'>c</span> <span class='op'>==</span> <span class='self'>self</span>).<span class='ident'>unwrap_or</span>(<span class='boolval'>false</span>) {
+ <span class='ident'>chars</span>.<span class='ident'>cur</span>
+ } <span class='kw'>else</span> {
+ <span class='number'>0</span>
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span> <span class='ident'>Bumpable</span> <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>str</span> {
+ <span class='kw'>fn</span> <span class='ident'>match_end</span>(<span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>Parser</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>search</span> <span class='op'>=</span> <span class='self'>self</span>.<span class='ident'>chars</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>rest</span> <span class='op'>=</span> <span class='ident'>p</span>.<span class='ident'>chars</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>count</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>loop</span> {
+ <span class='kw'>match</span> (<span class='ident'>rest</span>.<span class='ident'>next</span>(), <span class='ident'>search</span>.<span class='ident'>next</span>()) {
+ (<span class='prelude-val'>Some</span>(<span class='ident'>c1</span>), <span class='prelude-val'>Some</span>(<span class='ident'>c2</span>)) <span class='kw'>if</span> <span class='ident'>c1</span> <span class='op'>==</span> <span class='ident'>c2</span> <span class='op'>=&gt;</span> <span class='ident'>count</span> <span class='op'>=</span> <span class='ident'>rest</span>.<span class='ident'>cur</span>,
+ (_, <span class='prelude-val'>None</span>) <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='ident'>count</span>,
+ _ <span class='op'>=&gt;</span> <span class='kw'>return</span> <span class='number'>0</span>,
+ }
+ }
+ }
+}
+
+<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>F</span>: <span class='ident'>FnMut</span>(<span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span><span class='op'>&gt;</span> <span class='ident'>Bumpable</span> <span class='kw'>for</span> <span class='ident'>F</span> {
+ <span class='kw'>fn</span> <span class='ident'>match_end</span>(<span class='kw-2'>mut</span> <span class='self'>self</span>, <span class='ident'>p</span>: <span class='kw-2'>&amp;</span><span class='ident'>Parser</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>chars</span> <span class='op'>=</span> <span class='ident'>p</span>.<span class='ident'>chars</span>();
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>count</span> <span class='op'>=</span> <span class='number'>0</span>;
+ <span class='kw'>while</span> <span class='kw'>let</span> <span class='prelude-val'>Some</span>(<span class='ident'>c</span>) <span class='op'>=</span> <span class='ident'>chars</span>.<span class='ident'>next</span>() {
+ <span class='kw'>if</span> <span class='op'>!</span><span class='self'>self</span>(<span class='ident'>c</span>) {
+ <span class='kw'>break</span>
+ }
+ <span class='ident'>count</span> <span class='op'>=</span> <span class='ident'>chars</span>.<span class='ident'>cur</span>;
+ }
+ <span class='ident'>count</span>
+ }
+}
+
+<span class='comment'>// Turn a sequence of expressions into a concatenation.</span>
+<span class='comment'>// This only uses `Concat` if there are 2 or more expressions.</span>
+<span class='kw'>fn</span> <span class='ident'>rev_concat</span>(<span class='kw-2'>mut</span> <span class='ident'>exprs</span>: <span class='ident'>Vec</span><span class='op'>&lt;</span><span class='ident'>Expr</span><span class='op'>&gt;</span>) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> {
+ <span class='kw'>if</span> <span class='ident'>exprs</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>0</span> {
+ <span class='ident'>Expr</span>::<span class='ident'>Empty</span>
+ } <span class='kw'>else</span> <span class='kw'>if</span> <span class='ident'>exprs</span>.<span class='ident'>len</span>() <span class='op'>==</span> <span class='number'>1</span> {
+ <span class='ident'>exprs</span>.<span class='ident'>pop</span>().<span class='ident'>unwrap</span>()
+ } <span class='kw'>else</span> {
+ <span class='ident'>exprs</span>.<span class='ident'>reverse</span>();
+ <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='ident'>exprs</span>)
+ }
+}
+
+<span class='comment'>// Returns true if and only if the given character is allowed in a capture</span>
+<span class='comment'>// name. Note that the first char of a capture name must not be numeric.</span>
+<span class='kw'>fn</span> <span class='ident'>is_valid_capture_char</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='ident'>c</span> <span class='op'>==</span> <span class='string'>&#39;_&#39;</span> <span class='op'>||</span> (<span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='string'>&#39;0&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='string'>&#39;9&#39;</span>)
+ <span class='op'>||</span> (<span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='string'>&#39;a&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='string'>&#39;z&#39;</span>) <span class='op'>||</span> (<span class='ident'>c</span> <span class='op'>&gt;=</span> <span class='string'>&#39;A&#39;</span> <span class='op'>&amp;&amp;</span> <span class='ident'>c</span> <span class='op'>&lt;=</span> <span class='string'>&#39;Z&#39;</span>)
+}
+
+<span class='doccomment'>/// Returns true if the give character has significance in a regex.</span>
+<span class='attribute'>#[<span class='ident'>doc</span>(<span class='ident'>hidden</span>)]</span>
+<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>is_punct</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>bool</span> {
+ <span class='kw'>match</span> <span class='ident'>c</span> {
+ <span class='string'>&#39;\\&#39;</span> <span class='op'>|</span> <span class='string'>&#39;.&#39;</span> <span class='op'>|</span> <span class='string'>&#39;+&#39;</span> <span class='op'>|</span> <span class='string'>&#39;*&#39;</span> <span class='op'>|</span> <span class='string'>&#39;?&#39;</span> <span class='op'>|</span> <span class='string'>&#39;(&#39;</span> <span class='op'>|</span> <span class='string'>&#39;)&#39;</span> <span class='op'>|</span> <span class='string'>&#39;|&#39;</span> <span class='op'>|</span>
+ <span class='string'>&#39;[&#39;</span> <span class='op'>|</span> <span class='string'>&#39;]&#39;</span> <span class='op'>|</span> <span class='string'>&#39;{&#39;</span> <span class='op'>|</span> <span class='string'>&#39;}&#39;</span> <span class='op'>|</span> <span class='string'>&#39;^&#39;</span> <span class='op'>|</span> <span class='string'>&#39;$&#39;</span> <span class='op'>|</span> <span class='string'>&#39;#&#39;</span> <span class='op'>=&gt;</span> <span class='boolval'>true</span>,
+ _ <span class='op'>=&gt;</span> <span class='boolval'>false</span>,
+ }
+}
+
+<span class='kw'>fn</span> <span class='ident'>checkadd</span>(<span class='ident'>x</span>: <span class='ident'>usize</span>, <span class='ident'>y</span>: <span class='ident'>usize</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span> {
+ <span class='ident'>x</span>.<span class='ident'>checked_add</span>(<span class='ident'>y</span>).<span class='ident'>expect</span>(<span class='string'>&quot;regex length overflow&quot;</span>)
+}
+
+<span class='kw'>fn</span> <span class='ident'>unicode_class</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CharClass</span><span class='op'>&gt;</span> {
+ <span class='ident'>UNICODE_CLASSES</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, _)<span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>cmp</span>(<span class='ident'>name</span>)).<span class='ident'>ok</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>i</span><span class='op'>|</span> {
+ <span class='ident'>raw_class_to_expr</span>(<span class='ident'>UNICODE_CLASSES</span>[<span class='ident'>i</span>].<span class='number'>1</span>)
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>ascii_class</span>(<span class='ident'>name</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>CharClass</span><span class='op'>&gt;</span> {
+ <span class='ident'>ASCII_CLASSES</span>.<span class='ident'>binary_search_by</span>(<span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, _)<span class='op'>|</span> <span class='ident'>s</span>.<span class='ident'>cmp</span>(<span class='ident'>name</span>)).<span class='ident'>ok</span>().<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>i</span><span class='op'>|</span> {
+ <span class='ident'>raw_class_to_expr</span>(<span class='ident'>ASCII_CLASSES</span>[<span class='ident'>i</span>].<span class='number'>1</span>)
+ })
+}
+
+<span class='kw'>fn</span> <span class='ident'>raw_class_to_expr</span>(<span class='ident'>raw</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='ident'>range</span> <span class='op'>=</span> <span class='op'>|</span><span class='kw-2'>&amp;</span>(<span class='ident'>s</span>, <span class='ident'>e</span>)<span class='op'>|</span> <span class='ident'>ClassRange</span> { <span class='ident'>start</span>: <span class='ident'>s</span>, <span class='ident'>end</span>: <span class='ident'>e</span> };
+ <span class='ident'>CharClass</span>::<span class='ident'>new</span>(<span class='ident'>raw</span>.<span class='ident'>iter</span>().<span class='ident'>map</span>(<span class='ident'>range</span>).<span class='ident'>collect</span>())
+}
+
+<span class='kw'>type</span> <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [(<span class='ident'>char</span>, <span class='ident'>char</span>)];
+<span class='kw'>type</span> <span class='ident'>NamedClasses</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [(<span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> <span class='ident'>str</span>, <span class='ident'>Class</span>)];
+
+<span class='kw'>const</span> <span class='ident'>ASCII_CLASSES</span>: <span class='ident'>NamedClasses</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[
+ <span class='comment'>// Classes must be in alphabetical order so that bsearch works.</span>
+ <span class='comment'>// [:alnum:] alphanumeric (== [0-9A-Za-z])</span>
+ <span class='comment'>// [:alpha:] alphabetic (== [A-Za-z])</span>
+ <span class='comment'>// [:ascii:] ASCII (== [\x00-\x7F])</span>
+ <span class='comment'>// [:blank:] blank (== [\t ])</span>
+ <span class='comment'>// [:cntrl:] control (== [\x00-\x1F\x7F])</span>
+ <span class='comment'>// [:digit:] digits (== [0-9])</span>
+ <span class='comment'>// [:graph:] graphical (== [!-~])</span>
+ <span class='comment'>// [:lower:] lower case (== [a-z])</span>
+ <span class='comment'>// [:print:] printable (== [ -~] == [ [:graph:]])</span>
+ <span class='comment'>// [:punct:] punctuation (== [!-/:-@[-`{-~])</span>
+ <span class='comment'>// [:space:] whitespace (== [\t\n\v\f\r ])</span>
+ <span class='comment'>// [:upper:] upper case (== [A-Z])</span>
+ <span class='comment'>// [:word:] word characters (== [0-9A-Za-z_])</span>
+ <span class='comment'>// [:xdigit:] hex digit (== [0-9A-Fa-f])</span>
+ <span class='comment'>// Taken from: http://golang.org/pkg/regex/syntax/</span>
+ (<span class='string'>&quot;alnum&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>ALNUM</span>),
+ (<span class='string'>&quot;alpha&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>ALPHA</span>),
+ (<span class='string'>&quot;ascii&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>ASCII</span>),
+ (<span class='string'>&quot;blank&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>BLANK</span>),
+ (<span class='string'>&quot;cntrl&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>CNTRL</span>),
+ (<span class='string'>&quot;digit&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>DIGIT</span>),
+ (<span class='string'>&quot;graph&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>GRAPH</span>),
+ (<span class='string'>&quot;lower&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>LOWER</span>),
+ (<span class='string'>&quot;print&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>PRINT</span>),
+ (<span class='string'>&quot;punct&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>PUNCT</span>),
+ (<span class='string'>&quot;space&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>SPACE</span>),
+ (<span class='string'>&quot;upper&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>UPPER</span>),
+ (<span class='string'>&quot;word&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>WORD</span>),
+ (<span class='string'>&quot;xdigit&quot;</span>, <span class='kw-2'>&amp;</span><span class='ident'>XDIGIT</span>),
+];
+
+<span class='kw'>const</span> <span class='ident'>ALNUM</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;0&#39;</span>, <span class='string'>&#39;9&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>ALPHA</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>ASCII</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x7F&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>BLANK</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39; &#39;</span>, <span class='string'>&#39; &#39;</span>), (<span class='string'>&#39;\t&#39;</span>, <span class='string'>&#39;\t&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>CNTRL</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x1F&#39;</span>), (<span class='string'>&#39;\x7F&#39;</span>, <span class='string'>&#39;\x7F&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>DIGIT</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;0&#39;</span>, <span class='string'>&#39;9&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>GRAPH</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;!&#39;</span>, <span class='string'>&#39;~&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>LOWER</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>PRINT</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39; &#39;</span>, <span class='string'>&#39;~&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>PUNCT</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;!&#39;</span>, <span class='string'>&#39;/&#39;</span>), (<span class='string'>&#39;:&#39;</span>, <span class='string'>&#39;@&#39;</span>), (<span class='string'>&#39;[&#39;</span>, <span class='string'>&#39;`&#39;</span>), (<span class='string'>&#39;{&#39;</span>, <span class='string'>&#39;~&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>SPACE</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\t&#39;</span>, <span class='string'>&#39;\t&#39;</span>), (<span class='string'>&#39;\n&#39;</span>, <span class='string'>&#39;\n&#39;</span>), (<span class='string'>&#39;\x0B&#39;</span>, <span class='string'>&#39;\x0B&#39;</span>),
+ (<span class='string'>&#39;\x0C&#39;</span>, <span class='string'>&#39;\x0C&#39;</span>), (<span class='string'>&#39;\r&#39;</span>, <span class='string'>&#39;\r&#39;</span>), (<span class='string'>&#39; &#39;</span>, <span class='string'>&#39; &#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>UPPER</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>WORD</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;0&#39;</span>, <span class='string'>&#39;9&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;Z&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>), (<span class='string'>&#39;_&#39;</span>, <span class='string'>&#39;_&#39;</span>)];
+<span class='kw'>const</span> <span class='ident'>XDIGIT</span>: <span class='ident'>Class</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;0&#39;</span>, <span class='string'>&#39;9&#39;</span>), (<span class='string'>&#39;A&#39;</span>, <span class='string'>&#39;F&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;f&#39;</span>)];
+
+<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>test</span>)]</span>
+<span class='kw'>mod</span> <span class='ident'>tests</span> {
+ <span class='kw'>use</span> { <span class='ident'>CharClass</span>, <span class='ident'>ClassRange</span>, <span class='ident'>Expr</span>, <span class='ident'>Repeater</span>, <span class='ident'>ErrorKind</span> };
+ <span class='kw'>use</span> <span class='ident'>unicode</span>::<span class='ident'>regex</span>::{<span class='ident'>PERLD</span>, <span class='ident'>PERLS</span>, <span class='ident'>PERLW</span>};
+ <span class='kw'>use</span> <span class='ident'>super</span>::<span class='ident'>Parser</span>;
+ <span class='kw'>use</span> <span class='ident'>super</span>::{<span class='ident'>LOWER</span>, <span class='ident'>UPPER</span>};
+
+ <span class='kw'>static</span> <span class='ident'>YI</span>: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;static</span> [(<span class='ident'>char</span>, <span class='ident'>char</span>)] <span class='op'>=</span> <span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{a000}&#39;</span>, <span class='string'>&#39;\u{a48c}&#39;</span>), (<span class='string'>&#39;\u{a490}&#39;</span>, <span class='string'>&#39;\u{a4c6}&#39;</span>),
+ ];
+
+ <span class='kw'>fn</span> <span class='ident'>p</span>(<span class='ident'>s</span>: <span class='kw-2'>&amp;</span><span class='ident'>str</span>) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> { <span class='ident'>Parser</span>::<span class='ident'>parse</span>(<span class='ident'>s</span>).<span class='ident'>unwrap</span>() }
+ <span class='kw'>fn</span> <span class='ident'>lit</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> { <span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>c</span>], <span class='ident'>casei</span>: <span class='boolval'>false</span> } }
+ <span class='kw'>fn</span> <span class='ident'>liti</span>(<span class='ident'>c</span>: <span class='ident'>char</span>) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> { <span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>c</span>], <span class='ident'>casei</span>: <span class='boolval'>true</span> } }
+ <span class='kw'>fn</span> <span class='ident'>b</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>v</span>: <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>Box</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> { <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>v</span>) }
+ <span class='kw'>fn</span> <span class='ident'>c</span>(<span class='ident'>es</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>Expr</span>]) <span class='op'>-&gt;</span> <span class='ident'>Expr</span> { <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='ident'>es</span>.<span class='ident'>to_vec</span>()) }
+
+ <span class='kw'>fn</span> <span class='ident'>class</span>(<span class='ident'>ranges</span>: <span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='ident'>ranges</span> <span class='op'>=</span> <span class='ident'>ranges</span>.<span class='ident'>iter</span>().<span class='ident'>cloned</span>()
+ .<span class='ident'>map</span>(<span class='op'>|</span>(<span class='ident'>c1</span>, <span class='ident'>c2</span>)<span class='op'>|</span> <span class='ident'>ClassRange</span>::<span class='ident'>new</span>(<span class='ident'>c1</span>, <span class='ident'>c2</span>)).<span class='ident'>collect</span>();
+ <span class='ident'>CharClass</span>::<span class='ident'>new</span>(<span class='ident'>ranges</span>)
+ }
+
+ <span class='kw'>fn</span> <span class='ident'>classes</span>(<span class='ident'>classes</span>: <span class='kw-2'>&amp;</span>[<span class='kw-2'>&amp;</span>[(<span class='ident'>char</span>, <span class='ident'>char</span>)]]) <span class='op'>-&gt;</span> <span class='ident'>CharClass</span> {
+ <span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>CharClass</span>::<span class='ident'>empty</span>();
+ <span class='kw'>for</span> <span class='kw-2'>&amp;</span><span class='ident'>ranges</span> <span class='kw'>in</span> <span class='ident'>classes</span> {
+ <span class='ident'>cls</span>.<span class='ident'>ranges</span>.<span class='ident'>extend</span>(<span class='ident'>class</span>(<span class='ident'>ranges</span>));
+ }
+ <span class='ident'>cls</span>.<span class='ident'>canonicalize</span>()
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>empty</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Empty</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>literal</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a&quot;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>literal_string</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;ab&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>start_literal</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;^a&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>StartText</span>,
+ <span class='ident'>Expr</span>::<span class='ident'>Literal</span> { <span class='ident'>chars</span>: <span class='macro'>vec</span><span class='macro'>!</span>[<span class='string'>&#39;a&#39;</span>], <span class='ident'>casei</span>: <span class='boolval'>false</span> },
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_zero_or_one_greedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrOne</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_zero_or_one_greedy_concat</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;ab?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrOne</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ },
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_zero_or_one_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a??&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrOne</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_one_or_more_greedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a+&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>OneOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_one_or_more_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a+?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>OneOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_zero_or_more_greedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a*&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_zero_or_more_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a*?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_exact</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>5</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_min</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5,}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>None</span> },
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_min_max</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5,10}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>10</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_exact_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5}?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>5</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_min_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5,}?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>None</span> },
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_min_max_nongreedy</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{5,10}?&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>10</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>repeat_counted_whitespace</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{ 5 }&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>5</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a{ 5 , 10 }&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>Range</span> { <span class='ident'>min</span>: <span class='number'>5</span>, <span class='ident'>max</span>: <span class='prelude-val'>Some</span>(<span class='number'>10</span>) },
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_literal</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(a)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_literal_concat</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(ab)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_two</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a|b&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_many</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;a|b|c&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_many_concat</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;ab|bc|cd&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)]),
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>)]),
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;d&#39;</span>)]),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_group_two</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(a|b)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_group_many</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(a|b|c)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>)])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_group_many_concat</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(ab|bc|cd)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)]),
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>)]),
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;d&#39;</span>)]),
+ ])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>alt_group_nested</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(ab|(bc|(cd)))&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>)]),
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>)]),
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;d&#39;</span>)])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>3</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ }
+ ])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>2</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ ])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_name</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?P&lt;foo&gt;a)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>Some</span>(<span class='string'>&quot;foo&quot;</span>.<span class='ident'>into</span>()),
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_no_capture</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?:a)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_flags</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i:a)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_flags_returned</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i:a)a&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>group_flags_retained</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)(?-i:a)a&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)a&quot;</span>), <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline_multiple</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?is)a.&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>Expr</span>::<span class='ident'>AnyChar</span>]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline_multiline</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?m)^(?-m)$&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>Expr</span>::<span class='ident'>StartLine</span>, <span class='ident'>Expr</span>::<span class='ident'>EndText</span>]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline_swap_greed</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?U)a*a*?(?i-U)a*a*?&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ },
+ <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ },
+ <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ },
+ <span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>false</span>,
+ },
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline_multiple_negate_one</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?is)a.(?i-s)a.&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>Expr</span>::<span class='ident'>AnyChar</span>, <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>Expr</span>::<span class='ident'>AnyCharNoNL</span>,
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_inline_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)a(?-i)a&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_group_inline</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(a(?i)a)a&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>)])),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>flags_group_inline_retain</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)((?-i)a)a&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ <span class='ident'>liti</span>(<span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_simple</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\a\f\t\n\r\v&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;\x07&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;\x0C&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;\t&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;\n&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;\r&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;\x0B&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_boundaries</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\A\z\b\B&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>StartText</span>, <span class='ident'>Expr</span>::<span class='ident'>EndText</span>,
+ <span class='ident'>Expr</span>::<span class='ident'>WordBoundary</span>, <span class='ident'>Expr</span>::<span class='ident'>NotWordBoundary</span>,
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_punctuation</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\\\.\+\*\?\(\)\|\[\]\{\}\^\$\#&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;\\&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;.&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;+&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;*&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;?&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;(&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;)&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;|&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;[&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;]&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;{&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;}&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;^&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;$&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;#&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_octal</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\123&quot;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\1234&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;4&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_hex2</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\x53&quot;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\x534&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;4&#39;</span>)]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_hex</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\x{53}&quot;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\x{53}4&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>lit</span>(<span class='string'>&#39;S&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;4&#39;</span>)]));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\x{2603}&quot;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;\u{2603}&#39;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_name</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\p{Yi}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_letter</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\pZ&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{20}&#39;</span>, <span class='string'>&#39;\u{20}&#39;</span>), (<span class='string'>&#39;\u{a0}&#39;</span>, <span class='string'>&#39;\u{a0}&#39;</span>),
+ (<span class='string'>&#39;\u{1680}&#39;</span>, <span class='string'>&#39;\u{1680}&#39;</span>), (<span class='string'>&#39;\u{2000}&#39;</span>, <span class='string'>&#39;\u{200a}&#39;</span>),
+ (<span class='string'>&#39;\u{2028}&#39;</span>, <span class='string'>&#39;\u{2029}&#39;</span>), (<span class='string'>&#39;\u{202f}&#39;</span>, <span class='string'>&#39;\u{202f}&#39;</span>),
+ (<span class='string'>&#39;\u{205f}&#39;</span>, <span class='string'>&#39;\u{205f}&#39;</span>), (<span class='string'>&#39;\u{3000}&#39;</span>, <span class='string'>&#39;\u{3000}&#39;</span>),
+ ])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_name_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\p{Yi}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_letter_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\pZ&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{20}&#39;</span>, <span class='string'>&#39;\u{20}&#39;</span>), (<span class='string'>&#39;\u{a0}&#39;</span>, <span class='string'>&#39;\u{a0}&#39;</span>),
+ (<span class='string'>&#39;\u{1680}&#39;</span>, <span class='string'>&#39;\u{1680}&#39;</span>), (<span class='string'>&#39;\u{2000}&#39;</span>, <span class='string'>&#39;\u{200a}&#39;</span>),
+ (<span class='string'>&#39;\u{2028}&#39;</span>, <span class='string'>&#39;\u{2029}&#39;</span>), (<span class='string'>&#39;\u{202f}&#39;</span>, <span class='string'>&#39;\u{202f}&#39;</span>),
+ (<span class='string'>&#39;\u{205f}&#39;</span>, <span class='string'>&#39;\u{205f}&#39;</span>), (<span class='string'>&#39;\u{3000}&#39;</span>, <span class='string'>&#39;\u{3000}&#39;</span>),
+ ]).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_name_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\P{Yi}&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_letter_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\PZ&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{20}&#39;</span>, <span class='string'>&#39;\u{20}&#39;</span>), (<span class='string'>&#39;\u{a0}&#39;</span>, <span class='string'>&#39;\u{a0}&#39;</span>),
+ (<span class='string'>&#39;\u{1680}&#39;</span>, <span class='string'>&#39;\u{1680}&#39;</span>), (<span class='string'>&#39;\u{2000}&#39;</span>, <span class='string'>&#39;\u{200a}&#39;</span>),
+ (<span class='string'>&#39;\u{2028}&#39;</span>, <span class='string'>&#39;\u{2029}&#39;</span>), (<span class='string'>&#39;\u{202f}&#39;</span>, <span class='string'>&#39;\u{202f}&#39;</span>),
+ (<span class='string'>&#39;\u{205f}&#39;</span>, <span class='string'>&#39;\u{205f}&#39;</span>), (<span class='string'>&#39;\u{3000}&#39;</span>, <span class='string'>&#39;\u{3000}&#39;</span>),
+ ]).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_name_negate_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\P{Yi}&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_unicode_letter_negate_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\PZ&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\u{20}&#39;</span>, <span class='string'>&#39;\u{20}&#39;</span>), (<span class='string'>&#39;\u{a0}&#39;</span>, <span class='string'>&#39;\u{a0}&#39;</span>),
+ (<span class='string'>&#39;\u{1680}&#39;</span>, <span class='string'>&#39;\u{1680}&#39;</span>), (<span class='string'>&#39;\u{2000}&#39;</span>, <span class='string'>&#39;\u{200a}&#39;</span>),
+ (<span class='string'>&#39;\u{2028}&#39;</span>, <span class='string'>&#39;\u{2029}&#39;</span>), (<span class='string'>&#39;\u{202f}&#39;</span>, <span class='string'>&#39;\u{202f}&#39;</span>),
+ (<span class='string'>&#39;\u{205f}&#39;</span>, <span class='string'>&#39;\u{205f}&#39;</span>), (<span class='string'>&#39;\u{3000}&#39;</span>, <span class='string'>&#39;\u{3000}&#39;</span>),
+ ]).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_d</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\d&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_s</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\s&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_w</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\w&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_d_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\D&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_s_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\S&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_w_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;\W&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_d_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\d&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_s_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\s&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_w_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\w&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_d_case_fold_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\D&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_s_case_fold_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\S&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>escape_perl_w_case_fold_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)\W&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[a]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\x00]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x00&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\n]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\n&#39;</span>, <span class='string'>&#39;\n&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[\n]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;\n&#39;</span>, <span class='string'>&#39;\n&#39;</span>)])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^a]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x60&#39;</span>), (<span class='string'>&#39;\x62&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\x00]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x01&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\n]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x09&#39;</span>), (<span class='string'>&#39;\x0b&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[^\n]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[
+ (<span class='string'>&#39;\x00&#39;</span>, <span class='string'>&#39;\x09&#39;</span>), (<span class='string'>&#39;\x0b&#39;</span>, <span class='string'>&#39;\u{10FFFF}&#39;</span>),
+ ])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\d]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>)));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\d]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\w]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>negate</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\s]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class_negate_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\D]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>)));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\W]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>)));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\S]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class_casei</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[\d]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class_negate_casei</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\d]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\w]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\s]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_singleton_class_negate_negate_casei</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\D]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\W]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLW</span>).<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\S]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLS</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\d\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>PERLD</span>, <span class='ident'>YI</span>,
+ ])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\d\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>PERLD</span>, <span class='ident'>YI</span>,
+ ]).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class_negate_negate</span>() {
+ <span class='kw'>let</span> <span class='ident'>nperld</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>();
+ <span class='kw'>let</span> <span class='ident'>nyi</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>negate</span>();
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>CharClass</span>::<span class='ident'>empty</span>().<span class='ident'>merge</span>(<span class='ident'>nperld</span>).<span class='ident'>merge</span>(<span class='ident'>nyi</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[^\D\P{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class_casei</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[\d\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>PERLD</span>, <span class='ident'>YI</span>,
+ ]).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class_negate_casei</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\d\p{Yi}]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>PERLD</span>, <span class='ident'>YI</span>,
+ ]).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_multiple_class_negate_negate_casei</span>() {
+ <span class='kw'>let</span> <span class='ident'>nperld</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>();
+ <span class='kw'>let</span> <span class='ident'>nyi</span> <span class='op'>=</span> <span class='ident'>class</span>(<span class='ident'>YI</span>).<span class='ident'>negate</span>();
+ <span class='kw'>let</span> <span class='ident'>class</span> <span class='op'>=</span> <span class='ident'>CharClass</span>::<span class='ident'>empty</span>().<span class='ident'>merge</span>(<span class='ident'>nperld</span>).<span class='ident'>merge</span>(<span class='ident'>nyi</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?i)[^\D\P{Yi}]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>.<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_class_hypen</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\p{Yi}-]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;-&#39;</span>, <span class='string'>&#39;-&#39;</span>)], <span class='ident'>YI</span>,
+ ])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;[\p{Yi}-a]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[
+ <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;-&#39;</span>, <span class='string'>&#39;-&#39;</span>)], <span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;a&#39;</span>)], <span class='ident'>YI</span>,
+ ])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_brackets</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;]&#39;</span>, <span class='string'>&#39;]&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[][]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;[&#39;</span>, <span class='string'>&#39;[&#39;</span>), (<span class='string'>&#39;]&#39;</span>, <span class='string'>&#39;]&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[[]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;[&#39;</span>, <span class='string'>&#39;[&#39;</span>)])),
+ <span class='ident'>lit</span>(<span class='string'>&#39;]&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_brackets_hypen</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[]-]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;-&#39;</span>, <span class='string'>&#39;-&#39;</span>), (<span class='string'>&#39;]&#39;</span>, <span class='string'>&#39;]&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[-]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;-&#39;</span>, <span class='string'>&#39;-&#39;</span>)])),
+ <span class='ident'>lit</span>(<span class='string'>&#39;]&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>class_overlapping</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[a-fd-h]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;h&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[a-fg-m]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;m&#39;</span>)])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[:upper:]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>)));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[[:upper:]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_not</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[:abc:]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;:&#39;</span>, <span class='string'>&#39;:&#39;</span>), (<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;c&#39;</span>)])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_multiple</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[[:lower:][:upper:]]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>classes</span>(<span class='kw-2'>&amp;</span>[<span class='ident'>UPPER</span>, <span class='ident'>LOWER</span>])));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_negate</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[[:^upper:]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>negate</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[^[:^upper:]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>)));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_negate_multiple</span>() {
+ <span class='kw'>let</span> (<span class='ident'>nlower</span>, <span class='ident'>nupper</span>) <span class='op'>=</span> (<span class='ident'>class</span>(<span class='ident'>LOWER</span>).<span class='ident'>negate</span>(), <span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>negate</span>());
+ <span class='kw'>let</span> <span class='ident'>cls</span> <span class='op'>=</span> <span class='ident'>CharClass</span>::<span class='ident'>empty</span>().<span class='ident'>merge</span>(<span class='ident'>nlower</span>).<span class='ident'>merge</span>(<span class='ident'>nupper</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[[:^lower:][:^upper:]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>.<span class='ident'>clone</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;[^[:^lower:][:^upper:]]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>cls</span>.<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)[:upper:]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)[[:upper:]]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ascii_class_negate_case_fold</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)[[:^upper:]]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>negate</span>().<span class='ident'>case_fold</span>()));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?i)[^[:^upper:]]&quot;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>UPPER</span>).<span class='ident'>case_fold</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_literal</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?x) a b c&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_literal_off</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?x) a b c(?-x) a&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;b&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;c&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39; &#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_class</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?x)[a
+ - z
+]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)])));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>&quot;(?x)[ ^ a
+ - z
+]&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='kw-2'>&amp;</span>[(<span class='string'>&#39;a&#39;</span>, <span class='string'>&#39;z&#39;</span>)]).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_escape</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)\ d&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>)));
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)\
+ D&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>).<span class='ident'>negate</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_comments</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)(?P&lt;foo&gt;
+ a # comment 1
+)(?P&lt;bar&gt;
+ z # comment 2
+)&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>1</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>Some</span>(<span class='string'>&quot;foo&quot;</span>.<span class='ident'>into</span>()),
+ },
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>lit</span>(<span class='string'>&#39;z&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>Some</span>(<span class='number'>2</span>),
+ <span class='ident'>name</span>: <span class='prelude-val'>Some</span>(<span class='string'>&quot;bar&quot;</span>.<span class='ident'>into</span>()),
+ },
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_comments_re_enable</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)a # hi
+(?-x:#) # sweet&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ <span class='ident'>Expr</span>::<span class='ident'>Group</span> {
+ <span class='ident'>e</span>: <span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>lit</span>(<span class='string'>&#39;#&#39;</span>)),
+ <span class='ident'>i</span>: <span class='prelude-val'>None</span>,
+ <span class='ident'>name</span>: <span class='prelude-val'>None</span>,
+ },
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_escape_punctuation</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)\\\.\+\*\?\(\)\|\[\]\{\}\^\$\#&quot;</span>), <span class='ident'>c</span>(<span class='kw-2'>&amp;</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;\\&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;.&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;+&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;*&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;?&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;(&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;)&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;|&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;[&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;]&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;{&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;}&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;^&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;$&#39;</span>), <span class='ident'>lit</span>(<span class='string'>&#39;#&#39;</span>),
+ ]));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>ignore_space_escape_hash</span>() {
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='ident'>p</span>(<span class='string'>r&quot;(?x)a\# # hi there&quot;</span>), <span class='ident'>Expr</span>::<span class='ident'>Concat</span>(<span class='macro'>vec</span><span class='macro'>!</span>[
+ <span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>),
+ <span class='ident'>lit</span>(<span class='string'>&#39;#&#39;</span>),
+ ]));
+ }
+
+ <span class='comment'>// Test every single possible error case.</span>
+
+ <span class='macro'>macro_rules</span><span class='macro'>!</span> <span class='ident'>test_err</span> {
+ (<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>re</span>:<span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>pos</span>:<span class='ident'>expr</span>, <span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>kind</span>:<span class='ident'>expr</span>) <span class='op'>=&gt;</span> {{
+ <span class='kw'>let</span> <span class='ident'>err</span> <span class='op'>=</span> <span class='ident'>Parser</span>::<span class='ident'>parse</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>re</span>).<span class='ident'>unwrap_err</span>();
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>pos</span>, <span class='ident'>err</span>.<span class='ident'>pos</span>);
+ <span class='macro'>assert_eq</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>kind</span>, <span class='ident'>err</span>.<span class='ident'>kind</span>);
+ <span class='macro'>assert</span><span class='macro'>!</span>(<span class='macro-nonterminal'>$</span><span class='macro-nonterminal'>re</span>.<span class='ident'>contains</span>(<span class='kw-2'>&amp;</span><span class='ident'>err</span>.<span class='ident'>surround</span>));
+ }}
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_no_expr_simple</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(*&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterExpectsExpr</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_no_expr_counted</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;({5}&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterExpectsExpr</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_beginning_counted</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;{5}&quot;</span>, <span class='number'>0</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterExpectsExpr</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_illegal_exprs_simple</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a**&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ }));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a|*&quot;</span>, <span class='number'>2</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)]))
+ );
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_illegal_exprs_counted</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a*{5}&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>Expr</span>::<span class='ident'>Repeat</span> {
+ <span class='ident'>e</span>: <span class='ident'>b</span>(<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)),
+ <span class='ident'>r</span>: <span class='ident'>Repeater</span>::<span class='ident'>ZeroOrMore</span>,
+ <span class='ident'>greedy</span>: <span class='boolval'>true</span>,
+ }));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a|{5}&quot;</span>, <span class='number'>2</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>RepeaterUnexpectedExpr</span>(<span class='ident'>Expr</span>::<span class='ident'>Alternate</span>(<span class='macro'>vec</span><span class='macro'>!</span>[<span class='ident'>lit</span>(<span class='string'>&#39;a&#39;</span>)]))
+ );
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_empty_number</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{}&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>MissingBase10</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_eof</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{5&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedRepeat</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_empty_number_eof</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{xyz&quot;</span>, <span class='number'>5</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;xyz&quot;</span>.<span class='ident'>into</span>()));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{12,xyz&quot;</span>, <span class='number'>8</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;xyz&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_invalid_number</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{9999999999}&quot;</span>, <span class='number'>12</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;9999999999&quot;</span>.<span class='ident'>into</span>()));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{1,9999999999}&quot;</span>, <span class='number'>14</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;9999999999&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_invalid_number_extra</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{12x}&quot;</span>, <span class='number'>5</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;12x&quot;</span>.<span class='ident'>into</span>()));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{1,12x}&quot;</span>, <span class='number'>7</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase10</span>(<span class='string'>&quot;12x&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_repeat_invalid_range</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a{2,1}&quot;</span>, <span class='number'>5</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidRepeatRange</span> { <span class='ident'>min</span>: <span class='number'>2</span>, <span class='ident'>max</span>: <span class='number'>1</span> });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_alternate_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;|a&quot;</span>, <span class='number'>0</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_alternate_empty_with_group</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(|a)&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_alternate_empty_with_alternate</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a||&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_unopened_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;)&quot;</span>, <span class='number'>0</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnopenedParen</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_unopened</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;ab)&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnopenedParen</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_unopened_with_alt</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a|b)&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnopenedParen</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_empty_alt</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(a|)&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_empty_group</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;()&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyGroup</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_close_paren_empty_group_with_name</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;foo&gt;)&quot;</span>, <span class='number'>8</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyGroup</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_finish_concat_unclosed</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;ab(xy&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedParen</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_finish_concat_empty_alt</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;a|&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyAlternate</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_name_invalid</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;a#&gt;x)&quot;</span>, <span class='number'>6</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidCaptureName</span>(<span class='string'>&quot;a#&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_name_invalid_leading</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;1a&gt;a)&quot;</span>, <span class='number'>6</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidCaptureName</span>(<span class='string'>&quot;1a&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_name_unexpected_eof</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;a&quot;</span>, <span class='number'>5</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedCaptureName</span>(<span class='string'>&quot;a&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_name_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;&gt;a)&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyCaptureName</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_opts_unrecognized_flag</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?z:a)&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedFlag</span>(<span class='string'>&#39;z&#39;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_opts_unexpected_eof</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?i&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedFlagEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_opts_double_negation</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?-i-s:a)&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>DoubleFlagNegation</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_opts_empty_negation</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?i-:a)&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyFlagNegation</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_group_opts_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?)&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>EmptyFlagNegation</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_unexpected_eof</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedEscapeEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_unrecognized</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\m&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedEscape</span>(<span class='string'>&#39;m&#39;</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex2_eof0</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedTwoDigitHexEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex2_eof1</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\xA&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedTwoDigitHexEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex2_invalid</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\xAG&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='string'>&quot;AG&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_eof0</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='string'>&quot;&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_eof1</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{A&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedHex</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_invalid</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{AG}&quot;</span>, <span class='number'>5</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='string'>&quot;AG&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_invalid_scalar_value_surrogate</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{D800}&quot;</span>, <span class='number'>7</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidScalarValue</span>(<span class='number'>0xD800</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_invalid_scalar_value_high</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{110000}&quot;</span>, <span class='number'>9</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidScalarValue</span>(<span class='number'>0x110000</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_escape_hex_invalid_u32</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\x{9999999999}&quot;</span>, <span class='number'>13</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidBase16</span>(<span class='string'>&quot;9999999999&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_unicode_unclosed</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\p{&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedUnicodeName</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\p{Greek&quot;</span>, <span class='number'>8</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnclosedUnicodeName</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_unicode_no_letter</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\p&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedEscapeEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_unicode_unknown_letter</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\pA&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedUnicodeClass</span>(<span class='string'>&quot;A&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_unicode_unknown_name</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;\p{Yii}&quot;</span>, <span class='number'>7</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedUnicodeClass</span>(<span class='string'>&quot;Yii&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_eof_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[&quot;</span>, <span class='number'>1</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[^&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_eof_non_empty</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[a&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[^a&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_eof_range</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[a-&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[^a-&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[---&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_invalid_escape</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;[\pA]&quot;</span>, <span class='number'>4</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>UnrecognizedUnicodeClass</span>(<span class='string'>&quot;A&quot;</span>.<span class='ident'>into</span>()));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_valid_escape_not_allowed</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;[\A]&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>Expr</span>::<span class='ident'>StartText</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_range_valid_escape_not_allowed</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;[a-\d]&quot;</span>, <span class='number'>5</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>Expr</span>::<span class='ident'>Class</span>(<span class='ident'>class</span>(<span class='ident'>PERLD</span>))));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;[a-\A]&quot;</span>, <span class='number'>5</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>Expr</span>::<span class='ident'>StartText</span>));
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>r&quot;[\A-a]&quot;</span>, <span class='number'>3</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassEscape</span>(<span class='ident'>Expr</span>::<span class='ident'>StartText</span>));
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_invalid_range</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[z-a]&quot;</span>, <span class='number'>4</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>InvalidClassRange</span> {
+ <span class='ident'>start</span>: <span class='string'>&#39;z&#39;</span>,
+ <span class='ident'>end</span>: <span class='string'>&#39;a&#39;</span>,
+ });
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_class_empty_range</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[]&quot;</span>, <span class='number'>2</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;[^]&quot;</span>, <span class='number'>3</span>, <span class='ident'>ErrorKind</span>::<span class='ident'>UnexpectedClassEof</span>);
+ }
+
+ <span class='attribute'>#[<span class='ident'>test</span>]</span>
+ <span class='kw'>fn</span> <span class='ident'>error_duplicate_capture_name</span>() {
+ <span class='macro'>test_err</span><span class='macro'>!</span>(<span class='string'>&quot;(?P&lt;a&gt;.)(?P&lt;a&gt;.)&quot;</span>, <span class='number'>14</span>,
+ <span class='ident'>ErrorKind</span>::<span class='ident'>DuplicateCaptureName</span>(<span class='string'>&quot;a&quot;</span>.<span class='ident'>into</span>()));
+ }
+}
+</pre>
+</section>
+ <section id='search' class="content hidden"></section>
+
+ <section class="footer"></section>
+
+ <div id="help" class="hidden">
+ <div class="shortcuts">
+ <h1>Keyboard shortcuts</h1>
+ <dl>
+ <dt>?</dt>
+ <dd>Show this help dialog</dd>
+ <dt>S</dt>
+ <dd>Focus the search field</dd>
+ <dt>&larrb;</dt>
+ <dd>Move up in search results</dd>
+ <dt>&rarrb;</dt>
+ <dd>Move down in search results</dd>
+ <dt>&#9166;</dt>
+ <dd>Go to active search result</dd>
+ </dl>
+ </div>
+ <div class="infos">
+ <h1>Search tricks</h1>
+ <p>
+ Prefix searches with a type followed by a colon (e.g.
+ <code>fn:</code>) to restrict the search to a given type.
+ </p>
+ <p>
+ Accepted types are: <code>fn</code>, <code>mod</code>,
+ <code>struct</code>, <code>enum</code>,
+ <code>trait</code>, <code>typedef</code> (or
+ <code>tdef</code>).
+ </p>
+ <p>
+ Search functions by type signature (e.g.
+ <code>vec -> usize</code>)
+ </p>
+ </div>
+ </div>
+
+
+
+ <script>
+ window.rootPath = "../../";
+ window.currentCrate = "regex_syntax";
+ window.playgroundUrl = "";
+ </script>
+ <script src="../../jquery.js"></script>
+ <script src="../../main.js"></script>
+
+ <script async src="../../search-index.js"></script>
+</body>
+</html> \ No newline at end of file