• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! parsers recognizing numbers, complete input version
2 
3 use crate::internal::*;
4 use crate::error::ParseError;
5 use crate::traits::{AsChar, InputIter, InputLength, InputTakeAtPosition};
6 use crate::lib::std::ops::{RangeFrom, RangeTo};
7 use crate::traits::{Offset, Slice};
8 use crate::error::{ErrorKind, make_error};
9 use crate::character::complete::{char, digit1};
10 use crate::combinator::{opt, cut, map, recognize};
11 use crate::branch::alt;
12 use crate::sequence::{tuple, pair};
13 
14 /// Recognizes an unsigned 1 byte integer
15 ///
16 /// *complete version*: returns an error if there is not enough input data
17 /// ```rust
18 /// # use nom::{Err, error::ErrorKind, Needed};
19 /// # use nom::Needed::Size;
20 /// use nom::number::complete::be_u8;
21 ///
22 /// let parser = |s| {
23 ///   be_u8(s)
24 /// };
25 ///
26 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"\x03abcefg"[..], 0x00)));
27 /// assert_eq!(parser(b""), Err(Err::Error((&[][..], ErrorKind::Eof))));
28 /// ```
29 #[inline]
be_u8<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u8, E>30 pub fn be_u8<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u8, E> {
31   if i.len() < 1 {
32     Err(Err::Error(make_error(i, ErrorKind::Eof)))
33   } else {
34     Ok((&i[1..], i[0]))
35   }
36 }
37 
38 /// Recognizes a big endian unsigned 2 bytes integer
39 ///
40 /// *complete version*: returns an error if there is not enough input data
41 /// ```rust
42 /// # use nom::{Err, error::ErrorKind, Needed};
43 /// # use nom::Needed::Size;
44 /// use nom::number::complete::be_u16;
45 ///
46 /// let parser = |s| {
47 ///   be_u16(s)
48 /// };
49 ///
50 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"abcefg"[..], 0x0003)));
51 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
52 /// ```
53 #[inline]
be_u16<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u16, E>54 pub fn be_u16<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u16, E> {
55   if i.len() < 2 {
56     Err(Err::Error(make_error(i, ErrorKind::Eof)))
57   } else {
58     let res = ((i[0] as u16) << 8) + i[1] as u16;
59     Ok((&i[2..], res))
60   }
61 }
62 
63 /// Recognizes a big endian unsigned 3 byte integer
64 ///
65 /// *complete version*: returns an error if there is not enough input data
66 /// ```rust
67 /// # use nom::{Err, error::ErrorKind, Needed};
68 /// # use nom::Needed::Size;
69 /// use nom::number::complete::be_u24;
70 ///
71 /// let parser = |s| {
72 ///   be_u24(s)
73 /// };
74 ///
75 /// assert_eq!(parser(b"\x00\x03\x05abcefg"), Ok((&b"abcefg"[..], 0x000305)));
76 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
77 /// ```
78 #[inline]
be_u24<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E>79 pub fn be_u24<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E> {
80   if i.len() < 3 {
81     Err(Err::Error(make_error(i, ErrorKind::Eof)))
82   } else {
83     let res = ((i[0] as u32) << 16) + ((i[1] as u32) << 8) + (i[2] as u32);
84     Ok((&i[3..], res))
85   }
86 }
87 
88 /// Recognizes a big endian unsigned 4 bytes integer
89 ///
90 /// *complete version*: returns an error if there is not enough input data
91 /// ```rust
92 /// # use nom::{Err, error::ErrorKind, Needed};
93 /// # use nom::Needed::Size;
94 /// use nom::number::complete::be_u32;
95 ///
96 /// let parser = |s| {
97 ///   be_u32(s)
98 /// };
99 ///
100 /// assert_eq!(parser(b"\x00\x03\x05\x07abcefg"), Ok((&b"abcefg"[..], 0x00030507)));
101 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
102 /// ```
103 #[inline]
be_u32<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E>104 pub fn be_u32<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E> {
105   if i.len() < 4 {
106     Err(Err::Error(make_error(i, ErrorKind::Eof)))
107   } else {
108     let res = ((i[0] as u32) << 24) + ((i[1] as u32) << 16) + ((i[2] as u32) << 8) + i[3] as u32;
109     Ok((&i[4..], res))
110   }
111 }
112 
113 /// Recognizes a big endian unsigned 8 bytes integer
114 ///
115 /// *complete version*: returns an error if there is not enough input data
116 /// ```rust
117 /// # use nom::{Err, error::ErrorKind, Needed};
118 /// # use nom::Needed::Size;
119 /// use nom::number::complete::be_u64;
120 ///
121 /// let parser = |s| {
122 ///   be_u64(s)
123 /// };
124 ///
125 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x0001020304050607)));
126 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
127 /// ```
128 #[inline]
be_u64<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u64, E>129 pub fn be_u64<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u64, E> {
130   if i.len() < 8 {
131     Err(Err::Error(make_error(i, ErrorKind::Eof)))
132   } else {
133     let res = ((i[0] as u64) << 56) + ((i[1] as u64) << 48) + ((i[2] as u64) << 40) + ((i[3] as u64) << 32) + ((i[4] as u64) << 24)
134       + ((i[5] as u64) << 16) + ((i[6] as u64) << 8) + i[7] as u64;
135     Ok((&i[8..], res))
136   }
137 }
138 
139 /// Recognizes a big endian unsigned 16 bytes integer
140 ///
141 /// *complete version*: returns an error if there is not enough input data
142 /// ```rust
143 /// # use nom::{Err, error::ErrorKind, Needed};
144 /// # use nom::Needed::Size;
145 /// use nom::number::complete::be_u128;
146 ///
147 /// let parser = |s| {
148 ///   be_u128(s)
149 /// };
150 ///
151 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
152 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
153 /// ```
154 #[inline]
155 #[cfg(stable_i128)]
be_u128<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u128, E>156 pub fn be_u128<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u128, E> {
157   if i.len() < 16 {
158     Err(Err::Error(make_error(i, ErrorKind::Eof)))
159   } else {
160     let res = ((i[0] as u128) << 120)
161       + ((i[1] as u128) << 112)
162       + ((i[2] as u128) << 104)
163       + ((i[3] as u128) << 96)
164       + ((i[4] as u128) << 88)
165       + ((i[5] as u128) << 80)
166       + ((i[6] as u128) << 72)
167       + ((i[7] as u128) << 64)
168       + ((i[8] as u128) << 56)
169       + ((i[9] as u128) << 48)
170       + ((i[10] as u128) << 40)
171       + ((i[11] as u128) << 32)
172       + ((i[12] as u128) << 24)
173       + ((i[13] as u128) << 16)
174       + ((i[14] as u128) << 8)
175       + i[15] as u128;
176     Ok((&i[16..], res))
177   }
178 }
179 
180 /// Recognizes a signed 1 byte integer
181 ///
182 /// *complete version*: returns an error if there is not enough input data
183 /// ```rust
184 /// # use nom::{Err, error::ErrorKind, Needed};
185 /// # use nom::Needed::Size;
186 /// use nom::number::complete::be_i8;
187 ///
188 /// let parser = |s| {
189 ///   be_i8(s)
190 /// };
191 ///
192 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"\x03abcefg"[..], 0x00)));
193 /// assert_eq!(parser(b""), Err(Err::Error((&[][..], ErrorKind::Eof))));
194 /// ```
195 #[inline]
be_i8<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i8, E>196 pub fn be_i8<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i8, E> {
197   map!(i, be_u8, |x| x as i8)
198 }
199 
200 /// Recognizes a big endian signed 2 bytes integer
201 ///
202 /// *complete version*: returns an error if there is not enough input data
203 /// ```rust
204 /// # use nom::{Err, error::ErrorKind, Needed};
205 /// # use nom::Needed::Size;
206 /// use nom::number::complete::be_i16;
207 ///
208 /// let parser = |s| {
209 ///   be_i16(s)
210 /// };
211 ///
212 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"abcefg"[..], 0x0003)));
213 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
214 /// ```
215 #[inline]
be_i16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i16, E>216 pub fn be_i16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i16, E> {
217   map!(i, be_u16, |x| x as i16)
218 }
219 
220 /// Recognizes a big endian signed 3 bytes integer
221 ///
222 /// *complete version*: returns an error if there is not enough input data
223 /// ```rust
224 /// # use nom::{Err, error::ErrorKind, Needed};
225 /// # use nom::Needed::Size;
226 /// use nom::number::complete::be_i24;
227 ///
228 /// let parser = |s| {
229 ///   be_i24(s)
230 /// };
231 ///
232 /// assert_eq!(parser(b"\x00\x03\x05abcefg"), Ok((&b"abcefg"[..], 0x000305)));
233 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
234 /// ```
235 #[inline]
be_i24<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E>236 pub fn be_i24<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E> {
237   // Same as the unsigned version but we need to sign-extend manually here
238   map!(i, be_u24, |x| if x & 0x80_00_00 != 0 {
239     (x | 0xff_00_00_00) as i32
240   } else {
241     x as i32
242   })
243 }
244 
245 /// Recognizes a big endian signed 4 bytes integer
246 ///
247 /// *complete version*: returns an error if there is not enough input data
248 /// ```rust
249 /// # use nom::{Err, error::ErrorKind, Needed};
250 /// # use nom::Needed::Size;
251 /// use nom::number::complete::be_i32;
252 ///
253 /// let parser = |s| {
254 ///   be_i32(s)
255 /// };
256 ///
257 /// assert_eq!(parser(b"\x00\x03\x05\x07abcefg"), Ok((&b"abcefg"[..], 0x00030507)));
258 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
259 /// ```
260 #[inline]
be_i32<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E>261 pub fn be_i32<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E> {
262   map!(i, be_u32, |x| x as i32)
263 }
264 
265 /// Recognizes a big endian signed 8 bytes integer
266 ///
267 /// *complete version*: returns an error if there is not enough input data
268 /// ```rust
269 /// # use nom::{Err, error::ErrorKind, Needed};
270 /// # use nom::Needed::Size;
271 /// use nom::number::complete::be_i64;
272 ///
273 /// let parser = |s| {
274 ///   be_i64(s)
275 /// };
276 ///
277 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x0001020304050607)));
278 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
279 /// ```
280 #[inline]
be_i64<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i64, E>281 pub fn be_i64<'a, E: ParseError<&'a[u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i64, E> {
282   map!(i, be_u64, |x| x as i64)
283 }
284 
285 /// Recognizes a big endian signed 16 bytes integer
286 ///
287 /// *complete version*: returns an error if there is not enough input data
288 /// ```rust
289 /// # use nom::{Err, error::ErrorKind, Needed};
290 /// # use nom::Needed::Size;
291 /// use nom::number::complete::be_i128;
292 ///
293 /// let parser = |s| {
294 ///   be_i128(s)
295 /// };
296 ///
297 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
298 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
299 /// ```
300 #[inline]
301 #[cfg(stable_i128)]
be_i128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i128, E>302 pub fn be_i128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i128, E> {
303   map!(i, be_u128, |x| x as i128)
304 }
305 
306 /// Recognizes an unsigned 1 byte integer
307 ///
308 /// *complete version*: returns an error if there is not enough input data
309 /// ```rust
310 /// # use nom::{Err, error::ErrorKind, Needed};
311 /// # use nom::Needed::Size;
312 /// use nom::number::complete::le_u8;
313 ///
314 /// let parser = |s| {
315 ///   le_u8(s)
316 /// };
317 ///
318 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"\x03abcefg"[..], 0x00)));
319 /// assert_eq!(parser(b""), Err(Err::Error((&[][..], ErrorKind::Eof))));
320 /// ```
321 #[inline]
le_u8<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u8, E>322 pub fn le_u8<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u8, E> {
323   if i.len() < 1 {
324     Err(Err::Error(make_error(i, ErrorKind::Eof)))
325   } else {
326     Ok((&i[1..], i[0]))
327   }
328 }
329 
330 /// Recognizes a little endian unsigned 2 bytes integer
331 ///
332 /// *complete version*: returns an error if there is not enough input data
333 /// ```rust
334 /// # use nom::{Err, error::ErrorKind, Needed};
335 /// # use nom::Needed::Size;
336 /// use nom::number::complete::le_u16;
337 ///
338 /// let parser = |s| {
339 ///   le_u16(s)
340 /// };
341 ///
342 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"abcefg"[..], 0x0300)));
343 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
344 /// ```
345 #[inline]
le_u16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u16, E>346 pub fn le_u16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u16, E> {
347   if i.len() < 2 {
348     Err(Err::Error(make_error(i, ErrorKind::Eof)))
349   } else {
350     let res = ((i[1] as u16) << 8) + i[0] as u16;
351     Ok((&i[2..], res))
352   }
353 }
354 
355 /// Recognizes a little endian unsigned 3 byte integer
356 ///
357 /// *complete version*: returns an error if there is not enough input data
358 /// ```rust
359 /// # use nom::{Err, error::ErrorKind, Needed};
360 /// # use nom::Needed::Size;
361 /// use nom::number::complete::le_u24;
362 ///
363 /// let parser = |s| {
364 ///   le_u24(s)
365 /// };
366 ///
367 /// assert_eq!(parser(b"\x00\x03\x05abcefg"), Ok((&b"abcefg"[..], 0x050300)));
368 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
369 /// ```
370 #[inline]
le_u24<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E>371 pub fn le_u24<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E> {
372   if i.len() < 3 {
373     Err(Err::Error(make_error(i, ErrorKind::Eof)))
374   } else {
375     let res = (i[0] as u32) + ((i[1] as u32) << 8) + ((i[2] as u32) << 16);
376     Ok((&i[3..], res))
377   }
378 }
379 
380 /// Recognizes a little endian unsigned 4 bytes integer
381 ///
382 /// *complete version*: returns an error if there is not enough input data
383 /// ```rust
384 /// # use nom::{Err, error::ErrorKind, Needed};
385 /// # use nom::Needed::Size;
386 /// use nom::number::complete::le_u32;
387 ///
388 /// let parser = |s| {
389 ///   le_u32(s)
390 /// };
391 ///
392 /// assert_eq!(parser(b"\x00\x03\x05\x07abcefg"), Ok((&b"abcefg"[..], 0x07050300)));
393 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
394 /// ```
395 #[inline]
le_u32<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E>396 pub fn le_u32<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u32, E> {
397   if i.len() < 4 {
398     Err(Err::Error(make_error(i, ErrorKind::Eof)))
399   } else {
400     let res = ((i[3] as u32) << 24) + ((i[2] as u32) << 16) + ((i[1] as u32) << 8) + i[0] as u32;
401     Ok((&i[4..], res))
402   }
403 }
404 
405 /// Recognizes a little endian unsigned 8 bytes integer
406 ///
407 /// *complete version*: returns an error if there is not enough input data
408 /// ```rust
409 /// # use nom::{Err, error::ErrorKind, Needed};
410 /// # use nom::Needed::Size;
411 /// use nom::number::complete::le_u64;
412 ///
413 /// let parser = |s| {
414 ///   le_u64(s)
415 /// };
416 ///
417 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x0706050403020100)));
418 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
419 /// ```
420 #[inline]
le_u64<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u64, E>421 pub fn le_u64<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u64, E> {
422   if i.len() < 8 {
423     Err(Err::Error(make_error(i, ErrorKind::Eof)))
424   } else {
425     let res = ((i[7] as u64) << 56) + ((i[6] as u64) << 48) + ((i[5] as u64) << 40) + ((i[4] as u64) << 32) + ((i[3] as u64) << 24)
426       + ((i[2] as u64) << 16) + ((i[1] as u64) << 8) + i[0] as u64;
427     Ok((&i[8..], res))
428   }
429 }
430 
431 /// Recognizes a little endian unsigned 16 bytes integer
432 ///
433 /// *complete version*: returns an error if there is not enough input data
434 /// ```rust
435 /// # use nom::{Err, error::ErrorKind, Needed};
436 /// # use nom::Needed::Size;
437 /// use nom::number::complete::le_u128;
438 ///
439 /// let parser = |s| {
440 ///   le_u128(s)
441 /// };
442 ///
443 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
444 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
445 /// ```
446 #[inline]
447 #[cfg(stable_i128)]
le_u128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u128, E>448 pub fn le_u128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], u128, E> {
449   if i.len() < 16 {
450     Err(Err::Error(make_error(i, ErrorKind::Eof)))
451   } else {
452     let res = ((i[15] as u128) << 120)
453       + ((i[14] as u128) << 112)
454       + ((i[13] as u128) << 104)
455       + ((i[12] as u128) << 96)
456       + ((i[11] as u128) << 88)
457       + ((i[10] as u128) << 80)
458       + ((i[9] as u128) << 72)
459       + ((i[8] as u128) << 64)
460       + ((i[7] as u128) << 56)
461       + ((i[6] as u128) << 48)
462       + ((i[5] as u128) << 40)
463       + ((i[4] as u128) << 32)
464       + ((i[3] as u128) << 24)
465       + ((i[2] as u128) << 16)
466       + ((i[1] as u128) << 8)
467       + i[0] as u128;
468     Ok((&i[16..], res))
469   }
470 }
471 
472 /// Recognizes a signed 1 byte integer
473 ///
474 /// *complete version*: returns an error if there is not enough input data
475 /// ```rust
476 /// # use nom::{Err, error::ErrorKind, Needed};
477 /// # use nom::Needed::Size;
478 /// use nom::number::complete::le_i8;
479 ///
480 /// let parser = |s| {
481 ///   le_i8(s)
482 /// };
483 ///
484 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"\x03abcefg"[..], 0x00)));
485 /// assert_eq!(parser(b""), Err(Err::Error((&[][..], ErrorKind::Eof))));
486 /// ```
487 #[inline]
le_i8<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i8, E>488 pub fn le_i8<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i8, E> {
489   map!(i, le_u8, |x| x as i8)
490 }
491 
492 /// Recognizes a little endian signed 2 bytes integer
493 ///
494 /// *complete version*: returns an error if there is not enough input data
495 /// ```rust
496 /// # use nom::{Err, error::ErrorKind, Needed};
497 /// # use nom::Needed::Size;
498 /// use nom::number::complete::le_i16;
499 ///
500 /// let parser = |s| {
501 ///   le_i16(s)
502 /// };
503 ///
504 /// assert_eq!(parser(b"\x00\x03abcefg"), Ok((&b"abcefg"[..], 0x0300)));
505 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
506 /// ```
507 #[inline]
le_i16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i16, E>508 pub fn le_i16<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i16, E> {
509   map!(i, le_u16, |x| x as i16)
510 }
511 
512 /// Recognizes a little endian signed 3 bytes integer
513 ///
514 /// *complete version*: returns an error if there is not enough input data
515 /// ```rust
516 /// # use nom::{Err, error::ErrorKind, Needed};
517 /// # use nom::Needed::Size;
518 /// use nom::number::complete::le_i24;
519 ///
520 /// let parser = |s| {
521 ///   le_i24(s)
522 /// };
523 ///
524 /// assert_eq!(parser(b"\x00\x03\x05abcefg"), Ok((&b"abcefg"[..], 0x050300)));
525 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
526 /// ```
527 #[inline]
le_i24<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E>528 pub fn le_i24<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E> {
529   // Same as the unsigned version but we need to sign-extend manually here
530   map!(i, le_u24, |x| if x & 0x80_00_00 != 0 {
531     (x | 0xff_00_00_00) as i32
532   } else {
533     x as i32
534   })
535 }
536 
537 /// Recognizes a little endian signed 4 bytes integer
538 ///
539 /// *complete version*: returns an error if there is not enough input data
540 /// ```rust
541 /// # use nom::{Err, error::ErrorKind, Needed};
542 /// # use nom::Needed::Size;
543 /// use nom::number::complete::le_i32;
544 ///
545 /// let parser = |s| {
546 ///   le_i32(s)
547 /// };
548 ///
549 /// assert_eq!(parser(b"\x00\x03\x05\x07abcefg"), Ok((&b"abcefg"[..], 0x07050300)));
550 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
551 /// ```
552 #[inline]
le_i32<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E>553 pub fn le_i32<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i32, E> {
554   map!(i, le_u32, |x| x as i32)
555 }
556 
557 /// Recognizes a little endian signed 8 bytes integer
558 ///
559 /// *complete version*: returns an error if there is not enough input data
560 /// ```rust
561 /// # use nom::{Err, error::ErrorKind, Needed};
562 /// # use nom::Needed::Size;
563 /// use nom::number::complete::le_i64;
564 ///
565 /// let parser = |s| {
566 ///   le_i64(s)
567 /// };
568 ///
569 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x0706050403020100)));
570 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
571 /// ```
572 #[inline]
le_i64<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i64, E>573 pub fn le_i64<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i64, E> {
574   map!(i, le_u64, |x| x as i64)
575 }
576 
577 /// Recognizes a little endian signed 16 bytes integer
578 ///
579 /// *complete version*: returns an error if there is not enough input data
580 /// ```rust
581 /// # use nom::{Err, error::ErrorKind, Needed};
582 /// # use nom::Needed::Size;
583 /// use nom::number::complete::le_i128;
584 ///
585 /// let parser = |s| {
586 ///   le_i128(s)
587 /// };
588 ///
589 /// assert_eq!(parser(b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
590 /// assert_eq!(parser(b"\x01"), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
591 /// ```
592 #[inline]
593 #[cfg(stable_i128)]
le_i128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i128, E>594 pub fn le_i128<'a, E: ParseError<&'a [u8]>>(i: &'a[u8]) -> IResult<&'a[u8], i128, E> {
595   map!(i, le_u128, |x| x as i128)
596 }
597 
598 /// Recognizes a big endian 4 bytes floating point number
599 ///
600 /// *complete version*: returns an error if there is not enough input data
601 /// ```rust
602 /// # use nom::{Err, error::ErrorKind, Needed};
603 /// # use nom::Needed::Size;
604 /// use nom::number::complete::be_f32;
605 ///
606 /// let parser = |s| {
607 ///   be_f32(s)
608 /// };
609 ///
610 /// assert_eq!(parser(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
611 /// assert_eq!(parser(b"abc"), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
612 /// ```
613 #[inline]
be_f32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f32, E>614 pub fn be_f32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f32, E> {
615   match be_u32(input) {
616     Err(e) => Err(e),
617     Ok((i, o)) => Ok((i, f32::from_bits(o))),
618   }
619 }
620 
621 /// Recognizes a big endian 8 bytes floating point number
622 ///
623 /// *complete version*: returns an error if there is not enough input data
624 /// ```rust
625 /// # use nom::{Err, error::ErrorKind, Needed};
626 /// # use nom::Needed::Size;
627 /// use nom::number::complete::be_f64;
628 ///
629 /// let parser = |s| {
630 ///   be_f64(s)
631 /// };
632 ///
633 /// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
634 /// assert_eq!(parser(b"abc"), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
635 /// ```
636 #[inline]
be_f64<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f64, E>637 pub fn be_f64<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f64, E> {
638   match be_u64(input) {
639     Err(e) => Err(e),
640     Ok((i, o)) => Ok((i, f64::from_bits(o))),
641   }
642 }
643 
644 /// Recognizes a little endian 4 bytes floating point number
645 ///
646 /// *complete version*: returns an error if there is not enough input data
647 /// ```rust
648 /// # use nom::{Err, error::ErrorKind, Needed};
649 /// # use nom::Needed::Size;
650 /// use nom::number::complete::le_f32;
651 ///
652 /// let parser = |s| {
653 ///   le_f32(s)
654 /// };
655 ///
656 /// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
657 /// assert_eq!(parser(b"abc"), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
658 /// ```
659 #[inline]
le_f32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f32, E>660 pub fn le_f32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f32, E> {
661   match le_u32(input) {
662     Err(e) => Err(e),
663     Ok((i, o)) => Ok((i, f32::from_bits(o))),
664   }
665 }
666 
667 /// Recognizes a little endian 8 bytes floating point number
668 ///
669 /// *complete version*: returns an error if there is not enough input data
670 /// ```rust
671 /// # use nom::{Err, error::ErrorKind, Needed};
672 /// # use nom::Needed::Size;
673 /// use nom::number::complete::le_f64;
674 ///
675 /// let parser = |s| {
676 ///   le_f64(s)
677 /// };
678 ///
679 /// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
680 /// assert_eq!(parser(b"abc"), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
681 /// ```
682 #[inline]
le_f64<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f64, E>683 pub fn le_f64<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], f64, E> {
684   match le_u64(input) {
685     Err(e) => Err(e),
686     Ok((i, o)) => Ok((i, f64::from_bits(o))),
687   }
688 }
689 
690 /// Recognizes a hex-encoded integer
691 ///
692 /// *complete version*: will parse until the end of input if it has less than 8 bytes
693 /// ```rust
694 /// # use nom::{Err, error::ErrorKind, Needed};
695 /// # use nom::Needed::Size;
696 /// use nom::number::complete::hex_u32;
697 ///
698 /// let parser = |s| {
699 ///   hex_u32(s)
700 /// };
701 ///
702 /// assert_eq!(parser(b"01AE"), Ok((&b""[..], 0x01AE)));
703 /// assert_eq!(parser(b"abc"), Ok((&b""[..], 0x0ABC)));
704 /// assert_eq!(parser(b"ggg"), Err(Err::Error((&b"ggg"[..], ErrorKind::IsA))));
705 /// ```
706 #[inline]
hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], u32, E>707 pub fn hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a[u8]) -> IResult<&'a[u8], u32, E> {
708   let (i, o) = crate::bytes::complete::is_a(&b"0123456789abcdefABCDEF"[..])(input)?;
709   // Do not parse more than 8 characters for a u32
710   let (parsed, remaining) = if o.len() <= 8 {
711     (o, i)
712   } else {
713     (&input[..8], &input[8..])
714   };
715 
716   let res = parsed
717     .iter()
718     .rev()
719     .enumerate()
720     .map(|(k, &v)| {
721       let digit = v as char;
722       digit.to_digit(16).unwrap_or(0) << (k * 4)
723     })
724     .sum();
725 
726   Ok((remaining, res))
727 }
728 
729 /// Recognizes floating point number in a byte string and returns the corresponding slice
730 ///
731 /// *complete version*: can parse until the end of input
732 ///
733 /// ```rust
734 /// # use nom::{Err, error::ErrorKind, Needed};
735 /// # use nom::Needed::Size;
736 /// use nom::number::complete::recognize_float;
737 ///
738 /// let parser = |s| {
739 ///   recognize_float(s)
740 /// };
741 ///
742 /// assert_eq!(parser("11e-1"), Ok(("", "11e-1")));
743 /// assert_eq!(parser("123E-02"), Ok(("", "123E-02")));
744 /// assert_eq!(parser("123K-01"), Ok(("K-01", "123")));
745 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
746 /// ```
747 #[allow(unused_imports)]
748 #[cfg_attr(rustfmt, rustfmt_skip)]
recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, T: Clone + Offset, T: InputIter, <T as InputIter>::Item: AsChar, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar,749 pub fn recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E>
750 where
751   T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
752   T: Clone + Offset,
753   T: InputIter,
754   <T as InputIter>::Item: AsChar,
755   T: InputTakeAtPosition,
756   <T as InputTakeAtPosition>::Item: AsChar,
757 {
758   recognize(
759     tuple((
760       opt(alt((char('+'), char('-')))),
761       alt((
762         map(tuple((digit1, opt(pair(char('.'), opt(digit1))))), |_| ()),
763         map(tuple((char('.'), digit1)), |_| ())
764       )),
765       opt(tuple((
766         alt((char('e'), char('E'))),
767         opt(alt((char('+'), char('-')))),
768         cut(digit1)
769       )))
770     ))
771   )(input)
772 }
773 
774 /// Recognizes floating point number in a byte string and returns a f32
775 ///
776 /// *complete version*: can parse until the end of input
777 /// ```rust
778 /// # use nom::{Err, error::ErrorKind, Needed};
779 /// # use nom::Needed::Size;
780 /// use nom::number::complete::float;
781 ///
782 /// let parser = |s| {
783 ///   float(s)
784 /// };
785 ///
786 /// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
787 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
788 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
789 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
790 /// ```
791 #[cfg(not(feature = "lexical"))]
float<T, E:ParseError<T>>(input: T) -> IResult<T, f32, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, T: Clone + Offset, T: InputIter + InputLength + crate::traits::ParseTo<f32>, <T as InputIter>::Item: AsChar, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar792 pub fn float<T, E:ParseError<T>>(input: T) -> IResult<T, f32, E>
793 where
794   T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
795   T: Clone + Offset,
796   T: InputIter + InputLength + crate::traits::ParseTo<f32>,
797   <T as InputIter>::Item: AsChar,
798   T: InputTakeAtPosition,
799   <T as InputTakeAtPosition>::Item: AsChar
800 {
801   match recognize_float(input) {
802     Err(e) => Err(e),
803     Ok((i, s)) => match s.parse_to() {
804       Some(n) => Ok((i, n)),
805       None =>  Err(Err::Error(E::from_error_kind(i, ErrorKind::Float)))
806     }
807   }
808 }
809 
810 /// Recognizes floating point number in a byte string and returns a f32
811 ///
812 /// *complete version*: can parse until the end of input
813 ///
814 /// this function uses the lexical-core crate for float parsing by default, you
815 /// can deactivate it by removing the "lexical" feature
816 /// ```rust
817 /// # use nom::{Err, error::ErrorKind, Needed};
818 /// # use nom::Needed::Size;
819 /// use nom::number::complete::float;
820 ///
821 /// let parser = |s| {
822 ///   float(s)
823 /// };
824 ///
825 /// assert_eq!(parser("1.1"), Ok(("", 1.1)));
826 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
827 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
828 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
829 /// ```
830 #[cfg(feature = "lexical")]
float<T, E:ParseError<T>>(input: T) -> IResult<T, f32, E> where T: crate::traits::AsBytes + InputLength + Slice<RangeFrom<usize>>,831 pub fn float<T, E:ParseError<T>>(input: T) -> IResult<T, f32, E>
832 where
833   T: crate::traits::AsBytes + InputLength + Slice<RangeFrom<usize>>,
834 {
835   match ::lexical_core::parse_partial(input.as_bytes()) {
836     Ok((value, processed)) => Ok((input.slice(processed..), value)),
837     Err(_) => Err(Err::Error(E::from_error_kind(input, ErrorKind::Float)))
838   }
839 }
840 
841 /// Recognizes floating point number in a byte string and returns a f64
842 ///
843 /// *complete version*: can parse until the end of input
844 /// ```rust
845 /// # use nom::{Err, error::ErrorKind, Needed};
846 /// # use nom::Needed::Size;
847 /// use nom::number::complete::double;
848 ///
849 /// let parser = |s| {
850 ///   double(s)
851 /// };
852 ///
853 /// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
854 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
855 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
856 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
857 /// ```
858 #[cfg(not(feature = "lexical"))]
double<T, E:ParseError<T>>(input: T) -> IResult<T, f64, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, T: Clone + Offset, T: InputIter + InputLength + crate::traits::ParseTo<f64>, <T as InputIter>::Item: AsChar, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar859 pub fn double<T, E:ParseError<T>>(input: T) -> IResult<T, f64, E>
860 where
861   T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
862   T: Clone + Offset,
863   T: InputIter + InputLength + crate::traits::ParseTo<f64>,
864   <T as InputIter>::Item: AsChar,
865   T: InputTakeAtPosition,
866   <T as InputTakeAtPosition>::Item: AsChar
867 {
868   match recognize_float(input) {
869     Err(e) => Err(e),
870     Ok((i, s)) => match s.parse_to() {
871       Some(n) => Ok((i, n)),
872       None =>  Err(Err::Error(E::from_error_kind(i, ErrorKind::Float)))
873     }
874   }
875 }
876 
877 /// Recognizes floating point number in a byte string and returns a f64
878 ///
879 /// *complete version*: can parse until the end of input
880 ///
881 /// this function uses the lexical-core crate for float parsing by default, you
882 /// can deactivate it by removing the "lexical" feature
883 /// ```rust
884 /// # use nom::{Err, error::ErrorKind, Needed};
885 /// # use nom::Needed::Size;
886 /// use nom::number::complete::double;
887 ///
888 /// let parser = |s| {
889 ///   double(s)
890 /// };
891 ///
892 /// assert_eq!(parser("1.1"), Ok(("", 1.1)));
893 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
894 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
895 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
896 /// ```
897 #[cfg(feature = "lexical")]
double<T, E:ParseError<T>>(input: T) -> IResult<T, f64, E> where T: crate::traits::AsBytes + InputLength + Slice<RangeFrom<usize>>,898 pub fn double<T, E:ParseError<T>>(input: T) -> IResult<T, f64, E>
899 where
900   T: crate::traits::AsBytes + InputLength + Slice<RangeFrom<usize>>,
901 {
902   match ::lexical_core::parse_partial(input.as_bytes()) {
903     Ok((value, processed)) => Ok((input.slice(processed..), value)),
904     Err(_) => Err(Err::Error(E::from_error_kind(input, ErrorKind::Float)))
905   }
906 }
907 
908 #[cfg(test)]
909 mod tests {
910   use super::*;
911   use crate::internal::Err;
912   use crate::error::ErrorKind;
913 
914   macro_rules! assert_parse(
915     ($left: expr, $right: expr) => {
916       let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
917       assert_eq!(res, $right);
918     };
919   );
920 
921   #[test]
i8_tests()922   fn i8_tests() {
923     assert_parse!(be_i8(&[0x00]), Ok((&b""[..], 0)));
924     assert_parse!(be_i8(&[0x7f]), Ok((&b""[..], 127)));
925     assert_parse!(be_i8(&[0xff]), Ok((&b""[..], -1)));
926     assert_parse!(be_i8(&[0x80]), Ok((&b""[..], -128)));
927   }
928 
929   #[test]
i16_tests()930   fn i16_tests() {
931     assert_parse!(be_i16(&[0x00, 0x00]), Ok((&b""[..], 0)));
932     assert_parse!(be_i16(&[0x7f, 0xff]), Ok((&b""[..], 32_767_i16)));
933     assert_parse!(be_i16(&[0xff, 0xff]), Ok((&b""[..], -1)));
934     assert_parse!(be_i16(&[0x80, 0x00]), Ok((&b""[..], -32_768_i16)));
935   }
936 
937   #[test]
u24_tests()938   fn u24_tests() {
939     assert_parse!(be_u24(&[0x00, 0x00, 0x00]), Ok((&b""[..], 0)));
940     assert_parse!(be_u24(&[0x00, 0xFF, 0xFF]), Ok((&b""[..], 65_535_u32)));
941     assert_parse!(be_u24(&[0x12, 0x34, 0x56]), Ok((&b""[..], 1_193_046_u32)));
942   }
943 
944   #[test]
i24_tests()945   fn i24_tests() {
946     assert_parse!(be_i24(&[0xFF, 0xFF, 0xFF]), Ok((&b""[..], -1_i32)));
947     assert_parse!(be_i24(&[0xFF, 0x00, 0x00]), Ok((&b""[..], -65_536_i32)));
948     assert_parse!(be_i24(&[0xED, 0xCB, 0xAA]), Ok((&b""[..], -1_193_046_i32)));
949   }
950 
951   #[test]
i32_tests()952   fn i32_tests() {
953     assert_parse!(be_i32(&[0x00, 0x00, 0x00, 0x00]), Ok((&b""[..], 0)));
954     assert_parse!(
955       be_i32(&[0x7f, 0xff, 0xff, 0xff]),
956       Ok((&b""[..], 2_147_483_647_i32))
957     );
958     assert_parse!(be_i32(&[0xff, 0xff, 0xff, 0xff]), Ok((&b""[..], -1)));
959     assert_parse!(
960       be_i32(&[0x80, 0x00, 0x00, 0x00]),
961       Ok((&b""[..], -2_147_483_648_i32))
962     );
963   }
964 
965   #[test]
i64_tests()966   fn i64_tests() {
967     assert_parse!(
968       be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
969       Ok((&b""[..], 0))
970     );
971     assert_parse!(
972       be_i64(&[0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
973       Ok((&b""[..], 9_223_372_036_854_775_807_i64))
974     );
975     assert_parse!(
976       be_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
977       Ok((&b""[..], -1))
978     );
979     assert_parse!(
980       be_i64(&[0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
981       Ok((&b""[..], -9_223_372_036_854_775_808_i64))
982     );
983   }
984 
985   #[test]
986   #[cfg(stable_i128)]
i128_tests()987   fn i128_tests() {
988     assert_parse!(
989       be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
990       Ok((&b""[..], 0))
991     );
992     assert_parse!(
993       be_i128(&[0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
994       Ok((&b""[..], 170_141_183_460_469_231_731_687_303_715_884_105_727_i128))
995     );
996     assert_parse!(
997       be_i128(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
998       Ok((&b""[..], -1))
999     );
1000     assert_parse!(
1001       be_i128(&[0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
1002       Ok((&b""[..], -170_141_183_460_469_231_731_687_303_715_884_105_728_i128))
1003     );
1004   }
1005 
1006   #[test]
le_i8_tests()1007   fn le_i8_tests() {
1008     assert_parse!(le_i8(&[0x00]), Ok((&b""[..], 0)));
1009     assert_parse!(le_i8(&[0x7f]), Ok((&b""[..], 127)));
1010     assert_parse!(le_i8(&[0xff]), Ok((&b""[..], -1)));
1011     assert_parse!(le_i8(&[0x80]), Ok((&b""[..], -128)));
1012   }
1013 
1014   #[test]
le_i16_tests()1015   fn le_i16_tests() {
1016     assert_parse!(le_i16(&[0x00, 0x00]), Ok((&b""[..], 0)));
1017     assert_parse!(le_i16(&[0xff, 0x7f]), Ok((&b""[..], 32_767_i16)));
1018     assert_parse!(le_i16(&[0xff, 0xff]), Ok((&b""[..], -1)));
1019     assert_parse!(le_i16(&[0x00, 0x80]), Ok((&b""[..], -32_768_i16)));
1020   }
1021 
1022   #[test]
le_u24_tests()1023   fn le_u24_tests() {
1024     assert_parse!(le_u24(&[0x00, 0x00, 0x00]), Ok((&b""[..], 0)));
1025     assert_parse!(le_u24(&[0xFF, 0xFF, 0x00]), Ok((&b""[..], 65_535_u32)));
1026     assert_parse!(le_u24(&[0x56, 0x34, 0x12]), Ok((&b""[..], 1_193_046_u32)));
1027   }
1028 
1029   #[test]
le_i24_tests()1030   fn le_i24_tests() {
1031     assert_parse!(le_i24(&[0xFF, 0xFF, 0xFF]), Ok((&b""[..], -1_i32)));
1032     assert_parse!(le_i24(&[0x00, 0x00, 0xFF]), Ok((&b""[..], -65_536_i32)));
1033     assert_parse!(le_i24(&[0xAA, 0xCB, 0xED]), Ok((&b""[..], -1_193_046_i32)));
1034   }
1035 
1036   #[test]
le_i32_tests()1037   fn le_i32_tests() {
1038     assert_parse!(le_i32(&[0x00, 0x00, 0x00, 0x00]), Ok((&b""[..], 0)));
1039     assert_parse!(
1040       le_i32(&[0xff, 0xff, 0xff, 0x7f]),
1041       Ok((&b""[..], 2_147_483_647_i32))
1042     );
1043     assert_parse!(le_i32(&[0xff, 0xff, 0xff, 0xff]), Ok((&b""[..], -1)));
1044     assert_parse!(
1045       le_i32(&[0x00, 0x00, 0x00, 0x80]),
1046       Ok((&b""[..], -2_147_483_648_i32))
1047     );
1048   }
1049 
1050   #[test]
le_i64_tests()1051   fn le_i64_tests() {
1052     assert_parse!(
1053       le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
1054       Ok((&b""[..], 0))
1055     );
1056     assert_parse!(
1057       le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f]),
1058       Ok((&b""[..], 9_223_372_036_854_775_807_i64))
1059     );
1060     assert_parse!(
1061       le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
1062       Ok((&b""[..], -1))
1063     );
1064     assert_parse!(
1065       le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]),
1066       Ok((&b""[..], -9_223_372_036_854_775_808_i64))
1067     );
1068   }
1069 
1070   #[test]
1071   #[cfg(stable_i128)]
le_i128_tests()1072   fn le_i128_tests() {
1073     assert_parse!(
1074       le_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
1075       Ok((&b""[..], 0))
1076     );
1077     assert_parse!(
1078       le_i128(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f]),
1079       Ok((&b""[..], 170_141_183_460_469_231_731_687_303_715_884_105_727_i128))
1080     );
1081     assert_parse!(
1082       le_i128(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
1083       Ok((&b""[..], -1))
1084     );
1085     assert_parse!(
1086       le_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]),
1087       Ok((&b""[..], -170_141_183_460_469_231_731_687_303_715_884_105_728_i128))
1088     );
1089   }
1090 
1091   #[test]
be_f32_tests()1092   fn be_f32_tests() {
1093     assert_parse!(be_f32(&[0x00, 0x00, 0x00, 0x00]), Ok((&b""[..], 0_f32)));
1094     assert_parse!(
1095       be_f32(&[0x4d, 0x31, 0x1f, 0xd8]),
1096       Ok((&b""[..], 185_728_392_f32))
1097     );
1098   }
1099 
1100   #[test]
be_f64_tests()1101   fn be_f64_tests() {
1102     assert_parse!(
1103       be_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
1104       Ok((&b""[..], 0_f64))
1105     );
1106     assert_parse!(
1107       be_f64(&[0x41, 0xa6, 0x23, 0xfb, 0x10, 0x00, 0x00, 0x00]),
1108       Ok((&b""[..], 185_728_392_f64))
1109     );
1110   }
1111 
1112   #[test]
le_f32_tests()1113   fn le_f32_tests() {
1114     assert_parse!(le_f32(&[0x00, 0x00, 0x00, 0x00]), Ok((&b""[..], 0_f32)));
1115     assert_parse!(
1116       le_f32(&[0xd8, 0x1f, 0x31, 0x4d]),
1117       Ok((&b""[..], 185_728_392_f32))
1118     );
1119   }
1120 
1121   #[test]
le_f64_tests()1122   fn le_f64_tests() {
1123     assert_parse!(
1124       le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
1125       Ok((&b""[..], 0_f64))
1126     );
1127     assert_parse!(
1128       le_f64(&[0x00, 0x00, 0x00, 0x10, 0xfb, 0x23, 0xa6, 0x41]),
1129       Ok((&b""[..], 185_728_392_f64))
1130     );
1131   }
1132 
1133   #[test]
hex_u32_tests()1134   fn hex_u32_tests() {
1135     assert_parse!(
1136       hex_u32(&b";"[..]),
1137       Err(Err::Error(error_position!(&b";"[..], ErrorKind::IsA)))
1138     );
1139     assert_parse!(hex_u32(&b"ff;"[..]), Ok((&b";"[..], 255)));
1140     assert_parse!(hex_u32(&b"1be2;"[..]), Ok((&b";"[..], 7138)));
1141     assert_parse!(hex_u32(&b"c5a31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
1142     assert_parse!(hex_u32(&b"C5A31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
1143     assert_parse!(hex_u32(&b"00c5a31be2;"[..]), Ok((&b"e2;"[..], 12_952_347)));
1144     assert_parse!(
1145       hex_u32(&b"c5a31be201;"[..]),
1146       Ok((&b"01;"[..], 3_315_801_058))
1147     );
1148     assert_parse!(hex_u32(&b"ffffffff;"[..]), Ok((&b";"[..], 4_294_967_295)));
1149     assert_parse!(hex_u32(&b"0x1be2;"[..]), Ok((&b"x1be2;"[..], 0)));
1150     assert_parse!(hex_u32(&b"12af"[..]), Ok((&b""[..], 0x12af)));
1151   }
1152 
1153   #[test]
1154   #[cfg(feature = "std")]
float_test()1155   fn float_test() {
1156     let mut test_cases = vec![
1157       "+3.14",
1158       "3.14",
1159       "-3.14",
1160       "0",
1161       "0.0",
1162       "1.",
1163       ".789",
1164       "-.5",
1165       "1e7",
1166       "-1E-7",
1167       ".3e-2",
1168       "1.e4",
1169       "1.2e4",
1170       "12.34",
1171       "-1.234E-12",
1172       "-1.234e-12",
1173     ];
1174 
1175     for test in test_cases.drain(..) {
1176       let expected32 = str::parse::<f32>(test).unwrap();
1177       let expected64 = str::parse::<f64>(test).unwrap();
1178 
1179       println!("now parsing: {} -> {}", test, expected32);
1180 
1181       let larger = format!("{}", test);
1182       assert_parse!(recognize_float(&larger[..]), Ok(("", test)));
1183 
1184       assert_parse!(float(larger.as_bytes()), Ok((&b""[..], expected32)));
1185       assert_parse!(float(&larger[..]), Ok(("", expected32)));
1186 
1187       assert_parse!(double(larger.as_bytes()), Ok((&b""[..], expected64)));
1188       assert_parse!(double(&larger[..]), Ok(("", expected64)));
1189     }
1190 
1191     let remaining_exponent = "-1.234E-";
1192     assert_parse!(
1193       recognize_float(remaining_exponent),
1194       Err(Err::Failure(("", ErrorKind::Digit)))
1195     );
1196   }
1197 
1198 }
1199