gdbstub 0.7.10

An implementation of the GDB Remote Serial Protocol in Rust
Documentation
use super::prelude::*;
use crate::target::ext::tracepoints::Tracepoint;
use crate::target::ext::tracepoints::TracepointSourceType;

pub struct QTDPsrc<'a> {
    pub number: Tracepoint,
    pub addr: &'a [u8],
    pub kind: TracepointSourceType,
    pub start: u32,
    pub slen: u32,
    pub bytes: &'a mut [u8],
}

impl<'a> ParseCommand<'a> for QTDPsrc<'a> {
    #[inline(always)]
    fn from_packet(buf: PacketBuf<'a>) -> Option<Self> {
        let body = buf.into_body();
        match body {
            [b':', info @ ..] => {
                let mut params = info.splitn_mut(7, |b| *b == b':');
                let number = Tracepoint(decode_hex(params.next()?).ok()?);
                let addr = decode_hex_buf(params.next()?).ok()?;
                // Clippy incorrect thinks this as_ref isn't needed, but it is.
                #[allow(clippy::useless_asref)]
                let kind = match params.next()?.as_ref() {
                    b"at" => Some(TracepointSourceType::At),
                    b"cond" => Some(TracepointSourceType::Cond),
                    b"cmd" => Some(TracepointSourceType::Cmd),
                    _ => None,
                }?;
                let start = decode_hex(params.next()?).ok()?;
                let slen = decode_hex(params.next()?).ok()?;
                let bytes = decode_hex_buf(params.next()?).ok()?;
                Some(QTDPsrc {
                    number,
                    addr,
                    kind,
                    start,
                    slen,
                    bytes,
                })
            }
            _ => None,
        }
    }
}