|
511 | 511 | <span id="506">506</span>
|
512 | 512 | <span id="507">507</span>
|
513 | 513 | <span id="508">508</span>
|
514 |
| -<span id="509">509</span> |
515 |
| -<span id="510">510</span> |
516 |
| -<span id="511">511</span> |
517 |
| -<span id="512">512</span> |
518 | 514 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
|
519 | 515 | <span class="comment">//</span>
|
520 | 516 | <span class="comment">// (c) Virgile Andreani <virgile.andreani@anbuco.fr></span>
|
|
531 | 527 |
|
532 | 528 | <span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">crate_version</span>, <span class="ident">Arg</span>, <span class="ident">ArgMatches</span>, <span class="ident">Command</span>};
|
533 | 529 | <span class="kw">use</span> <span class="ident">std::error::Error</span>;
|
534 |
| -<span class="kw">use</span> <span class="ident">std::ffi::OsString</span>; |
535 | 530 | <span class="kw">use</span> <span class="ident">std::fmt</span>;
|
536 | 531 | <span class="kw">use</span> <span class="ident">std::fs::File</span>;
|
537 | 532 | <span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdin</span>, <span class="ident">stdout</span>, <span class="ident">BufRead</span>, <span class="ident">BufReader</span>, <span class="ident">BufWriter</span>, <span class="ident">Read</span>, <span class="ident">Write</span>};
|
538 | 533 | <span class="kw">use</span> <span class="ident">std::num::IntErrorKind</span>;
|
539 | 534 | <span class="kw">use</span> <span class="ident">std::str::from_utf8</span>;
|
540 | 535 | <span class="kw">use</span> <span class="ident">unicode_width::UnicodeWidthChar</span>;
|
541 | 536 | <span class="kw">use</span> <span class="ident">uucore::display::Quotable</span>;
|
542 |
| -<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UError</span>, <span class="ident">UResult</span>, <span class="ident">UUsageError</span>}; |
543 |
| -<span class="kw">use</span> <span class="ident">uucore::format_usage</span>; |
| 537 | +<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UError</span>, <span class="ident">UResult</span>}; |
| 538 | +<span class="kw">use</span> <span class="ident">uucore</span>::{<span class="ident">format_usage</span>, <span class="ident">InvalidEncodingHandling</span>}; |
544 | 539 |
|
545 | 540 | <span class="kw">static</span> <span class="ident">ABOUT</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"Convert tabs in each FILE to spaces, writing to standard output.
|
546 | 541 | With no FILE, or when FILE is -, read standard input."</span>;
|
|
768 | 763 |
|
769 | 764 | <span class="doccomment">/// Preprocess command line arguments and expand shortcuts. For example, "-7" is expanded to</span>
|
770 | 765 | <span class="doccomment">/// "--tabs=7" and "-1,3" to "--tabs=1 --tabs=3".</span>
|
771 |
| -<span class="kw">fn</span> <span class="ident">expand_shortcuts</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>( |
772 |
| - <span class="kw-2">mut</span> <span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span> <span class="op">+</span> <span class="lifetime">'a</span>, |
773 |
| -) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">Iterator</span><span class="op"><</span><span class="ident">Item</span> <span class="op">=</span> <span class="ident">OsString</span><span class="op">></span> <span class="op">+</span> <span class="lifetime">'a</span><span class="op">></span>, <span class="ident">Box</span><span class="op"><</span>(<span class="kw">dyn</span> <span class="ident">UError</span> <span class="op">+</span> <span class="lifetime">'static</span>)<span class="op">></span><span class="op">></span> { |
774 |
| - <span class="comment">// argv[0] is always present</span> |
775 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">processed_args</span> <span class="op">=</span> <span class="macro">vec!</span>[<span class="ident">args</span>.<span class="ident">next</span>().<span class="ident">unwrap</span>()]; |
| 766 | +<span class="kw">fn</span> <span class="ident">expand_shortcuts</span>(<span class="ident">args</span>: <span class="kw-2">&</span>[<span class="ident">String</span>]) -> <span class="ident">Vec</span><span class="op"><</span><span class="ident">String</span><span class="op">></span> { |
| 767 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">processed_args</span> <span class="op">=</span> <span class="ident">Vec::with_capacity</span>(<span class="ident">args</span>.<span class="ident">len</span>()); |
776 | 768 |
|
777 | 769 | <span class="kw">for</span> <span class="ident">arg</span> <span class="kw">in</span> <span class="ident">args</span> {
|
778 |
| - <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">s</span>) <span class="op">=</span> <span class="ident">arg</span>.<span class="ident">to_str</span>() { |
779 |
| - <span class="kw">if</span> <span class="ident">s</span>.<span class="ident">starts_with</span>(<span class="string">'-'</span>) <span class="op">&&</span> <span class="ident">s</span>[<span class="number">1</span>..].<span class="ident">chars</span>().<span class="ident">all</span>(<span class="ident">is_digit_or_comma</span>) { |
780 |
| - <span class="ident">s</span>[<span class="number">1</span>..] |
781 |
| - .<span class="ident">split</span>(<span class="string">','</span>) |
782 |
| - .<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>()) |
783 |
| - .<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">processed_args</span>.<span class="ident">push</span>(<span class="macro">format!</span>(<span class="string">"--tabs={}"</span>, <span class="ident">s</span>).<span class="ident">into</span>())); |
784 |
| - } <span class="kw">else</span> { |
785 |
| - <span class="ident">processed_args</span>.<span class="ident">push</span>(<span class="ident">arg</span>); |
786 |
| - } |
| 770 | + <span class="kw">if</span> <span class="ident">arg</span>.<span class="ident">starts_with</span>(<span class="string">'-'</span>) <span class="op">&&</span> <span class="ident">arg</span>[<span class="number">1</span>..].<span class="ident">chars</span>().<span class="ident">all</span>(<span class="ident">is_digit_or_comma</span>) { |
| 771 | + <span class="ident">arg</span>[<span class="number">1</span>..] |
| 772 | + .<span class="ident">split</span>(<span class="string">','</span>) |
| 773 | + .<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>()) |
| 774 | + .<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">processed_args</span>.<span class="ident">push</span>(<span class="macro">format!</span>(<span class="string">"--tabs={}"</span>, <span class="ident">s</span>))); |
787 | 775 | } <span class="kw">else</span> {
|
788 |
| - <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">UUsageError::new</span>(<span class="number">1</span>, <span class="string">"bad argument encoding"</span>.<span class="ident">to_owned</span>())); |
| 776 | + <span class="ident">processed_args</span>.<span class="ident">push</span>(<span class="ident">arg</span>.<span class="ident">to_string</span>()); |
789 | 777 | }
|
790 | 778 | }
|
791 | 779 |
|
792 |
| - <span class="prelude-val">Ok</span>(<span class="ident">Box::new</span>(<span class="ident">processed_args</span>.<span class="ident">into_iter</span>())) |
| 780 | + <span class="ident">processed_args</span> |
793 | 781 | }
|
794 | 782 |
|
795 | 783 | <span class="attribute">#[<span class="ident">uucore::main</span>]</span>
|
796 | 784 | <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uumain</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) -> <span class="ident">UResult</span><span class="op"><</span>()<span class="op">></span> {
|
797 |
| - <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">expand_shortcuts</span>(<span class="ident">args</span>)<span class="question-mark">?</span>); |
| 785 | + <span class="kw">let</span> <span class="ident">args</span> <span class="op">=</span> <span class="ident">args</span> |
| 786 | + .<span class="ident">collect_str</span>(<span class="ident">InvalidEncodingHandling::Ignore</span>) |
| 787 | + .<span class="ident">accept_any</span>(); |
| 788 | + |
| 789 | + <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">expand_shortcuts</span>(<span class="kw-2">&</span><span class="ident">args</span>)); |
798 | 790 |
|
799 | 791 | <span class="ident">expand</span>(<span class="kw-2">&</span><span class="ident">Options::new</span>(<span class="kw-2">&</span><span class="ident">matches</span>)<span class="question-mark">?</span>).<span class="ident">map_err_context</span>(<span class="op">|</span><span class="op">|</span> <span class="string">"failed to write output"</span>.<span class="ident">to_string</span>())
|
800 | 792 | }
|
|
0 commit comments