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:
+150
-12
@@ -243,6 +243,75 @@
|
|||||||
<span id="243">243</span>
|
<span id="243">243</span>
|
||||||
<span id="244">244</span>
|
<span id="244">244</span>
|
||||||
<span id="245">245</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>
|
||||||
</pre><pre class="rust">
|
</pre><pre class="rust">
|
||||||
<span class="comment">// spell-checker:ignore memmem</span>
|
<span class="comment">// spell-checker:ignore memmem</span>
|
||||||
<span class="doccomment">//! Implementations of digest functions, like md5 and sha1.</span>
|
<span class="doccomment">//! Implementations of digest functions, like md5 and sha1.</span>
|
||||||
@@ -435,13 +504,31 @@
|
|||||||
<span class="doccomment">/// "\n" before passing input bytes to the [`digest`].</span>
|
<span class="doccomment">/// "\n" before passing input bytes to the [`digest`].</span>
|
||||||
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
||||||
<span class="ident">binary</span>: <span class="ident">bool</span>,
|
<span class="ident">binary</span>: <span class="ident">bool</span>,
|
||||||
<span class="comment">// TODO This is dead code only on non-Windows operating systems. It</span>
|
|
||||||
<span class="comment">// might be better to use a `#[cfg(windows)]` guard here.</span>
|
<span class="doccomment">/// Whether the previous</span>
|
||||||
|
<span class="attribute">#[<span class="ident">allow</span>(<span class="ident">dead_code</span>)]</span>
|
||||||
|
<span class="ident">was_last_character_carriage_return</span>: <span class="ident">bool</span>,
|
||||||
|
<span class="comment">// TODO These are dead code only on non-Windows operating systems.</span>
|
||||||
|
<span class="comment">// It might be better to use a `#[cfg(windows)]` guard here.</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
<span class="kw">impl</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> <span class="ident">DigestWriter</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
<span class="kw">impl</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> <span class="ident">DigestWriter</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">digest</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="kw-2">mut</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Digest</span><span class="op">></span>, <span class="ident">binary</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">></span> <span class="ident">DigestWriter</span> {
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">digest</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="kw-2">mut</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Digest</span><span class="op">></span>, <span class="ident">binary</span>: <span class="ident">bool</span>) <span class="op">-</span><span class="op">></span> <span class="ident">DigestWriter</span> {
|
||||||
<span class="ident">DigestWriter</span> { <span class="ident">digest</span>, <span class="ident">binary</span> }
|
<span class="kw">let</span> <span class="ident">was_last_character_carriage_return</span> <span class="op">=</span> <span class="bool-val">false</span>;
|
||||||
|
<span class="ident">DigestWriter</span> {
|
||||||
|
<span class="ident">digest</span>,
|
||||||
|
<span class="ident">binary</span>,
|
||||||
|
<span class="ident">was_last_character_carriage_return</span>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">finalize</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="self">self</span>) <span class="op">-</span><span class="op">></span> <span class="ident">bool</span> {
|
||||||
|
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">was_last_character_carriage_return</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span>[<span class="string">b'\r'</span>]);
|
||||||
|
<span class="bool-val">true</span>
|
||||||
|
} <span class="kw">else</span> {
|
||||||
|
<span class="bool-val">false</span>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -459,22 +546,40 @@
|
|||||||
<span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">buf</span>.<span class="ident">len</span>());
|
<span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">buf</span>.<span class="ident">len</span>());
|
||||||
}
|
}
|
||||||
|
|
||||||
<span class="comment">// In Windows text mode, replace each occurrence of "\r\n"</span>
|
<span class="comment">// The remaining code handles Windows text mode, where we must</span>
|
||||||
<span class="comment">// with "\n".</span>
|
<span class="comment">// replace each occurrence of "\r\n" with "\n".</span>
|
||||||
<span class="comment">//</span>
|
<span class="comment">//</span>
|
||||||
<span class="comment">// Find all occurrences of "\r\n", inputting the slice just</span>
|
<span class="comment">// First, if the last character written was "\r" and the first</span>
|
||||||
<span class="comment">// before the "\n" in the previous instance of "\r\n" and</span>
|
<span class="comment">// character in the current buffer to write is not "\n", then we</span>
|
||||||
<span class="comment">// the beginning of this "\r\n".</span>
|
<span class="comment">// need to write the "\r" that we buffered from the previous</span>
|
||||||
<span class="comment">//</span>
|
<span class="comment">// call to `write()`.</span>
|
||||||
<span class="comment">// FIXME This fails if one call to `write()` ends with the</span>
|
|
||||||
<span class="comment">// "\r" and the next call to `write()` begins with the "\n".</span>
|
|
||||||
<span class="kw">let</span> <span class="ident">n</span> <span class="op">=</span> <span class="ident">buf</span>.<span class="ident">len</span>();
|
<span class="kw">let</span> <span class="ident">n</span> <span class="op">=</span> <span class="ident">buf</span>.<span class="ident">len</span>();
|
||||||
|
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">was_last_character_carriage_return</span> <span class="op">&&</span> <span class="ident">n</span> <span class="op">></span> <span class="number">0</span> <span class="op">&&</span> <span class="ident">buf</span>[<span class="number">0</span>] <span class="op">!</span><span class="op">=</span> <span class="string">b'\n'</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span>[<span class="string">b'\r'</span>]);
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="comment">// Next, find all occurrences of "\r\n", inputting the slice</span>
|
||||||
|
<span class="comment">// just before the "\n" in the previous instance of "\r\n" and</span>
|
||||||
|
<span class="comment">// the beginning of this "\r\n".</span>
|
||||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">i_prev</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_prev</span> <span class="op">=</span> <span class="number">0</span>;
|
||||||
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="ident">memmem::find_iter</span>(<span class="ident">buf</span>, <span class="string">b"\r\n"</span>) {
|
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="ident">memmem::find_iter</span>(<span class="ident">buf</span>, <span class="string">b"\r\n"</span>) {
|
||||||
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span><span class="ident">buf</span>[<span class="ident">i_prev</span>..<span class="ident">i</span>]);
|
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span><span class="ident">buf</span>[<span class="ident">i_prev</span>..<span class="ident">i</span>]);
|
||||||
<span class="ident">i_prev</span> <span class="op">=</span> <span class="ident">i</span> <span class="op">+</span> <span class="number">1</span>;
|
<span class="ident">i_prev</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">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span><span class="ident">buf</span>[<span class="ident">i_prev</span>..<span class="ident">n</span>]);
|
|
||||||
|
<span class="comment">// Finally, check whether the last character is "\r". If so,</span>
|
||||||
|
<span class="comment">// buffer it until we know that the next character is not "\n",</span>
|
||||||
|
<span class="comment">// which can only be known on the next call to `write()`.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// This all assumes that `write()` will be called on adjacent</span>
|
||||||
|
<span class="comment">// blocks of the input.</span>
|
||||||
|
<span class="kw">if</span> <span class="ident">n</span> <span class="op">></span> <span class="number">0</span> <span class="op">&&</span> <span class="ident">buf</span>[<span class="ident">n</span> <span class="op">-</span> <span class="number">1</span>] <span class="op">=</span><span class="op">=</span> <span class="string">b'\r'</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">was_last_character_carriage_return</span> <span class="op">=</span> <span class="bool-val">true</span>;
|
||||||
|
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span><span class="ident">buf</span>[<span class="ident">i_prev</span>..<span class="ident">n</span> <span class="op">-</span> <span class="number">1</span>]);
|
||||||
|
} <span class="kw">else</span> {
|
||||||
|
<span class="self">self</span>.<span class="ident">was_last_character_carriage_return</span> <span class="op">=</span> <span class="bool-val">false</span>;
|
||||||
|
<span class="self">self</span>.<span class="ident">digest</span>.<span class="ident">input</span>(<span class="kw-2">&</span><span class="ident">buf</span>[<span class="ident">i_prev</span>..<span class="ident">n</span>]);
|
||||||
|
}
|
||||||
|
|
||||||
<span class="comment">// Even though we dropped a "\r" for each "\r\n" we found, we</span>
|
<span class="comment">// Even though we dropped a "\r" for each "\r\n" we found, we</span>
|
||||||
<span class="comment">// still report the number of bytes written as `n`. This is</span>
|
<span class="comment">// still report the number of bytes written as `n`. This is</span>
|
||||||
@@ -489,6 +594,39 @@
|
|||||||
<span class="prelude-val">Ok</span>(())
|
<span class="prelude-val">Ok</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="doccomment">/// Test for replacing a "\r\n" sequence with "\n" when the "\r" is</span>
|
||||||
|
<span class="doccomment">/// at the end of one block and the "\n" is at the beginning of the</span>
|
||||||
|
<span class="doccomment">/// next block, when reading in blocks.</span>
|
||||||
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">windows</span>)]</span>
|
||||||
|
<span class="attribute">#[<span class="ident">test</span>]</span>
|
||||||
|
<span class="kw">fn</span> <span class="ident">test_crlf_across_blocks</span>() {
|
||||||
|
<span class="kw">use</span> <span class="ident">std::io::Write</span>;
|
||||||
|
|
||||||
|
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::digest::Digest</span>;
|
||||||
|
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::digest::DigestWriter</span>;
|
||||||
|
|
||||||
|
<span class="comment">// Writing "\r" in one call to `write()`, and then "\n" in another.</span>
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">digest</span> <span class="op">=</span> <span class="ident">Box::new</span>(<span class="ident">md5::Context::new</span>()) <span class="kw">as</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Digest</span><span class="op">></span>;
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">writer_crlf</span> <span class="op">=</span> <span class="ident">DigestWriter::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">digest</span>, <span class="bool-val">false</span>);
|
||||||
|
<span class="ident">writer_crlf</span>.<span class="ident">write_all</span>(<span class="kw-2">&</span>[<span class="string">b'\r'</span>]).<span class="ident">unwrap</span>();
|
||||||
|
<span class="ident">writer_crlf</span>.<span class="ident">write_all</span>(<span class="kw-2">&</span>[<span class="string">b'\n'</span>]).<span class="ident">unwrap</span>();
|
||||||
|
<span class="ident">writer_crlf</span>.<span class="ident">finalize</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">result_crlf</span> <span class="op">=</span> <span class="ident">digest</span>.<span class="ident">result_str</span>();
|
||||||
|
|
||||||
|
<span class="comment">// We expect "\r\n" to be replaced with "\n" in text mode on Windows.</span>
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">digest</span> <span class="op">=</span> <span class="ident">Box::new</span>(<span class="ident">md5::Context::new</span>()) <span class="kw">as</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Digest</span><span class="op">></span>;
|
||||||
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">writer_lf</span> <span class="op">=</span> <span class="ident">DigestWriter::new</span>(<span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">digest</span>, <span class="bool-val">false</span>);
|
||||||
|
<span class="ident">writer_lf</span>.<span class="ident">write_all</span>(<span class="kw-2">&</span>[<span class="string">b'\n'</span>]).<span class="ident">unwrap</span>();
|
||||||
|
<span class="ident">writer_lf</span>.<span class="ident">finalize</span>();
|
||||||
|
<span class="kw">let</span> <span class="ident">result_lf</span> <span class="op">=</span> <span class="ident">digest</span>.<span class="ident">result_str</span>();
|
||||||
|
|
||||||
|
<span class="macro">assert_eq!</span>(<span class="ident">result_crlf</span>, <span class="ident">result_lf</span>);
|
||||||
|
}
|
||||||
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_hashsum" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div>
|
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_hashsum" 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>
|
<script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script>
|
||||||
|
|||||||
@@ -624,6 +624,14 @@
|
|||||||
<span id="624">624</span>
|
<span id="624">624</span>
|
||||||
<span id="625">625</span>
|
<span id="625">625</span>
|
||||||
<span id="626">626</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>
|
||||||
</pre><pre class="rust">
|
</pre><pre class="rust">
|
||||||
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
||||||
<span class="comment">// *</span>
|
<span class="comment">// *</span>
|
||||||
@@ -1238,8 +1246,16 @@
|
|||||||
<span class="comment">// If `binary` is `false` and the operating system is Windows, then</span>
|
<span class="comment">// If `binary` is `false` and the operating system is Windows, then</span>
|
||||||
<span class="comment">// `DigestWriter` replaces "\r\n" with "\n" before it writes the</span>
|
<span class="comment">// `DigestWriter` replaces "\r\n" with "\n" before it writes the</span>
|
||||||
<span class="comment">// bytes into `digest`. Otherwise, it just inserts the bytes as-is.</span>
|
<span class="comment">// bytes into `digest`. Otherwise, it just inserts the bytes as-is.</span>
|
||||||
|
<span class="comment">//</span>
|
||||||
|
<span class="comment">// In order to support replacing "\r\n", we must call `finalize()`</span>
|
||||||
|
<span class="comment">// in order to support the possibility that the last character read</span>
|
||||||
|
<span class="comment">// from the reader was "\r". (This character gets buffered by</span>
|
||||||
|
<span class="comment">// `DigestWriter` and only written if the following character is</span>
|
||||||
|
<span class="comment">// "\n". But when "\r" is the last character read, we need to force</span>
|
||||||
|
<span class="comment">// it to be written.)</span>
|
||||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">digest_writer</span> <span class="op">=</span> <span class="ident">DigestWriter::new</span>(<span class="ident">digest</span>, <span class="ident">binary</span>);
|
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">digest_writer</span> <span class="op">=</span> <span class="ident">DigestWriter::new</span>(<span class="ident">digest</span>, <span class="ident">binary</span>);
|
||||||
<span class="ident">std::io::copy</span>(<span class="ident">reader</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">digest_writer</span>)<span class="question-mark">?</span>;
|
<span class="ident">std::io::copy</span>(<span class="ident">reader</span>, <span class="kw-2">&</span><span class="kw-2">mut</span> <span class="ident">digest_writer</span>)<span class="question-mark">?</span>;
|
||||||
|
<span class="ident">digest_writer</span>.<span class="ident">finalize</span>();
|
||||||
|
|
||||||
<span class="kw">if</span> <span class="ident">digest</span>.<span class="ident">output_bits</span>() <span class="op">></span> <span class="number">0</span> {
|
<span class="kw">if</span> <span class="ident">digest</span>.<span class="ident">output_bits</span>() <span class="op">></span> <span class="number">0</span> {
|
||||||
<span class="prelude-val">Ok</span>(<span class="ident">digest</span>.<span class="ident">result_str</span>())
|
<span class="prelude-val">Ok</span>(<span class="ident">digest</span>.<span class="ident">result_str</span>())
|
||||||
|
|||||||
@@ -589,7 +589,6 @@
|
|||||||
<span id="589">589</span>
|
<span id="589">589</span>
|
||||||
<span id="590">590</span>
|
<span id="590">590</span>
|
||||||
<span id="591">591</span>
|
<span id="591">591</span>
|
||||||
<span id="592">592</span>
|
|
||||||
</pre><pre class="rust">
|
</pre><pre class="rust">
|
||||||
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
||||||
<span class="comment">// *</span>
|
<span class="comment">// *</span>
|
||||||
@@ -612,7 +611,6 @@
|
|||||||
<span class="kw">const</span> <span class="ident">ABOUT</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"\
|
<span class="kw">const</span> <span class="ident">ABOUT</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"\
|
||||||
Print the first 10 lines of each FILE to standard output.\n\
|
Print the first 10 lines of each FILE to standard output.\n\
|
||||||
With more than one FILE, precede each with a header giving the file name.\n\
|
With more than one FILE, precede each with a header giving the file name.\n\
|
||||||
\n\
|
|
||||||
With no FILE, or when FILE is -, read standard input.\n\
|
With no FILE, or when FILE is -, read standard input.\n\
|
||||||
\n\
|
\n\
|
||||||
Mandatory arguments to long flags are mandatory for short flags too.\
|
Mandatory arguments to long flags are mandatory for short flags too.\
|
||||||
|
|||||||
@@ -480,6 +480,15 @@
|
|||||||
<span id="480">480</span>
|
<span id="480">480</span>
|
||||||
<span id="481">481</span>
|
<span id="481">481</span>
|
||||||
<span id="482">482</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>
|
||||||
</pre><pre class="rust">
|
</pre><pre class="rust">
|
||||||
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
<span class="comment">// * This file is part of the uutils coreutils package.</span>
|
||||||
<span class="comment">// *</span>
|
<span class="comment">// *</span>
|
||||||
@@ -518,6 +527,15 @@
|
|||||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
|
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
|
||||||
<span class="kw">use</span> <span class="ident">std::os::unix::fs::MetadataExt</span>;
|
<span class="kw">use</span> <span class="ident">std::os::unix::fs::MetadataExt</span>;
|
||||||
|
|
||||||
|
<span class="kw">const</span> <span class="ident">ABOUT</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"\
|
||||||
|
Print the last 10 lines of each FILE to standard output.\n\
|
||||||
|
With more than one FILE, precede each with a header giving the file name.\n\
|
||||||
|
With no FILE, or when FILE is -, read standard input.\n\
|
||||||
|
\n\
|
||||||
|
Mandatory arguments to long flags are mandatory for short flags too.\
|
||||||
|
"</span>;
|
||||||
|
<span class="kw">const</span> <span class="ident">USAGE</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"tail [FLAG]... [FILE]..."</span>;
|
||||||
|
|
||||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">options</span> {
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">options</span> {
|
||||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">verbosity</span> {
|
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">verbosity</span> {
|
||||||
<span class="kw">pub</span> <span class="kw">static</span> <span class="ident">QUIET</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"quiet"</span>;
|
<span class="kw">pub</span> <span class="kw">static</span> <span class="ident">QUIET</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"quiet"</span>;
|
||||||
@@ -701,8 +719,8 @@
|
|||||||
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uu_app</span>() <span class="op">-</span><span class="op">></span> <span class="ident">App</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="lifetime">'static</span><span class="op">></span> {
|
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uu_app</span>() <span class="op">-</span><span class="op">></span> <span class="ident">App</span><span class="op"><</span><span class="lifetime">'static</span>, <span class="lifetime">'static</span><span class="op">></span> {
|
||||||
<span class="ident">App::new</span>(<span class="ident">uucore::util_name</span>())
|
<span class="ident">App::new</span>(<span class="ident">uucore::util_name</span>())
|
||||||
.<span class="ident">version</span>(<span class="macro">crate_version!</span>())
|
.<span class="ident">version</span>(<span class="macro">crate_version!</span>())
|
||||||
.<span class="ident">about</span>(<span class="string">"output the last part of files"</span>)
|
.<span class="ident">about</span>(<span class="ident">ABOUT</span>)
|
||||||
<span class="comment">// TODO: add usage</span>
|
.<span class="ident">usage</span>(<span class="ident">USAGE</span>)
|
||||||
.<span class="ident">arg</span>(
|
.<span class="ident">arg</span>(
|
||||||
<span class="ident">Arg::with_name</span>(<span class="ident">options::BYTES</span>)
|
<span class="ident">Arg::with_name</span>(<span class="ident">options::BYTES</span>)
|
||||||
.<span class="ident">short</span>(<span class="string">"c"</span>)
|
.<span class="ident">short</span>(<span class="string">"c"</span>)
|
||||||
|
|||||||
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
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
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
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
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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user