vte/
definitions.rs

1#[allow(dead_code)]
2#[derive(Debug, Copy, Clone)]
3pub enum State {
4   Anywhere = 0,
5   CsiEntry = 1,
6   CsiIgnore = 2,
7   CsiIntermediate = 3,
8   CsiParam = 4,
9   DcsEntry = 5,
10   DcsIgnore = 6,
11   DcsIntermediate = 7,
12   DcsParam = 8,
13   DcsPassthrough = 9,
14   Escape = 10,
15   EscapeIntermediate = 11,
16   Ground = 12,
17   OscString = 13,
18   SosPmApcString = 14,
19   Utf8 = 15,
20}
21
22#[allow(dead_code)]
23#[derive(Debug, Clone, Copy)]
24pub enum Action {
25   None = 0,
26   Clear = 1,
27   Collect = 2,
28   CsiDispatch = 3,
29   EscDispatch = 4,
30   Execute = 5,
31   Hook = 6,
32   Ignore = 7,
33   OscEnd = 8,
34   OscPut = 9,
35   OscStart = 10,
36   Param = 11,
37   Print = 12,
38   Put = 13,
39   Unhook = 14,
40   BeginUtf8 = 15,
41}
42
43/// Unpack a u8 into a State and Action
44///
45/// The implementation of this assumes that there are *precisely* 16 variants for both Action and
46/// State. Furthermore, it assumes that the enums are tag-only; that is, there is no data in any
47/// variant.
48///
49/// Bad things will happen if those invariants are violated.
50#[inline(always)]
51pub fn unpack(delta: u8) -> (State, Action) {
52    (
53        // State is stored in bottom 4 bits
54        unsafe { ::core::mem::transmute(delta & 0x0f) },
55
56        // Action is stored in top 4 bits
57        unsafe { ::core::mem::transmute(delta >> 4) },
58    )
59}
60
61#[cfg(test)]
62mod tests {
63    use super::{State, Action, unpack};
64    #[test]
65    fn unpack_state_action() {
66        match unpack(0xee) {
67            (State::SosPmApcString, Action::Unhook) => (),
68            _ => panic!("unpack failed"),
69        }
70
71        match unpack(0x0f) {
72            (State::Utf8, Action::None) => (),
73            _ => panic!("unpack failed"),
74        }
75
76        match unpack(0xff) {
77            (State::Utf8, Action::BeginUtf8) => (),
78            _ => panic!("unpack failed"),
79        }
80    }
81}