72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
|
#include <cmdbuf.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
static bool parse_hex_digit(char digit, char *out) {
|
||
|
if (digit >= '0' && digit <= '9') {
|
||
|
*out = digit - '0';
|
||
|
return true;
|
||
|
}
|
||
|
if (digit >= 'a' && digit <= 'f') {
|
||
|
*out = digit - 'a' + 10;
|
||
|
return true;
|
||
|
}
|
||
|
if (digit >= 'A' && digit <= 'F') {
|
||
|
*out = digit - 'A' + 10;
|
||
|
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;
|
||
|
}
|