This commit is contained in:
sylvestre
2022-02-19 02:37:01 +00:00
parent a6144bae26
commit fd6f55169f
15 changed files with 236 additions and 126 deletions
+3 -3
View File
File diff suppressed because one or more lines are too long
+29 -13
View File
@@ -783,6 +783,14 @@
<span id="782">782</span>
<span id="783">783</span>
<span id="784">784</span>
<span id="785">785</span>
<span id="786">786</span>
<span id="787">787</span>
<span id="788">788</span>
<span id="789">789</span>
<span id="790">790</span>
<span id="791">791</span>
<span id="792">792</span>
</pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
<span class="comment">// (c) Tyler Steele &lt;tyler.steele@protonmail.com&gt;</span>
@@ -1110,6 +1118,14 @@
}
}
<span class="kw">fn</span> <span class="ident">show_zero_multiplier_warning</span>() {
<span class="macro">show_warning!</span>(
<span class="string">&quot;{} is a zero multiplier; use {} if that is intended&quot;</span>,
<span class="string">&quot;0x&quot;</span>.<span class="ident">quote</span>(),
<span class="string">&quot;00x&quot;</span>.<span class="ident">quote</span>()
);
}
<span class="doccomment">/// Parse bytes using str::parse, then map error if needed.</span>
<span class="kw">fn</span> <span class="ident">parse_bytes_only</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">usize</span>, <span class="ident">ParseError</span><span class="op">&gt;</span> {
<span class="ident">s</span>.<span class="ident">parse</span>()
@@ -1142,13 +1158,6 @@
<span class="doccomment">/// assert_eq!(parse_bytes_no_x(&quot;2k&quot;).unwrap(), 2 * 1024);</span>
<span class="doccomment">/// ```</span>
<span class="kw">fn</span> <span class="ident">parse_bytes_no_x</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">usize</span>, <span class="ident">ParseError</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">s</span> <span class="op">==</span> <span class="string">&quot;0&quot;</span> {
<span class="macro">show_warning!</span>(
<span class="string">&quot;{} is a zero multiplier; use {} if that is intended&quot;</span>,
<span class="string">&quot;0x&quot;</span>.<span class="ident">quote</span>(),
<span class="string">&quot;00x&quot;</span>.<span class="ident">quote</span>()
);
}
<span class="kw">let</span> (<span class="ident">num</span>, <span class="ident">multiplier</span>) <span class="op">=</span> <span class="kw">match</span> (<span class="ident">s</span>.<span class="ident">find</span>(<span class="string">&#39;c&#39;</span>), <span class="ident">s</span>.<span class="ident">rfind</span>(<span class="string">&#39;w&#39;</span>), <span class="ident">s</span>.<span class="ident">rfind</span>(<span class="string">&#39;b&#39;</span>)) {
(<span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>) =&gt; <span class="kw">match</span> <span class="ident">uucore::parse_size::parse_size</span>(<span class="ident">s</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">n</span>) =&gt; (<span class="ident">n</span>, <span class="number">1</span>),
@@ -1186,13 +1195,20 @@
<span class="comment">// Split on the &#39;x&#39; characters. Each component will be parsed</span>
<span class="comment">// individually, then multiplied together.</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">total</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">for</span> <span class="ident">part</span> <span class="kw">in</span> <span class="ident">s</span>.<span class="ident">split</span>(<span class="string">&#39;x&#39;</span>) {
<span class="kw">let</span> <span class="ident">num</span> <span class="op">=</span> <span class="ident">parse_bytes_no_x</span>(<span class="ident">part</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">with_arg</span>(<span class="ident">s</span>.<span class="ident">to_string</span>()))<span class="question-mark">?</span>;
<span class="ident">total</span> <span class="kw-2">*</span><span class="op">=</span> <span class="ident">num</span>;
<span class="kw">let</span> <span class="ident">parts</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="ident">s</span>.<span class="ident">split</span>(<span class="string">&#39;x&#39;</span>).<span class="ident">collect</span>();
<span class="kw">if</span> <span class="ident">parts</span>.<span class="ident">len</span>() <span class="op">==</span> <span class="number">1</span> {
<span class="ident">parse_bytes_no_x</span>(<span class="ident">parts</span>[<span class="number">0</span>]).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">with_arg</span>(<span class="ident">s</span>.<span class="ident">to_string</span>()))
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">total</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">for</span> <span class="ident">part</span> <span class="kw">in</span> <span class="ident">parts</span> {
<span class="kw">if</span> <span class="ident">part</span> <span class="op">==</span> <span class="string">&quot;0&quot;</span> {
<span class="ident">show_zero_multiplier_warning</span>();
}
<span class="kw">let</span> <span class="ident">num</span> <span class="op">=</span> <span class="ident">parse_bytes_no_x</span>(<span class="ident">part</span>).<span class="ident">map_err</span>(<span class="op">|</span><span class="ident">e</span><span class="op">|</span> <span class="ident">e</span>.<span class="ident">with_arg</span>(<span class="ident">s</span>.<span class="ident">to_string</span>()))<span class="question-mark">?</span>;
<span class="ident">total</span> <span class="kw-2">*</span><span class="op">=</span> <span class="ident">num</span>;
}
<span class="prelude-val">Ok</span>(<span class="ident">total</span>)
}
<span class="prelude-val">Ok</span>(<span class="ident">total</span>)
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">parse_ibs</span>(<span class="ident">matches</span>: <span class="kw-2">&amp;</span><span class="ident">Matches</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">usize</span>, <span class="ident">ParseError</span><span class="op">&gt;</span> {
+83 -63
View File
@@ -2583,6 +2583,16 @@
<span id="2582">2582</span>
<span id="2583">2583</span>
<span id="2584">2584</span>
<span id="2585">2585</span>
<span id="2586">2586</span>
<span id="2587">2587</span>
<span id="2588">2588</span>
<span id="2589">2589</span>
<span id="2590">2590</span>
<span id="2591">2591</span>
<span id="2592">2592</span>
<span id="2593">2593</span>
<span id="2594">2594</span>
</pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
<span class="comment">//</span>
<span class="comment">// (c) Jeremiah Peschka &lt;jeremiah.peschka@gmail.com&gt;</span>
@@ -3994,7 +4004,8 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="comment">// if not, check if we can use Path metadata</span>
<span class="kw">match</span> <span class="ident">get_metadata</span>(<span class="self">self</span>.<span class="ident">p_buf</span>.<span class="ident">as_path</span>(), <span class="self">self</span>.<span class="ident">must_dereference</span>) {
<span class="prelude-val">Err</span>(<span class="ident">err</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">out</span>.<span class="ident">flush</span>();
<span class="comment">// FIXME: A bit tricky to propagate the result here</span>
<span class="ident">out</span>.<span class="ident">flush</span>().<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="ident">errno</span> <span class="op">=</span> <span class="ident">err</span>.<span class="ident">raw_os_error</span>().<span class="ident">unwrap_or</span>(<span class="number">1i32</span>);
<span class="comment">// a bad fd will throw an error when dereferenced,</span>
<span class="comment">// but GNU will not throw an error until a bad fd &quot;dir&quot;</span>
@@ -4058,7 +4069,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="ident">sort_entries</span>(<span class="kw-2">&amp;mut</span> <span class="ident">files</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>);
<span class="ident">sort_entries</span>(<span class="kw-2">&amp;mut</span> <span class="ident">dirs</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>);
<span class="ident">display_items</span>(<span class="kw-2">&amp;</span><span class="ident">files</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>);
<span class="ident">display_items</span>(<span class="kw-2">&amp;</span><span class="ident">files</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>)<span class="question-mark">?</span>;
<span class="kw">for</span> (<span class="ident">pos</span>, <span class="ident">path_data</span>) <span class="kw">in</span> <span class="ident">dirs</span>.<span class="ident">iter</span>().<span class="ident">enumerate</span>() {
<span class="comment">// Do read_dir call here to match GNU semantics by printing</span>
@@ -4066,7 +4077,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="kw">let</span> <span class="ident">read_dir</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">fs::read_dir</span>(<span class="kw-2">&amp;</span><span class="ident">path_data</span>.<span class="ident">p_buf</span>) {
<span class="prelude-val">Err</span>(<span class="ident">err</span>) =&gt; {
<span class="comment">// flush stdout buffer before the error to preserve formatting and order</span>
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">out</span>.<span class="ident">flush</span>();
<span class="ident">out</span>.<span class="ident">flush</span>()<span class="question-mark">?</span>;
<span class="macro">show!</span>(<span class="ident">LsError::IOErrorContext</span>(<span class="ident">err</span>, <span class="ident">path_data</span>.<span class="ident">p_buf</span>.<span class="ident">clone</span>()));
<span class="kw">continue</span>;
}
@@ -4076,12 +4087,12 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="comment">// Print dir heading - name... &#39;total&#39; comes after error display</span>
<span class="kw">if</span> <span class="ident">initial_locs_len</span> <span class="op">&gt;</span> <span class="number">1</span> <span class="op">|</span><span class="op">|</span> <span class="ident">config</span>.<span class="ident">recursive</span> {
<span class="kw">if</span> <span class="ident">pos</span>.<span class="ident">eq</span>(<span class="kw-2">&amp;</span><span class="number">0usize</span>) <span class="op">&amp;&amp;</span> <span class="ident">files</span>.<span class="ident">is_empty</span>() {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;{}:&quot;</span>, <span class="ident">path_data</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>());
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;{}:&quot;</span>, <span class="ident">path_data</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>())<span class="question-mark">?</span>;
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;\n{}:&quot;</span>, <span class="ident">path_data</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>());
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;\n{}:&quot;</span>, <span class="ident">path_data</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>())<span class="question-mark">?</span>;
}
}
<span class="ident">enter_directory</span>(<span class="ident">path_data</span>, <span class="ident">read_dir</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>);
<span class="ident">enter_directory</span>(<span class="ident">path_data</span>, <span class="ident">read_dir</span>, <span class="ident">config</span>, <span class="kw-2">&amp;mut</span> <span class="ident">out</span>)<span class="question-mark">?</span>;
}
<span class="prelude-val">Ok</span>(())
@@ -4155,7 +4166,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="ident">read_dir</span>: <span class="ident">ReadDir</span>,
<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>,
<span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>,
) {
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="comment">// Create vec of entries with initial dot files</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">entries</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">PathData</span><span class="op">&gt;</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">config</span>.<span class="ident">files</span> <span class="op">==</span> <span class="ident">Files::All</span> {
<span class="macro">vec!</span>[
@@ -4185,7 +4196,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="kw">let</span> <span class="ident">dir_entry</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">raw_entry</span> {
<span class="prelude-val">Ok</span>(<span class="ident">path</span>) =&gt; <span class="ident">path</span>,
<span class="prelude-val">Err</span>(<span class="ident">err</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">out</span>.<span class="ident">flush</span>();
<span class="ident">out</span>.<span class="ident">flush</span>()<span class="question-mark">?</span>;
<span class="macro">show!</span>(<span class="ident">LsError::IOError</span>(<span class="ident">err</span>));
<span class="kw">continue</span>;
}
@@ -4203,10 +4214,10 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="comment">// Print total after any error display</span>
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">format</span> <span class="op">==</span> <span class="ident">Format::Long</span> {
<span class="ident">display_total</span>(<span class="kw-2">&amp;</span><span class="ident">entries</span>, <span class="ident">config</span>, <span class="ident">out</span>);
<span class="ident">display_total</span>(<span class="kw-2">&amp;</span><span class="ident">entries</span>, <span class="ident">config</span>, <span class="ident">out</span>)<span class="question-mark">?</span>;
}
<span class="ident">display_items</span>(<span class="kw-2">&amp;</span><span class="ident">entries</span>, <span class="ident">config</span>, <span class="ident">out</span>);
<span class="ident">display_items</span>(<span class="kw-2">&amp;</span><span class="ident">entries</span>, <span class="ident">config</span>, <span class="ident">out</span>)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">recursive</span> {
<span class="kw">for</span> <span class="ident">e</span> <span class="kw">in</span> <span class="ident">entries</span>
@@ -4218,17 +4229,19 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
{
<span class="kw">match</span> <span class="ident">fs::read_dir</span>(<span class="kw-2">&amp;</span><span class="ident">e</span>.<span class="ident">p_buf</span>) {
<span class="prelude-val">Err</span>(<span class="ident">err</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">out</span>.<span class="ident">flush</span>();
<span class="ident">out</span>.<span class="ident">flush</span>()<span class="question-mark">?</span>;
<span class="macro">show!</span>(<span class="ident">LsError::IOErrorContext</span>(<span class="ident">err</span>, <span class="ident">e</span>.<span class="ident">p_buf</span>.<span class="ident">clone</span>()));
<span class="kw">continue</span>;
}
<span class="prelude-val">Ok</span>(<span class="ident">rd</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;\n{}:&quot;</span>, <span class="ident">e</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>());
<span class="ident">enter_directory</span>(<span class="ident">e</span>, <span class="ident">rd</span>, <span class="ident">config</span>, <span class="ident">out</span>);
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;\n{}:&quot;</span>, <span class="ident">e</span>.<span class="ident">p_buf</span>.<span class="ident">display</span>())<span class="question-mark">?</span>;
<span class="ident">enter_directory</span>(<span class="ident">e</span>, <span class="ident">rd</span>, <span class="ident">config</span>, <span class="ident">out</span>)<span class="question-mark">?</span>;
}
}
}
}
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn</span> <span class="ident">get_metadata</span>(<span class="ident">p_buf</span>: <span class="kw-2">&amp;</span><span class="ident">Path</span>, <span class="ident">dereference</span>: <span class="ident">bool</span>) -&gt; <span class="ident">std::io::Result</span><span class="op">&lt;</span><span class="ident">Metadata</span><span class="op">&gt;</span> {
@@ -4276,7 +4289,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="macro">format!</span>(<span class="string">&quot;{:&lt;width$}&quot;</span>, <span class="ident">string</span>, <span class="ident">width</span> <span class="op">=</span> <span class="ident">count</span>)
}
<span class="kw">fn</span> <span class="ident">display_total</span>(<span class="ident">items</span>: <span class="kw-2">&amp;</span>[<span class="ident">PathData</span>], <span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>, <span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>) {
<span class="kw">fn</span> <span class="ident">display_total</span>(<span class="ident">items</span>: <span class="kw-2">&amp;</span>[<span class="ident">PathData</span>], <span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>, <span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>) -&gt; <span class="ident">UResult</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">total_size</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">for</span> <span class="ident">item</span> <span class="kw">in</span> <span class="ident">items</span> {
<span class="ident">total_size</span> <span class="op">+</span><span class="op">=</span> <span class="ident">item</span>
@@ -4284,10 +4297,11 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
.<span class="ident">as_ref</span>()
.<span class="ident">map_or</span>(<span class="number">0</span>, <span class="op">|</span><span class="ident">md</span><span class="op">|</span> <span class="ident">get_block_size</span>(<span class="ident">md</span>, <span class="ident">config</span>));
}
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;total {}&quot;</span>, <span class="ident">display_size</span>(<span class="ident">total_size</span>, <span class="ident">config</span>));
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;total {}&quot;</span>, <span class="ident">display_size</span>(<span class="ident">total_size</span>, <span class="ident">config</span>))<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn</span> <span class="ident">display_items</span>(<span class="ident">items</span>: <span class="kw-2">&amp;</span>[<span class="ident">PathData</span>], <span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>, <span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>) {
<span class="kw">fn</span> <span class="ident">display_items</span>(<span class="ident">items</span>: <span class="kw-2">&amp;</span>[<span class="ident">PathData</span>], <span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>, <span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="comment">// `-Z`, `--context`:</span>
<span class="comment">// Display the SELinux security context or &#39;?&#39; if none is found. When used with the `-l`</span>
<span class="comment">// option, print the security context to the left of the size column.</span>
@@ -4296,7 +4310,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="kw">let</span> <span class="ident">padding_collection</span> <span class="op">=</span> <span class="ident">calculate_padding_collection</span>(<span class="ident">items</span>, <span class="ident">config</span>, <span class="ident">out</span>);
<span class="kw">for</span> <span class="ident">item</span> <span class="kw">in</span> <span class="ident">items</span> {
<span class="ident">display_item_long</span>(<span class="ident">item</span>, <span class="kw-2">&amp;</span><span class="ident">padding_collection</span>, <span class="ident">config</span>, <span class="ident">out</span>);
<span class="ident">display_item_long</span>(<span class="ident">item</span>, <span class="kw-2">&amp;</span><span class="ident">padding_collection</span>, <span class="ident">config</span>, <span class="ident">out</span>)<span class="question-mark">?</span>;
}
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">longest_context_len</span> <span class="op">=</span> <span class="number">1</span>;
@@ -4333,13 +4347,13 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
.<span class="ident">into_iter</span>();
<span class="kw">match</span> <span class="ident">config</span>.<span class="ident">format</span> {
<span class="ident">Format::Columns</span> =&gt; <span class="ident">display_grid</span>(<span class="ident">names</span>, <span class="ident">config</span>.<span class="ident">width</span>, <span class="ident">Direction::TopToBottom</span>, <span class="ident">out</span>),
<span class="ident">Format::Across</span> =&gt; <span class="ident">display_grid</span>(<span class="ident">names</span>, <span class="ident">config</span>.<span class="ident">width</span>, <span class="ident">Direction::LeftToRight</span>, <span class="ident">out</span>),
<span class="ident">Format::Columns</span> =&gt; <span class="ident">display_grid</span>(<span class="ident">names</span>, <span class="ident">config</span>.<span class="ident">width</span>, <span class="ident">Direction::TopToBottom</span>, <span class="ident">out</span>)<span class="question-mark">?</span>,
<span class="ident">Format::Across</span> =&gt; <span class="ident">display_grid</span>(<span class="ident">names</span>, <span class="ident">config</span>.<span class="ident">width</span>, <span class="ident">Direction::LeftToRight</span>, <span class="ident">out</span>)<span class="question-mark">?</span>,
<span class="ident">Format::Commas</span> =&gt; {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">current_col</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">names</span> <span class="op">=</span> <span class="ident">names</span>;
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">name</span>) <span class="op">=</span> <span class="ident">names</span>.<span class="ident">next</span>() {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>)<span class="question-mark">?</span>;
<span class="ident">current_col</span> <span class="op">=</span> <span class="ident">name</span>.<span class="ident">width</span> <span class="kw">as</span> <span class="ident">u16</span> <span class="op">+</span> <span class="number">2</span>;
}
<span class="kw">for</span> <span class="ident">name</span> <span class="kw">in</span> <span class="ident">names</span> {
@@ -4347,25 +4361,27 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="comment">// If the width is 0 we print one single line</span>
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">width</span> <span class="op">!</span><span class="op">=</span> <span class="number">0</span> <span class="op">&amp;&amp;</span> <span class="ident">current_col</span> <span class="op">+</span> <span class="ident">name_width</span> <span class="op">+</span> <span class="number">1</span> <span class="op">&gt;</span> <span class="ident">config</span>.<span class="ident">width</span> {
<span class="ident">current_col</span> <span class="op">=</span> <span class="ident">name_width</span> <span class="op">+</span> <span class="number">2</span>;
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;,\n{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;,\n{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>)<span class="question-mark">?</span>;
} <span class="kw">else</span> {
<span class="ident">current_col</span> <span class="op">+</span><span class="op">=</span> <span class="ident">name_width</span> <span class="op">+</span> <span class="number">2</span>;
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;, {}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;, {}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>)<span class="question-mark">?</span>;
}
}
<span class="comment">// Current col is never zero again if names have been printed.</span>
<span class="comment">// So we print a newline.</span>
<span class="kw">if</span> <span class="ident">current_col</span> <span class="op">&gt;</span> <span class="number">0</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>,);
<span class="macro">writeln!</span>(<span class="ident">out</span>,)<span class="question-mark">?</span>;
}
}
<span class="kw">_</span> =&gt; {
<span class="kw">for</span> <span class="ident">name</span> <span class="kw">in</span> <span class="ident">names</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>);
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>)<span class="question-mark">?</span>;
}
}
}
};
}
<span class="prelude-val">Ok</span>(())
}
<span class="kw">fn</span> <span class="ident">get_block_size</span>(<span class="ident">md</span>: <span class="kw-2">&amp;</span><span class="ident">Metadata</span>, <span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>) -&gt; <span class="ident">u64</span> {
@@ -4384,6 +4400,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">not</span>(<span class="ident">unix</span>))]</span>
{
<span class="comment">// Silence linter warning about `config` being unused for windows.</span>
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="ident">config</span>;
<span class="comment">// no way to get block size for windows, fall-back to file size</span>
<span class="ident">md</span>.<span class="ident">len</span>()
@@ -4395,19 +4412,19 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="ident">width</span>: <span class="ident">u16</span>,
<span class="ident">direction</span>: <span class="ident">Direction</span>,
<span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>,
) {
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">width</span> <span class="op">==</span> <span class="number">0</span> {
<span class="comment">// If the width is 0 we print one single line</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">printed_something</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">for</span> <span class="ident">name</span> <span class="kw">in</span> <span class="ident">names</span> {
<span class="kw">if</span> <span class="ident">printed_something</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; &quot;</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; &quot;</span>)<span class="question-mark">?</span>;
}
<span class="ident">printed_something</span> <span class="op">=</span> <span class="bool-val">true</span>;
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">name</span>.<span class="ident">contents</span>)<span class="question-mark">?</span>;
}
<span class="kw">if</span> <span class="ident">printed_something</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>);
<span class="macro">writeln!</span>(<span class="ident">out</span>)<span class="question-mark">?</span>;
}
} <span class="kw">else</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">grid</span> <span class="op">=</span> <span class="ident">Grid::new</span>(<span class="ident">GridOptions</span> {
@@ -4421,14 +4438,15 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="kw">match</span> <span class="ident">grid</span>.<span class="ident">fit_into_width</span>(<span class="ident">width</span> <span class="kw">as</span> <span class="ident">usize</span>) {
<span class="prelude-val">Some</span>(<span class="ident">output</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">output</span>);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">output</span>)<span class="question-mark">?</span>;
}
<span class="comment">// Width is too small for the grid, so we fit it in one column</span>
<span class="prelude-val">None</span> =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">grid</span>.<span class="ident">fit_into_columns</span>(<span class="number">1</span>));
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{}&quot;</span>, <span class="ident">grid</span>.<span class="ident">fit_into_columns</span>(<span class="number">1</span>))<span class="question-mark">?</span>;
}
}
}
<span class="prelude-val">Ok</span>(())
}
<span class="doccomment">/// This writes to the BufWriter out a single string of the output of `ls -l`.</span>
@@ -4464,16 +4482,16 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="ident">padding</span>: <span class="kw-2">&amp;</span><span class="ident">PaddingCollection</span>,
<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Config</span>,
<span class="ident">out</span>: <span class="kw-2">&amp;mut</span> <span class="ident">BufWriter</span><span class="op">&lt;</span><span class="ident">Stdout</span><span class="op">&gt;</span>,
) {
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">md</span>) <span class="op">=</span> <span class="ident">item</span>.<span class="ident">md</span>(<span class="ident">out</span>) {
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
{
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">inode</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{} &quot;</span>, <span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">get_inode</span>(<span class="ident">md</span>), <span class="ident">padding</span>.<span class="ident">inode</span>),);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{} &quot;</span>, <span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">get_inode</span>(<span class="ident">md</span>), <span class="ident">padding</span>.<span class="ident">inode</span>))<span class="question-mark">?</span>;
}
}
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot;{}{} {}&quot;</span>,
<span class="ident">display_permissions</span>(<span class="ident">md</span>, <span class="bool-val">true</span>),
@@ -4484,49 +4502,49 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
} <span class="kw">else</span> {
<span class="string">&quot;&quot;</span>
},
<span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">display_symlink_count</span>(<span class="ident">md</span>), <span class="ident">padding</span>.<span class="ident">link_count</span>),
);
<span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">display_symlink_count</span>(<span class="ident">md</span>), <span class="ident">padding</span>.<span class="ident">link_count</span>)
)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">owner</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}&quot;</span>,
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_uname</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">uname</span>),
);
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_uname</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">uname</span>)
)<span class="question-mark">?</span>;
}
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">group</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}&quot;</span>,
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_group</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">group</span>),
);
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_group</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">group</span>)
)<span class="question-mark">?</span>;
}
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">context</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}&quot;</span>,
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">item</span>.<span class="ident">security_context</span>, <span class="ident">padding</span>.<span class="ident">context</span>),
);
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">item</span>.<span class="ident">security_context</span>, <span class="ident">padding</span>.<span class="ident">context</span>)
)<span class="question-mark">?</span>;
}
<span class="comment">// Author is only different from owner on GNU/Hurd, so we reuse</span>
<span class="comment">// the owner, since GNU/Hurd is not currently supported by Rust.</span>
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">author</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}&quot;</span>,
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_uname</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">uname</span>),
);
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">display_uname</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">padding</span>.<span class="ident">uname</span>)
)<span class="question-mark">?</span>;
}
<span class="kw">match</span> <span class="ident">display_size_or_rdev</span>(<span class="ident">md</span>, <span class="ident">config</span>) {
<span class="ident">SizeOrDeviceId::Size</span>(<span class="ident">size</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">size</span>, <span class="ident">padding</span>.<span class="ident">size</span>),);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_left</span>(<span class="kw-2">&amp;</span><span class="ident">size</span>, <span class="ident">padding</span>.<span class="ident">size</span>))<span class="question-mark">?</span>;
}
<span class="ident">SizeOrDeviceId::Device</span>(<span class="ident">major</span>, <span class="ident">minor</span>) =&gt; {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}, {}&quot;</span>,
<span class="ident">pad_left</span>(
@@ -4547,19 +4565,19 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
<span class="ident">padding</span>.<span class="ident">minor</span>,
),
);
)<span class="question-mark">?</span>;
}
};
<span class="kw">let</span> <span class="ident">dfn</span> <span class="op">=</span> <span class="ident">display_file_name</span>(<span class="ident">item</span>, <span class="ident">config</span>, <span class="prelude-val">None</span>, <span class="number">0</span>, <span class="ident">out</span>).<span class="ident">contents</span>;
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot; {} {}&quot;</span>, <span class="ident">display_date</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">dfn</span>);
<span class="macro">writeln!</span>(<span class="ident">out</span>, <span class="string">&quot; {} {}&quot;</span>, <span class="ident">display_date</span>(<span class="ident">md</span>, <span class="ident">config</span>), <span class="ident">dfn</span>)<span class="question-mark">?</span>;
} <span class="kw">else</span> {
<span class="comment">// this &#39;else&#39; is expressly for the case of a dangling symlink/restricted file</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
{
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">inode</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{} &quot;</span>, <span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">inode</span>),);
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot;{} &quot;</span>, <span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">inode</span>))<span class="question-mark">?</span>;
}
}
@@ -4596,7 +4614,7 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
}
};
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot;{}{} {}&quot;</span>,
<span class="macro">format_args!</span>(<span class="string">&quot;{}?????????&quot;</span>, <span class="ident">leading_char</span>),
@@ -4607,42 +4625,44 @@ only ignore &#39;.&#39; and &#39;..&#39;.&quot;</span>,
} <span class="kw">else</span> {
<span class="string">&quot;&quot;</span>
},
<span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">link_count</span>),
);
<span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">link_count</span>)
)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">owner</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">uname</span>));
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">uname</span>))<span class="question-mark">?</span>;
}
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">group</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">group</span>));
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">group</span>))<span class="question-mark">?</span>;
}
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">context</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(
<span class="macro">write!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {}&quot;</span>,
<span class="ident">pad_right</span>(<span class="kw-2">&amp;</span><span class="ident">item</span>.<span class="ident">security_context</span>, <span class="ident">padding</span>.<span class="ident">context</span>)
);
)<span class="question-mark">?</span>;
}
<span class="comment">// Author is only different from owner on GNU/Hurd, so we reuse</span>
<span class="comment">// the owner, since GNU/Hurd is not currently supported by Rust.</span>
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">long</span>.<span class="ident">author</span> {
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">uname</span>));
<span class="macro">write!</span>(<span class="ident">out</span>, <span class="string">&quot; {}&quot;</span>, <span class="ident">pad_right</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">uname</span>))<span class="question-mark">?</span>;
}
<span class="kw">let</span> <span class="ident">dfn</span> <span class="op">=</span> <span class="ident">display_file_name</span>(<span class="ident">item</span>, <span class="ident">config</span>, <span class="prelude-val">None</span>, <span class="number">0</span>, <span class="ident">out</span>).<span class="ident">contents</span>;
<span class="kw">let</span> <span class="ident">date_len</span> <span class="op">=</span> <span class="number">12</span>;
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="macro">writeln!</span>(
<span class="macro">writeln!</span>(
<span class="ident">out</span>,
<span class="string">&quot; {} {} {}&quot;</span>,
<span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">padding</span>.<span class="ident">size</span>),
<span class="ident">pad_left</span>(<span class="string">&quot;?&quot;</span>, <span class="ident">date_len</span>),
<span class="ident">dfn</span>,
);
)<span class="question-mark">?</span>;
}
<span class="prelude-val">Ok</span>(())
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">unix</span>)]</span>
+1 -1
View File
@@ -591,7 +591,7 @@ COPYRIGHT :
<span class="prelude-val">None</span> =&gt; <span class="macro">vec!</span>[],
};
<span class="ident">memo::Memo::run_all</span>(<span class="ident">format_string</span>, <span class="kw-2">&amp;</span><span class="ident">values</span>[..]);
<span class="ident">memo::Memo::run_all</span>(<span class="ident">format_string</span>, <span class="kw-2">&amp;</span><span class="ident">values</span>[..])<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(())
}
+18 -2
View File
@@ -364,6 +364,14 @@
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
</pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
<span class="comment">// *</span>
<span class="comment">// * For the full copyright and license information, please view the LICENSE</span>
@@ -371,6 +379,7 @@
<span class="comment">// TODO: Support -f flag</span>
<span class="comment">// spell-checker:ignore (ToDO) istr chiter argptr ilen extendedbigdecimal extendedbigint numberparse</span>
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdout</span>, <span class="ident">ErrorKind</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std::process::exit</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">AppSettings</span>, <span class="ident">Arg</span>};
<span class="kw">use</span> <span class="ident">num_traits::Zero</span>;
@@ -378,6 +387,7 @@
<span class="kw">use</span> <span class="ident">uucore::error::FromIo</span>;
<span class="kw">use</span> <span class="ident">uucore::error::UResult</span>;
<span class="kw">use</span> <span class="ident">uucore::memo::Memo</span>;
<span class="kw">use</span> <span class="ident">uucore::show</span>;
<span class="kw">mod</span> <span class="ident">error</span>;
<span class="kw">mod</span> <span class="ident">extendedbigdecimal</span>;
@@ -653,7 +663,10 @@
<span class="kw">match</span> <span class="ident">format</span> {
<span class="prelude-val">Some</span>(<span class="ident">f</span>) =&gt; {
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="macro">format!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">value</span>);
<span class="ident">Memo::run_all</span>(<span class="ident">f</span>, <span class="kw-2">&amp;</span>[<span class="ident">s</span>]);
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="ident">Memo::run_all</span>(<span class="ident">f</span>, <span class="kw-2">&amp;</span>[<span class="ident">s</span>]) {
<span class="macro">show!</span>(<span class="ident">x</span>);
<span class="ident">exit</span>(<span class="number">1</span>);
}
}
<span class="prelude-val">None</span> =&gt; <span class="ident">write_value_float</span>(
<span class="kw-2">&amp;mut</span> <span class="ident">stdout</span>,
@@ -715,7 +728,10 @@
<span class="kw">match</span> <span class="ident">format</span> {
<span class="prelude-val">Some</span>(<span class="ident">f</span>) =&gt; {
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="macro">format!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">value</span>);
<span class="ident">Memo::run_all</span>(<span class="ident">f</span>, <span class="kw-2">&amp;</span>[<span class="ident">s</span>]);
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Err</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="ident">Memo::run_all</span>(<span class="ident">f</span>, <span class="kw-2">&amp;</span>[<span class="ident">s</span>]) {
<span class="macro">show!</span>(<span class="ident">x</span>);
<span class="ident">exit</span>(<span class="number">1</span>);
}
}
<span class="prelude-val">None</span> =&gt; <span class="ident">write_value_int</span>(<span class="kw-2">&amp;mut</span> <span class="ident">stdout</span>, <span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="ident">padding</span>, <span class="ident">pad</span>, <span class="ident">is_first_iteration</span>)<span class="question-mark">?</span>,
}
+9 -7
View File
@@ -83,6 +83,7 @@
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
</pre><pre class="rust"><code><span class="doccomment">//! Memo runner of printf</span>
<span class="doccomment">//! Takes a format string and arguments</span>
<span class="doccomment">//! 1. tokenize format string into tokens, consuming</span>
@@ -91,6 +92,7 @@
<span class="doccomment">//! that prints tokens.</span>
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::display::Quotable</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::error::UResult</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::features::tokenize::sub::Sub</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::features::tokenize::token</span>::{<span class="ident">Token</span>, <span class="ident">Tokenizer</span>};
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::features::tokenize::unescaped_text::UnescapedText</span>;
@@ -111,17 +113,17 @@
}
<span class="kw">impl</span> <span class="ident">Memo</span> {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">pf_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">pf_args_it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>) -&gt; <span class="self">Self</span> {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">pf_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">pf_args_it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="self">Self</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">pm</span> <span class="op">=</span> <span class="self">Self</span> { <span class="ident">tokens</span>: <span class="ident">Vec::new</span>() };
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">tmp_token</span>: <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Token</span><span class="op">&gt;</span><span class="op">&gt;</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">it</span> <span class="op">=</span> <span class="ident">put_back_n</span>(<span class="ident">pf_string</span>.<span class="ident">chars</span>());
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">has_sub</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">loop</span> {
<span class="ident">tmp_token</span> <span class="op">=</span> <span class="ident">UnescapedText::from_it</span>(<span class="kw-2">&amp;mut</span> <span class="ident">it</span>, <span class="ident">pf_args_it</span>);
<span class="ident">tmp_token</span> <span class="op">=</span> <span class="ident">UnescapedText::from_it</span>(<span class="kw-2">&amp;mut</span> <span class="ident">it</span>, <span class="ident">pf_args_it</span>)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="ident">tmp_token</span> {
<span class="ident">pm</span>.<span class="ident">tokens</span>.<span class="ident">push</span>(<span class="ident">x</span>);
}
<span class="ident">tmp_token</span> <span class="op">=</span> <span class="ident">Sub::from_it</span>(<span class="kw-2">&amp;mut</span> <span class="ident">it</span>, <span class="ident">pf_args_it</span>);
<span class="ident">tmp_token</span> <span class="op">=</span> <span class="ident">Sub::from_it</span>(<span class="kw-2">&amp;mut</span> <span class="ident">it</span>, <span class="ident">pf_args_it</span>)<span class="question-mark">?</span>;
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="ident">tmp_token</span> {
<span class="kw">if</span> <span class="op">!</span><span class="ident">has_sub</span> {
<span class="ident">has_sub</span> <span class="op">=</span> <span class="bool-val">true</span>;
@@ -149,19 +151,19 @@
}
}
}
<span class="ident">pm</span>
<span class="prelude-val">Ok</span>(<span class="ident">pm</span>)
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">apply</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">pf_args_it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>) {
<span class="kw">for</span> <span class="ident">tkn</span> <span class="kw">in</span> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">tokens</span> {
<span class="ident">tkn</span>.<span class="ident">print</span>(<span class="ident">pf_args_it</span>);
}
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">run_all</span>(<span class="ident">pf_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">pf_args</span>: <span class="kw-2">&amp;</span>[<span class="ident">String</span>]) {
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">run_all</span>(<span class="ident">pf_string</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">pf_args</span>: <span class="kw-2">&amp;</span>[<span class="ident">String</span>]) -&gt; <span class="ident">UResult</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">arg_it</span> <span class="op">=</span> <span class="ident">pf_args</span>.<span class="ident">iter</span>().<span class="ident">peekable</span>();
<span class="kw">let</span> <span class="ident">pm</span> <span class="op">=</span> <span class="ident"><span class="self">Self</span>::new</span>(<span class="ident">pf_string</span>, <span class="kw-2">&amp;mut</span> <span class="ident">arg_it</span>);
<span class="kw">let</span> <span class="ident">pm</span> <span class="op">=</span> <span class="ident"><span class="self">Self</span>::new</span>(<span class="ident">pf_string</span>, <span class="kw-2">&amp;mut</span> <span class="ident">arg_it</span>)<span class="question-mark">?</span>;
<span class="kw">loop</span> {
<span class="kw">if</span> <span class="ident">arg_it</span>.<span class="ident">peek</span>().<span class="ident">is_none</span>() {
<span class="kw">break</span>;
<span class="kw">return</span> <span class="prelude-val">Ok</span>(());
}
<span class="ident">pm</span>.<span class="ident">apply</span>(<span class="kw-2">&amp;mut</span> <span class="ident">arg_it</span>);
}
+76 -28
View File
@@ -420,6 +420,30 @@
<span id="419">419</span>
<span id="420">420</span>
<span id="421">421</span>
<span id="422">422</span>
<span id="423">423</span>
<span id="424">424</span>
<span id="425">425</span>
<span id="426">426</span>
<span id="427">427</span>
<span id="428">428</span>
<span id="429">429</span>
<span id="430">430</span>
<span id="431">431</span>
<span id="432">432</span>
<span id="433">433</span>
<span id="434">434</span>
<span id="435">435</span>
<span id="436">436</span>
<span id="437">437</span>
<span id="438">438</span>
<span id="439">439</span>
<span id="440">440</span>
<span id="441">441</span>
<span id="442">442</span>
<span id="443">443</span>
<span id="444">444</span>
<span id="445">445</span>
</pre><pre class="rust"><code><span class="comment">// spell-checker:ignore (vars) charf decf floatf intf scif strf Cninety</span>
<span class="doccomment">//! Sub is a token that represents a</span>
@@ -427,8 +451,10 @@
<span class="doccomment">//! it is created by Sub&#39;s implementation of the Tokenizer trait</span>
<span class="doccomment">//! Subs which have numeric field chars make use of the num_format</span>
<span class="doccomment">//! submodule</span>
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::show_error</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::error</span>::{<span class="ident">UError</span>, <span class="ident">UResult</span>};
<span class="kw">use</span> <span class="ident">itertools</span>::{<span class="ident">put_back_n</span>, <span class="ident">PutBackN</span>};
<span class="kw">use</span> <span class="ident">std::error::Error</span>;
<span class="kw">use</span> <span class="ident">std::fmt::Display</span>;
<span class="kw">use</span> <span class="ident">std::iter::Peekable</span>;
<span class="kw">use</span> <span class="ident">std::process::exit</span>;
<span class="kw">use</span> <span class="ident">std::slice::Iter</span>;
@@ -442,11 +468,23 @@
<span class="kw">const</span> <span class="ident">EXIT_ERR</span>: <span class="ident">i32</span> <span class="op">=</span> <span class="number">1</span>;
<span class="kw">fn</span> <span class="ident">err_conv</span>(<span class="ident">sofar</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) {
<span class="macro">show_error!</span>(<span class="string">&quot;%{}: invalid conversion specification&quot;</span>, <span class="ident">sofar</span>);
<span class="ident">exit</span>(<span class="ident">EXIT_ERR</span>);
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">SubError</span> {
<span class="ident">InvalidSpec</span>(<span class="ident">String</span>),
}
<span class="kw">impl</span> <span class="ident">Display</span> <span class="kw">for</span> <span class="ident">SubError</span> {
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&amp;mut</span> <span class="ident">std::fmt::Formatter</span><span class="op">&lt;</span><span class="lifetime">&#39;_</span><span class="op">&gt;</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), <span class="ident">std::fmt::Error</span><span class="op">&gt;</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident"><span class="self">Self</span>::InvalidSpec</span>(<span class="ident">s</span>) =&gt; <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">&quot;%{}: invalid conversion specification&quot;</span>, <span class="ident">s</span>),
}
}
}
<span class="kw">impl</span> <span class="ident">Error</span> <span class="kw">for</span> <span class="ident">SubError</span> {}
<span class="kw">impl</span> <span class="ident">UError</span> <span class="kw">for</span> <span class="ident">SubError</span> {}
<span class="kw">fn</span> <span class="ident">convert_asterisk_arg_int</span>(<span class="ident">asterisk_arg</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) -&gt; <span class="ident">isize</span> {
<span class="comment">// this is a costly way to parse the</span>
<span class="comment">// args used for asterisk values into integers</span>
@@ -538,14 +576,14 @@
<span class="kw">fn</span> <span class="ident">from_it</span>(
<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>,
<span class="ident">args</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>,
) -&gt; <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span> {
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">parser</span> <span class="op">=</span> <span class="ident"><span class="self">Self</span>::new</span>();
<span class="kw">if</span> <span class="ident">parser</span>.<span class="ident">sub_vals_retrieved</span>(<span class="ident">it</span>) {
<span class="kw">if</span> <span class="ident">parser</span>.<span class="ident">sub_vals_retrieved</span>(<span class="ident">it</span>)<span class="question-mark">?</span> {
<span class="kw">let</span> <span class="ident">t</span>: <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident"><span class="self">Self</span>::build_token</span>(<span class="ident">parser</span>);
<span class="ident">t</span>.<span class="ident">print</span>(<span class="ident">args</span>);
<span class="prelude-val">Some</span>(<span class="ident">t</span>)
<span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(<span class="ident">t</span>))
} <span class="kw">else</span> {
<span class="prelude-val">None</span>
<span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
}
}
<span class="kw">fn</span> <span class="ident">build_token</span>(<span class="ident">parser</span>: <span class="self">Self</span>) -&gt; <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span> {
@@ -573,9 +611,9 @@
));
<span class="ident">t</span>
}
<span class="kw">fn</span> <span class="ident">sub_vals_retrieved</span>(<span class="kw-2">&amp;mut</span> <span class="self">self</span>, <span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>) -&gt; <span class="ident">bool</span> {
<span class="kw">if</span> <span class="op">!</span><span class="ident"><span class="self">Self</span>::successfully_eat_prefix</span>(<span class="ident">it</span>, <span class="kw-2">&amp;mut</span> <span class="self">self</span>.<span class="ident">text_so_far</span>) {
<span class="kw">return</span> <span class="bool-val">false</span>;
<span class="kw">fn</span> <span class="ident">sub_vals_retrieved</span>(<span class="kw-2">&amp;mut</span> <span class="self">self</span>, <span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="ident">bool</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="op">!</span><span class="ident"><span class="self">Self</span>::successfully_eat_prefix</span>(<span class="ident">it</span>, <span class="kw-2">&amp;mut</span> <span class="self">self</span>.<span class="ident">text_so_far</span>)<span class="question-mark">?</span> {
<span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="bool-val">false</span>);
}
<span class="comment">// this fn in particular is much longer than it needs to be</span>
<span class="comment">// .could get a lot</span>
@@ -599,7 +637,7 @@
<span class="string">&#39;-&#39;</span> <span class="op">|</span> <span class="string">&#39;*&#39;</span> <span class="op">|</span> <span class="string">&#39;0&#39;</span>..<span class="op">=</span><span class="string">&#39;9&#39;</span> =&gt; {
<span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">past_decimal</span> {
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">min_width_is_asterisk</span> <span class="op">|</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">specifiers_found</span> {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">min_width_tmp</span>.<span class="ident">is_none</span>() {
<span class="self">self</span>.<span class="ident">min_width_tmp</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">String::new</span>());
@@ -607,7 +645,9 @@
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">min_width_tmp</span>.<span class="ident">as_mut</span>() {
<span class="prelude-val">Some</span>(<span class="ident">x</span>) =&gt; {
<span class="kw">if</span> (<span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;-&#39;</span> <span class="op">|</span><span class="op">|</span> <span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;*&#39;</span>) <span class="op">&amp;&amp;</span> <span class="op">!</span><span class="ident">x</span>.<span class="ident">is_empty</span>() {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(
<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>()
);
}
<span class="kw">if</span> <span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;*&#39;</span> {
<span class="self">self</span>.<span class="ident">min_width_is_asterisk</span> <span class="op">=</span> <span class="bool-val">true</span>;
@@ -622,7 +662,7 @@
<span class="comment">// second field should never have a</span>
<span class="comment">// negative value</span>
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">second_field_is_asterisk</span> <span class="op">|</span><span class="op">|</span> <span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;-&#39;</span> <span class="op">|</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">specifiers_found</span> {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">second_field_tmp</span>.<span class="ident">is_none</span>() {
<span class="self">self</span>.<span class="ident">second_field_tmp</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">String::new</span>());
@@ -630,7 +670,9 @@
<span class="kw">match</span> <span class="self">self</span>.<span class="ident">second_field_tmp</span>.<span class="ident">as_mut</span>() {
<span class="prelude-val">Some</span>(<span class="ident">x</span>) =&gt; {
<span class="kw">if</span> <span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;*&#39;</span> <span class="op">&amp;&amp;</span> <span class="op">!</span><span class="ident">x</span>.<span class="ident">is_empty</span>() {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(
<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>()
);
}
<span class="kw">if</span> <span class="ident">ch</span> <span class="op">==</span> <span class="string">&#39;*&#39;</span> {
<span class="self">self</span>.<span class="ident">second_field_is_asterisk</span> <span class="op">=</span> <span class="bool-val">true</span>;
@@ -647,7 +689,7 @@
<span class="kw">if</span> <span class="op">!</span><span class="self">self</span>.<span class="ident">past_decimal</span> {
<span class="self">self</span>.<span class="ident">past_decimal</span> <span class="op">=</span> <span class="bool-val">true</span>;
} <span class="kw">else</span> {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
}
<span class="ident">x</span> <span class="kw">if</span> <span class="ident">legal_fields</span>.<span class="ident">binary_search</span>(<span class="kw-2">&amp;</span><span class="ident">x</span>).<span class="ident">is_ok</span>() =&gt; {
@@ -664,18 +706,18 @@
}
}
<span class="kw">_</span> =&gt; {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
}
}
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">field_char</span>.<span class="ident">is_none</span>() {
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
<span class="kw">let</span> <span class="ident">field_char_retrieved</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">field_char</span>.<span class="ident">unwrap</span>();
<span class="kw">if</span> <span class="self">self</span>.<span class="ident">past_decimal</span> <span class="op">&amp;&amp;</span> <span class="self">self</span>.<span class="ident">second_field_tmp</span>.<span class="ident">is_none</span>() {
<span class="self">self</span>.<span class="ident">second_field_tmp</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="ident">String::from</span>(<span class="string">&quot;0&quot;</span>));
}
<span class="self">self</span>.<span class="ident">validate_field_params</span>(<span class="ident">field_char_retrieved</span>);
<span class="self">self</span>.<span class="ident">validate_field_params</span>(<span class="ident">field_char_retrieved</span>)<span class="question-mark">?</span>;
<span class="comment">// if the dot is provided without a second field</span>
<span class="comment">// printf interprets it as 0.</span>
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">second_field_tmp</span>.<span class="ident">as_mut</span>() {
@@ -684,9 +726,12 @@
}
}
<span class="bool-val">true</span>
<span class="prelude-val">Ok</span>(<span class="bool-val">true</span>)
}
<span class="kw">fn</span> <span class="ident">successfully_eat_prefix</span>(<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>, <span class="ident">text_so_far</span>: <span class="kw-2">&amp;mut</span> <span class="ident">String</span>) -&gt; <span class="ident">bool</span> {
<span class="kw">fn</span> <span class="ident">successfully_eat_prefix</span>(
<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>,
<span class="ident">text_so_far</span>: <span class="kw-2">&amp;mut</span> <span class="ident">String</span>,
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="ident">bool</span><span class="op">&gt;</span> {
<span class="comment">// get next two chars,</span>
<span class="comment">// if they&#39;re &#39;%%&#39; we&#39;re not tokenizing it</span>
<span class="comment">// else put chars back</span>
@@ -696,12 +741,11 @@
<span class="kw">match</span> <span class="ident">n_ch</span> {
<span class="prelude-val">Some</span>(<span class="ident">x</span>) =&gt; {
<span class="ident">it</span>.<span class="ident">put_back</span>(<span class="ident">x</span>);
<span class="bool-val">true</span>
<span class="prelude-val">Ok</span>(<span class="bool-val">true</span>)
}
<span class="prelude-val">None</span> =&gt; {
<span class="ident">text_so_far</span>.<span class="ident">push</span>(<span class="string">&#39;%&#39;</span>);
<span class="ident">err_conv</span>(<span class="ident">text_so_far</span>);
<span class="bool-val">false</span>
<span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>())
}
}
} <span class="kw">else</span> {
@@ -711,10 +755,10 @@
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">x</span>) <span class="op">=</span> <span class="ident">preface</span> {
<span class="ident">it</span>.<span class="ident">put_back</span>(<span class="ident">x</span>);
};
<span class="bool-val">false</span>
<span class="prelude-val">Ok</span>(<span class="bool-val">false</span>)
}
}
<span class="kw">fn</span> <span class="ident">validate_field_params</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">field_char</span>: <span class="ident">char</span>) {
<span class="kw">fn</span> <span class="ident">validate_field_params</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">field_char</span>: <span class="ident">char</span>) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span>()<span class="op">&gt;</span> {
<span class="comment">// check for illegal combinations here when possible vs</span>
<span class="comment">// on each application so we check less per application</span>
<span class="comment">// to do: move these checks to Sub::new</span>
@@ -726,8 +770,12 @@
<span class="op">|</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">past_decimal</span>
<span class="op">|</span><span class="op">|</span> <span class="self">self</span>.<span class="ident">second_field_tmp</span>.<span class="ident">is_some</span>()))
{
<span class="ident">err_conv</span>(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">text_so_far</span>);
<span class="comment">// invalid string substitution</span>
<span class="comment">// to do: include information about an invalid</span>
<span class="comment">// string substitution</span>
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">SubError::InvalidSpec</span>(<span class="self">self</span>.<span class="ident">text_so_far</span>.<span class="ident">clone</span>()).<span class="ident">into</span>());
}
<span class="prelude-val">Ok</span>(())
}
}
@@ -735,7 +783,7 @@
<span class="kw">fn</span> <span class="ident">from_it</span>(
<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>,
<span class="ident">args</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>,
) -&gt; <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span> {
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="ident">SubParser::from_it</span>(<span class="ident">it</span>, <span class="ident">args</span>)
}
}
@@ -30,12 +30,16 @@
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
</pre><pre class="rust"><code><span class="doccomment">//! Traits and enums dealing with Tokenization of printf Format String</span>
<span class="kw">use</span> <span class="ident">itertools::PutBackN</span>;
<span class="kw">use</span> <span class="ident">std::iter::Peekable</span>;
<span class="kw">use</span> <span class="ident">std::slice::Iter</span>;
<span class="kw">use</span> <span class="ident">std::str::Chars</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::error::UResult</span>;
<span class="comment">// A token object is an object that can print the expected output</span>
<span class="comment">// of a contiguous segment of the format string, and</span>
<span class="comment">// requires at most 1 argument</span>
@@ -59,7 +63,7 @@
<span class="kw">fn</span> <span class="ident">from_it</span>(
<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>,
<span class="ident">args</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>,
) -&gt; <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Token</span><span class="op">&gt;</span><span class="op">&gt;</span>;
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">Token</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>;
}
</code></pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../../../" data-current-crate="uucore" data-search-index-js="../../../../search-index.js" data-search-js="../../../../search.js"></div>
@@ -276,6 +276,8 @@
<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>
</pre><pre class="rust"><code><span class="doccomment">//! UnescapedText is a tokenizer impl</span>
<span class="doccomment">//! for tokenizing character literals,</span>
<span class="doccomment">//! and escaped character literals (of allowed escapes),</span>
@@ -291,6 +293,8 @@
<span class="kw">use</span> <span class="ident">std::slice::Iter</span>;
<span class="kw">use</span> <span class="ident">std::str::Chars</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::error::UResult</span>;
<span class="kw">use</span> <span class="ident"><span class="kw">super</span>::token</span>;
<span class="kw">const</span> <span class="ident">EXIT_OK</span>: <span class="ident">i32</span> <span class="op">=</span> <span class="number">0</span>;
@@ -544,8 +548,8 @@
<span class="kw">fn</span> <span class="ident">from_it</span>(
<span class="ident">it</span>: <span class="kw-2">&amp;mut</span> <span class="ident">PutBackN</span><span class="op">&lt;</span><span class="ident">Chars</span><span class="op">&gt;</span>,
<span class="kw">_</span>: <span class="kw-2">&amp;mut</span> <span class="ident">Peekable</span><span class="op">&lt;</span><span class="ident">Iter</span><span class="op">&lt;</span><span class="ident">String</span><span class="op">&gt;</span><span class="op">&gt;</span>,
) -&gt; <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="ident"><span class="self">Self</span>::from_it_core</span>(<span class="ident">it</span>, <span class="bool-val">false</span>)
) -&gt; <span class="ident">UResult</span><span class="op">&lt;</span><span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">token::Token</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="prelude-val">Ok</span>(<span class="ident"><span class="self">Self</span>::from_it_core</span>(<span class="ident">it</span>, <span class="bool-val">false</span>))
}
}
<span class="kw">impl</span> <span class="ident">token::Token</span> <span class="kw">for</span> <span class="ident">UnescapedText</span> {
+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
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