This commit is contained in:
sylvestre
2021-10-13 02:32:05 +00:00
parent fd3598e2fa
commit 9bf5e67ad1
8 changed files with 140 additions and 80 deletions
+2 -2
View File
File diff suppressed because one or more lines are too long
+13 -43
View File
@@ -590,21 +590,6 @@
<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>
</pre><pre class="rust">
<span class="comment">// * This file is part of the uutils coreutils package.</span>
<span class="comment">// *</span>
@@ -716,6 +701,12 @@
<span class="ident">Bytes</span>(<span class="ident">usize</span>),
}
<span class="kw">impl</span> <span class="ident">Default</span> <span class="kw">for</span> <span class="ident">Modes</span> {
<span class="kw">fn</span> <span class="ident">default</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="self">Self</span> {
<span class="ident">Modes::Lines</span>(<span class="number">10</span>)
}
}
<span class="kw">fn</span> <span class="ident">parse_mode</span><span class="op">&lt;</span><span class="ident">F</span><span class="op">&gt;</span>(<span class="ident">src</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">closure</span>: <span class="ident">F</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">Modes</span>, <span class="ident">bool</span>), <span class="ident">String</span><span class="op">&gt;</span>
<span class="kw">where</span>
<span class="ident">F</span>: <span class="ident">FnOnce</span>(<span class="ident">usize</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Modes</span>,
@@ -752,7 +743,7 @@
}
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">PartialEq</span>)]</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">PartialEq</span>, <span class="ident">Default</span>)]</span>
<span class="kw">struct</span> <span class="ident">HeadOptions</span> {
<span class="kw">pub</span> <span class="ident">quiet</span>: <span class="ident">bool</span>,
<span class="kw">pub</span> <span class="ident">verbose</span>: <span class="ident">bool</span>,
@@ -763,22 +754,11 @@
}
<span class="kw">impl</span> <span class="ident">HeadOptions</span> {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">HeadOptions</span> {
<span class="ident">HeadOptions</span> {
<span class="ident">quiet</span>: <span class="bool-val">false</span>,
<span class="ident">verbose</span>: <span class="bool-val">false</span>,
<span class="ident">zeroed</span>: <span class="bool-val">false</span>,
<span class="ident">all_but_last</span>: <span class="bool-val">false</span>,
<span class="ident">mode</span>: <span class="ident">Modes::Lines</span>(<span class="number">10</span>),
<span class="ident">files</span>: <span class="ident">Vec::new</span>(),
}
}
<span class="doccomment">///Construct options from matches</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_from</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="ident">String</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">uu_app</span>().<span class="ident">get_matches_from</span>(<span class="ident">arg_iterate</span>(<span class="ident">args</span>)<span class="question-mark">?</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">options</span> <span class="op">=</span> <span class="ident">HeadOptions::new</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">options</span>: <span class="ident">HeadOptions</span> <span class="op">=</span> <span class="ident">Default::default</span>();
<span class="ident">options</span>.<span class="ident">quiet</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::QUIET_NAME</span>);
<span class="ident">options</span>.<span class="ident">verbose</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::VERBOSE_NAME</span>);
@@ -805,12 +785,6 @@
<span class="prelude-val">Ok</span>(<span class="ident">options</span>)
}
}
<span class="comment">// to make clippy shut up</span>
<span class="kw">impl</span> <span class="ident">Default</span> <span class="kw">for</span> <span class="ident">HeadOptions</span> {
<span class="kw">fn</span> <span class="ident">default</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="self">Self</span> {
<span class="self">Self</span><span class="ident">::new</span>()
}
}
<span class="kw">fn</span> <span class="ident">read_n_bytes</span><span class="op">&lt;</span><span class="ident">R</span><span class="op">&gt;</span>(<span class="ident">input</span>: <span class="ident">R</span>, <span class="ident">n</span>: <span class="ident">usize</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">std::io::Result</span><span class="op">&lt;</span>()<span class="op">&gt;</span>
<span class="kw">where</span>
@@ -1131,17 +1105,13 @@
<span class="macro">assert!</span>(<span class="ident">options</span>(<span class="string">&quot;-c IsThisJustFantasy&quot;</span>).<span class="ident">is_err</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">clippy::bool_comparison</span>)]</span>
<span class="kw">fn</span> <span class="ident">test_options_correct_defaults</span>() {
<span class="kw">let</span> <span class="ident">opts</span> <span class="op">=</span> <span class="ident">HeadOptions::new</span>();
<span class="kw">let</span> <span class="ident">opts2</span>: <span class="ident">HeadOptions</span> <span class="op">=</span> <span class="ident">Default::default</span>();
<span class="kw">let</span> <span class="ident">opts</span>: <span class="ident">HeadOptions</span> <span class="op">=</span> <span class="ident">Default::default</span>();
<span class="macro">assert_eq!</span>(<span class="ident">opts</span>, <span class="ident">opts2</span>);
<span class="macro">assert!</span>(<span class="ident">opts</span>.<span class="ident">verbose</span> <span class="op">=</span><span class="op">=</span> <span class="bool-val">false</span>);
<span class="macro">assert!</span>(<span class="ident">opts</span>.<span class="ident">quiet</span> <span class="op">=</span><span class="op">=</span> <span class="bool-val">false</span>);
<span class="macro">assert!</span>(<span class="ident">opts</span>.<span class="ident">zeroed</span> <span class="op">=</span><span class="op">=</span> <span class="bool-val">false</span>);
<span class="macro">assert!</span>(<span class="ident">opts</span>.<span class="ident">all_but_last</span> <span class="op">=</span><span class="op">=</span> <span class="bool-val">false</span>);
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">opts</span>.<span class="ident">verbose</span>);
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">opts</span>.<span class="ident">quiet</span>);
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">opts</span>.<span class="ident">zeroed</span>);
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">opts</span>.<span class="ident">all_but_last</span>);
<span class="macro">assert_eq!</span>(<span class="ident">opts</span>.<span class="ident">mode</span>, <span class="ident">Modes::Lines</span>(<span class="number">10</span>));
<span class="macro">assert!</span>(<span class="ident">opts</span>.<span class="ident">files</span>.<span class="ident">is_empty</span>());
}
+120 -30
View File
@@ -254,6 +254,51 @@
<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>
</pre><pre class="rust">
<span class="comment">// * This file is part of the uutils coreutils package.</span>
<span class="comment">// *</span>
@@ -262,15 +307,19 @@
<span class="comment">// * For the full copyright and license information, please view the LICENSE</span>
<span class="comment">// * file that was distributed with this source code.</span>
<span class="comment">// spell-checker:ignore (ToDO) sbytes slen dlen memmem</span>
<span class="comment">// spell-checker:ignore (ToDO) sbytes slen dlen memmem memmap Mmap mmap SIGBUS</span>
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">uucore</span>;
<span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">crate_version</span>, <span class="ident">App</span>, <span class="ident">Arg</span>};
<span class="kw">use</span> <span class="ident">memchr::memmem</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdin</span>, <span class="ident">stdout</span>, <span class="ident">BufReader</span>, <span class="ident">Read</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std</span>::{<span class="ident">fs::File</span>, <span class="ident">path::Path</span>};
<span class="kw">use</span> <span class="ident">memmap2::Mmap</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdin</span>, <span class="ident">stdout</span>, <span class="ident">BufWriter</span>, <span class="ident">Read</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std</span>::{
<span class="ident">fs</span>::{<span class="ident">read</span>, <span class="ident">File</span>},
<span class="ident">path::Path</span>,
};
<span class="kw">use</span> <span class="ident">uucore::display::Quotable</span>;
<span class="kw">use</span> <span class="ident">uucore::InvalidEncodingHandling</span>;
@@ -301,9 +350,9 @@
<span class="ident">raw_separator</span>
};
<span class="kw">let</span> <span class="ident">files</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="kw">match</span> <span class="ident">matches</span>.<span class="ident">values_of</span>(<span class="ident">options::FILE</span>) {
<span class="prelude-val">Some</span>(<span class="ident">v</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">v</span>.<span class="ident">map</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">to_owned</span>()).<span class="ident">collect</span>(),
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">vec!</span>[<span class="string">&quot;-&quot;</span>.<span class="ident">to_owned</span>()],
<span class="kw">let</span> <span class="ident">files</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="op">=</span> <span class="kw">match</span> <span class="ident">matches</span>.<span class="ident">values_of</span>(<span class="ident">options::FILE</span>) {
<span class="prelude-val">Some</span>(<span class="ident">v</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">v</span>.<span class="ident">collect</span>(),
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="macro">vec!</span>[<span class="string">&quot;-&quot;</span>],
};
<span class="ident">tac</span>(<span class="ident">files</span>, <span class="ident">before</span>, <span class="ident">regex</span>, <span class="ident">separator</span>)
@@ -359,10 +408,11 @@
<span class="doccomment">/// returns [`std::io::Error`].</span>
<span class="kw">fn</span> <span class="ident">buffer_tac_regex</span>(
<span class="ident">data</span>: <span class="kw-2">&amp;</span>[<span class="ident">u8</span>],
<span class="ident">pattern</span>: <span class="ident">regex::bytes::Regex</span>,
<span class="ident">pattern</span>: <span class="kw-2">&amp;</span><span class="ident">regex::bytes::Regex</span>,
<span class="ident">before</span>: <span class="ident">bool</span>,
) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">std::io::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">out</span> <span class="op">=</span> <span class="ident">stdout</span>();
<span class="kw">let</span> <span class="ident">out</span> <span class="op">=</span> <span class="ident">stdout</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">out</span> <span class="op">=</span> <span class="ident">BufWriter::new</span>(<span class="ident">out</span>.<span class="ident">lock</span>());
<span class="comment">// The index of the line separator for the current line.</span>
<span class="comment">//</span>
@@ -428,7 +478,8 @@
<span class="doccomment">/// `separator` appears at the beginning of each line, as in</span>
<span class="doccomment">/// `&quot;/abc/def&quot;`.</span>
<span class="kw">fn</span> <span class="ident">buffer_tac</span>(<span class="ident">data</span>: <span class="kw-2">&amp;</span>[<span class="ident">u8</span>], <span class="ident">before</span>: <span class="ident">bool</span>, <span class="ident">separator</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">std::io::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">out</span> <span class="op">=</span> <span class="ident">stdout</span>();
<span class="kw">let</span> <span class="ident">out</span> <span class="op">=</span> <span class="ident">stdout</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">out</span> <span class="op">=</span> <span class="ident">BufWriter::new</span>(<span class="ident">out</span>.<span class="ident">lock</span>());
<span class="comment">// The number of bytes in the line separator.</span>
<span class="kw">let</span> <span class="ident">slen</span> <span class="op">=</span> <span class="ident">separator</span>.<span class="ident">as_bytes</span>().<span class="ident">len</span>();
@@ -465,12 +516,33 @@
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn</span> <span class="ident">tac</span>(<span class="ident">filenames</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span>, <span class="ident">before</span>: <span class="ident">bool</span>, <span class="ident">regex</span>: <span class="ident">bool</span>, <span class="ident">separator</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="kw">fn</span> <span class="ident">tac</span>(<span class="ident">filenames</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="ident">before</span>: <span class="ident">bool</span>, <span class="ident">regex</span>: <span class="ident">bool</span>, <span class="ident">separator</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">exit_code</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">for</span> <span class="ident">filename</span> <span class="kw">in</span> <span class="kw-2">&amp;</span><span class="ident">filenames</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">file</span> <span class="op">=</span> <span class="ident">BufReader::new</span>(<span class="kw">if</span> <span class="ident">filename</span> <span class="op">=</span><span class="op">=</span> <span class="string">&quot;-&quot;</span> {
<span class="ident">Box::new</span>(<span class="ident">stdin</span>()) <span class="kw">as</span> <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">&gt;</span>
<span class="kw">let</span> <span class="ident">pattern</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">regex</span> {
<span class="prelude-val">Some</span>(<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">regex::bytes::Regex::new</span>(<span class="ident">separator</span>)))
} <span class="kw">else</span> {
<span class="prelude-val">None</span>
};
<span class="kw">for</span> <span class="kw-2">&amp;</span><span class="ident">filename</span> <span class="kw">in</span> <span class="kw-2">&amp;</span><span class="ident">filenames</span> {
<span class="kw">let</span> <span class="ident">mmap</span>;
<span class="kw">let</span> <span class="ident">buf</span>;
<span class="kw">let</span> <span class="ident">data</span>: <span class="kw-2">&amp;</span>[<span class="ident">u8</span>] <span class="op">=</span> <span class="kw">if</span> <span class="ident">filename</span> <span class="op">=</span><span class="op">=</span> <span class="string">&quot;-&quot;</span> {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">mmap1</span>) <span class="op">=</span> <span class="ident">try_mmap_stdin</span>() {
<span class="ident">mmap</span> <span class="op">=</span> <span class="ident">mmap1</span>;
<span class="kw-2">&amp;</span><span class="ident">mmap</span>
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf1</span> <span class="op">=</span> <span class="ident">Vec::new</span>();
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span> <span class="ident">stdin</span>().<span class="ident">read_to_end</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">buf1</span>) {
<span class="macro">show_error!</span>(<span class="string">&quot;failed to read from stdin: {}&quot;</span>, <span class="ident">e</span>);
<span class="ident">exit_code</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">continue</span>;
}
<span class="ident">buf</span> <span class="op">=</span> <span class="ident">buf1</span>;
<span class="kw-2">&amp;</span><span class="ident">buf</span>
}
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="ident">path</span> <span class="op">=</span> <span class="ident">Path::new</span>(<span class="ident">filename</span>);
<span class="kw">if</span> <span class="ident">path</span>.<span class="ident">is_dir</span>() <span class="op">|</span><span class="op">|</span> <span class="ident">path</span>.<span class="ident">metadata</span>().<span class="ident">is_err</span>() {
@@ -485,32 +557,50 @@
<span class="ident">exit_code</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">continue</span>;
}
<span class="kw">match</span> <span class="ident">File::open</span>(<span class="ident">path</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">f</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">Box::new</span>(<span class="ident">f</span>) <span class="kw">as</span> <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">&gt;</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="macro">show_error!</span>(<span class="string">&quot;failed to open {} for reading: {}&quot;</span>, <span class="ident">filename</span>.<span class="ident">quote</span>(), <span class="ident">e</span>);
<span class="ident">exit_code</span> <span class="op">=</span> <span class="number">1</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">mmap1</span>) <span class="op">=</span> <span class="ident">try_mmap_path</span>(<span class="ident">path</span>) {
<span class="ident">mmap</span> <span class="op">=</span> <span class="ident">mmap1</span>;
<span class="kw-2">&amp;</span><span class="ident">mmap</span>
} <span class="kw">else</span> {
<span class="kw">match</span> <span class="ident">read</span>(<span class="ident">path</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">buf1</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">buf</span> <span class="op">=</span> <span class="ident">buf1</span>;
<span class="kw-2">&amp;</span><span class="ident">buf</span>
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="macro">show_error!</span>(<span class="string">&quot;failed to read {}: {}&quot;</span>, <span class="ident">filename</span>.<span class="ident">quote</span>(), <span class="ident">e</span>);
<span class="ident">exit_code</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">continue</span>;
}
}
}
});
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">data</span> <span class="op">=</span> <span class="ident">Vec::new</span>();
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span> <span class="ident">file</span>.<span class="ident">read_to_end</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">data</span>) {
<span class="macro">show_error!</span>(<span class="string">&quot;failed to read {}: {}&quot;</span>, <span class="ident">filename</span>.<span class="ident">quote</span>(), <span class="ident">e</span>);
<span class="ident">exit_code</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">continue</span>;
};
<span class="kw">if</span> <span class="ident">regex</span> {
<span class="kw">let</span> <span class="ident">pattern</span> <span class="op">=</span> <span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">regex::bytes::Regex::new</span>(<span class="ident">separator</span>));
<span class="ident">buffer_tac_regex</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>, <span class="ident">pattern</span>, <span class="ident">before</span>)
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">pattern</span>) <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">pattern</span> {
<span class="ident">buffer_tac_regex</span>(<span class="ident">data</span>, <span class="ident">pattern</span>, <span class="ident">before</span>)
} <span class="kw">else</span> {
<span class="ident">buffer_tac</span>(<span class="kw-2">&amp;</span><span class="ident">data</span>, <span class="ident">before</span>, <span class="ident">separator</span>)
<span class="ident">buffer_tac</span>(<span class="ident">data</span>, <span class="ident">before</span>, <span class="ident">separator</span>)
}
.<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="macro">crash!</span>(<span class="number">1</span>, <span class="string">&quot;failed to write to stdout: {}&quot;</span>, <span class="ident">e</span>));
}
<span class="ident">exit_code</span>
}
<span class="kw">fn</span> <span class="ident">try_mmap_stdin</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Mmap</span><span class="op">&gt;</span> {
<span class="comment">// SAFETY: If the file is truncated while we map it, SIGBUS will be raised</span>
<span class="comment">// and our process will be terminated, thus preventing access of invalid memory.</span>
<span class="kw">unsafe</span> { <span class="ident">Mmap::map</span>(<span class="kw-2">&amp;</span><span class="ident">stdin</span>()).<span class="ident">ok</span>() }
}
<span class="kw">fn</span> <span class="ident">try_mmap_path</span>(<span class="ident">path</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Mmap</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">file</span> <span class="op">=</span> <span class="ident">File::open</span>(<span class="ident">path</span>).<span class="ident">ok</span>()<span class="question-mark">?</span>;
<span class="comment">// SAFETY: If the file is truncated while we map it, SIGBUS will be raised</span>
<span class="comment">// and our process will be terminated, thus preventing access of invalid memory.</span>
<span class="kw">let</span> <span class="ident">mmap</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="ident">Mmap::map</span>(<span class="kw-2">&amp;</span><span class="ident">file</span>).<span class="ident">ok</span>()<span class="question-mark">?</span> };
<span class="prelude-val">Some</span>(<span class="ident">mmap</span>)
}
</pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_tac" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div>
<script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script>
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long