mirror of
https://github.com/odriverobotics/ODrive.git
synced 2026-02-08 16:31:52 +08:00
48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
|
|
#include <fibre/channel_discoverer.hpp>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <algorithm>
|
|
|
|
using namespace fibre;
|
|
|
|
bool ChannelDiscoverer::try_parse_key(const char* begin, const char* end, const char* key, const char** val_begin, const char** val_end) {
|
|
ssize_t keylen = strlen(key);
|
|
|
|
while (begin != end) {
|
|
const char* next_delim = std::find(begin, end, ',');
|
|
|
|
if ((next_delim - begin >= keylen) && (memcmp(begin, key, keylen) == 0)) {
|
|
if (next_delim - begin == keylen) {
|
|
// The key exists but has no value
|
|
*val_begin = *val_end = next_delim;
|
|
return true;
|
|
} else if (begin[keylen] == '=') {
|
|
*val_begin = begin + keylen + 1;
|
|
*val_end = next_delim;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
begin = std::min(next_delim + 1, end);
|
|
}
|
|
|
|
return false; // key not found
|
|
}
|
|
|
|
bool ChannelDiscoverer::try_parse_key(const char* begin, const char* end, const char* key, int* val) {
|
|
const char* val_begin;
|
|
const char* val_end;
|
|
if (!try_parse_key(begin, end, key, &val_begin, &val_end)) {
|
|
return false;
|
|
}
|
|
|
|
// Copy value to a null-terminated buffer
|
|
char buf[val_end - val_begin + 1];
|
|
memcpy(buf, val_begin, val_end - val_begin);
|
|
buf[val_end - val_begin] = 0;
|
|
|
|
return sscanf(buf, "0x%x", val) == 1
|
|
|| sscanf(buf, "%d", val) == 1;
|
|
}
|