Skip to content

Commit 0bcb3b0

Browse files
committed
kernel_cmdline: Add remove_exact method
Signed-off-by: John Eckersberg <[email protected]>
1 parent a64ae89 commit 0bcb3b0

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

crates/kernel_cmdline/src/bytes.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,29 @@ impl<'a> Cmdline<'a> {
294294
removed
295295
}
296296

297+
/// Remove all parameters that exactly match the given parameter
298+
/// from the command line
299+
///
300+
/// Returns `true` if parameter(s) were removed.
301+
pub fn remove_exact(&mut self, param: &Parameter) -> bool {
302+
let mut removed = false;
303+
let mut new_params = Vec::new();
304+
305+
for p in self.iter() {
306+
if p == *param {
307+
removed = true;
308+
} else {
309+
new_params.push(p.parameter);
310+
}
311+
}
312+
313+
if removed {
314+
self.0 = Cow::Owned(new_params.join(b" ".as_slice()));
315+
}
316+
317+
removed
318+
}
319+
297320
#[cfg(test)]
298321
pub(crate) fn is_owned(&self) -> bool {
299322
matches!(self.0, Cow::Owned(_))
@@ -883,6 +906,25 @@ mod tests {
883906
assert_eq!(iter.next(), None);
884907
}
885908

909+
#[test]
910+
fn test_remove_exact() {
911+
let mut kargs = Cmdline::from(b"foo foo=bar foo=baz");
912+
913+
// remove existing
914+
assert!(kargs.remove_exact(&param("foo=bar")));
915+
let mut iter = kargs.iter();
916+
assert_eq!(iter.next(), Some(param("foo")));
917+
assert_eq!(iter.next(), Some(param("foo=baz")));
918+
assert_eq!(iter.next(), None);
919+
920+
// doesn't exist? returns false and doesn't modify anything
921+
assert!(!kargs.remove_exact(&param("foo=wuz")));
922+
iter = kargs.iter();
923+
assert_eq!(iter.next(), Some(param("foo")));
924+
assert_eq!(iter.next(), Some(param("foo=baz")));
925+
assert_eq!(iter.next(), None);
926+
}
927+
886928
#[test]
887929
fn test_extend() {
888930
let mut kargs = Cmdline::from(b"foo=bar baz");

crates/kernel_cmdline/src/utf8.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ impl<'a> Cmdline<'a> {
191191
self.0.remove(&key.0)
192192
}
193193

194+
/// Remove all parameters that exactly match the given parameter
195+
/// from the command line
196+
///
197+
/// Returns `true` if parameter(s) were removed.
198+
pub fn remove_exact(&mut self, param: &Parameter) -> bool {
199+
self.0.remove_exact(&param.0)
200+
}
201+
194202
#[cfg(test)]
195203
pub(crate) fn is_owned(&self) -> bool {
196204
self.0.is_owned()
@@ -806,6 +814,25 @@ mod tests {
806814
assert_eq!(iter.next(), None);
807815
}
808816

817+
#[test]
818+
fn test_remove_exact() {
819+
let mut kargs = Cmdline::from("foo foo=bar foo=baz");
820+
821+
// remove existing
822+
assert!(kargs.remove_exact(&param("foo=bar")));
823+
let mut iter = kargs.iter();
824+
assert_eq!(iter.next(), Some(param("foo")));
825+
assert_eq!(iter.next(), Some(param("foo=baz")));
826+
assert_eq!(iter.next(), None);
827+
828+
// doesn't exist? returns false and doesn't modify anything
829+
assert!(!kargs.remove_exact(&param("foo=wuz")));
830+
iter = kargs.iter();
831+
assert_eq!(iter.next(), Some(param("foo")));
832+
assert_eq!(iter.next(), Some(param("foo=baz")));
833+
assert_eq!(iter.next(), None);
834+
}
835+
809836
#[test]
810837
fn test_extend() {
811838
let mut kargs = Cmdline::from("foo=bar baz");

0 commit comments

Comments
 (0)