Skip to content

Commit a1d7c12

Browse files
committed
✨ v2.3.4-alpha.4
1 parent b97b408 commit a1d7c12

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "whitespace-sifter"
3-
version = "2.3.4-alpha.3"
3+
version = "2.3.4-alpha.4"
44
edition = "2021"
55
authors = ["JumperBot_"]
66
description = "Sift duplicate whitespaces away!"

src/lib.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ pub trait WhitespaceSifter: AsRef<str> {
3232
#[must_use]
3333
fn sift(&self) -> String {
3434
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() });
3837
out
3938
}
4039

@@ -51,7 +50,7 @@ pub trait WhitespaceSifter: AsRef<str> {
5150
let out_vec: &mut Vec<u8> = unsafe { out.as_mut_vec() };
5251
let mut ind: usize = 0;
5352
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);
5554
}
5655
if out_vec.len() > 1 {
5756
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>) {
7877
let mut copy_len: usize = 0;
7978
let mut is_last_whitespace: bool = false;
8079
let mut is_last_carriage_return: bool = false;
81-
let mut is_last_carriage_return_line_feed: bool = false;
8280
while ind < in_len {
8381
let data: u8 = unsafe { in_ptr.add(ind).read() };
8482
match get_char_len(data) {
@@ -88,7 +86,6 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
8886
if data == LINE_FEED && is_last_carriage_return {
8987
copy_len = unsafe { copy_len.unchecked_add(1) };
9088
is_last_carriage_return = false;
91-
is_last_carriage_return_line_feed = true;
9289
continue;
9390
}
9491
if is_last_whitespace {
@@ -108,7 +105,6 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
108105
}
109106
copy_len = unsafe { copy_len.unchecked_add(1) };
110107
is_last_carriage_return = data == CARRIAGE_RETURN;
111-
is_last_carriage_return_line_feed = false;
112108
continue;
113109
}
114110
len => {
@@ -118,23 +114,24 @@ fn sift_preallocated(in_ptr: *const u8, in_len: usize, out: &mut Vec<u8>) {
118114
}
119115
is_last_carriage_return = false;
120116
is_last_whitespace = false;
121-
is_last_carriage_return_line_feed = false;
122117
}
123118
unsafe {
124119
unsafe_custom_extend(out, in_ptr.add(ind).sub(copy_len), copy_len);
125120
}
126121
// 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+
}
131128
}
132129
sift_trim_end(out, is_last_whitespace);
133130
}
134131

135132
/// A utility for `sift_preserve_newlines`.
136133
#[inline]
137-
fn sift_preallocated_until_newline(
134+
fn sift_preallocated_until_newline_preserved(
138135
in_ptr: *const u8,
139136
in_len: usize,
140137
ind: &mut usize,

src/tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ fn test_sift_leading_whitespaces() {
2222
let input: String = "a\r\n\n\t b\r\n\r\n\r\n".to_owned();
2323
let out: String = "a\r\nb".to_owned();
2424
assert_eq!(input.sift(), out);
25+
let input: String = "a\r\n\n\t b\t ".to_owned();
26+
assert_eq!(input.sift(), out);
27+
let input: String = "a\r\n\n\t b\t \n".to_owned();
28+
assert_eq!(input.sift(), out);
2529
}
2630

2731
#[test]
@@ -36,14 +40,20 @@ fn test_sift_preserve_newlines_leading_whitespaces() {
3640
let input: String = "a \r\n\n\t b\r\n\r\n\r\n".to_owned();
3741
let out: String = "a\r\nb".to_owned();
3842
assert_eq!(input.sift_preserve_newlines(), out);
43+
let input: String = "a \r\n\n\t b\t ".to_owned();
44+
assert_eq!(input.sift_preserve_newlines(), out);
45+
let input: String = "a \r\n\n\t b\t \n".to_owned();
46+
assert_eq!(input.sift_preserve_newlines(), out);
3947
}
4048

4149
#[test]
4250
fn test_all_blank_output() {
4351
assert_eq!(&"".sift(), "");
4452
assert_eq!(&"\n\r\n".sift(), "");
53+
assert_eq!(&"\t ".sift(), "");
4554
assert_eq!(&"".sift_preserve_newlines(), "");
4655
assert_eq!(&"\n\r\n".sift_preserve_newlines(), "");
56+
assert_eq!(&"\t ".sift_preserve_newlines(), "");
4757
}
4858

4959
#[test]

0 commit comments

Comments
 (0)