ms_oforms/common/
parser.rs

1use 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);