diff --git a/src/lib/parser/shell_expand/words/mod.rs b/src/lib/parser/shell_expand/words/mod.rs index 88f974cf24252dbdc3d4537e02d3520ce77fcae1..337323e47a2248673da764e5a52ea81ff206ebc9 100644 --- a/src/lib/parser/shell_expand/words/mod.rs +++ b/src/lib/parser/shell_expand/words/mod.rs @@ -24,6 +24,14 @@ bitflags! { } } +impl Flags { + pub(crate) fn new() -> Self { + Flags { + bits: 0, + } + } +} + #[derive(Debug, PartialEq, Clone)] pub(crate) enum WordToken<'a> { /// Represents a normal string who may contain a globbing character @@ -348,6 +356,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { where I: Iterator<Item = u8>, { + let mut method_flags = Flags::new(); let mut start = self.read; self.read += 1; while let Some(character) = iterator.next() { @@ -359,12 +368,12 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { let mut depth = 0; while let Some(character) = iterator.next() { match character { - b'\'' => self.flags ^= Flags::SQUOTE, - b'"' => self.flags ^= Flags::DQUOTE, - b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1, - b']' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1, + b'\'' => method_flags ^= Flags::SQUOTE, + b'"' => method_flags ^= Flags::DQUOTE, + b'[' if !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1, + b']' if !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1, b' ' if depth == 0 - && !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => { + && !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => { let variable = &self.data[start..self.read]; self.read += 1; start = self.read; @@ -480,6 +489,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { where I: Iterator<Item = u8>, { + let mut method_flags = Flags::new(); let mut start = self.read; self.read += 1; while let Some(character) = iterator.next() { @@ -491,12 +501,12 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { let mut depth = 0; while let Some(character) = iterator.next() { match character { - b'\'' => self.flags ^= Flags::SQUOTE, - b'"' => self.flags ^= Flags::DQUOTE, - b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1, - b']' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1, + b'\'' => method_flags ^= Flags::SQUOTE, + b'"' => method_flags ^= Flags::DQUOTE, + b'[' if !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1, + b']' if !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1, b' ' if depth == 0 - && !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => { + && !method_flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => { let variable = &self.data[start..self.read]; self.read += 1; start = self.read;