86 const packet_type type = packet_recognizer::recognize(payload);
87 if (type == packet_type::unknown)
91 string_view args = payload;
92 if (payload.starts_with(meta.
prefix)) {
93 args = payload.substr(meta.
prefix.size());
98 case packet_type::continue_with_signal:
99 case packet_type::step_with_signal:
100 out_view.signal =
static_cast<uint8_t
>(detail::parse_hex_int(args));
103 case packet_type::read_memory: {
105 out_view.addr = detail::parse_hex_int(args, &consumed);
106 if (consumed < args.size() && args[consumed] ==
',') {
107 out_view.length =
static_cast<size_t>(detail::parse_hex_int(args.substr(consumed + 1)));
112 case packet_type::write_memory_hex:
113 case packet_type::write_memory_binary:
114 case packet_type::search_memory: {
116 if (type == packet_type::search_memory && args.starts_with(
":")) {
117 args = args.substr(1);
119 const size_t sep1 = args.find(type == packet_type::search_memory ?
';' :
',');
121 args.find(type == packet_type::search_memory ?
';' :
':', sep1 != string_view::npos ? sep1 + 1 : 0);
123 if (sep1 != string_view::npos && sep2 != string_view::npos) {
124 out_view.addr = detail::parse_hex_int(args.substr(0, sep1));
125 out_view.length =
static_cast<size_t>(detail::parse_hex_int(args.substr(sep1 + 1, sep2 - sep1 - 1)));
127 const string_view data_str = args.substr(sep2 + 1);
128 if (type == packet_type::write_memory_binary) {
129 out_view.data = decode_escaped_binary(data_str, scratch);
131 out_view.data = decode_hex_bytes(data_str, scratch);
137 case packet_type::read_single_register:
138 out_view.reg_index =
static_cast<uint32_t
>(detail::parse_hex_int(args));
141 case packet_type::write_single_register: {
142 const size_t eq = args.find(
'=');
143 if (eq != string_view::npos) {
144 out_view.reg_index =
static_cast<uint32_t
>(detail::parse_hex_int(args.substr(0, eq)));
145 out_view.data = decode_hex_bytes(args.substr(eq + 1), scratch);
150 case packet_type::write_general_registers:
151 out_view.data = decode_hex_bytes(args, scratch);
154 case packet_type::insert_break_watch:
155 case packet_type::remove_break_watch: {
157 out_view.bp_type =
static_cast<uint8_t
>(args[0] -
'0');
158 const size_t c1 = args.find(
',');
159 const size_t c2 = args.find(
',', c1 != string_view::npos ? c1 + 1 : 0);
160 if (c1 != string_view::npos && c2 != string_view::npos) {
161 out_view.addr = detail::parse_hex_int(args.substr(c1 + 1, c2 - c1 - 1));
162 out_view.bp_kind =
static_cast<uint32_t
>(detail::parse_hex_int(args.substr(c2 + 1)));
167 case packet_type::set_thread:
168 if (args.size() > 0) {
169 out_view.thread_action = args[0];
170 out_view.thread_id = detail::parse_thread_id(args.substr(1));
174 case packet_type::thread_is_alive:
175 out_view.thread_id = detail::parse_thread_id(args);
178 case packet_type::unknown:
179 case packet_type::enable_extended_mode:
180 case packet_type::halt_reason:
181 case packet_type::continue_exec:
182 case packet_type::step_exec:
183 case packet_type::kill:
184 case packet_type::detach:
185 case packet_type::restart:
186 case packet_type::read_general_registers:
187 case packet_type::query_supported:
188 case packet_type::query_first_thread_info:
189 case packet_type::query_subsequent_thread:
190 case packet_type::query_current_thread:
193 out_view.extra_text = args;