8#include "../microfmt.hpp"
28 static constexpr size_t k_count_multichar = []() ->
size_t {
30#define __INSPECTOR_GDB_PACKET_TYPE_X(name, str) \
31 if constexpr (sizeof(str) > 2) { \
35#undef __INSPECTOR_GDB_PACKET_TYPE_X
39 static constexpr auto k_multi_char_table = []() {
40 reloco::array<packet_entry, k_count_multichar> sub{};
42#define __INSPECTOR_GDB_PACKET_TYPE_X(name, str) \
43 if constexpr (sizeof(str) > 2) { \
44 sub[idx++] = packet_entry{str, packet_type::name}; \
47#undef __INSPECTOR_GDB_PACKET_TYPE_X
57 static constexpr auto k_first_byte_table = []() {
58 reloco::array<packet_type, 128> table{};
59 for (
size_t i = 0; i < 128; ++i) {
60 table[i] = packet_type::unknown;
63#define __INSPECTOR_GDB_PACKET_TYPE_X(name, str) \
64 if constexpr (sizeof(str) > 2) { \
65 const unsigned char c = static_cast<unsigned char>((str)[0]); \
67 table[c] = packet_type::_multi_char_marker; \
69 } else if constexpr (sizeof(str) == 2) { \
70 const unsigned char c = static_cast<unsigned char>((str)[0]); \
72 table[c] = packet_type::name; \
76#undef __INSPECTOR_GDB_PACKET_TYPE_X
88 if (payload.empty()) {
89 return packet_type::unknown;
92 const unsigned char first_char =
static_cast<unsigned char>(payload[0]);
93 if (first_char >= 128) {
94 return packet_type::unknown;
97 const packet_type match = k_first_byte_table[first_char];
100 if (match != packet_type::_multi_char_marker) {
105 for (
const auto &entry : k_multi_char_table) {
106 if (payload.substr(0, entry.prefix.size()) == entry.prefix) {
111 return packet_type::unknown;
Zero-allocation packet payload recognizer.
Definition gdb_packet_recognizer.hpp:18
static constexpr packet_type recognize(string_view payload) noexcept
Identifies the high-level packet_type from a raw GDB packet payload.
Definition gdb_packet_recognizer.hpp:87
#define MICROFMT_API_CLASS
Definition compat.hpp:181
#define __INSPECTOR_GDB_PACKET_TYPE_X(name, str)
Comprehensive enumeration of GDB RSP packet types.
#define INSPECTOR_GDB_PACKET_LIST(X)
Definition gdb_packet_types.hpp:12
Definition gdb_decoders.hpp:15
packet_type
High-level classification of GDB Remote Serial Protocol commands.
Definition gdb_packet_types.hpp:64
Definition gdb_packet_recognizer.hpp:52
bool is_multi_char
Definition gdb_packet_recognizer.hpp:54
packet_type type
Definition gdb_packet_recognizer.hpp:53
Definition gdb_packet_recognizer.hpp:20
packet_type type
Definition gdb_packet_recognizer.hpp:23
microfmt::string_view prefix
Definition gdb_packet_recognizer.hpp:22
constexpr bool operator<(const packet_entry &other) const noexcept
Definition gdb_packet_recognizer.hpp:25