4 (1) DONE - In bitmatch operator, use patterns not expressions.
6 (2) DONE - Allow matching against strings.
8 (3) DONE - Change the syntax so { ... } surrounds match patterns.
10 (4) Provide UInt32 and UInt64 types.
12 (5) DONE - Allow for specific offsets and alignment. Something like this:
15 another : 16 : offset(256); (* location would be 256 bits from start *)
21 another : 16 : align(32); (* implicit 16 bit gap before this *)
26 { start : 16 : assert (offset = 0); }
28 (Q: Are these evaluated at compile time or at run time or selectable?)
30 (8) Named but unbound patterns to avoid "Warning Y: unused variable".
33 Make the error locations fine-grained, particularly so they point to
34 individual fields, not the whole match.
36 (10) DONE - Cross-module, persistent, named patterns, see:
37 http://caml.inria.fr/pub/ml-archives/caml-list/2008/04/25992c9c9fa999fe1d35d961dd9917a2.en.html
40 Runtime endiannness expressions. The suggested syntax is:
42 { field : len : endian (expr) }
44 where expr would evaluate to something like BigEndian or
47 There are several protocols around where endianness is only
48 determined at runtime, examples are libpcap and TIFF.
50 (12) DONE - More constant field lengths.
52 (13) PARTLY DONE - Implement native endian functions.
54 (14) PARTLY DONE - A proper test suite.
56 (15) DONE - More examples:
61 (16) We now know the offset of the current field relative to the
62 whole match. This may allow more efficient aligned versions
63 of functions to be called (at compile time). However do note
64 that the offset in the bitstring is usually not known.
66 (17) PARTLY DONE - Fix the META file. Current one is very broken.
68 (18) when() qualifier:
70 { field : 16 : when (field > 100) }
72 The when(expr) qualifier will abort the rest of the match if the
75 (19) bind() qualifier:
77 { field : 16 : bind (field * 3) }
80 The bind(expr) qualifier binds the pattern to a new value,
83 let field = field * 3 in
84 (* remainder of match *)
86 There is a question of whether bind() should run before or
87 after when() [best is probably when() first, then bind()].
89 (20) save_offset_to() qualifier:
91 { field : 16 : save_offset_to (offset), bind (field - offset) }
95 { field : 16 : save_offset_to (field_offset) } ->
96 printf "the offset of field (%d) is %d\n" field field_offset
98 save_offset_to(patt) binds the current match offset to
99 the variable, for later use within bind(), when() or
100 any later parts of the match.