424
424
< a href ="#424 " id ="424 "> 424</ a >
425
425
< a href ="#425 " id ="425 "> 425</ a >
426
426
< a href ="#426 " id ="426 "> 426</ a >
427
+ < a href ="#427 " id ="427 "> 427</ a >
428
+ < a href ="#428 " id ="428 "> 428</ a >
429
+ < a href ="#429 " id ="429 "> 429</ a >
430
+ < a href ="#430 " id ="430 "> 430</ a >
431
+ < a href ="#431 " id ="431 "> 431</ a >
432
+ < a href ="#432 " id ="432 "> 432</ a >
433
+ < a href ="#433 " id ="433 "> 433</ a >
434
+ < a href ="#434 " id ="434 "> 434</ a >
435
+ < a href ="#435 " id ="435 "> 435</ a >
436
+ < a href ="#436 " id ="436 "> 436</ a >
437
+ < a href ="#437 " id ="437 "> 437</ a >
438
+ < a href ="#438 " id ="438 "> 438</ a >
439
+ < a href ="#439 " id ="439 "> 439</ a >
440
+ < a href ="#440 " id ="440 "> 440</ a >
441
+ < a href ="#441 " id ="441 "> 441</ a >
442
+ < a href ="#442 " id ="442 "> 442</ a >
443
+ < a href ="#443 " id ="443 "> 443</ a >
444
+ < a href ="#444 " id ="444 "> 444</ a >
445
+ < a href ="#445 " id ="445 "> 445</ a >
446
+ < a href ="#446 " id ="446 "> 446</ a >
447
+ < a href ="#447 " id ="447 "> 447</ a >
448
+ < a href ="#448 " id ="448 "> 448</ a >
449
+ < a href ="#449 " id ="449 "> 449</ a >
450
+ < a href ="#450 " id ="450 "> 450</ a >
451
+ < a href ="#451 " id ="451 "> 451</ a >
452
+ < a href ="#452 " id ="452 "> 452</ a >
427
453
</ pre > </ div > < pre class ="rust "> < code > < span class ="comment "> // * This file is part of the uutils coreutils package.
428
454
// *
429
455
// * (c) Tobias Bohumir Schottdorf <tobias.schottdorf@gmail.com>
689
715
</ span > < span class ="kw "> fn </ span > nl<T: Read>(reader: < span class ="kw-2 "> &mut </ span > BufReader<T>, settings: < span class ="kw-2 "> &</ span > Settings) -> UResult<()> {
690
716
< span class ="kw "> let </ span > regexp: regex::Regex = regex::Regex::new(< span class ="string "> r".?"</ span > ).unwrap();
691
717
< span class ="kw "> let </ span > < span class ="kw-2 "> mut </ span > line_no = settings.starting_line_number;
692
- < span class ="comment "> // The current line number's width as a string. Using to_string is inefficient
693
- // but since we only do it once, it should not hurt.
694
- </ span > < span class ="kw "> let </ span > < span class ="kw-2 "> mut </ span > line_no_width = line_no.to_string().len();
718
+ < span class ="kw "> let </ span > < span class ="kw-2 "> mut </ span > line_no_width = line_no.len();
695
719
< span class ="kw "> let </ span > line_no_width_initial = line_no_width;
696
- < span class ="comment "> // Stores the smallest integer with one more digit than line_no, so that
697
- // when line_no >= line_no_threshold, we need to use one more digit.
698
- </ span > < span class ="kw "> let </ span > < span class ="kw-2 "> mut </ span > line_no_threshold = < span class ="number "> 10i64</ span > .pow(line_no_width < span class ="kw "> as </ span > u32);
699
720
< span class ="kw "> let </ span > < span class ="kw-2 "> mut </ span > empty_line_count: u64 = < span class ="number "> 0</ span > ;
700
721
< span class ="kw "> let </ span > fill_char = < span class ="kw "> match </ span > settings.number_format {
701
722
NumberFormat::RightZero => < span class ="string "> '0'</ span > ,
757
778
</ span > < span class ="kw "> if </ span > settings.renumber {
758
779
line_no = settings.starting_line_number;
759
780
line_no_width = line_no_width_initial;
760
- line_no_threshold = < span class ="number "> 10i64</ span > .pow(line_no_width < span class ="kw "> as </ span > u32);
761
781
}
762
782
< span class ="kw-2 "> &</ span > settings.header_numbering
763
783
}
826
846
< span class ="comment "> // Now update the variables for the (potential) next
827
847
// line.
828
848
</ span > line_no += settings.line_increment;
829
- < span class ="kw "> while </ span > line_no >= line_no_threshold {
830
- < span class ="comment "> // The line number just got longer.
831
- </ span > line_no_threshold < span class ="kw-2 "> *</ span > = < span class ="number "> 10</ span > ;
832
- line_no_width += < span class ="number "> 1</ span > ;
833
- }
849
+ line_no_width = line_no.len();
834
850
}
835
851
< span class ="prelude-val "> Ok</ span > (())
836
852
}
850
866
< span class ="kw "> fn </ span > pass_all(< span class ="kw "> _</ span > : < span class ="kw-2 "> &</ span > str, < span class ="kw "> _</ span > : < span class ="kw-2 "> &</ span > regex::Regex) -> bool {
851
867
< span class ="bool-val "> true
852
868
</ span > }
869
+
870
+ < span class ="kw "> trait </ span > Length {
871
+ < span class ="kw "> fn </ span > len(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ) -> usize;
872
+ }
873
+
874
+ < span class ="kw "> impl </ span > Length < span class ="kw "> for </ span > i64 {
875
+ < span class ="comment "> // Returns the length in `char`s.
876
+ </ span > < span class ="kw "> fn </ span > len(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ) -> usize {
877
+ < span class ="kw "> if </ span > < span class ="kw-2 "> *</ span > < span class ="self "> self </ span > == < span class ="number "> 0 </ span > {
878
+ < span class ="kw "> return </ span > < span class ="number "> 1</ span > ;
879
+ };
880
+
881
+ < span class ="kw "> let </ span > sign_len = < span class ="kw "> if </ span > < span class ="kw-2 "> *</ span > < span class ="self "> self </ span > < < span class ="number "> 0 </ span > { < span class ="number "> 1 </ span > } < span class ="kw "> else </ span > { < span class ="number "> 0 </ span > };
882
+ (< span class ="number "> 0</ span > ..).take_while(|i| < span class ="number "> 10i64</ span > .pow(< span class ="kw-2 "> *</ span > i) <= < span class ="self "> self</ span > .abs()).count() + sign_len
883
+ }
884
+ }
885
+
886
+ < span class ="attr "> #[cfg(test)]
887
+ </ span > < span class ="kw "> mod </ span > test {
888
+ < span class ="kw "> use super</ span > ::< span class ="kw-2 "> *</ span > ;
889
+
890
+ < span class ="attr "> #[test]
891
+ </ span > < span class ="kw "> fn </ span > test_len() {
892
+ < span class ="macro "> assert_eq!</ span > ((-< span class ="number "> 1</ span > ).len(), < span class ="number "> 2</ span > );
893
+ < span class ="macro "> assert_eq!</ span > ((-< span class ="number "> 10</ span > ).len(), < span class ="number "> 3</ span > );
894
+ < span class ="macro "> assert_eq!</ span > ((-< span class ="number "> 100</ span > ).len(), < span class ="number "> 4</ span > );
895
+ < span class ="macro "> assert_eq!</ span > ((-< span class ="number "> 1000</ span > ).len(), < span class ="number "> 5</ span > );
896
+
897
+ < span class ="macro "> assert_eq!</ span > (< span class ="number "> 0</ span > .len(), < span class ="number "> 1</ span > );
898
+
899
+ < span class ="macro "> assert_eq!</ span > (< span class ="number "> 1</ span > .len(), < span class ="number "> 1</ span > );
900
+ < span class ="macro "> assert_eq!</ span > (< span class ="number "> 10</ span > .len(), < span class ="number "> 2</ span > );
901
+ < span class ="macro "> assert_eq!</ span > (< span class ="number "> 100</ span > .len(), < span class ="number "> 3</ span > );
902
+ < span class ="macro "> assert_eq!</ span > (< span class ="number "> 1000</ span > .len(), < span class ="number "> 4</ span > );
903
+ }
904
+ }
853
905
</ code > </ pre > </ div > </ section > </ main > </ body > </ html >
0 commit comments