ms_oforms/common/
parser.rs1use nom::{le_u8, le_u16, le_u32, le_u64, le_i16, le_i32};
2use super::GUID;
3
4named_args!(pub check_guid(guid: GUID)<GUID>,
5 verify!(parse_guid, |x| x == guid)
6);
7
8named!(pub parse_guid<GUID>,
9 do_parse!(
10 d1: le_u32 >>
11 d2: le_u16 >>
12 d3: le_u16 >>
13 d4: le_u64 >>
14 (GUID(d1,d2,d3,d4))
15 )
16);
17
18named_args!(pub align<'a>(offset: &'a mut usize, count: usize)<usize>,
19 do_parse!(
20 p1: value!(*offset % count) >>
21 p2: value!(if p1 == 0 { 0 } else { count - p1 }) >>
22 take!(p2) >>
23 ({*offset += p2; *offset})
24 )
25);
26
27named_args!(pub aligned_le_u32<'a>(offset: &'a mut usize)<u32>,
28 do_parse!(
29 call!(align, offset, 4) >>
30 val: map!(le_u32, |x| { *offset += 4; x }) >>
31 (val)
32 )
33);
34
35named_args!(pub aligned_le_i32<'a>(offset: &'a mut usize)<i32>,
36 do_parse!(
37 call!(align, offset, 4) >>
38 val: map!(le_i32, |x| { *offset += 4; x }) >>
39 (val)
40 )
41);
42
43named_args!(pub aligned_le_u16<'a>(offset: &'a mut usize)<u16>,
44 do_parse!(
45 call!(align, offset, 2) >>
46 val: map!(le_u16, |x| { *offset += 2; x }) >>
47 (val)
48 )
49);
50
51named_args!(pub aligned_le_i16<'a>(offset: &'a mut usize)<i16>,
52 do_parse!(
53 call!(align, offset, 2) >>
54 val: map!(le_i16, |x| { *offset += 2; x }) >>
55 (val)
56 )
57);
58
59named_args!(pub aligned_le_u8<'a>(offset: &'a mut usize)<u8>,
60 map!(le_u8, |x| { *offset += 1; x })
61);