#include #include #include bool cmd_match_str(CommandBuf *cmd, const char *str) { size_t len = strlen(str); if (cmd->len < len) return false; if (!strncmp(cmd->buf, str, len)) { cmd->buf += len; cmd->len -= len; return true; } return false; } bool cmd_match_only_str(CommandBuf *cmd, const char *str) { size_t len = strlen(str); if (cmd->len != len) return false; if (!strncmp(cmd->buf, str, len)) { cmd->buf += len; cmd->len -= len; return true; } return false; } bool cmd_match_hex_number(CommandBuf *cmd, uint32_t *value) { size_t read = 0; size_t max_len = cmd->len; if (max_len > 8) max_len = 8; *value = 0; for (; read < max_len; ++read) { char digit; if (!parse_hex_digit(cmd->buf[read], &digit)) break; *value = (*value << 4) | digit; } if (!read) return false; cmd->buf += read; cmd->len -= read; return true; } bool cmd_match_hex_bytes(CommandBuf *cmd, const uint32_t count, char *value) { if (cmd->len < (count * 2)) return false; for (size_t i = 0; i < count; ++i) { char hi, lo; if (!parse_hex_digit(cmd->buf[i * 2], &hi)) return false; if (!parse_hex_digit(cmd->buf[(i * 2) + 1], &lo)) return false; value[i] = (hi << 4) | lo; } cmd->buf += (count * 2); cmd->len -= (count * 2); return true; }