1 //! Parsers recognizing numbers, complete input version
2
3 use crate::branch::alt;
4 use crate::bytes::complete::tag;
5 use crate::character::complete::{char, digit1, sign};
6 use crate::combinator::{cut, map, opt, recognize};
7 use crate::error::ParseError;
8 use crate::error::{make_error, ErrorKind};
9 use crate::internal::*;
10 use crate::lib::std::ops::{Range, RangeFrom, RangeTo};
11 use crate::sequence::{pair, tuple};
12 use crate::traits::{
13 AsBytes, AsChar, Compare, InputIter, InputLength, InputTake, InputTakeAtPosition, Offset, Slice,
14 };
15
16 /// Recognizes an unsigned 1 byte integer.
17 ///
18 /// *Complete version*: Returns an error if there is not enough input data.
19 /// ```rust
20 /// # use nom::{Err, error::ErrorKind, Needed};
21 /// # use nom::Needed::Size;
22 /// use nom::number::complete::be_u8;
23 ///
24 /// let parser = |s| {
25 /// be_u8(s)
26 /// };
27 ///
28 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
29 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
30 /// ```
31 #[inline]
be_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,32 pub fn be_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
33 where
34 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
35 {
36 let bound: usize = 1;
37 if input.input_len() < bound {
38 Err(Err::Error(make_error(input, ErrorKind::Eof)))
39 } else {
40 let res = input.iter_elements().next().unwrap();
41
42 Ok((input.slice(bound..), res))
43 }
44 }
45
46 /// Recognizes a big endian unsigned 2 bytes integer.
47 ///
48 /// *Complete version*: Returns an error if there is not enough input data.
49 /// ```rust
50 /// # use nom::{Err, error::ErrorKind, Needed};
51 /// # use nom::Needed::Size;
52 /// use nom::number::complete::be_u16;
53 ///
54 /// let parser = |s| {
55 /// be_u16(s)
56 /// };
57 ///
58 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
59 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
60 /// ```
61 #[inline]
be_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,62 pub fn be_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E>
63 where
64 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
65 {
66 let bound: usize = 2;
67 if input.input_len() < bound {
68 Err(Err::Error(make_error(input, ErrorKind::Eof)))
69 } else {
70 let mut res = 0u16;
71 for byte in input.iter_elements().take(bound) {
72 res = (res << 8) + byte as u16;
73 }
74
75 Ok((input.slice(bound..), res))
76 }
77 }
78
79 /// Recognizes a big endian unsigned 3 byte integer.
80 ///
81 /// *Complete version*: Returns an error if there is not enough input data.
82 /// ```rust
83 /// # use nom::{Err, error::ErrorKind, Needed};
84 /// # use nom::Needed::Size;
85 /// use nom::number::complete::be_u24;
86 ///
87 /// let parser = |s| {
88 /// be_u24(s)
89 /// };
90 ///
91 /// assert_eq!(parser(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
92 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
93 /// ```
94 #[inline]
be_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,95 pub fn be_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
96 where
97 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
98 {
99 let bound: usize = 3;
100 if input.input_len() < bound {
101 Err(Err::Error(make_error(input, ErrorKind::Eof)))
102 } else {
103 let mut res = 0u32;
104 for byte in input.iter_elements().take(bound) {
105 res = (res << 8) + byte as u32;
106 }
107
108 Ok((input.slice(bound..), res))
109 }
110 }
111
112 /// Recognizes a big endian unsigned 4 bytes integer.
113 ///
114 /// *Complete version*: Returns an error if there is not enough input data.
115 /// ```rust
116 /// # use nom::{Err, error::ErrorKind, Needed};
117 /// # use nom::Needed::Size;
118 /// use nom::number::complete::be_u32;
119 ///
120 /// let parser = |s| {
121 /// be_u32(s)
122 /// };
123 ///
124 /// assert_eq!(parser(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
125 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
126 /// ```
127 #[inline]
be_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,128 pub fn be_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
129 where
130 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
131 {
132 let bound: usize = 4;
133 if input.input_len() < bound {
134 Err(Err::Error(make_error(input, ErrorKind::Eof)))
135 } else {
136 let mut res = 0u32;
137 for byte in input.iter_elements().take(bound) {
138 res = (res << 8) + byte as u32;
139 }
140
141 Ok((input.slice(bound..), res))
142 }
143 }
144
145 /// Recognizes a big endian unsigned 8 bytes integer.
146 ///
147 /// *Complete version*: Returns an error if there is not enough input data.
148 /// ```rust
149 /// # use nom::{Err, error::ErrorKind, Needed};
150 /// # use nom::Needed::Size;
151 /// use nom::number::complete::be_u64;
152 ///
153 /// let parser = |s| {
154 /// be_u64(s)
155 /// };
156 ///
157 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
158 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
159 /// ```
160 #[inline]
be_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,161 pub fn be_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E>
162 where
163 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
164 {
165 let bound: usize = 8;
166 if input.input_len() < bound {
167 Err(Err::Error(make_error(input, ErrorKind::Eof)))
168 } else {
169 let mut res = 0u64;
170 for byte in input.iter_elements().take(bound) {
171 res = (res << 8) + byte as u64;
172 }
173
174 Ok((input.slice(bound..), res))
175 }
176 }
177
178 /// Recognizes a big endian unsigned 16 bytes integer.
179 ///
180 /// *Complete version*: Returns an error if there is not enough input data.
181 /// ```rust
182 /// # use nom::{Err, error::ErrorKind, Needed};
183 /// # use nom::Needed::Size;
184 /// use nom::number::complete::be_u128;
185 ///
186 /// let parser = |s| {
187 /// be_u128(s)
188 /// };
189 ///
190 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
191 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
192 /// ```
193 #[inline]
be_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,194 pub fn be_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E>
195 where
196 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
197 {
198 let bound: usize = 16;
199 if input.input_len() < bound {
200 Err(Err::Error(make_error(input, ErrorKind::Eof)))
201 } else {
202 let mut res = 0u128;
203 for byte in input.iter_elements().take(bound) {
204 res = (res << 8) + byte as u128;
205 }
206
207 Ok((input.slice(bound..), res))
208 }
209 }
210
211 /// Recognizes a signed 1 byte integer.
212 ///
213 /// *Complete version*: Returns an error if there is not enough input data.
214 /// ```rust
215 /// # use nom::{Err, error::ErrorKind, Needed};
216 /// # use nom::Needed::Size;
217 /// use nom::number::complete::be_i8;
218 ///
219 /// let parser = |s| {
220 /// be_i8(s)
221 /// };
222 ///
223 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
224 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
225 /// ```
226 #[inline]
be_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,227 pub fn be_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E>
228 where
229 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
230 {
231 be_u8.map(|x| x as i8).parse(input)
232 }
233
234 /// Recognizes a big endian signed 2 bytes integer.
235 ///
236 /// *Complete version*: Returns an error if there is not enough input data.
237 /// ```rust
238 /// # use nom::{Err, error::ErrorKind, Needed};
239 /// # use nom::Needed::Size;
240 /// use nom::number::complete::be_i16;
241 ///
242 /// let parser = |s| {
243 /// be_i16(s)
244 /// };
245 ///
246 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
247 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
248 /// ```
249 #[inline]
be_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,250 pub fn be_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E>
251 where
252 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
253 {
254 be_u16.map(|x| x as i16).parse(input)
255 }
256
257 /// Recognizes a big endian signed 3 bytes integer.
258 ///
259 /// *Complete version*: Returns an error if there is not enough input data.
260 /// ```rust
261 /// # use nom::{Err, error::ErrorKind, Needed};
262 /// # use nom::Needed::Size;
263 /// use nom::number::complete::be_i24;
264 ///
265 /// let parser = |s| {
266 /// be_i24(s)
267 /// };
268 ///
269 /// assert_eq!(parser(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
270 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
271 /// ```
272 #[inline]
be_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,273 pub fn be_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
274 where
275 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
276 {
277 // Same as the unsigned version but we need to sign-extend manually here
278 be_u24
279 .map(|x| {
280 if x & 0x80_00_00 != 0 {
281 (x | 0xff_00_00_00) as i32
282 } else {
283 x as i32
284 }
285 })
286 .parse(input)
287 }
288
289 /// Recognizes a big endian signed 4 bytes integer.
290 ///
291 /// *Complete version*: Returns an error if there is not enough input data.
292 /// ```rust
293 /// # use nom::{Err, error::ErrorKind, Needed};
294 /// # use nom::Needed::Size;
295 /// use nom::number::complete::be_i32;
296 ///
297 /// let parser = |s| {
298 /// be_i32(s)
299 /// };
300 ///
301 /// assert_eq!(parser(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
302 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
303 /// ```
304 #[inline]
be_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,305 pub fn be_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
306 where
307 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
308 {
309 be_u32.map(|x| x as i32).parse(input)
310 }
311
312 /// Recognizes a big endian signed 8 bytes integer.
313 ///
314 /// *Complete version*: Returns an error if there is not enough input data.
315 /// ```rust
316 /// # use nom::{Err, error::ErrorKind, Needed};
317 /// # use nom::Needed::Size;
318 /// use nom::number::complete::be_i64;
319 ///
320 /// let parser = |s| {
321 /// be_i64(s)
322 /// };
323 ///
324 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
325 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
326 /// ```
327 #[inline]
be_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,328 pub fn be_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E>
329 where
330 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
331 {
332 be_u64.map(|x| x as i64).parse(input)
333 }
334
335 /// Recognizes a big endian signed 16 bytes integer.
336 ///
337 /// *Complete version*: Returns an error if there is not enough input data.
338 /// ```rust
339 /// # use nom::{Err, error::ErrorKind, Needed};
340 /// # use nom::Needed::Size;
341 /// use nom::number::complete::be_i128;
342 ///
343 /// let parser = |s| {
344 /// be_i128(s)
345 /// };
346 ///
347 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
348 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
349 /// ```
350 #[inline]
be_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,351 pub fn be_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E>
352 where
353 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
354 {
355 be_u128.map(|x| x as i128).parse(input)
356 }
357
358 /// Recognizes an unsigned 1 byte integer.
359 ///
360 /// *Complete version*: Returns an error if there is not enough input data.
361 /// ```rust
362 /// # use nom::{Err, error::ErrorKind, Needed};
363 /// # use nom::Needed::Size;
364 /// use nom::number::complete::le_u8;
365 ///
366 /// let parser = |s| {
367 /// le_u8(s)
368 /// };
369 ///
370 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
371 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
372 /// ```
373 #[inline]
le_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,374 pub fn le_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
375 where
376 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
377 {
378 let bound: usize = 1;
379 if input.input_len() < bound {
380 Err(Err::Error(make_error(input, ErrorKind::Eof)))
381 } else {
382 let res = input.iter_elements().next().unwrap();
383
384 Ok((input.slice(bound..), res))
385 }
386 }
387
388 /// Recognizes a little endian unsigned 2 bytes integer.
389 ///
390 /// *Complete version*: Returns an error if there is not enough input data.
391 /// ```rust
392 /// # use nom::{Err, error::ErrorKind, Needed};
393 /// # use nom::Needed::Size;
394 /// use nom::number::complete::le_u16;
395 ///
396 /// let parser = |s| {
397 /// le_u16(s)
398 /// };
399 ///
400 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
401 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
402 /// ```
403 #[inline]
le_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,404 pub fn le_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E>
405 where
406 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
407 {
408 let bound: usize = 2;
409 if input.input_len() < bound {
410 Err(Err::Error(make_error(input, ErrorKind::Eof)))
411 } else {
412 let mut res = 0u16;
413 for (index, byte) in input.iter_indices().take(bound) {
414 res += (byte as u16) << (8 * index);
415 }
416
417 Ok((input.slice(bound..), res))
418 }
419 }
420
421 /// Recognizes a little endian unsigned 3 byte integer.
422 ///
423 /// *Complete version*: Returns an error if there is not enough input data.
424 /// ```rust
425 /// # use nom::{Err, error::ErrorKind, Needed};
426 /// # use nom::Needed::Size;
427 /// use nom::number::complete::le_u24;
428 ///
429 /// let parser = |s| {
430 /// le_u24(s)
431 /// };
432 ///
433 /// assert_eq!(parser(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
434 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
435 /// ```
436 #[inline]
le_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,437 pub fn le_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
438 where
439 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
440 {
441 let bound: usize = 3;
442 if input.input_len() < bound {
443 Err(Err::Error(make_error(input, ErrorKind::Eof)))
444 } else {
445 let mut res = 0u32;
446 for (index, byte) in input.iter_indices().take(bound) {
447 res += (byte as u32) << (8 * index);
448 }
449
450 Ok((input.slice(bound..), res))
451 }
452 }
453
454 /// Recognizes a little endian unsigned 4 bytes integer.
455 ///
456 /// *Complete version*: Returns an error if there is not enough input data.
457 /// ```rust
458 /// # use nom::{Err, error::ErrorKind, Needed};
459 /// # use nom::Needed::Size;
460 /// use nom::number::complete::le_u32;
461 ///
462 /// let parser = |s| {
463 /// le_u32(s)
464 /// };
465 ///
466 /// assert_eq!(parser(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
467 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
468 /// ```
469 #[inline]
le_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,470 pub fn le_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
471 where
472 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
473 {
474 let bound: usize = 4;
475 if input.input_len() < bound {
476 Err(Err::Error(make_error(input, ErrorKind::Eof)))
477 } else {
478 let mut res = 0u32;
479 for (index, byte) in input.iter_indices().take(bound) {
480 res += (byte as u32) << (8 * index);
481 }
482
483 Ok((input.slice(bound..), res))
484 }
485 }
486
487 /// Recognizes a little endian unsigned 8 bytes integer.
488 ///
489 /// *Complete version*: Returns an error if there is not enough input data.
490 /// ```rust
491 /// # use nom::{Err, error::ErrorKind, Needed};
492 /// # use nom::Needed::Size;
493 /// use nom::number::complete::le_u64;
494 ///
495 /// let parser = |s| {
496 /// le_u64(s)
497 /// };
498 ///
499 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
500 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
501 /// ```
502 #[inline]
le_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,503 pub fn le_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E>
504 where
505 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
506 {
507 let bound: usize = 8;
508 if input.input_len() < bound {
509 Err(Err::Error(make_error(input, ErrorKind::Eof)))
510 } else {
511 let mut res = 0u64;
512 for (index, byte) in input.iter_indices().take(bound) {
513 res += (byte as u64) << (8 * index);
514 }
515
516 Ok((input.slice(bound..), res))
517 }
518 }
519
520 /// Recognizes a little endian unsigned 16 bytes integer.
521 ///
522 /// *Complete version*: Returns an error if there is not enough input data.
523 /// ```rust
524 /// # use nom::{Err, error::ErrorKind, Needed};
525 /// # use nom::Needed::Size;
526 /// use nom::number::complete::le_u128;
527 ///
528 /// let parser = |s| {
529 /// le_u128(s)
530 /// };
531 ///
532 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
533 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
534 /// ```
535 #[inline]
le_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,536 pub fn le_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E>
537 where
538 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
539 {
540 let bound: usize = 16;
541 if input.input_len() < bound {
542 Err(Err::Error(make_error(input, ErrorKind::Eof)))
543 } else {
544 let mut res = 0u128;
545 for (index, byte) in input.iter_indices().take(bound) {
546 res += (byte as u128) << (8 * index);
547 }
548
549 Ok((input.slice(bound..), res))
550 }
551 }
552
553 /// Recognizes a signed 1 byte integer.
554 ///
555 /// *Complete version*: Returns an error if there is not enough input data.
556 /// ```rust
557 /// # use nom::{Err, error::ErrorKind, Needed};
558 /// # use nom::Needed::Size;
559 /// use nom::number::complete::le_i8;
560 ///
561 /// let parser = |s| {
562 /// le_i8(s)
563 /// };
564 ///
565 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
566 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
567 /// ```
568 #[inline]
le_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,569 pub fn le_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E>
570 where
571 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
572 {
573 be_u8.map(|x| x as i8).parse(input)
574 }
575
576 /// Recognizes a little endian signed 2 bytes integer.
577 ///
578 /// *Complete version*: Returns an error if there is not enough input data.
579 /// ```rust
580 /// # use nom::{Err, error::ErrorKind, Needed};
581 /// # use nom::Needed::Size;
582 /// use nom::number::complete::le_i16;
583 ///
584 /// let parser = |s| {
585 /// le_i16(s)
586 /// };
587 ///
588 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
589 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
590 /// ```
591 #[inline]
le_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,592 pub fn le_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E>
593 where
594 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
595 {
596 le_u16.map(|x| x as i16).parse(input)
597 }
598
599 /// Recognizes a little endian signed 3 bytes integer.
600 ///
601 /// *Complete version*: Returns an error if there is not enough input data.
602 /// ```rust
603 /// # use nom::{Err, error::ErrorKind, Needed};
604 /// # use nom::Needed::Size;
605 /// use nom::number::complete::le_i24;
606 ///
607 /// let parser = |s| {
608 /// le_i24(s)
609 /// };
610 ///
611 /// assert_eq!(parser(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
612 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
613 /// ```
614 #[inline]
le_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,615 pub fn le_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
616 where
617 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
618 {
619 // Same as the unsigned version but we need to sign-extend manually here
620 le_u24
621 .map(|x| {
622 if x & 0x80_00_00 != 0 {
623 (x | 0xff_00_00_00) as i32
624 } else {
625 x as i32
626 }
627 })
628 .parse(input)
629 }
630
631 /// Recognizes a little endian signed 4 bytes integer.
632 ///
633 /// *Complete version*: Returns an error if there is not enough input data.
634 /// ```rust
635 /// # use nom::{Err, error::ErrorKind, Needed};
636 /// # use nom::Needed::Size;
637 /// use nom::number::complete::le_i32;
638 ///
639 /// let parser = |s| {
640 /// le_i32(s)
641 /// };
642 ///
643 /// assert_eq!(parser(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
644 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
645 /// ```
646 #[inline]
le_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,647 pub fn le_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
648 where
649 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
650 {
651 le_u32.map(|x| x as i32).parse(input)
652 }
653
654 /// Recognizes a little endian signed 8 bytes integer.
655 ///
656 /// *Complete version*: Returns an error if there is not enough input data.
657 /// ```rust
658 /// # use nom::{Err, error::ErrorKind, Needed};
659 /// # use nom::Needed::Size;
660 /// use nom::number::complete::le_i64;
661 ///
662 /// let parser = |s| {
663 /// le_i64(s)
664 /// };
665 ///
666 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
667 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
668 /// ```
669 #[inline]
le_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,670 pub fn le_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E>
671 where
672 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
673 {
674 le_u64.map(|x| x as i64).parse(input)
675 }
676
677 /// Recognizes a little endian signed 16 bytes integer.
678 ///
679 /// *Complete version*: Returns an error if there is not enough input data.
680 /// ```rust
681 /// # use nom::{Err, error::ErrorKind, Needed};
682 /// # use nom::Needed::Size;
683 /// use nom::number::complete::le_i128;
684 ///
685 /// let parser = |s| {
686 /// le_i128(s)
687 /// };
688 ///
689 /// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
690 /// assert_eq!(parser(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
691 /// ```
692 #[inline]
le_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,693 pub fn le_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E>
694 where
695 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
696 {
697 le_u128.map(|x| x as i128).parse(input)
698 }
699
700 /// Recognizes an unsigned 1 byte integer
701 ///
702 /// Note that endianness does not apply to 1 byte numbers.
703 /// *complete version*: returns an error if there is not enough input data
704 /// ```rust
705 /// # use nom::{Err, error::ErrorKind, Needed};
706 /// # use nom::Needed::Size;
707 /// use nom::number::complete::u8;
708 ///
709 /// let parser = |s| {
710 /// u8(s)
711 /// };
712 ///
713 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
714 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
715 /// ```
716 #[inline]
u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,717 pub fn u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
718 where
719 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
720 {
721 let bound: usize = 1;
722 if input.input_len() < bound {
723 Err(Err::Error(make_error(input, ErrorKind::Eof)))
724 } else {
725 let res = input.iter_elements().next().unwrap();
726
727 Ok((input.slice(bound..), res))
728 }
729 }
730
731 /// Recognizes an unsigned 2 bytes integer
732 ///
733 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer,
734 /// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer.
735 /// *complete version*: returns an error if there is not enough input data
736 ///
737 /// ```rust
738 /// # use nom::{Err, error::ErrorKind, Needed};
739 /// # use nom::Needed::Size;
740 /// use nom::number::complete::u16;
741 ///
742 /// let be_u16 = |s| {
743 /// u16(nom::number::Endianness::Big)(s)
744 /// };
745 ///
746 /// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
747 /// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
748 ///
749 /// let le_u16 = |s| {
750 /// u16(nom::number::Endianness::Little)(s)
751 /// };
752 ///
753 /// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
754 /// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
755 /// ```
756 #[inline]
u16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,757 pub fn u16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u16, E>
758 where
759 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
760 {
761 match endian {
762 crate::number::Endianness::Big => be_u16,
763 crate::number::Endianness::Little => le_u16,
764 #[cfg(target_endian = "big")]
765 crate::number::Endianness::Native => be_u16,
766 #[cfg(target_endian = "little")]
767 crate::number::Endianness::Native => le_u16,
768 }
769 }
770
771 /// Recognizes an unsigned 3 byte integer
772 ///
773 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer,
774 /// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer.
775 /// *complete version*: returns an error if there is not enough input data
776 /// ```rust
777 /// # use nom::{Err, error::ErrorKind, Needed};
778 /// # use nom::Needed::Size;
779 /// use nom::number::complete::u24;
780 ///
781 /// let be_u24 = |s| {
782 /// u24(nom::number::Endianness::Big)(s)
783 /// };
784 ///
785 /// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
786 /// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
787 ///
788 /// let le_u24 = |s| {
789 /// u24(nom::number::Endianness::Little)(s)
790 /// };
791 ///
792 /// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
793 /// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
794 /// ```
795 #[inline]
u24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,796 pub fn u24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E>
797 where
798 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
799 {
800 match endian {
801 crate::number::Endianness::Big => be_u24,
802 crate::number::Endianness::Little => le_u24,
803 #[cfg(target_endian = "big")]
804 crate::number::Endianness::Native => be_u24,
805 #[cfg(target_endian = "little")]
806 crate::number::Endianness::Native => le_u24,
807 }
808 }
809
810 /// Recognizes an unsigned 4 byte integer
811 ///
812 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer,
813 /// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer.
814 /// *complete version*: returns an error if there is not enough input data
815 /// ```rust
816 /// # use nom::{Err, error::ErrorKind, Needed};
817 /// # use nom::Needed::Size;
818 /// use nom::number::complete::u32;
819 ///
820 /// let be_u32 = |s| {
821 /// u32(nom::number::Endianness::Big)(s)
822 /// };
823 ///
824 /// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
825 /// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
826 ///
827 /// let le_u32 = |s| {
828 /// u32(nom::number::Endianness::Little)(s)
829 /// };
830 ///
831 /// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
832 /// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
833 /// ```
834 #[inline]
u32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,835 pub fn u32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E>
836 where
837 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
838 {
839 match endian {
840 crate::number::Endianness::Big => be_u32,
841 crate::number::Endianness::Little => le_u32,
842 #[cfg(target_endian = "big")]
843 crate::number::Endianness::Native => be_u32,
844 #[cfg(target_endian = "little")]
845 crate::number::Endianness::Native => le_u32,
846 }
847 }
848
849 /// Recognizes an unsigned 8 byte integer
850 ///
851 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer,
852 /// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer.
853 /// *complete version*: returns an error if there is not enough input data
854 /// ```rust
855 /// # use nom::{Err, error::ErrorKind, Needed};
856 /// # use nom::Needed::Size;
857 /// use nom::number::complete::u64;
858 ///
859 /// let be_u64 = |s| {
860 /// u64(nom::number::Endianness::Big)(s)
861 /// };
862 ///
863 /// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
864 /// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
865 ///
866 /// let le_u64 = |s| {
867 /// u64(nom::number::Endianness::Little)(s)
868 /// };
869 ///
870 /// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
871 /// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
872 /// ```
873 #[inline]
u64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,874 pub fn u64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u64, E>
875 where
876 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
877 {
878 match endian {
879 crate::number::Endianness::Big => be_u64,
880 crate::number::Endianness::Little => le_u64,
881 #[cfg(target_endian = "big")]
882 crate::number::Endianness::Native => be_u64,
883 #[cfg(target_endian = "little")]
884 crate::number::Endianness::Native => le_u64,
885 }
886 }
887
888 /// Recognizes an unsigned 16 byte integer
889 ///
890 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer,
891 /// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer.
892 /// *complete version*: returns an error if there is not enough input data
893 /// ```rust
894 /// # use nom::{Err, error::ErrorKind, Needed};
895 /// # use nom::Needed::Size;
896 /// use nom::number::complete::u128;
897 ///
898 /// let be_u128 = |s| {
899 /// u128(nom::number::Endianness::Big)(s)
900 /// };
901 ///
902 /// assert_eq!(be_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
903 /// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
904 ///
905 /// let le_u128 = |s| {
906 /// u128(nom::number::Endianness::Little)(s)
907 /// };
908 ///
909 /// assert_eq!(le_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
910 /// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
911 /// ```
912 #[inline]
u128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,913 pub fn u128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u128, E>
914 where
915 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
916 {
917 match endian {
918 crate::number::Endianness::Big => be_u128,
919 crate::number::Endianness::Little => le_u128,
920 #[cfg(target_endian = "big")]
921 crate::number::Endianness::Native => be_u128,
922 #[cfg(target_endian = "little")]
923 crate::number::Endianness::Native => le_u128,
924 }
925 }
926
927 /// Recognizes a signed 1 byte integer
928 ///
929 /// Note that endianness does not apply to 1 byte numbers.
930 /// *complete version*: returns an error if there is not enough input data
931 /// ```rust
932 /// # use nom::{Err, error::ErrorKind, Needed};
933 /// # use nom::Needed::Size;
934 /// use nom::number::complete::i8;
935 ///
936 /// let parser = |s| {
937 /// i8(s)
938 /// };
939 ///
940 /// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
941 /// assert_eq!(parser(&b""[..]), Err(Err::Error((&[][..], ErrorKind::Eof))));
942 /// ```
943 #[inline]
i8<I, E: ParseError<I>>(i: I) -> IResult<I, i8, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,944 pub fn i8<I, E: ParseError<I>>(i: I) -> IResult<I, i8, E>
945 where
946 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
947 {
948 u8.map(|x| x as i8).parse(i)
949 }
950
951 /// Recognizes a signed 2 byte integer
952 ///
953 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer,
954 /// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer.
955 /// *complete version*: returns an error if there is not enough input data
956 /// ```rust
957 /// # use nom::{Err, error::ErrorKind, Needed};
958 /// # use nom::Needed::Size;
959 /// use nom::number::complete::i16;
960 ///
961 /// let be_i16 = |s| {
962 /// i16(nom::number::Endianness::Big)(s)
963 /// };
964 ///
965 /// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
966 /// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
967 ///
968 /// let le_i16 = |s| {
969 /// i16(nom::number::Endianness::Little)(s)
970 /// };
971 ///
972 /// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
973 /// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
974 /// ```
975 #[inline]
i16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i16, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,976 pub fn i16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i16, E>
977 where
978 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
979 {
980 match endian {
981 crate::number::Endianness::Big => be_i16,
982 crate::number::Endianness::Little => le_i16,
983 #[cfg(target_endian = "big")]
984 crate::number::Endianness::Native => be_i16,
985 #[cfg(target_endian = "little")]
986 crate::number::Endianness::Native => le_i16,
987 }
988 }
989
990 /// Recognizes a signed 3 byte integer
991 ///
992 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer,
993 /// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer.
994 /// *complete version*: returns an error if there is not enough input data
995 /// ```rust
996 /// # use nom::{Err, error::ErrorKind, Needed};
997 /// # use nom::Needed::Size;
998 /// use nom::number::complete::i24;
999 ///
1000 /// let be_i24 = |s| {
1001 /// i24(nom::number::Endianness::Big)(s)
1002 /// };
1003 ///
1004 /// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
1005 /// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1006 ///
1007 /// let le_i24 = |s| {
1008 /// i24(nom::number::Endianness::Little)(s)
1009 /// };
1010 ///
1011 /// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
1012 /// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1013 /// ```
1014 #[inline]
i24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1015 pub fn i24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E>
1016 where
1017 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1018 {
1019 match endian {
1020 crate::number::Endianness::Big => be_i24,
1021 crate::number::Endianness::Little => le_i24,
1022 #[cfg(target_endian = "big")]
1023 crate::number::Endianness::Native => be_i24,
1024 #[cfg(target_endian = "little")]
1025 crate::number::Endianness::Native => le_i24,
1026 }
1027 }
1028
1029 /// Recognizes a signed 4 byte integer
1030 ///
1031 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer,
1032 /// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer.
1033 /// *complete version*: returns an error if there is not enough input data
1034 /// ```rust
1035 /// # use nom::{Err, error::ErrorKind, Needed};
1036 /// # use nom::Needed::Size;
1037 /// use nom::number::complete::i32;
1038 ///
1039 /// let be_i32 = |s| {
1040 /// i32(nom::number::Endianness::Big)(s)
1041 /// };
1042 ///
1043 /// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
1044 /// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1045 ///
1046 /// let le_i32 = |s| {
1047 /// i32(nom::number::Endianness::Little)(s)
1048 /// };
1049 ///
1050 /// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
1051 /// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1052 /// ```
1053 #[inline]
i32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1054 pub fn i32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E>
1055 where
1056 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1057 {
1058 match endian {
1059 crate::number::Endianness::Big => be_i32,
1060 crate::number::Endianness::Little => le_i32,
1061 #[cfg(target_endian = "big")]
1062 crate::number::Endianness::Native => be_i32,
1063 #[cfg(target_endian = "little")]
1064 crate::number::Endianness::Native => le_i32,
1065 }
1066 }
1067
1068 /// Recognizes a signed 8 byte integer
1069 ///
1070 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer,
1071 /// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer.
1072 /// *complete version*: returns an error if there is not enough input data
1073 /// ```rust
1074 /// # use nom::{Err, error::ErrorKind, Needed};
1075 /// # use nom::Needed::Size;
1076 /// use nom::number::complete::i64;
1077 ///
1078 /// let be_i64 = |s| {
1079 /// i64(nom::number::Endianness::Big)(s)
1080 /// };
1081 ///
1082 /// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
1083 /// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1084 ///
1085 /// let le_i64 = |s| {
1086 /// i64(nom::number::Endianness::Little)(s)
1087 /// };
1088 ///
1089 /// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
1090 /// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1091 /// ```
1092 #[inline]
i64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1093 pub fn i64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i64, E>
1094 where
1095 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1096 {
1097 match endian {
1098 crate::number::Endianness::Big => be_i64,
1099 crate::number::Endianness::Little => le_i64,
1100 #[cfg(target_endian = "big")]
1101 crate::number::Endianness::Native => be_i64,
1102 #[cfg(target_endian = "little")]
1103 crate::number::Endianness::Native => le_i64,
1104 }
1105 }
1106
1107 /// Recognizes a signed 16 byte integer
1108 ///
1109 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer,
1110 /// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer.
1111 /// *complete version*: returns an error if there is not enough input data
1112 /// ```rust
1113 /// # use nom::{Err, error::ErrorKind, Needed};
1114 /// # use nom::Needed::Size;
1115 /// use nom::number::complete::i128;
1116 ///
1117 /// let be_i128 = |s| {
1118 /// i128(nom::number::Endianness::Big)(s)
1119 /// };
1120 ///
1121 /// assert_eq!(be_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
1122 /// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1123 ///
1124 /// let le_i128 = |s| {
1125 /// i128(nom::number::Endianness::Little)(s)
1126 /// };
1127 ///
1128 /// assert_eq!(le_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
1129 /// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Error((&[0x01][..], ErrorKind::Eof))));
1130 /// ```
1131 #[inline]
i128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i128, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1132 pub fn i128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i128, E>
1133 where
1134 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1135 {
1136 match endian {
1137 crate::number::Endianness::Big => be_i128,
1138 crate::number::Endianness::Little => le_i128,
1139 #[cfg(target_endian = "big")]
1140 crate::number::Endianness::Native => be_i128,
1141 #[cfg(target_endian = "little")]
1142 crate::number::Endianness::Native => le_i128,
1143 }
1144 }
1145
1146 /// Recognizes a big endian 4 bytes floating point number.
1147 ///
1148 /// *Complete version*: Returns an error if there is not enough input data.
1149 /// ```rust
1150 /// # use nom::{Err, error::ErrorKind, Needed};
1151 /// # use nom::Needed::Size;
1152 /// use nom::number::complete::be_f32;
1153 ///
1154 /// let parser = |s| {
1155 /// be_f32(s)
1156 /// };
1157 ///
1158 /// assert_eq!(parser(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1159 /// assert_eq!(parser(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1160 /// ```
1161 #[inline]
be_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1162 pub fn be_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E>
1163 where
1164 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1165 {
1166 match be_u32(input) {
1167 Err(e) => Err(e),
1168 Ok((i, o)) => Ok((i, f32::from_bits(o))),
1169 }
1170 }
1171
1172 /// Recognizes a big endian 8 bytes floating point number.
1173 ///
1174 /// *Complete version*: Returns an error if there is not enough input data.
1175 /// ```rust
1176 /// # use nom::{Err, error::ErrorKind, Needed};
1177 /// # use nom::Needed::Size;
1178 /// use nom::number::complete::be_f64;
1179 ///
1180 /// let parser = |s| {
1181 /// be_f64(s)
1182 /// };
1183 ///
1184 /// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1185 /// assert_eq!(parser(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1186 /// ```
1187 #[inline]
be_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1188 pub fn be_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E>
1189 where
1190 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1191 {
1192 match be_u64(input) {
1193 Err(e) => Err(e),
1194 Ok((i, o)) => Ok((i, f64::from_bits(o))),
1195 }
1196 }
1197
1198 /// Recognizes a little endian 4 bytes floating point number.
1199 ///
1200 /// *Complete version*: Returns an error if there is not enough input data.
1201 /// ```rust
1202 /// # use nom::{Err, error::ErrorKind, Needed};
1203 /// # use nom::Needed::Size;
1204 /// use nom::number::complete::le_f32;
1205 ///
1206 /// let parser = |s| {
1207 /// le_f32(s)
1208 /// };
1209 ///
1210 /// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1211 /// assert_eq!(parser(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1212 /// ```
1213 #[inline]
le_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1214 pub fn le_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E>
1215 where
1216 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1217 {
1218 match le_u32(input) {
1219 Err(e) => Err(e),
1220 Ok((i, o)) => Ok((i, f32::from_bits(o))),
1221 }
1222 }
1223
1224 /// Recognizes a little endian 8 bytes floating point number.
1225 ///
1226 /// *Complete version*: Returns an error if there is not enough input data.
1227 /// ```rust
1228 /// # use nom::{Err, error::ErrorKind, Needed};
1229 /// # use nom::Needed::Size;
1230 /// use nom::number::complete::le_f64;
1231 ///
1232 /// let parser = |s| {
1233 /// le_f64(s)
1234 /// };
1235 ///
1236 /// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
1237 /// assert_eq!(parser(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1238 /// ```
1239 #[inline]
le_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1240 pub fn le_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E>
1241 where
1242 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1243 {
1244 match le_u64(input) {
1245 Err(e) => Err(e),
1246 Ok((i, o)) => Ok((i, f64::from_bits(o))),
1247 }
1248 }
1249
1250 /// Recognizes a 4 byte floating point number
1251 ///
1252 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float,
1253 /// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float.
1254 /// *complete version*: returns an error if there is not enough input data
1255 /// ```rust
1256 /// # use nom::{Err, error::ErrorKind, Needed};
1257 /// # use nom::Needed::Size;
1258 /// use nom::number::complete::f32;
1259 ///
1260 /// let be_f32 = |s| {
1261 /// f32(nom::number::Endianness::Big)(s)
1262 /// };
1263 ///
1264 /// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1265 /// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1266 ///
1267 /// let le_f32 = |s| {
1268 /// f32(nom::number::Endianness::Little)(s)
1269 /// };
1270 ///
1271 /// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1272 /// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1273 /// ```
1274 #[inline]
f32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f32, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1275 pub fn f32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f32, E>
1276 where
1277 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1278 {
1279 match endian {
1280 crate::number::Endianness::Big => be_f32,
1281 crate::number::Endianness::Little => le_f32,
1282 #[cfg(target_endian = "big")]
1283 crate::number::Endianness::Native => be_f32,
1284 #[cfg(target_endian = "little")]
1285 crate::number::Endianness::Native => le_f32,
1286 }
1287 }
1288
1289 /// Recognizes an 8 byte floating point number
1290 ///
1291 /// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float,
1292 /// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float.
1293 /// *complete version*: returns an error if there is not enough input data
1294 /// ```rust
1295 /// # use nom::{Err, error::ErrorKind, Needed};
1296 /// # use nom::Needed::Size;
1297 /// use nom::number::complete::f64;
1298 ///
1299 /// let be_f64 = |s| {
1300 /// f64(nom::number::Endianness::Big)(s)
1301 /// };
1302 ///
1303 /// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1304 /// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1305 ///
1306 /// let le_f64 = |s| {
1307 /// f64(nom::number::Endianness::Little)(s)
1308 /// };
1309 ///
1310 /// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
1311 /// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Error((&b"abc"[..], ErrorKind::Eof))));
1312 /// ```
1313 #[inline]
f64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f64, E> where I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,1314 pub fn f64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f64, E>
1315 where
1316 I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1317 {
1318 match endian {
1319 crate::number::Endianness::Big => be_f64,
1320 crate::number::Endianness::Little => le_f64,
1321 #[cfg(target_endian = "big")]
1322 crate::number::Endianness::Native => be_f64,
1323 #[cfg(target_endian = "little")]
1324 crate::number::Endianness::Native => le_f64,
1325 }
1326 }
1327
1328 /// Recognizes a hex-encoded integer.
1329 ///
1330 /// *Complete version*: Will parse until the end of input if it has less than 8 bytes.
1331 /// ```rust
1332 /// # use nom::{Err, error::ErrorKind, Needed};
1333 /// # use nom::Needed::Size;
1334 /// use nom::number::complete::hex_u32;
1335 ///
1336 /// let parser = |s| {
1337 /// hex_u32(s)
1338 /// };
1339 ///
1340 /// assert_eq!(parser(&b"01AE"[..]), Ok((&b""[..], 0x01AE)));
1341 /// assert_eq!(parser(&b"abc"[..]), Ok((&b""[..], 0x0ABC)));
1342 /// assert_eq!(parser(&b"ggg"[..]), Err(Err::Error((&b"ggg"[..], ErrorKind::IsA))));
1343 /// ```
1344 #[inline]
hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], u32, E>1345 pub fn hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], u32, E> {
1346 let (i, o) = crate::bytes::complete::is_a(&b"0123456789abcdefABCDEF"[..])(input)?;
1347 // Do not parse more than 8 characters for a u32
1348 let (parsed, remaining) = if o.len() <= 8 {
1349 (o, i)
1350 } else {
1351 (&input[..8], &input[8..])
1352 };
1353
1354 let res = parsed
1355 .iter()
1356 .rev()
1357 .enumerate()
1358 .map(|(k, &v)| {
1359 let digit = v as char;
1360 digit.to_digit(16).unwrap_or(0) << (k * 4)
1361 })
1362 .sum();
1363
1364 Ok((remaining, res))
1365 }
1366
1367 /// Recognizes floating point number in a byte string and returns the corresponding slice.
1368 ///
1369 /// *Complete version*: Can parse until the end of input.
1370 ///
1371 /// ```rust
1372 /// # use nom::{Err, error::ErrorKind, Needed};
1373 /// # use nom::Needed::Size;
1374 /// use nom::number::complete::recognize_float;
1375 ///
1376 /// let parser = |s| {
1377 /// recognize_float(s)
1378 /// };
1379 ///
1380 /// assert_eq!(parser("11e-1"), Ok(("", "11e-1")));
1381 /// assert_eq!(parser("123E-02"), Ok(("", "123E-02")));
1382 /// assert_eq!(parser("123K-01"), Ok(("K-01", "123")));
1383 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
1384 /// ```
1385 #[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,1386 pub fn recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E>
1387 where
1388 T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
1389 T: Clone + Offset,
1390 T: InputIter,
1391 <T as InputIter>::Item: AsChar,
1392 T: InputTakeAtPosition,
1393 <T as InputTakeAtPosition>::Item: AsChar,
1394 {
1395 recognize(
1396 tuple((
1397 opt(alt((char('+'), char('-')))),
1398 alt((
1399 map(tuple((digit1, opt(pair(char('.'), opt(digit1))))), |_| ()),
1400 map(tuple((char('.'), digit1)), |_| ())
1401 )),
1402 opt(tuple((
1403 alt((char('e'), char('E'))),
1404 opt(alt((char('+'), char('-')))),
1405 cut(digit1)
1406 )))
1407 ))
1408 )(input)
1409 }
1410
1411 // workaround until issues with minimal-lexical are fixed
1412 #[doc(hidden)]
recognize_float_or_exceptions<T, E: ParseError<T>>(input: T) -> IResult<T, T, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, T: Clone + Offset, T: InputIter + InputTake + Compare<&'static str>, <T as InputIter>::Item: AsChar, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar,1413 pub fn recognize_float_or_exceptions<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
1414 where
1415 T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
1416 T: Clone + Offset,
1417 T: InputIter + InputTake + Compare<&'static str>,
1418 <T as InputIter>::Item: AsChar,
1419 T: InputTakeAtPosition,
1420 <T as InputTakeAtPosition>::Item: AsChar,
1421 {
1422 alt((
1423 |i: T| {
1424 recognize_float::<_, E>(i.clone()).map_err(|e| match e {
1425 crate::Err::Error(_) => crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)),
1426 crate::Err::Failure(_) => crate::Err::Failure(E::from_error_kind(i, ErrorKind::Float)),
1427 crate::Err::Incomplete(needed) => crate::Err::Incomplete(needed),
1428 })
1429 },
1430 |i: T| {
1431 crate::bytes::complete::tag_no_case::<_, _, E>("nan")(i.clone())
1432 .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1433 },
1434 |i: T| {
1435 crate::bytes::complete::tag_no_case::<_, _, E>("inf")(i.clone())
1436 .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1437 },
1438 |i: T| {
1439 crate::bytes::complete::tag_no_case::<_, _, E>("infinity")(i.clone())
1440 .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1441 },
1442 ))(input)
1443 }
1444
1445 /// Recognizes a floating point number in text format
1446 ///
1447 /// It returns a tuple of (`sign`, `integer part`, `fraction part` and `exponent`) of the input
1448 /// data.
1449 ///
1450 /// *Complete version*: Can parse until the end of input.
1451 ///
recognize_float_parts<T, E: ParseError<T>>(input: T) -> IResult<T, (bool, T, T, i32), E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>, T: Clone + Offset, T: InputIter + InputTake, <T as InputIter>::Item: AsChar + Copy, T: InputTakeAtPosition + InputLength, <T as InputTakeAtPosition>::Item: AsChar, T: for<'a> Compare<&'a [u8]>, T: AsBytes,1452 pub fn recognize_float_parts<T, E: ParseError<T>>(input: T) -> IResult<T, (bool, T, T, i32), E>
1453 where
1454 T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>,
1455 T: Clone + Offset,
1456 T: InputIter + InputTake,
1457 <T as InputIter>::Item: AsChar + Copy,
1458 T: InputTakeAtPosition + InputLength,
1459 <T as InputTakeAtPosition>::Item: AsChar,
1460 T: for<'a> Compare<&'a [u8]>,
1461 T: AsBytes,
1462 {
1463 let (i, sign) = sign(input.clone())?;
1464
1465 //let (i, zeroes) = take_while(|c: <T as InputTakeAtPosition>::Item| c.as_char() == '0')(i)?;
1466 let (i, zeroes) = match i.as_bytes().iter().position(|c| *c != b'0') {
1467 Some(index) => i.take_split(index),
1468 None => i.take_split(i.input_len()),
1469 };
1470 //let (i, mut integer) = digit0(i)?;
1471 let (i, mut integer) = match i
1472 .as_bytes()
1473 .iter()
1474 .position(|c| !(*c >= b'0' && *c <= b'9'))
1475 {
1476 Some(index) => i.take_split(index),
1477 None => i.take_split(i.input_len()),
1478 };
1479
1480 if integer.input_len() == 0 && zeroes.input_len() > 0 {
1481 // keep the last zero if integer is empty
1482 integer = zeroes.slice(zeroes.input_len() - 1..);
1483 }
1484
1485 let (i, opt_dot) = opt(tag(&b"."[..]))(i)?;
1486 let (i, fraction) = if opt_dot.is_none() {
1487 let i2 = i.clone();
1488 (i2, i.slice(..0))
1489 } else {
1490 // match number, trim right zeroes
1491 let mut zero_count = 0usize;
1492 let mut position = None;
1493 for (pos, c) in i.as_bytes().iter().enumerate() {
1494 if *c >= b'0' && *c <= b'9' {
1495 if *c == b'0' {
1496 zero_count += 1;
1497 } else {
1498 zero_count = 0;
1499 }
1500 } else {
1501 position = Some(pos);
1502 break;
1503 }
1504 }
1505
1506 let position = position.unwrap_or(i.input_len());
1507
1508 let index = if zero_count == 0 {
1509 position
1510 } else if zero_count == position {
1511 position - zero_count + 1
1512 } else {
1513 position - zero_count
1514 };
1515
1516 (i.slice(position..), i.slice(..index))
1517 };
1518
1519 if integer.input_len() == 0 && fraction.input_len() == 0 {
1520 return Err(Err::Error(E::from_error_kind(input, ErrorKind::Float)));
1521 }
1522
1523 let i2 = i.clone();
1524 let (i, e) = match i.as_bytes().iter().next() {
1525 Some(b'e') => (i.slice(1..), true),
1526 Some(b'E') => (i.slice(1..), true),
1527 _ => (i, false),
1528 };
1529
1530 let (i, exp) = if e {
1531 cut(crate::character::complete::i32)(i)?
1532 } else {
1533 (i2, 0)
1534 };
1535
1536 Ok((i, (sign, integer, fraction, exp)))
1537 }
1538
1539 use crate::traits::ParseTo;
1540
1541 /// Recognizes floating point number in text format and returns a f32.
1542 ///
1543 /// *Complete version*: Can parse until the end of input.
1544 /// ```rust
1545 /// # use nom::{Err, error::ErrorKind, Needed};
1546 /// # use nom::Needed::Size;
1547 /// use nom::number::complete::float;
1548 ///
1549 /// let parser = |s| {
1550 /// float(s)
1551 /// };
1552 ///
1553 /// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
1554 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
1555 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
1556 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
1557 /// ```
float<T, E: ParseError<T>>(input: T) -> IResult<T, f32, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>, T: Clone + Offset + ParseTo<f32> + Compare<&'static str>, T: InputIter + InputLength + InputTake, <T as InputIter>::Item: AsChar + Copy, <T as InputIter>::IterElem: Clone, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar, T: AsBytes, T: for<'a> Compare<&'a [u8]>,1558 pub fn float<T, E: ParseError<T>>(input: T) -> IResult<T, f32, E>
1559 where
1560 T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>,
1561 T: Clone + Offset + ParseTo<f32> + Compare<&'static str>,
1562 T: InputIter + InputLength + InputTake,
1563 <T as InputIter>::Item: AsChar + Copy,
1564 <T as InputIter>::IterElem: Clone,
1565 T: InputTakeAtPosition,
1566 <T as InputTakeAtPosition>::Item: AsChar,
1567 T: AsBytes,
1568 T: for<'a> Compare<&'a [u8]>,
1569 {
1570 /*
1571 let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?;
1572
1573 let mut float: f32 = minimal_lexical::parse_float(
1574 integer.as_bytes().iter(),
1575 fraction.as_bytes().iter(),
1576 exponent,
1577 );
1578 if !sign {
1579 float = -float;
1580 }
1581
1582 Ok((i, float))
1583 */
1584 let (i, s) = recognize_float_or_exceptions(input)?;
1585 match s.parse_to() {
1586 Some(f) => Ok((i, f)),
1587 None => Err(crate::Err::Error(E::from_error_kind(
1588 i,
1589 crate::error::ErrorKind::Float,
1590 ))),
1591 }
1592 }
1593
1594 /// Recognizes floating point number in text format and returns a f64.
1595 ///
1596 /// *Complete version*: Can parse until the end of input.
1597 /// ```rust
1598 /// # use nom::{Err, error::ErrorKind, Needed};
1599 /// # use nom::Needed::Size;
1600 /// use nom::number::complete::double;
1601 ///
1602 /// let parser = |s| {
1603 /// double(s)
1604 /// };
1605 ///
1606 /// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
1607 /// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
1608 /// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
1609 /// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
1610 /// ```
double<T, E: ParseError<T>>(input: T) -> IResult<T, f64, E> where T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>, T: Clone + Offset + ParseTo<f64> + Compare<&'static str>, T: InputIter + InputLength + InputTake, <T as InputIter>::Item: AsChar + Copy, <T as InputIter>::IterElem: Clone, T: InputTakeAtPosition, <T as InputTakeAtPosition>::Item: AsChar, T: AsBytes, T: for<'a> Compare<&'a [u8]>,1611 pub fn double<T, E: ParseError<T>>(input: T) -> IResult<T, f64, E>
1612 where
1613 T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Slice<Range<usize>>,
1614 T: Clone + Offset + ParseTo<f64> + Compare<&'static str>,
1615 T: InputIter + InputLength + InputTake,
1616 <T as InputIter>::Item: AsChar + Copy,
1617 <T as InputIter>::IterElem: Clone,
1618 T: InputTakeAtPosition,
1619 <T as InputTakeAtPosition>::Item: AsChar,
1620 T: AsBytes,
1621 T: for<'a> Compare<&'a [u8]>,
1622 {
1623 /*
1624 let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?;
1625
1626 let mut float: f64 = minimal_lexical::parse_float(
1627 integer.as_bytes().iter(),
1628 fraction.as_bytes().iter(),
1629 exponent,
1630 );
1631 if !sign {
1632 float = -float;
1633 }
1634
1635 Ok((i, float))
1636 */
1637 let (i, s) = recognize_float_or_exceptions(input)?;
1638 match s.parse_to() {
1639 Some(f) => Ok((i, f)),
1640 None => Err(crate::Err::Error(E::from_error_kind(
1641 i,
1642 crate::error::ErrorKind::Float,
1643 ))),
1644 }
1645 }
1646
1647 #[cfg(test)]
1648 mod tests {
1649 use super::*;
1650 use crate::error::ErrorKind;
1651 use crate::internal::Err;
1652 use proptest::prelude::*;
1653
1654 macro_rules! assert_parse(
1655 ($left: expr, $right: expr) => {
1656 let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
1657 assert_eq!(res, $right);
1658 };
1659 );
1660
1661 #[test]
i8_tests()1662 fn i8_tests() {
1663 assert_parse!(i8(&[0x00][..]), Ok((&b""[..], 0)));
1664 assert_parse!(i8(&[0x7f][..]), Ok((&b""[..], 127)));
1665 assert_parse!(i8(&[0xff][..]), Ok((&b""[..], -1)));
1666 assert_parse!(i8(&[0x80][..]), Ok((&b""[..], -128)));
1667 }
1668
1669 #[test]
be_i8_tests()1670 fn be_i8_tests() {
1671 assert_parse!(be_i8(&[0x00][..]), Ok((&b""[..], 0)));
1672 assert_parse!(be_i8(&[0x7f][..]), Ok((&b""[..], 127)));
1673 assert_parse!(be_i8(&[0xff][..]), Ok((&b""[..], -1)));
1674 assert_parse!(be_i8(&[0x80][..]), Ok((&b""[..], -128)));
1675 }
1676
1677 #[test]
be_i16_tests()1678 fn be_i16_tests() {
1679 assert_parse!(be_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0)));
1680 assert_parse!(be_i16(&[0x7f, 0xff][..]), Ok((&b""[..], 32_767_i16)));
1681 assert_parse!(be_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1)));
1682 assert_parse!(be_i16(&[0x80, 0x00][..]), Ok((&b""[..], -32_768_i16)));
1683 }
1684
1685 #[test]
be_u24_tests()1686 fn be_u24_tests() {
1687 assert_parse!(be_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
1688 assert_parse!(be_u24(&[0x00, 0xFF, 0xFF][..]), Ok((&b""[..], 65_535_u32)));
1689 assert_parse!(
1690 be_u24(&[0x12, 0x34, 0x56][..]),
1691 Ok((&b""[..], 1_193_046_u32))
1692 );
1693 }
1694
1695 #[test]
be_i24_tests()1696 fn be_i24_tests() {
1697 assert_parse!(be_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32)));
1698 assert_parse!(be_i24(&[0xFF, 0x00, 0x00][..]), Ok((&b""[..], -65_536_i32)));
1699 assert_parse!(
1700 be_i24(&[0xED, 0xCB, 0xAA][..]),
1701 Ok((&b""[..], -1_193_046_i32))
1702 );
1703 }
1704
1705 #[test]
be_i32_tests()1706 fn be_i32_tests() {
1707 assert_parse!(be_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
1708 assert_parse!(
1709 be_i32(&[0x7f, 0xff, 0xff, 0xff][..]),
1710 Ok((&b""[..], 2_147_483_647_i32))
1711 );
1712 assert_parse!(be_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1)));
1713 assert_parse!(
1714 be_i32(&[0x80, 0x00, 0x00, 0x00][..]),
1715 Ok((&b""[..], -2_147_483_648_i32))
1716 );
1717 }
1718
1719 #[test]
be_i64_tests()1720 fn be_i64_tests() {
1721 assert_parse!(
1722 be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
1723 Ok((&b""[..], 0))
1724 );
1725 assert_parse!(
1726 be_i64(&[0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
1727 Ok((&b""[..], 9_223_372_036_854_775_807_i64))
1728 );
1729 assert_parse!(
1730 be_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
1731 Ok((&b""[..], -1))
1732 );
1733 assert_parse!(
1734 be_i64(&[0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
1735 Ok((&b""[..], -9_223_372_036_854_775_808_i64))
1736 );
1737 }
1738
1739 #[test]
be_i128_tests()1740 fn be_i128_tests() {
1741 assert_parse!(
1742 be_i128(
1743 &[
1744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1745 0x00
1746 ][..]
1747 ),
1748 Ok((&b""[..], 0))
1749 );
1750 assert_parse!(
1751 be_i128(
1752 &[
1753 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1754 0xff
1755 ][..]
1756 ),
1757 Ok((
1758 &b""[..],
1759 170_141_183_460_469_231_731_687_303_715_884_105_727_i128
1760 ))
1761 );
1762 assert_parse!(
1763 be_i128(
1764 &[
1765 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1766 0xff
1767 ][..]
1768 ),
1769 Ok((&b""[..], -1))
1770 );
1771 assert_parse!(
1772 be_i128(
1773 &[
1774 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x00
1776 ][..]
1777 ),
1778 Ok((
1779 &b""[..],
1780 -170_141_183_460_469_231_731_687_303_715_884_105_728_i128
1781 ))
1782 );
1783 }
1784
1785 #[test]
le_i8_tests()1786 fn le_i8_tests() {
1787 assert_parse!(le_i8(&[0x00][..]), Ok((&b""[..], 0)));
1788 assert_parse!(le_i8(&[0x7f][..]), Ok((&b""[..], 127)));
1789 assert_parse!(le_i8(&[0xff][..]), Ok((&b""[..], -1)));
1790 assert_parse!(le_i8(&[0x80][..]), Ok((&b""[..], -128)));
1791 }
1792
1793 #[test]
le_i16_tests()1794 fn le_i16_tests() {
1795 assert_parse!(le_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0)));
1796 assert_parse!(le_i16(&[0xff, 0x7f][..]), Ok((&b""[..], 32_767_i16)));
1797 assert_parse!(le_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1)));
1798 assert_parse!(le_i16(&[0x00, 0x80][..]), Ok((&b""[..], -32_768_i16)));
1799 }
1800
1801 #[test]
le_u24_tests()1802 fn le_u24_tests() {
1803 assert_parse!(le_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
1804 assert_parse!(le_u24(&[0xFF, 0xFF, 0x00][..]), Ok((&b""[..], 65_535_u32)));
1805 assert_parse!(
1806 le_u24(&[0x56, 0x34, 0x12][..]),
1807 Ok((&b""[..], 1_193_046_u32))
1808 );
1809 }
1810
1811 #[test]
le_i24_tests()1812 fn le_i24_tests() {
1813 assert_parse!(le_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32)));
1814 assert_parse!(le_i24(&[0x00, 0x00, 0xFF][..]), Ok((&b""[..], -65_536_i32)));
1815 assert_parse!(
1816 le_i24(&[0xAA, 0xCB, 0xED][..]),
1817 Ok((&b""[..], -1_193_046_i32))
1818 );
1819 }
1820
1821 #[test]
le_i32_tests()1822 fn le_i32_tests() {
1823 assert_parse!(le_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
1824 assert_parse!(
1825 le_i32(&[0xff, 0xff, 0xff, 0x7f][..]),
1826 Ok((&b""[..], 2_147_483_647_i32))
1827 );
1828 assert_parse!(le_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1)));
1829 assert_parse!(
1830 le_i32(&[0x00, 0x00, 0x00, 0x80][..]),
1831 Ok((&b""[..], -2_147_483_648_i32))
1832 );
1833 }
1834
1835 #[test]
le_i64_tests()1836 fn le_i64_tests() {
1837 assert_parse!(
1838 le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
1839 Ok((&b""[..], 0))
1840 );
1841 assert_parse!(
1842 le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f][..]),
1843 Ok((&b""[..], 9_223_372_036_854_775_807_i64))
1844 );
1845 assert_parse!(
1846 le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
1847 Ok((&b""[..], -1))
1848 );
1849 assert_parse!(
1850 le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80][..]),
1851 Ok((&b""[..], -9_223_372_036_854_775_808_i64))
1852 );
1853 }
1854
1855 #[test]
le_i128_tests()1856 fn le_i128_tests() {
1857 assert_parse!(
1858 le_i128(
1859 &[
1860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1861 0x00
1862 ][..]
1863 ),
1864 Ok((&b""[..], 0))
1865 );
1866 assert_parse!(
1867 le_i128(
1868 &[
1869 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1870 0x7f
1871 ][..]
1872 ),
1873 Ok((
1874 &b""[..],
1875 170_141_183_460_469_231_731_687_303_715_884_105_727_i128
1876 ))
1877 );
1878 assert_parse!(
1879 le_i128(
1880 &[
1881 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1882 0xff
1883 ][..]
1884 ),
1885 Ok((&b""[..], -1))
1886 );
1887 assert_parse!(
1888 le_i128(
1889 &[
1890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1891 0x80
1892 ][..]
1893 ),
1894 Ok((
1895 &b""[..],
1896 -170_141_183_460_469_231_731_687_303_715_884_105_728_i128
1897 ))
1898 );
1899 }
1900
1901 #[test]
be_f32_tests()1902 fn be_f32_tests() {
1903 assert_parse!(be_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32)));
1904 assert_parse!(
1905 be_f32(&[0x4d, 0x31, 0x1f, 0xd8][..]),
1906 Ok((&b""[..], 185_728_392_f32))
1907 );
1908 }
1909
1910 #[test]
be_f64_tests()1911 fn be_f64_tests() {
1912 assert_parse!(
1913 be_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
1914 Ok((&b""[..], 0_f64))
1915 );
1916 assert_parse!(
1917 be_f64(&[0x41, 0xa6, 0x23, 0xfb, 0x10, 0x00, 0x00, 0x00][..]),
1918 Ok((&b""[..], 185_728_392_f64))
1919 );
1920 }
1921
1922 #[test]
le_f32_tests()1923 fn le_f32_tests() {
1924 assert_parse!(le_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32)));
1925 assert_parse!(
1926 le_f32(&[0xd8, 0x1f, 0x31, 0x4d][..]),
1927 Ok((&b""[..], 185_728_392_f32))
1928 );
1929 }
1930
1931 #[test]
le_f64_tests()1932 fn le_f64_tests() {
1933 assert_parse!(
1934 le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
1935 Ok((&b""[..], 0_f64))
1936 );
1937 assert_parse!(
1938 le_f64(&[0x00, 0x00, 0x00, 0x10, 0xfb, 0x23, 0xa6, 0x41][..]),
1939 Ok((&b""[..], 185_728_392_f64))
1940 );
1941 }
1942
1943 #[test]
hex_u32_tests()1944 fn hex_u32_tests() {
1945 assert_parse!(
1946 hex_u32(&b";"[..]),
1947 Err(Err::Error(error_position!(&b";"[..], ErrorKind::IsA)))
1948 );
1949 assert_parse!(hex_u32(&b"ff;"[..]), Ok((&b";"[..], 255)));
1950 assert_parse!(hex_u32(&b"1be2;"[..]), Ok((&b";"[..], 7138)));
1951 assert_parse!(hex_u32(&b"c5a31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
1952 assert_parse!(hex_u32(&b"C5A31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
1953 assert_parse!(hex_u32(&b"00c5a31be2;"[..]), Ok((&b"e2;"[..], 12_952_347)));
1954 assert_parse!(
1955 hex_u32(&b"c5a31be201;"[..]),
1956 Ok((&b"01;"[..], 3_315_801_058))
1957 );
1958 assert_parse!(hex_u32(&b"ffffffff;"[..]), Ok((&b";"[..], 4_294_967_295)));
1959 assert_parse!(hex_u32(&b"0x1be2;"[..]), Ok((&b"x1be2;"[..], 0)));
1960 assert_parse!(hex_u32(&b"12af"[..]), Ok((&b""[..], 0x12af)));
1961 }
1962
1963 #[test]
1964 #[cfg(feature = "std")]
float_test()1965 fn float_test() {
1966 let mut test_cases = vec![
1967 "+3.14",
1968 "3.14",
1969 "-3.14",
1970 "0",
1971 "0.0",
1972 "1.",
1973 ".789",
1974 "-.5",
1975 "1e7",
1976 "-1E-7",
1977 ".3e-2",
1978 "1.e4",
1979 "1.2e4",
1980 "12.34",
1981 "-1.234E-12",
1982 "-1.234e-12",
1983 "0.00000000000000000087",
1984 ];
1985
1986 for test in test_cases.drain(..) {
1987 let expected32 = str::parse::<f32>(test).unwrap();
1988 let expected64 = str::parse::<f64>(test).unwrap();
1989
1990 println!("now parsing: {} -> {}", test, expected32);
1991
1992 let larger = format!("{}", test);
1993 assert_parse!(recognize_float(&larger[..]), Ok(("", test)));
1994
1995 assert_parse!(float(larger.as_bytes()), Ok((&b""[..], expected32)));
1996 assert_parse!(float(&larger[..]), Ok(("", expected32)));
1997
1998 assert_parse!(double(larger.as_bytes()), Ok((&b""[..], expected64)));
1999 assert_parse!(double(&larger[..]), Ok(("", expected64)));
2000 }
2001
2002 let remaining_exponent = "-1.234E-";
2003 assert_parse!(
2004 recognize_float(remaining_exponent),
2005 Err(Err::Failure(("", ErrorKind::Digit)))
2006 );
2007
2008 let (_i, nan) = float::<_, ()>("NaN").unwrap();
2009 assert!(nan.is_nan());
2010
2011 let (_i, inf) = float::<_, ()>("inf").unwrap();
2012 assert!(inf.is_infinite());
2013 let (_i, inf) = float::<_, ()>("infinite").unwrap();
2014 assert!(inf.is_infinite());
2015 }
2016
2017 #[test]
configurable_endianness()2018 fn configurable_endianness() {
2019 use crate::number::Endianness;
2020
2021 fn be_tst16(i: &[u8]) -> IResult<&[u8], u16> {
2022 u16(Endianness::Big)(i)
2023 }
2024 fn le_tst16(i: &[u8]) -> IResult<&[u8], u16> {
2025 u16(Endianness::Little)(i)
2026 }
2027 assert_eq!(be_tst16(&[0x80, 0x00]), Ok((&b""[..], 32_768_u16)));
2028 assert_eq!(le_tst16(&[0x80, 0x00]), Ok((&b""[..], 128_u16)));
2029
2030 fn be_tst32(i: &[u8]) -> IResult<&[u8], u32> {
2031 u32(Endianness::Big)(i)
2032 }
2033 fn le_tst32(i: &[u8]) -> IResult<&[u8], u32> {
2034 u32(Endianness::Little)(i)
2035 }
2036 assert_eq!(
2037 be_tst32(&[0x12, 0x00, 0x60, 0x00]),
2038 Ok((&b""[..], 302_014_464_u32))
2039 );
2040 assert_eq!(
2041 le_tst32(&[0x12, 0x00, 0x60, 0x00]),
2042 Ok((&b""[..], 6_291_474_u32))
2043 );
2044
2045 fn be_tst64(i: &[u8]) -> IResult<&[u8], u64> {
2046 u64(Endianness::Big)(i)
2047 }
2048 fn le_tst64(i: &[u8]) -> IResult<&[u8], u64> {
2049 u64(Endianness::Little)(i)
2050 }
2051 assert_eq!(
2052 be_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
2053 Ok((&b""[..], 1_297_142_246_100_992_000_u64))
2054 );
2055 assert_eq!(
2056 le_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
2057 Ok((&b""[..], 36_028_874_334_666_770_u64))
2058 );
2059
2060 fn be_tsti16(i: &[u8]) -> IResult<&[u8], i16> {
2061 i16(Endianness::Big)(i)
2062 }
2063 fn le_tsti16(i: &[u8]) -> IResult<&[u8], i16> {
2064 i16(Endianness::Little)(i)
2065 }
2066 assert_eq!(be_tsti16(&[0x00, 0x80]), Ok((&b""[..], 128_i16)));
2067 assert_eq!(le_tsti16(&[0x00, 0x80]), Ok((&b""[..], -32_768_i16)));
2068
2069 fn be_tsti32(i: &[u8]) -> IResult<&[u8], i32> {
2070 i32(Endianness::Big)(i)
2071 }
2072 fn le_tsti32(i: &[u8]) -> IResult<&[u8], i32> {
2073 i32(Endianness::Little)(i)
2074 }
2075 assert_eq!(
2076 be_tsti32(&[0x00, 0x12, 0x60, 0x00]),
2077 Ok((&b""[..], 1_204_224_i32))
2078 );
2079 assert_eq!(
2080 le_tsti32(&[0x00, 0x12, 0x60, 0x00]),
2081 Ok((&b""[..], 6_296_064_i32))
2082 );
2083
2084 fn be_tsti64(i: &[u8]) -> IResult<&[u8], i64> {
2085 i64(Endianness::Big)(i)
2086 }
2087 fn le_tsti64(i: &[u8]) -> IResult<&[u8], i64> {
2088 i64(Endianness::Little)(i)
2089 }
2090 assert_eq!(
2091 be_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
2092 Ok((&b""[..], 71_881_672_479_506_432_i64))
2093 );
2094 assert_eq!(
2095 le_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
2096 Ok((&b""[..], 36_028_874_334_732_032_i64))
2097 );
2098 }
2099
2100 #[cfg(feature = "std")]
parse_f64(i: &str) -> IResult<&str, f64, ()>2101 fn parse_f64(i: &str) -> IResult<&str, f64, ()> {
2102 match recognize_float_or_exceptions(i) {
2103 Err(e) => Err(e),
2104 Ok((i, s)) => {
2105 if s.is_empty() {
2106 return Err(Err::Error(()));
2107 }
2108 match s.parse_to() {
2109 Some(n) => Ok((i, n)),
2110 None => Err(Err::Error(())),
2111 }
2112 }
2113 }
2114 }
2115
2116 proptest! {
2117 #[test]
2118 #[cfg(feature = "std")]
2119 fn floats(s in "\\PC*") {
2120 println!("testing {}", s);
2121 let res1 = parse_f64(&s);
2122 let res2 = double::<_, ()>(s.as_str());
2123 assert_eq!(res1, res2);
2124 }
2125 }
2126 }
2127