@@ -32,9 +32,8 @@ pub trait WhitespaceSifter: AsRef<str> {
32
32
#[ must_use]
33
33
fn sift ( & self ) -> String {
34
34
let input: & str = self . as_ref ( ) ;
35
- let in_len: usize = input. len ( ) ;
36
- let mut out: String = String :: with_capacity ( in_len) ;
37
- crate :: sift_preallocated ( input. as_ptr ( ) , in_len, unsafe { out. as_mut_vec ( ) } ) ;
35
+ let mut out: String = String :: with_capacity ( input. len ( ) ) ;
36
+ crate :: sift_preallocated ( input. as_ptr ( ) , input. len ( ) , unsafe { out. as_mut_vec ( ) } ) ;
38
37
out
39
38
}
40
39
@@ -51,7 +50,7 @@ pub trait WhitespaceSifter: AsRef<str> {
51
50
let out_vec: & mut Vec < u8 > = unsafe { out. as_mut_vec ( ) } ;
52
51
let mut ind: usize = 0 ;
53
52
while ind < in_len {
54
- crate :: sift_preallocated_until_newline ( in_ptr, in_len, & mut ind, out_vec) ;
53
+ crate :: sift_preallocated_until_newline_preserved ( in_ptr, in_len, & mut ind, out_vec) ;
55
54
}
56
55
if out_vec. len ( ) > 1 {
57
56
let new_out_mut_len: usize = unsafe { out_vec. len ( ) . unchecked_sub ( 2 ) } ;
@@ -78,7 +77,6 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
78
77
let mut copy_len: usize = 0 ;
79
78
let mut is_last_whitespace: bool = false ;
80
79
let mut is_last_carriage_return: bool = false ;
81
- let mut is_last_carriage_return_line_feed: bool = false ;
82
80
while ind < in_len {
83
81
let data: u8 = unsafe { in_ptr. add ( ind) . read ( ) } ;
84
82
match get_char_len ( data) {
@@ -88,7 +86,6 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
88
86
if data == LINE_FEED && is_last_carriage_return {
89
87
copy_len = unsafe { copy_len. unchecked_add ( 1 ) } ;
90
88
is_last_carriage_return = false ;
91
- is_last_carriage_return_line_feed = true ;
92
89
continue ;
93
90
}
94
91
if is_last_whitespace {
@@ -108,7 +105,6 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
108
105
}
109
106
copy_len = unsafe { copy_len. unchecked_add ( 1 ) } ;
110
107
is_last_carriage_return = data == CARRIAGE_RETURN ;
111
- is_last_carriage_return_line_feed = false ;
112
108
continue ;
113
109
}
114
110
len => {
@@ -118,23 +114,24 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
118
114
}
119
115
is_last_carriage_return = false ;
120
116
is_last_whitespace = false ;
121
- is_last_carriage_return_line_feed = false ;
122
117
}
123
118
unsafe {
124
119
unsafe_custom_extend ( out, in_ptr. add ( ind) . sub ( copy_len) , copy_len) ;
125
120
}
126
121
// Implementation of str::trim_end()
127
- if is_last_carriage_return_line_feed {
128
- let new_out_len: usize = unsafe { out. len ( ) . unchecked_sub ( 2 ) } ;
129
- unsafe { out. set_len ( new_out_len) } ;
130
- return ;
122
+ if out. len ( ) > 1 {
123
+ let new_out_mut_len: usize = unsafe { out. len ( ) . unchecked_sub ( 2 ) } ;
124
+ if unsafe { out. as_ptr ( ) . add ( new_out_mut_len) . read ( ) } == CARRIAGE_RETURN {
125
+ unsafe { out. set_len ( new_out_mut_len) } ;
126
+ return ;
127
+ }
131
128
}
132
129
sift_trim_end ( out, is_last_whitespace) ;
133
130
}
134
131
135
132
/// A utility for `sift_preserve_newlines`.
136
133
#[ inline]
137
- fn sift_preallocated_until_newline (
134
+ fn sift_preallocated_until_newline_preserved (
138
135
in_ptr : * const u8 ,
139
136
in_len : usize ,
140
137
ind : & mut usize ,
0 commit comments