Snap for 8564071 from 61fbdb4506a7772a21c6f29568fae33fbc63b24b to mainline-permission-release

Change-Id: If5cdbf77444d71a8b024649e778f044d8712798d
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 2d990ac..8481d95 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "2979eee12f92d1903a53f820664c65735b010e0e"
+    "sha1": "6a43efb32cf14b8dc4cd294429d3de259d37e279"
   }
 }
diff --git a/Android.bp b/Android.bp
index 7d07606..e0534ba 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,5 @@
-// This file is generated by cargo2android.py --run --dependencies --device.
+// This file is generated by cargo2android.py --config cargo2android.json.
+// Do not modify this file as changes will be overridden on upgrade.
 
 package {
     default_applicable_licenses: ["external_rust_crates_cexpr_license"],
@@ -40,14 +41,11 @@
     name: "libcexpr",
     host_supported: true,
     crate_name: "cexpr",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.5.0",
     srcs: ["src/lib.rs"],
     edition: "2018",
     rustlibs: [
         "libnom",
     ],
 }
-
-// dependent_library ["feature_list"]
-//   memchr-2.3.3 "std,use_std"
-//   nom-5.1.2 "alloc,std"
-//   version_check-0.9.2
diff --git a/Cargo.toml b/Cargo.toml
index 9ae350d..a3067d0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
 [package]
 edition = "2018"
 name = "cexpr"
-version = "0.4.0"
+version = "0.5.0"
 authors = ["Jethro Beekman <jethro@jbeekman.nl>"]
 description = "A C expression parser and evaluator"
 documentation = "https://docs.rs/cexpr/"
@@ -21,7 +21,7 @@
 license = "Apache-2.0/MIT"
 repository = "https://github.com/jethrogb/rust-cexpr"
 [dependencies.nom]
-version = "5"
+version = "7"
 features = ["std"]
 default-features = false
 [dev-dependencies.clang-sys]
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index d6ab0de..acbe572 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "cexpr"
-version = "0.4.0"
+version = "0.5.0"
 edition = "2018"
 authors = ["Jethro Beekman <jethro@jbeekman.nl>"]
 license = "Apache-2.0/MIT"
@@ -13,7 +13,7 @@
 travis-ci = { repository = "jethrogb/rust-cexpr" }
 
 [dependencies]
-nom = { version = "5", default-features = false, features = ["std"] }
+nom = { version = "6", default-features = false, features = ["std"] }
 
 [dev-dependencies]
 clang-sys = ">= 0.13.0, < 0.29.0"
diff --git a/METADATA b/METADATA
index 8f79fa2..ea007fa 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/cexpr/cexpr-0.4.0.crate"
+    value: "https://static.crates.io/crates/cexpr/cexpr-0.5.0.crate"
   }
-  version: "0.4.0"
+  version: "0.5.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2020
-    month: 3
-    day: 31
+    year: 2021
+    month: 6
+    day: 21
   }
 }
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 6716814..e4ec3b3 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,8 +1,24 @@
-// Generated by cargo2android.py for tests in Android.bp
+// Generated by update_crate_tests.py for tests that depend on this crate.
 {
+  "imports": [
+    {
+      "path": "external/rust/crates/libsqlite3-sys"
+    }
+  ],
   "presubmit": [
     {
-      "name": "libsqlite3-sys_device_test_src_lib"
+      "name": "keystore2_test"
+    },
+    {
+      "name": "legacykeystore_test"
+    }
+  ],
+  "presubmit-rust": [
+    {
+      "name": "keystore2_test"
+    },
+    {
+      "name": "legacykeystore_test"
     }
   ]
 }
diff --git a/cargo2android.json b/cargo2android.json
new file mode 100644
index 0000000..bf78496
--- /dev/null
+++ b/cargo2android.json
@@ -0,0 +1,4 @@
+{
+  "device": true,
+  "run": true
+}
\ No newline at end of file
diff --git a/patches/nom7.patch b/patches/nom7.patch
new file mode 100644
index 0000000..5ba703d
--- /dev/null
+++ b/patches/nom7.patch
@@ -0,0 +1,84 @@
+diff --git a/Cargo.toml b/Cargo.toml
+index 8f6dcc2..a3067d0 100644
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -21,7 +21,7 @@ keywords = ["C", "expression", "parser"]
+ license = "Apache-2.0/MIT"
+ repository = "https://github.com/jethrogb/rust-cexpr"
+ [dependencies.nom]
+-version = "6"
++version = "7"
+ features = ["std"]
+ default-features = false
+ [dev-dependencies.clang-sys]
+diff --git a/src/expr.rs b/src/expr.rs
+index 5dce3c7..7f7e458 100644
+--- a/src/expr.rs
++++ b/src/expr.rs
+@@ -308,7 +308,7 @@ impl<'a> PRef<'a> {
+             pair(complete(one_of_punctuation(&["*", "/", "%"][..])), |i| {
+                 self.unary(i)
+             }),
+-            acc,
++            move || acc.clone(),
+             |mut acc, (op, val): (&[u8], EvalResult)| {
+                 match op[0] as char {
+                     '*' => acc *= &val,
+@@ -327,7 +327,7 @@ impl<'a> PRef<'a> {
+             pair(complete(one_of_punctuation(&["+", "-"][..])), |i| {
+                 self.mul_div_rem(i)
+             }),
+-            acc,
++            move || acc.clone(),
+             |mut acc, (op, val): (&[u8], EvalResult)| {
+                 match op[0] as char {
+                     '+' => acc += &val,
+@@ -345,7 +345,7 @@ impl<'a> PRef<'a> {
+             pair(complete(one_of_punctuation(&["<<", ">>"][..])), |i| {
+                 self.add_sub(i)
+             }),
+-            acc,
++            move || acc.clone(),
+             |mut acc, (op, val): (&[u8], EvalResult)| {
+                 match op {
+                     b"<<" => acc <<= &val,
+@@ -361,7 +361,7 @@ impl<'a> PRef<'a> {
+         let (input, acc) = self.shl_shr(input)?;
+         numeric(fold_many0(
+             preceded(complete(p("&")), |i| self.shl_shr(i)),
+-            acc,
++            move || acc.clone(),
+             |mut acc, val: EvalResult| {
+                 acc &= &val;
+                 acc
+@@ -373,7 +373,7 @@ impl<'a> PRef<'a> {
+         let (input, acc) = self.and(input)?;
+         numeric(fold_many0(
+             preceded(complete(p("^")), |i| self.and(i)),
+-            acc,
++            move || acc.clone(),
+             |mut acc, val: EvalResult| {
+                 acc ^= &val;
+                 acc
+@@ -385,7 +385,7 @@ impl<'a> PRef<'a> {
+         let (input, acc) = self.xor(input)?;
+         numeric(fold_many0(
+             preceded(complete(p("|")), |i| self.xor(i)),
+-            acc,
++            move || acc.clone(),
+             |mut acc, val: EvalResult| {
+                 acc |= &val;
+                 acc
+diff --git a/src/literal.rs b/src/literal.rs
+index b74699f..68e85c7 100644
+--- a/src/literal.rs
++++ b/src/literal.rs
+@@ -224,7 +224,7 @@ fn c_string(i: &[u8]) -> nom::IResult<&[u8], Vec<u8>> {
+                 map(escaped_char, |c: CChar| c.into()),
+                 map(is_not([b'\\', b'"']), |c: &[u8]| c.into()),
+             )),
+-            Vec::new(),
++            Vec::new,
+             |mut v: Vec<u8>, res: Vec<u8>| {
+                 v.extend_from_slice(&res);
+                 v
diff --git a/src/expr.rs b/src/expr.rs
index b1fbfb2..7f7e458 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -31,7 +31,7 @@
 use crate::ToCexprResult;
 use nom::branch::alt;
 use nom::combinator::{complete, map, map_opt};
-use nom::multi::{fold_many0, many0, separated_list};
+use nom::multi::{fold_many0, many0, separated_list0};
 use nom::sequence::{delimited, pair, preceded};
 use nom::*;
 
@@ -100,7 +100,7 @@
 	($k:ident, $c:expr) => ({
         move |input: &[Token]| {
 		if input.is_empty() {
-			let res: CResult<'_, &[u8]> = Err(crate::nom::Err::Incomplete(Needed::Size($c.len())));
+			let res: CResult<'_, &[u8]> = Err(crate::nom::Err::Incomplete(Needed::new($c.len())));
 			res
 		} else {
 			if input[0].kind==TokenKind::$k && &input[0].raw[..]==$c {
@@ -113,29 +113,16 @@
 	});
 );
 
-macro_rules! typed_token (
-	($k:ident) => ({
-        move |input: &[Token]| {
-		if input.is_empty() {
-			let res: CResult<'_, &[u8]> = Err(nom::Err::Incomplete(Needed::Size(1)));
-			res
-		} else {
-			if input[0].kind==TokenKind::$k {
-				Ok((&input[1..], &input[0].raw[..]))
-			} else {
-				Err(crate::nom::Err::Error((input, crate::ErrorKind::TypedToken(TokenKind::$k)).into()))
-			}
-		}
-        }
-	});
-);
-
-#[allow(dead_code)]
-fn any_token(input: &[Token]) -> CResult<'_, &Token> {
+fn identifier_token(input: &[Token]) -> CResult<'_, &[u8]> {
     if input.is_empty() {
-        Err(crate::nom::Err::Incomplete(Needed::Size(1)))
+        let res: CResult<'_, &[u8]> = Err(nom::Err::Incomplete(Needed::new(1)));
+        res
     } else {
-        Ok((&input[1..], &input[0]))
+        if input[0].kind == TokenKind::Identifier {
+            Ok((&input[1..], &input[0].raw[..]))
+        } else {
+            Err(crate::nom::Err::Error((input, crate::ErrorKind::TypedToken(TokenKind::Identifier)).into()))
+        }
     }
 }
 
@@ -151,7 +138,7 @@
                 .map(|opt| opt.len())
                 .min()
                 .expect("at least one option");
-            Err(crate::nom::Err::Incomplete(Needed::Size(min)))
+            Err(crate::nom::Err::Incomplete(Needed::new(min)))
         } else if input[0].kind == TokenKind::Punctuation
             && c.iter().any(|opt| opt.as_bytes() == &input[0].raw[..])
         {
@@ -295,9 +282,9 @@
 
 fn numeric<I: Clone, E: nom::error::ParseError<I>, F>(
     f: F,
-) -> impl Fn(I) -> nom::IResult<I, EvalResult, E>
+) -> impl FnMut(I) -> nom::IResult<I, EvalResult, E>
 where
-    F: Fn(I) -> nom::IResult<I, EvalResult, E>,
+    F: FnMut(I) -> nom::IResult<I, EvalResult, E>,
 {
     nom::combinator::map_opt(f, EvalResult::as_numeric)
 }
@@ -321,7 +308,7 @@
             pair(complete(one_of_punctuation(&["*", "/", "%"][..])), |i| {
                 self.unary(i)
             }),
-            acc,
+            move || acc.clone(),
             |mut acc, (op, val): (&[u8], EvalResult)| {
                 match op[0] as char {
                     '*' => acc *= &val,
@@ -340,7 +327,7 @@
             pair(complete(one_of_punctuation(&["+", "-"][..])), |i| {
                 self.mul_div_rem(i)
             }),
-            acc,
+            move || acc.clone(),
             |mut acc, (op, val): (&[u8], EvalResult)| {
                 match op[0] as char {
                     '+' => acc += &val,
@@ -358,7 +345,7 @@
             pair(complete(one_of_punctuation(&["<<", ">>"][..])), |i| {
                 self.add_sub(i)
             }),
-            acc,
+            move || acc.clone(),
             |mut acc, (op, val): (&[u8], EvalResult)| {
                 match op {
                     b"<<" => acc <<= &val,
@@ -374,7 +361,7 @@
         let (input, acc) = self.shl_shr(input)?;
         numeric(fold_many0(
             preceded(complete(p("&")), |i| self.shl_shr(i)),
-            acc,
+            move || acc.clone(),
             |mut acc, val: EvalResult| {
                 acc &= &val;
                 acc
@@ -386,7 +373,7 @@
         let (input, acc) = self.and(input)?;
         numeric(fold_many0(
             preceded(complete(p("^")), |i| self.and(i)),
-            acc,
+            move || acc.clone(),
             |mut acc, val: EvalResult| {
                 acc ^= &val;
                 acc
@@ -398,7 +385,7 @@
         let (input, acc) = self.xor(input)?;
         numeric(fold_many0(
             preceded(complete(p("|")), |i| self.xor(i)),
-            acc,
+            move || acc.clone(),
             |mut acc, val: EvalResult| {
                 acc |= &val;
                 acc
@@ -419,7 +406,7 @@
 impl<'a> PRef<'a> {
     fn identifier(self, input: &'_ [Token]) -> CResult<'_, EvalResult> {
         match input.split_first() {
-            None => Err(Err::Incomplete(Needed::Size(1))),
+            None => Err(Err::Incomplete(Needed::new(1))),
             Some((
                 &Token {
                     kind: TokenKind::Identifier,
@@ -443,7 +430,7 @@
 
     fn literal(self, input: &'_ [Token]) -> CResult<'_, EvalResult> {
         match input.split_first() {
-            None => Err(Err::Incomplete(Needed::Size(1))),
+            None => Err(Err::Incomplete(Needed::new(1))),
             Some((
                 &Token {
                     kind: TokenKind::Literal,
@@ -496,7 +483,7 @@
     }
 
     fn macro_definition(self, input: &'_ [Token]) -> CResult<'_, (&'_ [u8], EvalResult)> {
-        pair(typed_token!(Identifier), |i| self.expr(i))(input)
+        pair(identifier_token, |i| self.expr(i))(input)
     }
 }
 
@@ -519,7 +506,7 @@
         IdentifierParser { identifiers }
     }
 
-    /// Parse and evalute an expression of a list of tokens.
+    /// Parse and evaluate an expression of a list of tokens.
     ///
     /// Returns an error if the input is not a valid expression or if the token
     /// stream contains comments, keywords or unknown identifiers.
@@ -527,7 +514,7 @@
         self.as_ref().expr(input)
     }
 
-    /// Parse and evaluate a macro definition from of a list of tokens.
+    /// Parse and evaluate a macro definition from a list of tokens.
     ///
     /// Returns the identifier for the macro and its replacement evaluated as an
     /// expression. The input should not include `#define`.
@@ -552,7 +539,7 @@
     }
 }
 
-/// Parse and evalute an expression of a list of tokens.
+/// Parse and evaluate an expression of a list of tokens.
 ///
 /// Returns an error if the input is not a valid expression or if the token
 /// stream contains comments, keywords or identifiers.
@@ -560,7 +547,7 @@
     IdentifierParser::new(&HashMap::new()).expr(input)
 }
 
-/// Parse and evaluate a macro definition from of a list of tokens.
+/// Parse and evaluate a macro definition from a list of tokens.
 ///
 /// Returns the identifier for the macro and its replacement evaluated as an
 /// expression. The input should not include `#define`.
@@ -613,10 +600,10 @@
 /// ```
 pub fn fn_macro_declaration(input: &[Token]) -> CResult<'_, (&[u8], Vec<&[u8]>)> {
     pair(
-        typed_token!(Identifier),
+        identifier_token,
         delimited(
             p("("),
-            separated_list(p(","), typed_token!(Identifier)),
+            separated_list0(p(","), identifier_token),
             p(")"),
         ),
     )(input)
diff --git a/src/lib.rs b/src/lib.rs
index 84e1e83..5170f97 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -19,7 +19,7 @@
 
 pub mod nom {
     //! nom's result types, re-exported.
-    pub use nom::{error::ErrorKind, Err, IResult, Needed};
+    pub use nom::{error::ErrorKind, error::Error, Err, IResult, Needed};
 }
 pub mod expr;
 pub mod literal;
@@ -86,6 +86,15 @@
     }
 }
 
+impl<I> From<::nom::error::Error<I>> for Error<I> {
+    fn from(e: ::nom::error::Error<I>) -> Self {
+        Self {
+            input: e.input,
+            error: e.code.into(),
+        }
+    }
+}
+
 impl<I> ::nom::error::ParseError<I> for Error<I> {
     fn from_error_kind(input: I, kind: nom::ErrorKind) -> Self {
         Self {
diff --git a/src/literal.rs b/src/literal.rs
index 39f07be..68e85c7 100644
--- a/src/literal.rs
+++ b/src/literal.rs
@@ -70,7 +70,7 @@
 }
 
 // A non-allocating version of this would be nice...
-impl Into<Vec<u8>> for CChar {
+impl std::convert::Into<Vec<u8>> for CChar {
     fn into(self) -> Vec<u8> {
         match self {
             CChar::Char(c) => {
@@ -88,12 +88,12 @@
 }
 
 /// ensures the child parser consumes the whole input
-pub fn full<I: Clone, O, E: From<nom::error::ErrorKind>, F>(
+pub fn full<I: Clone, O, F>(
     f: F,
-) -> impl Fn(I) -> nom::IResult<I, O, (I, E)>
+) -> impl Fn(I) -> nom::IResult<I, O>
 where
     I: nom::InputLength,
-    F: Fn(I) -> nom::IResult<I, O, (I, E)>,
+    F: Fn(I) -> nom::IResult<I, O>,
 {
     move |input| {
         let res = f(input);
@@ -102,7 +102,7 @@
                 if i.input_len() == 0 {
                     Ok((i, o))
                 } else {
-                    Err(nom::Err::Error((i, nom::error::ErrorKind::Complete.into())))
+                    Err(nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Complete)))
                 }
             }
             r => r,
@@ -119,8 +119,8 @@
         fn parser(i: &[u8]) -> crate::nom::IResult<&[u8], u8> {
             match i.split_first() {
                 $(Some((&c @ $p,rest)))|* => Ok((rest,c)),
-                Some(_) => Err(nom::Err::Error((i, nom::error::ErrorKind::OneOf))),
-                None => Err(nom::Err::Incomplete(Needed::Size(1))),
+                Some(_) => Err(nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::OneOf))),
+                None => Err(nom::Err::Incomplete(Needed::new(1))),
             }
         }
 
@@ -224,7 +224,7 @@
                 map(escaped_char, |c: CChar| c.into()),
                 map(is_not([b'\\', b'"']), |c: &[u8]| c.into()),
             )),
-            Vec::new(),
+            Vec::new,
             |mut v: Vec<u8>, res: Vec<u8>| {
                 v.extend_from_slice(&res);
                 v
@@ -272,7 +272,7 @@
                     c_int_radix(v, 8)
                 }),
                 map_opt(many1(complete(decimal)), |v| c_int_radix(v, 10)),
-                |input| Err(crate::nom::Err::Error((input, crate::nom::ErrorKind::Fix))),
+                |input| Err(crate::nom::Err::Error(nom::error::Error::new(input, crate::nom::ErrorKind::Fix))),
             )),
             opt(take_ul),
         ),