From 0f938102cdd45c313b4decafef11f9308ddcb26b Mon Sep 17 00:00:00 2001
From: Bastien Orivel <eijebong@bananium.fr>
Date: Tue, 31 Oct 2017 17:57:46 +0100
Subject: [PATCH] Bump bitflags to 1.0

---
 Cargo.lock                           |   2 +-
 Cargo.toml                           |   2 +-
 src/builtins/echo.rs                 |  24 ++---
 src/parser/quotes.rs                 |  38 ++++----
 src/parser/shell_expand/words/mod.rs | 136 +++++++++++++--------------
 src/parser/statement/splitter.rs     |  72 +++++++-------
 src/shell/history.rs                 |  22 ++---
 7 files changed, 148 insertions(+), 148 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 9b292005..36b078f5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -116,7 +116,7 @@ version = "1.0.5"
 dependencies = [
  "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "app_dirs 1.1.1 (git+https://github.com/redox-os/app-dirs-rs.git)",
- "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "calculate 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "errno 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/Cargo.toml b/Cargo.toml
index 774fb010..1cdfaa3b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,7 +24,7 @@ ansi_term = "0.9"
 version_check = "0.1.3"
 
 [dependencies]
-bitflags = "0.9.1"
+bitflags = "1"
 calculate = "0.5"
 fnv = "1.0"
 glob = "0.2"
diff --git a/src/builtins/echo.rs b/src/builtins/echo.rs
index 297d6ec8..1ec9c7f2 100644
--- a/src/builtins/echo.rs
+++ b/src/builtins/echo.rs
@@ -47,20 +47,20 @@ pub(crate) fn echo(args: &[&str]) -> Result<(), io::Error> {
 
     for arg in args {
         match *arg {
-            "--help" => flags |= HELP,
-            "--escape" => flags |= ESCAPE,
-            "--no-newline" => flags |= NO_NEWLINE,
-            "--no-spaces" => flags |= NO_SPACES,
+            "--help" => flags |= Flags::HELP,
+            "--escape" => flags |= Flags::ESCAPE,
+            "--no-newline" => flags |= Flags::NO_NEWLINE,
+            "--no-spaces" => flags |= Flags::NO_SPACES,
             _ => if arg.starts_with('-') {
                 let mut is_opts = true;
                 let opts = &arg[1..];
                 let mut short_flags = Flags::empty();
                 for argopt in opts.chars() {
                     match argopt {
-                        'e' => short_flags |= ESCAPE,
-                        'n' => short_flags |= NO_NEWLINE,
-                        's' => short_flags |= NO_SPACES,
-                        'h' => short_flags |= HELP,
+                        'e' => short_flags |= Flags::ESCAPE,
+                        'n' => short_flags |= Flags::NO_NEWLINE,
+                        's' => short_flags |= Flags::NO_SPACES,
+                        'h' => short_flags |= Flags::HELP,
                         _ => {
                             is_opts = false;
                             break;
@@ -81,7 +81,7 @@ pub(crate) fn echo(args: &[&str]) -> Result<(), io::Error> {
     let stdout = io::stdout();
     let mut buffer = BufWriter::new(stdout.lock());
 
-    if flags.contains(HELP) {
+    if flags.contains(Flags::HELP) {
         buffer.write_all(MAN_PAGE.as_bytes())?;
         buffer.flush()?;
         return Ok(());
@@ -91,11 +91,11 @@ pub(crate) fn echo(args: &[&str]) -> Result<(), io::Error> {
     for arg in data[1..].iter().map(|x| x.as_bytes()) {
         if first {
             first = false;
-        } else if !flags.contains(NO_SPACES) {
+        } else if !flags.contains(Flags::NO_SPACES) {
             buffer.write_all(&[b' '])?;
         }
 
-        if flags.contains(ESCAPE) {
+        if flags.contains(Flags::ESCAPE) {
             let mut check = false;
             for &byte in arg {
                 match byte {
@@ -154,7 +154,7 @@ pub(crate) fn echo(args: &[&str]) -> Result<(), io::Error> {
         }
     }
 
-    if !flags.contains(NO_NEWLINE) {
+    if !flags.contains(Flags::NO_NEWLINE) {
         buffer.write_all(&[b'\n'])?;
     }
 
diff --git a/src/parser/quotes.rs b/src/parser/quotes.rs
index 6fdcb9d4..a07dd439 100644
--- a/src/parser/quotes.rs
+++ b/src/parser/quotes.rs
@@ -34,7 +34,7 @@ impl QuoteTerminator {
 
     pub(crate) fn append(&mut self, input: String) {
         if self.eof.is_none() {
-            self.buffer.push_str(if self.flags.contains(TRIM) { input.trim() } else { &input });
+            self.buffer.push_str(if self.flags.contains(Flags::TRIM) { input.trim() } else { &input });
         } else {
             self.eof_buffer.push_str(&input);
         }
@@ -58,9 +58,9 @@ impl QuoteTerminator {
                             b'\\' => {
                                 let _ = bytes.next();
                             }
-                            b'\'' if !self.flags.intersects(DQUOTE) => self.flags ^= SQUOTE,
-                            b'"' if !self.flags.intersects(SQUOTE) => self.flags ^= DQUOTE,
-                            b'<' if !self.flags.contains(SQUOTE | DQUOTE) => {
+                            b'\'' if !self.flags.intersects(Flags::DQUOTE) => self.flags ^= Flags::SQUOTE,
+                            b'"' if !self.flags.intersects(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
+                            b'<' if !self.flags.contains(Flags::SQUOTE | Flags::DQUOTE) => {
                                 let as_bytes = self.buffer.as_bytes();
                                 if Some(&b'<') == as_bytes.get(self.read) {
                                     self.read += 1;
@@ -69,59 +69,59 @@ impl QuoteTerminator {
                                             str::from_utf8_unchecked(&as_bytes[self.read..])
                                         };
                                         self.eof = Some(eof_phrase.trim().to_owned());
-                                        instance |= EOF;
+                                        instance |= Flags::EOF;
                                         break;
                                     }
                                 }
                             }
-                            b'[' if !self.flags.intersects(DQUOTE | SQUOTE) => {
-                                self.flags |= ARRAY;
+                            b'[' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => {
+                                self.flags |= Flags::ARRAY;
                                 self.array += 1;
                             }
-                            b']' if !self.flags.intersects(DQUOTE | SQUOTE) => {
+                            b']' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => {
                                 self.array -= 1;
                                 if self.array == 0 {
-                                    self.flags -= ARRAY
+                                    self.flags -= Flags::ARRAY
                                 }
                             }
-                            b'#' if !self.flags.intersects(DQUOTE | SQUOTE) => if self.read > 1 {
+                            b'#' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => if self.read > 1 {
                                 let character = self.buffer.as_bytes().get(self.read - 2).unwrap();
                                 if [b' ', b'\n'].contains(character) {
-                                    instance |= COMM;
+                                    instance |= Flags::COMM;
                                     break;
                                 }
                             } else {
-                                instance |= COMM;
+                                instance |= Flags::COMM;
                                 break;
                             },
                             _ => (),
                         }
                     }
                 }
-                if instance.contains(EOF) {
+                if instance.contains(Flags::EOF) {
                     self.buffer.push('\n');
                     return false;
-                } else if instance.contains(COMM) {
+                } else if instance.contains(Flags::COMM) {
                     self.buffer.truncate(self.read - 1);
-                    return !self.flags.intersects(SQUOTE | DQUOTE | ARRAY);
+                    return !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE | Flags::ARRAY);
                 }
             }
 
-            if self.flags.intersects(SQUOTE | DQUOTE | ARRAY) {
+            if self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE | Flags::ARRAY) {
                 if let Some(b'\\') = self.buffer.bytes().last() {
                     let _ = self.buffer.pop();
                     self.read -= 1;
-                    self.flags |= TRIM;
+                    self.flags |= Flags::TRIM;
                 } else {
                     self.read += 1;
-                    self.buffer.push(if self.flags.contains(ARRAY) { ' ' } else { '\n' });
+                    self.buffer.push(if self.flags.contains(Flags::ARRAY) { ' ' } else { '\n' });
                 }
                 false
             } else {
                 if let Some(b'\\') = self.buffer.bytes().last() {
                     let _ = self.buffer.pop();
                     self.read -= 1;
-                    self.flags |= TRIM;
+                    self.flags |= Flags::TRIM;
                     false
                 } else {
                     // If the last two bytes are either '&&' or '||', we aren't terminated yet.
diff --git a/src/parser/shell_expand/words/mod.rs b/src/parser/shell_expand/words/mod.rs
index 6cf6806a..5c644b27 100644
--- a/src/parser/shell_expand/words/mod.rs
+++ b/src/parser/shell_expand/words/mod.rs
@@ -90,7 +90,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
             if character == b'}' {
                 let output = &self.data[start..self.read];
                 self.read += 1;
-                return WordToken::Variable(output, self.flags.contains(DQUOTE), Select::All);
+                return WordToken::Variable(output, self.flags.contains(Flags::DQUOTE), Select::All);
             }
             self.read += 1;
         }
@@ -191,11 +191,11 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                     return if character == b'[' {
                         WordToken::Variable(
                             variable,
-                            self.flags.contains(DQUOTE),
+                            self.flags.contains(Flags::DQUOTE),
                             self.read_selection(iterator),
                         )
                     } else {
-                        WordToken::Variable(variable, self.flags.contains(DQUOTE), Select::All)
+                        WordToken::Variable(variable, self.flags.contains(Flags::DQUOTE), Select::All)
                     };
                 }
                 _ => (),
@@ -203,7 +203,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
             self.read += 1;
         }
 
-        WordToken::Variable(&self.data[start..], self.flags.contains(DQUOTE), Select::All)
+        WordToken::Variable(&self.data[start..], self.flags.contains(Flags::DQUOTE), Select::All)
     }
 
     fn read_selection<I>(&mut self, iterator: &mut I) -> Select
@@ -307,7 +307,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                 b'[' => {
                     return WordToken::ArrayVariable(
                         &self.data[start..self.read],
-                        self.flags.contains(DQUOTE),
+                        self.flags.contains(Flags::DQUOTE),
                         self.read_selection(iterator),
                     )
                 }
@@ -315,7 +315,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                 0...47 | 58...64 | 91...94 | 96 | 123...127 => {
                     return WordToken::ArrayVariable(
                         &self.data[start..self.read],
-                        self.flags.contains(DQUOTE),
+                        self.flags.contains(Flags::DQUOTE),
                         Select::All,
                     )
                 }
@@ -324,7 +324,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
             self.read += 1;
         }
 
-        WordToken::ArrayVariable(&self.data[start..], self.flags.contains(DQUOTE), Select::All)
+        WordToken::ArrayVariable(&self.data[start..], self.flags.contains(Flags::DQUOTE), Select::All)
     }
 
     fn braced_array_variable<I>(&mut self, iterator: &mut I) -> WordToken<'a>
@@ -337,7 +337,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                 b'[' => {
                     let result = WordToken::ArrayVariable(
                         &self.data[start..self.read],
-                        self.flags.contains(DQUOTE),
+                        self.flags.contains(Flags::DQUOTE),
                         self.read_selection(iterator),
                     );
                     self.read += 1;
@@ -354,7 +354,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                     self.read += 1;
                     return WordToken::ArrayVariable(
                         output,
-                        self.flags.contains(DQUOTE),
+                        self.flags.contains(Flags::DQUOTE),
                         Select::All,
                     );
                 }
@@ -362,7 +362,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                 0...47 | 58...64 | 91...94 | 96 | 123...127 => {
                     return WordToken::ArrayVariable(
                         &self.data[start..self.read],
-                        self.flags.contains(DQUOTE),
+                        self.flags.contains(Flags::DQUOTE),
                         Select::All,
                     )
                 }
@@ -370,7 +370,7 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
             }
             self.read += 1;
         }
-        WordToken::ArrayVariable(&self.data[start..], self.flags.contains(DQUOTE), Select::All)
+        WordToken::ArrayVariable(&self.data[start..], self.flags.contains(Flags::DQUOTE), Select::All)
     }
 
     /// Contains the logic for parsing subshell syntax.
@@ -381,27 +381,27 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
         let mut level = 0;
         while let Some(character) = iterator.next() {
             match character {
-                _ if self.flags.contains(BACKSL) => self.flags ^= BACKSL,
-                b'\\' => self.flags ^= BACKSL,
-                b'\'' if !self.flags.contains(DQUOTE) => self.flags ^= SQUOTE,
-                b'"' if !self.flags.contains(SQUOTE) => self.flags ^= DQUOTE,
-                b'$' if !self.flags.contains(SQUOTE) => {
+                _ if self.flags.contains(Flags::BACKSL) => self.flags ^= Flags::BACKSL,
+                b'\\' => self.flags ^= Flags::BACKSL,
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => self.flags ^= Flags::SQUOTE,
+                b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
+                b'$' if !self.flags.contains(Flags::SQUOTE) => {
                     if self.data.as_bytes()[self.read + 1] == b'(' {
                         level += 1;
                     }
                 }
-                b')' if !self.flags.contains(SQUOTE) => if level == 0 {
+                b')' if !self.flags.contains(Flags::SQUOTE) => if level == 0 {
                     let output = &self.data[start..self.read];
                     self.read += 1;
                     return if let Some(&b'[') = self.data.as_bytes().get(self.read) {
                         let _ = iterator.next();
                         WordToken::Process(
                             output,
-                            self.flags.contains(DQUOTE),
+                            self.flags.contains(Flags::DQUOTE),
                             self.read_selection(iterator),
                         )
                     } else {
-                        WordToken::Process(output, self.flags.contains(DQUOTE), Select::All)
+                        WordToken::Process(output, self.flags.contains(Flags::DQUOTE), Select::All)
                     };
                 } else {
                     level -= 1;
@@ -423,29 +423,29 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
         let mut level = 0;
         while let Some(character) = iterator.next() {
             match character {
-                _ if self.flags.contains(BACKSL) => self.flags ^= BACKSL,
-                b'\\' => self.flags ^= BACKSL,
-                b'\'' if !self.flags.contains(DQUOTE) => self.flags ^= SQUOTE,
-                b'"' if !self.flags.contains(SQUOTE) => self.flags ^= DQUOTE,
-                b'@' if !self.flags.contains(SQUOTE) => {
+                _ if self.flags.contains(Flags::BACKSL) => self.flags ^= Flags::BACKSL,
+                b'\\' => self.flags ^= Flags::BACKSL,
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => self.flags ^= Flags::SQUOTE,
+                b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
+                b'@' if !self.flags.contains(Flags::SQUOTE) => {
                     if self.data.as_bytes()[self.read + 1] == b'(' {
                         level += 1;
                     }
                 }
-                b')' if !self.flags.contains(SQUOTE) => if level == 0 {
+                b')' if !self.flags.contains(Flags::SQUOTE) => if level == 0 {
                     let array_process_contents = &self.data[start..self.read];
                     self.read += 1;
                     return if let Some(&b'[') = self.data.as_bytes().get(self.read) {
                         let _ = iterator.next();
                         WordToken::ArrayProcess(
                             array_process_contents,
-                            self.flags.contains(DQUOTE),
+                            self.flags.contains(Flags::DQUOTE),
                             self.read_selection(iterator),
                         )
                     } else {
                         WordToken::ArrayProcess(
                             array_process_contents,
-                            self.flags.contains(DQUOTE),
+                            self.flags.contains(Flags::DQUOTE),
                             Select::All,
                         )
                     };
@@ -470,16 +470,16 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
         let mut elements = Vec::new();
         while let Some(character) = iterator.next() {
             match character {
-                _ if self.flags.contains(BACKSL) => self.flags ^= BACKSL,
-                b'\\' => self.flags ^= BACKSL,
-                b'\'' if !self.flags.contains(DQUOTE) => self.flags ^= SQUOTE,
-                b'"' if !self.flags.contains(SQUOTE) => self.flags ^= DQUOTE,
-                b',' if !self.flags.intersects(SQUOTE | DQUOTE) && level == 0 => {
+                _ if self.flags.contains(Flags::BACKSL) => self.flags ^= Flags::BACKSL,
+                b'\\' => self.flags ^= Flags::BACKSL,
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => self.flags ^= Flags::SQUOTE,
+                b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
+                b',' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) && level == 0 => {
                     elements.push(&self.data[start..self.read]);
                     start = self.read + 1;
                 }
-                b'{' if !self.flags.intersects(SQUOTE | DQUOTE) => level += 1,
-                b'}' if !self.flags.intersects(SQUOTE | DQUOTE) => if level == 0 {
+                b'{' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => level += 1,
+                b'}' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => if level == 0 {
                     elements.push(&self.data[start..self.read]);
                     self.read += 1;
                     return WordToken::Brace(elements);
@@ -502,12 +502,12 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
         let mut level = 0;
         while let Some(character) = iterator.next() {
             match character {
-                _ if self.flags.contains(BACKSL) => self.flags ^= BACKSL,
-                b'\\' => self.flags ^= BACKSL,
-                b'\'' if !self.flags.contains(DQUOTE) => self.flags ^= SQUOTE,
-                b'"' if !self.flags.contains(SQUOTE) => self.flags ^= DQUOTE,
-                b'[' if !self.flags.intersects(SQUOTE | DQUOTE) => level += 1,
-                b']' if !self.flags.intersects(SQUOTE | DQUOTE) => if level == 0 {
+                _ if self.flags.contains(Flags::BACKSL) => self.flags ^= Flags::BACKSL,
+                b'\\' => self.flags ^= Flags::BACKSL,
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => self.flags ^= Flags::SQUOTE,
+                b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE,
+                b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => level += 1,
+                b']' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => if level == 0 {
                     let elements =
                         ArgumentSplitter::new(&self.data[start..self.read]).collect::<Vec<&str>>();
                     self.read += 1;
@@ -609,55 +609,55 @@ impl<'a, E: Expander + 'a> Iterator for WordIterator<'a, E> {
         loop {
             if let Some(character) = iterator.next() {
                 match character {
-                    _ if self.flags.contains(BACKSL) => {
+                    _ if self.flags.contains(Flags::BACKSL) => {
                         self.read += 1;
-                        self.flags ^= BACKSL;
+                        self.flags ^= Flags::BACKSL;
                         break;
                     }
                     b'\\' => {
-                        if !self.flags.intersects(DQUOTE | SQUOTE) {
+                        if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) {
                             start += 1;
                         }
                         self.read += 1;
-                        self.flags ^= BACKSL;
+                        self.flags ^= Flags::BACKSL;
                         break;
                     }
-                    b'\'' if !self.flags.contains(DQUOTE) => {
+                    b'\'' if !self.flags.contains(Flags::DQUOTE) => {
                         start += 1;
                         self.read += 1;
-                        self.flags ^= SQUOTE;
+                        self.flags ^= Flags::SQUOTE;
                         break;
                     }
-                    b'"' if !self.flags.contains(SQUOTE) => {
+                    b'"' if !self.flags.contains(Flags::SQUOTE) => {
                         start += 1;
                         self.read += 1;
-                        if self.flags.contains(DQUOTE) {
-                            self.flags -= DQUOTE;
+                        if self.flags.contains(Flags::DQUOTE) {
+                            self.flags -= Flags::DQUOTE;
                             return self.next();
                         }
-                        self.flags |= DQUOTE;
+                        self.flags |= Flags::DQUOTE;
                         break;
                     }
-                    b' ' if !self.flags.intersects(DQUOTE | SQUOTE) => {
+                    b' ' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => {
                         return Some(self.whitespaces(&mut iterator))
                     }
-                    b'~' if !self.flags.intersects(DQUOTE | SQUOTE) => {
+                    b'~' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => {
                         tilde = true;
                         self.read += 1;
                         break;
                     }
-                    b'{' if !self.flags.intersects(DQUOTE | SQUOTE) => {
+                    b'{' if !self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) => {
                         self.read += 1;
                         return Some(self.braces(&mut iterator));
                     }
-                    b'[' if !self.flags.intersects(SQUOTE | DQUOTE) => {
+                    b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                         if self.glob_check(&mut iterator) {
                             glob = true;
                         } else {
                             return Some(self.array(&mut iterator));
                         }
                     }
-                    b'@' if !self.flags.contains(SQUOTE) => match iterator.next() {
+                    b'@' if !self.flags.contains(Flags::SQUOTE) => match iterator.next() {
                         Some(b'(') => {
                             self.read += 2;
                             return Some(self.array_process(&mut iterator));
@@ -676,7 +676,7 @@ impl<'a, E: Expander + 'a> Iterator for WordIterator<'a, E> {
                             return Some(self.array_variable(&mut iterator));
                         }
                     },
-                    b'$' if !self.flags.contains(SQUOTE) => {
+                    b'$' if !self.flags.contains(Flags::SQUOTE) => {
                         match iterator.next() {
                             Some(b'(') => {
                                 self.read += 2;
@@ -721,10 +721,10 @@ impl<'a, E: Expander + 'a> Iterator for WordIterator<'a, E> {
 
         while let Some(character) = iterator.next() {
             match character {
-                _ if self.flags.contains(BACKSL) => self.flags ^= BACKSL,
+                _ if self.flags.contains(Flags::BACKSL) => self.flags ^= Flags::BACKSL,
                 b'\\' => {
-                    self.flags ^= BACKSL;
-                    let end = if self.flags.intersects(DQUOTE | SQUOTE) {
+                    self.flags ^= Flags::BACKSL;
+                    let end = if self.flags.intersects(Flags::DQUOTE | Flags::SQUOTE) {
                         self.read + 1
                     } else {
                         self.read
@@ -733,22 +733,22 @@ impl<'a, E: Expander + 'a> Iterator for WordIterator<'a, E> {
                     self.read += 1;
                     return Some(WordToken::Normal(output, glob, tilde));
                 }
-                b'\'' if !self.flags.contains(DQUOTE) => {
-                    self.flags ^= SQUOTE;
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => {
+                    self.flags ^= Flags::SQUOTE;
                     let output = &self.data[start..self.read];
                     self.read += 1;
                     return Some(WordToken::Normal(output, glob, tilde));
                 }
-                b'"' if !self.flags.contains(SQUOTE) => {
-                    self.flags ^= DQUOTE;
+                b'"' if !self.flags.contains(Flags::SQUOTE) => {
+                    self.flags ^= Flags::DQUOTE;
                     let output = &self.data[start..self.read];
                     self.read += 1;
                     return Some(WordToken::Normal(output, glob, tilde));
                 }
-                b' ' | b'{' if !self.flags.intersects(SQUOTE | DQUOTE) => {
+                b' ' | b'{' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                     return Some(WordToken::Normal(&self.data[start..self.read], glob, tilde))
                 }
-                b'$' | b'@' if !self.flags.contains(SQUOTE) => {
+                b'$' | b'@' if !self.flags.contains(Flags::SQUOTE) => {
                     if let Some(&character) = self.data.as_bytes().get(self.read) {
                         if character == b' ' {
                             self.read += 1;
@@ -763,17 +763,17 @@ impl<'a, E: Expander + 'a> Iterator for WordIterator<'a, E> {
                         return self.next();
                     };
                 }
-                b'[' if !self.flags.intersects(SQUOTE | DQUOTE) => {
+                b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                     if self.glob_check(&mut iterator) {
                         glob = true;
                     } else {
                         return Some(WordToken::Normal(&self.data[start..self.read], glob, tilde));
                     }
                 }
-                b'*' | b'?' if !self.flags.contains(SQUOTE) => {
+                b'*' | b'?' if !self.flags.contains(Flags::SQUOTE) => {
                     glob = true;
                 }
-                b'~' if !self.flags.intersects(SQUOTE | DQUOTE) => {
+                b'~' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                     let output = &self.data[start..self.read];
                     if output != "" {
                         return Some(WordToken::Normal(output, glob, tilde));
diff --git a/src/parser/statement/splitter.rs b/src/parser/statement/splitter.rs
index 4baac1ce..9c4b9f9a 100644
--- a/src/parser/statement/splitter.rs
+++ b/src/parser/statement/splitter.rs
@@ -125,68 +125,68 @@ impl<'a> Iterator for StatementSplitter<'a> {
                     self.read += 1;
                     bytes.next();
                 }
-                _ if self.flags.contains(POST_MATHEXPR) => {
-                    self.flags -= POST_MATHEXPR;
+                _ if self.flags.contains(Flags::POST_MATHEXPR) => {
+                    self.flags -= Flags::POST_MATHEXPR;
                 }
                 // [^A-Za-z0-9_:,}]
                 0...43 | 45...47 | 59...64 | 91...94 | 96 | 123...124 | 126...127
-                    if self.flags.contains(VBRACE) =>
+                    if self.flags.contains(Flags::VBRACE) =>
                 {
                     // If we are just ending the braced section continue as normal
                     if error.is_none() {
                         error = Some(StatementError::InvalidCharacter(character as char, self.read))
                     }
                 }
-                b'\'' if !self.flags.contains(DQUOTE) => {
-                    self.flags -= VARIAB | ARRAY;
+                b'\'' if !self.flags.contains(Flags::DQUOTE) => {
+                    self.flags -= Flags::VARIAB | Flags::ARRAY;
                     self.read += self.single_quote(&mut bytes);
                 }
-                // Toggle DQUOTE and disable VARIAB + ARRAY.
-                b'"' => self.flags = (self.flags ^ DQUOTE) - (VARIAB | ARRAY),
-                // Disable COMM_1 and enable COMM_2 + ARRAY.
+                // Toggle Flags::DQUOTE and disable Flags::VARIAB + Flags::ARRAY.
+                b'"' => self.flags = (self.flags ^ Flags::DQUOTE) - (Flags::VARIAB | Flags::ARRAY),
+                // Disable Flags::COMM_1 and enable Flags::COMM_2 + Flags::ARRAY.
                 b'@' => {
-                    self.flags = (self.flags - COMM_1) | (COMM_2 | ARRAY);
+                    self.flags = (self.flags - Flags::COMM_1) | (Flags::COMM_2 | Flags::ARRAY);
                     continue;
                 }
                 b'$' => {
-                    self.flags = (self.flags - COMM_2) | (COMM_1 | VARIAB);
+                    self.flags = (self.flags - Flags::COMM_2) | (Flags::COMM_1 | Flags::VARIAB);
                     continue;
                 }
-                b'{' if self.flags.intersects(COMM_1 | COMM_2) => self.flags |= VBRACE,
-                b'{' if !self.flags.contains(DQUOTE) => self.brace_level += 1,
-                b'}' if self.flags.contains(VBRACE) => self.flags.toggle(VBRACE),
-                b'}' if !self.flags.contains(DQUOTE) => if self.brace_level == 0 {
+                b'{' if self.flags.intersects(Flags::COMM_1 | Flags::COMM_2) => self.flags |= Flags::VBRACE,
+                b'{' if !self.flags.contains(Flags::DQUOTE) => self.brace_level += 1,
+                b'}' if self.flags.contains(Flags::VBRACE) => self.flags.toggle(Flags::VBRACE),
+                b'}' if !self.flags.contains(Flags::DQUOTE) => if self.brace_level == 0 {
                     if error.is_none() {
                         error = Some(StatementError::InvalidCharacter(character as char, self.read))
                     }
                 } else {
                     self.brace_level -= 1;
                 },
-                b'(' if self.flags.contains(MATHEXPR) => {
+                b'(' if self.flags.contains(Flags::MATHEXPR) => {
                     self.math_paren_level += 1;
                 }
-                b'(' if !self.flags.intersects(COMM_1 | VARIAB | ARRAY) => {
-                    if error.is_none() && !self.flags.contains(DQUOTE) {
+                b'(' if !self.flags.intersects(Flags::COMM_1 | Flags::VARIAB | Flags::ARRAY) => {
+                    if error.is_none() && !self.flags.contains(Flags::DQUOTE) {
                         error = Some(StatementError::InvalidCharacter(character as char, self.read))
                     }
                 }
-                b'(' if self.flags.intersects(COMM_1 | METHOD) => {
-                    self.flags -= VARIAB | ARRAY;
+                b'(' if self.flags.intersects(Flags::COMM_1 | Flags::METHOD) => {
+                    self.flags -= Flags::VARIAB | Flags::ARRAY;
                     if self.data.as_bytes()[self.read] == b'(' {
-                        self.flags = (self.flags - COMM_1) | MATHEXPR;
+                        self.flags = (self.flags - Flags::COMM_1) | Flags::MATHEXPR;
                         // The next character will always be a left paren in this branch;
                         self.math_paren_level = -1;
                     } else {
                         self.p_level += 1;
                     }
                 }
-                b'(' if self.flags.contains(COMM_2) => {
+                b'(' if self.flags.contains(Flags::COMM_2) => {
                     self.ap_level += 1;
                 }
-                b'(' if self.flags.intersects(VARIAB | ARRAY) => {
-                    self.flags = (self.flags - (VARIAB | ARRAY)) | METHOD;
+                b'(' if self.flags.intersects(Flags::VARIAB | Flags::ARRAY) => {
+                    self.flags = (self.flags - (Flags::VARIAB | Flags::ARRAY)) | Flags::METHOD;
                 }
-                b')' if self.flags.contains(MATHEXPR) => if self.math_paren_level == 0 {
+                b')' if self.flags.contains(Flags::MATHEXPR) => if self.math_paren_level == 0 {
                     if self.data.as_bytes().len() <= self.read {
                         if error.is_none() {
                             error = Some(StatementError::UnterminatedArithmetic)
@@ -194,7 +194,7 @@ impl<'a> Iterator for StatementSplitter<'a> {
                     } else {
                         let next_character = self.data.as_bytes()[self.read] as char;
                         if next_character == ')' {
-                            self.flags = (self.flags - MATHEXPR) | POST_MATHEXPR;
+                            self.flags = (self.flags - Flags::MATHEXPR) | Flags::POST_MATHEXPR;
                         } else if error.is_none() {
                             error =
                                 Some(StatementError::InvalidCharacter(next_character, self.read));
@@ -203,24 +203,24 @@ impl<'a> Iterator for StatementSplitter<'a> {
                 } else {
                     self.math_paren_level -= 1;
                 },
-                b')' if self.flags.contains(METHOD) && self.p_level == 0 => {
-                    self.flags ^= METHOD;
+                b')' if self.flags.contains(Flags::METHOD) && self.p_level == 0 => {
+                    self.flags ^= Flags::METHOD;
                 }
                 b')' if self.p_level + self.ap_level == 0 => {
-                    if error.is_none() && !self.flags.contains(DQUOTE) {
+                    if error.is_none() && !self.flags.contains(Flags::DQUOTE) {
                         error = Some(StatementError::InvalidCharacter(character as char, self.read))
                     }
                 }
                 b')' if self.p_level != 0 => self.p_level -= 1,
                 b')' => self.ap_level -= 1,
-                b';' if !self.flags.contains(DQUOTE) && self.p_level == 0 && self.ap_level == 0 => {
+                b';' if !self.flags.contains(Flags::DQUOTE) && self.p_level == 0 && self.ap_level == 0 => {
                     return match error {
                         Some(error) => Some(Err(error)),
                         None => Some(Ok(self.data[start..self.read - 1].trim())),
                     }
                 }
                 b'#' if self.read == 1
-                    || (!self.flags.contains(DQUOTE) && self.p_level + self.ap_level == 0
+                    || (!self.flags.contains(Flags::DQUOTE) && self.p_level + self.ap_level == 0
                         && match self.data.as_bytes()[self.read - 2] {
                             b' ' | b'\t' => true,
                             _ => false,
@@ -256,11 +256,11 @@ impl<'a> Iterator for StatementSplitter<'a> {
                     }
                 }
                 // [^A-Za-z0-9_]
-                byte => if self.flags.intersects(VARIAB | ARRAY) {
-                    self.flags -= if is_invalid(byte) { VARIAB | ARRAY } else { Flags::empty() };
+                byte => if self.flags.intersects(Flags::VARIAB | Flags::ARRAY) {
+                    self.flags -= if is_invalid(byte) { Flags::VARIAB | Flags::ARRAY } else { Flags::empty() };
                 },
             }
-            self.flags -= COMM_1 | COMM_2;
+            self.flags -= Flags::COMM_1 | Flags::COMM_2;
         }
 
         if start == self.read {
@@ -272,14 +272,14 @@ impl<'a> Iterator for StatementSplitter<'a> {
                 None if self.p_level != 0 || self.ap_level != 0 || self.a_level != 0 => {
                     Some(Err(StatementError::UnterminatedSubshell))
                 }
-                None if self.flags.contains(METHOD) => {
+                None if self.flags.contains(Flags::METHOD) => {
                     Some(Err(StatementError::UnterminatedMethod))
                 }
-                None if self.flags.contains(VBRACE) => {
+                None if self.flags.contains(Flags::VBRACE) => {
                     Some(Err(StatementError::UnterminatedBracedVar))
                 }
                 None if self.brace_level != 0 => Some(Err(StatementError::UnterminatedBrace)),
-                None if self.flags.contains(MATHEXPR) => {
+                None if self.flags.contains(Flags::MATHEXPR) => {
                     Some(Err(StatementError::UnterminatedArithmetic))
                 }
                 None => {
diff --git a/src/shell/history.rs b/src/shell/history.rs
index 0917e89f..168e0d3b 100644
--- a/src/shell/history.rs
+++ b/src/shell/history.rs
@@ -9,13 +9,13 @@ bitflags! {
     struct IgnoreFlags: u8 {
         // Macro definition fails if last flag has a comment at the end of the line.
         /// ignore all commands ("all")
-        const IGNORE_ALL                = (0b1 << 0);
+        const ALL                = (0b1 << 0);
         /// ignore commands with leading whitespace ("whitespace")
-        const IGNORE_WHITESPACE         = (0x1 << 1);
+        const WHITESPACE         = (0x1 << 1);
         /// ignore commands with status code 127 ("no_such_command")
-        const IGNORE_NO_SUCH_COMMAND    = (0b1 << 2);
+        const NO_SUCH_COMMAND    = (0b1 << 2);
         /// used if regexes are defined.
-        const IGNORE_BASED_ON_REGEX     = (0b1 << 3);
+        const BASED_ON_REGEX     = (0b1 << 3);
     }
 }
 
@@ -119,12 +119,12 @@ impl ShellHistory for Shell {
         let regex_prefix = "regex:";
         for pattern in patterns {
             match pattern.as_ref() {
-                "all" => flags |= IGNORE_ALL,
-                "no_such_command" => flags |= IGNORE_NO_SUCH_COMMAND,
-                "whitespace" => flags |= IGNORE_WHITESPACE,
+                "all" => flags |= IgnoreFlags::ALL,
+                "no_such_command" => flags |= IgnoreFlags::NO_SUCH_COMMAND,
+                "whitespace" => flags |= IgnoreFlags::WHITESPACE,
                 // The length check is there to just ignore empty regex definitions
                 _ if pattern.starts_with(regex_prefix) && pattern.len() > regex_prefix.len() => {
-                    flags |= IGNORE_BASED_ON_REGEX;
+                    flags |= IgnoreFlags::BASED_ON_REGEX;
                     let regex_string = &pattern[regex_prefix.len()..];
                     // We save the compiled regexes, as compiling them can be  an expensive task
                     if let Ok(regex) = Regex::new(regex_string) {
@@ -148,19 +148,19 @@ impl ShellHistoryPrivate for Shell {
 
         // without the second check the command which sets the local variable would also be
         // ignored. However, this behavior might not be wanted.
-        if ignore.contains(IGNORE_ALL) && !command.contains("HISTORY_IGNORE") {
+        if ignore.contains(IgnoreFlags::ALL) && !command.contains("HISTORY_IGNORE") {
             return false;
         }
 
         // Here we allow to also ignore the setting of the local variable because we assume
         // the user entered the leading whitespace on purpose.
-        if ignore.contains(IGNORE_WHITESPACE) {
+        if ignore.contains(IgnoreFlags::WHITESPACE) {
             if command.chars().next().map_or(false, |b| b.is_whitespace()) {
                 return false;
             }
         }
 
-        if ignore.contains(IGNORE_NO_SUCH_COMMAND) && self.previous_status == NO_SUCH_COMMAND {
+        if ignore.contains(IgnoreFlags::NO_SUCH_COMMAND) && self.previous_status == NO_SUCH_COMMAND {
             return false;
         }
 
-- 
GitLab