|
505 | 505 | <a href="#505" id="505">505</a>
|
506 | 506 | <a href="#506" id="506">506</a>
|
507 | 507 | <a href="#507" id="507">507</a>
|
| 508 | +<a href="#508" id="508">508</a> |
| 509 | +<a href="#509" id="509">509</a> |
508 | 510 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.
|
509 | 511 | //
|
510 | 512 | // (c) Virgile Andreani <virgile.andreani@anbuco.fr>
|
|
633 | 635 | <span class="kw">let </span>bytes = word.as_bytes();
|
634 | 636 | <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..bytes.len() {
|
635 | 637 | <span class="kw">match </span>bytes[i] {
|
636 |
| - <span class="string">b'+' </span>=> { |
637 |
| - remaining_mode = RemainingMode::Plus; |
638 |
| - } |
639 |
| - <span class="string">b'/' </span>=> { |
640 |
| - remaining_mode = RemainingMode::Slash; |
641 |
| - } |
| 638 | + <span class="string">b'+' </span>=> remaining_mode = RemainingMode::Plus, |
| 639 | + <span class="string">b'/' </span>=> remaining_mode = RemainingMode::Slash, |
642 | 640 | <span class="kw">_ </span>=> {
|
643 | 641 | <span class="comment">// Parse a number from the byte sequence.
|
644 | 642 | </span><span class="kw">let </span>s = from_utf8(<span class="kw-2">&</span>bytes[i..]).unwrap();
|
|
698 | 696 | </span><span class="kw">if </span>nums.is_empty() {
|
699 | 697 | nums = <span class="macro">vec!</span>[DEFAULT_TABSTOP];
|
700 | 698 | }
|
| 699 | + |
| 700 | + <span class="kw">if </span>nums.len() < <span class="number">2 </span>{ |
| 701 | + remaining_mode = RemainingMode::None; |
| 702 | + } |
701 | 703 | <span class="prelude-val">Ok</span>((remaining_mode, nums))
|
702 | 704 | }
|
703 | 705 |
|
|
843 | 845 | /// in the `tabstops` slice is interpreted as a relative number of
|
844 | 846 | /// spaces, which this function will return for every input value of
|
845 | 847 | /// `col` beyond the end of the second-to-last element of `tabstops`.
|
846 |
| -/// |
847 |
| -/// If `remaining_mode` is [`RemainingMode::Plus`], then the last entry |
848 |
| -/// in the `tabstops` slice is interpreted as a relative number of |
849 |
| -/// spaces, which this function will return for every input value of |
850 |
| -/// `col` beyond the end of the second-to-last element of `tabstops`. |
851 | 848 | </span><span class="kw">fn </span>next_tabstop(tabstops: <span class="kw-2">&</span>[usize], col: usize, remaining_mode: <span class="kw-2">&</span>RemainingMode) -> usize {
|
852 | 849 | <span class="kw">let </span>num_tabstops = tabstops.len();
|
853 | 850 | <span class="kw">match </span>remaining_mode {
|
854 | 851 | RemainingMode::Plus => <span class="kw">match </span>tabstops[<span class="number">0</span>..num_tabstops - <span class="number">1</span>].iter().find(|&&t| t > col) {
|
855 | 852 | <span class="prelude-val">Some</span>(t) => t - col,
|
856 |
| - <span class="prelude-val">None </span>=> tabstops[num_tabstops - <span class="number">1</span>] - <span class="number">1</span>, |
| 853 | + <span class="prelude-val">None </span>=> { |
| 854 | + <span class="kw">let </span>step_size = tabstops[num_tabstops - <span class="number">1</span>]; |
| 855 | + <span class="kw">let </span>last_fixed_tabstop = tabstops[num_tabstops - <span class="number">2</span>]; |
| 856 | + <span class="kw">let </span>characters_since_last_tabstop = col - last_fixed_tabstop; |
| 857 | + |
| 858 | + <span class="kw">let </span>steps_required = <span class="number">1 </span>+ characters_since_last_tabstop / step_size; |
| 859 | + steps_required * step_size - characters_since_last_tabstop |
| 860 | + } |
857 | 861 | },
|
858 | 862 | RemainingMode::Slash => <span class="kw">match </span>tabstops[<span class="number">0</span>..num_tabstops - <span class="number">1</span>].iter().find(|&&t| t > col) {
|
859 | 863 | <span class="prelude-val">Some</span>(t) => t - col,
|
|
994 | 998 | <span class="attr">#[test]
|
995 | 999 | </span><span class="kw">fn </span>test_next_tabstop_remaining_mode_plus() {
|
996 | 1000 | <span class="macro">assert_eq!</span>(next_tabstop(<span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">5</span>], <span class="number">0</span>, <span class="kw-2">&</span>RemainingMode::Plus), <span class="number">1</span>);
|
997 |
| - <span class="macro">assert_eq!</span>(next_tabstop(<span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">5</span>], <span class="number">3</span>, <span class="kw-2">&</span>RemainingMode::Plus), <span class="number">4</span>); |
998 |
| - <span class="macro">assert_eq!</span>(next_tabstop(<span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">5</span>], <span class="number">6</span>, <span class="kw-2">&</span>RemainingMode::Plus), <span class="number">4</span>); |
| 1001 | + <span class="macro">assert_eq!</span>(next_tabstop(<span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">5</span>], <span class="number">3</span>, <span class="kw-2">&</span>RemainingMode::Plus), <span class="number">3</span>); |
| 1002 | + <span class="macro">assert_eq!</span>(next_tabstop(<span class="kw-2">&</span>[<span class="number">1</span>, <span class="number">5</span>], <span class="number">6</span>, <span class="kw-2">&</span>RemainingMode::Plus), <span class="number">5</span>); |
999 | 1003 | }
|
1000 | 1004 |
|
1001 | 1005 | <span class="attr">#[test]
|
|
0 commit comments