mirror of
https://github.com/uutils/uutils.github.io.git
synced 2026-06-10 16:12:28 -07:00
deploy: b3ede5bce1
This commit is contained in:
+2
-2
File diff suppressed because one or more lines are too long
+13
-43
@@ -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">></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"><</span><span class="ident">F</span><span class="op">></span>(<span class="ident">src</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">closure</span>: <span class="ident">F</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Result</span><span class="op"><</span>(<span class="ident">Modes</span>, <span class="ident">bool</span>), <span class="ident">String</span><span class="op">></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">></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">></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">></span> <span class="prelude-ty">Result</span><span class="op"><</span><span class="self">Self</span>, <span class="ident">String</span><span class="op">></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">></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"><</span><span class="ident">R</span><span class="op">></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">></span> <span class="ident">std::io::Result</span><span class="op"><</span>()<span class="op">></span>
|
||||
<span class="kw">where</span>
|
||||
@@ -1131,17 +1105,13 @@
|
||||
<span class="macro">assert!</span>(<span class="ident">options</span>(<span class="string">"-c IsThisJustFantasy"</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
@@ -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"><</span><span class="ident">String</span><span class="op">></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">></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">></span> <span class="macro">vec!</span>[<span class="string">"-"</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"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></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">></span> <span class="ident">v</span>.<span class="ident">collect</span>(),
|
||||
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">></span> <span class="macro">vec!</span>[<span class="string">"-"</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">&</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">&</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">></span> <span class="ident">std::io::Result</span><span class="op"><</span>()<span class="op">></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">/// `"/abc/def"`.</span>
|
||||
<span class="kw">fn</span> <span class="ident">buffer_tac</span>(<span class="ident">data</span>: <span class="kw-2">&</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">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></span> <span class="ident">std::io::Result</span><span class="op"><</span>()<span class="op">></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"><</span><span class="ident">String</span><span class="op">></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">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></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"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></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">&</span><span class="ident">str</span>) <span class="op">-</span><span class="op">></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">&</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">"-"</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"><</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">></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">&</span><span class="ident">filename</span> <span class="kw">in</span> <span class="kw-2">&</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">&</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">"-"</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">&</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">&</span><span class="kw-2">mut</span> <span class="ident">buf1</span>) {
|
||||
<span class="macro">show_error!</span>(<span class="string">"failed to read from stdin: {}"</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">&</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">></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"><</span><span class="kw">dyn</span> <span class="ident">Read</span><span class="op">></span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">show_error!</span>(<span class="string">"failed to open {} for reading: {}"</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">&</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">></span> {
|
||||
<span class="ident">buf</span> <span class="op">=</span> <span class="ident">buf1</span>;
|
||||
<span class="kw-2">&</span><span class="ident">buf</span>
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="ident">e</span>) <span class="op">=</span><span class="op">></span> {
|
||||
<span class="macro">show_error!</span>(<span class="string">"failed to read {}: {}"</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">&</span><span class="kw-2">mut</span> <span class="ident">data</span>) {
|
||||
<span class="macro">show_error!</span>(<span class="string">"failed to read {}: {}"</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">&</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">&</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">&</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">"failed to write to stdout: {}"</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">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Mmap</span><span class="op">></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">&</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">&</span><span class="ident">Path</span>) <span class="op">-</span><span class="op">></span> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Mmap</span><span class="op">></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">&</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
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
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user