19 bufferMaxCapacity(std::min<size_t>(CMDPARSER_MAX_VALID_CAPACITY,bufferMaxCapacity)),
20 ringbuffer(
RingBufferWrapper(std::min<size_t>(CMDPARSER_MAX_VALID_CAPACITY,bufferMaxCapacity)))
44 for(uint32_t i=0;i<*Len;i++){
47 if(c ==
'\n' || c ==
'\r' || c ==
';'|| c ==
' '){
48 *(Buf+i) = (uint8_t)
';';
89 uint32_t bufferlen = std::min<size_t>(CMDPARSER_MAX_VALID_CAPACITY,
ringbuffer.
length());
104 std::string word(buf+lpos,buf+
pos);
109 uint8_t cmd_start = 0;
111 uint32_t point1 = word.find(
'.', 0);
112 uint32_t point2 = word.find(
'.', point1+1);
117 if(point1 != std::string::npos){
118 cmd_start = point1+1;
119 clsname = word.substr(0, point1);
124 if(point2 != std::string::npos){
126 cmd.
instance = word[point1+1] >=
'0' ? word[point1+1] -
'0' : 0;
127 cmd_start = point2+1;
130 std::string cmdstring;
131 if(word.back() ==
'?'){
133 cmdstring = word.substr(cmd_start, word.length()-cmd_start - 1);
135 }
else if(word.back() ==
'!'){
136 cmdstring = word.substr(cmd_start, word.length()-cmd_start - 1);
139 }
else if(word.back() ==
'='){
140 cmdstring = word.substr(cmd_start, word.length()-cmd_start);
145 uint32_t peq = word.find(
'=', 0);
146 uint32_t pqm = word.find(
'?', 0);
149 if(pqm == std::string::npos && peq == std::string::npos){
150 cmdstring = word.substr(cmd_start, word.length()-cmd_start);
156 bool validPqm = (pqm != std::string::npos && (std::isdigit(word[pqm+1]) || (std::isdigit(word[pqm+2]) && (word[pqm+1] ==
'-' || word[pqm+1] ==
'+')) || ( std::isxdigit(word[pqm+2]) && word[pqm+1] ==
'x')));
157 bool validPeq = (peq != std::string::npos && (std::isdigit(word[peq+1]) || (std::isdigit(word[peq+2]) && (word[peq+1] ==
'-' || word[peq+1] ==
'+')) || ( std::isxdigit(word[peq+2]) && word[peq+1] ==
'x')));
159 if(validPqm && validPeq && peq < pqm && (abs(pqm - peq) > 1)){
163 if(word[pqm+1] ==
'x'){
164 val2 = (int64_t)std::strtoll(&word[pqm+2],0,16);
166 val2 = (int64_t)std::strtoll(&word[pqm+1],0,10);
169 if(word[peq+1] ==
'x'){
170 val = (int64_t)std::strtoll(word.substr(peq+2, pqm-peq).c_str(),0,16);
172 val = (int64_t)std::strtoll(word.substr(peq+1, pqm-peq).c_str(),0,10);
175 cmdstring = word.substr(cmd_start, peq-cmd_start);
182 if(word[pqm+1] ==
'x'){
183 val = (int64_t)std::strtoll(&word[pqm+2],0,16);
185 val = (int64_t)std::strtoll(&word[pqm+1],0,10);
190 cmdstring = word.substr(cmd_start, pqm-cmd_start);
195 if(word[peq+1] ==
'x'){
196 val = (int64_t)std::strtoll(&word[peq+2],0,16);
198 val = (int64_t)std::strtoll(&word[peq+1],0,10);
203 cmdstring = word.substr(cmd_start, peq-cmd_start);
218 if(cmd.
target !=
nullptr){
223 commands.push_back(cmd);
238 if(targets.size() > 1)
244 commands.push_back(newCmd);
251 error.
info +=
":"+clsname+
"."+cmdstring;
RingBufferWrapper ringbuffer
bool parse(std::vector< ParsedCommand > &commands)
CmdParser(const uint32_t bufferMaxCapacity=512)
void setClearBufferTimeout(uint32_t timeout)
bool add(char *Buf, uint32_t *Len)
uint32_t clearBufferTimeout
const uint32_t bufferMaxCapacity
static std::vector< CommandHandler * > getHandlersFromClassName(const char *name)
static CommandHandler * getHandlerFromClassName(const char *name, const uint8_t instance=0xFF)
virtual CmdHandlerCommanddef * getCommandFromName(const std::string &cmd, uint32_t ignoredFlags=0)
static void addError(const Error &error)
static Error cmdNotFoundError
size_t freeSpace() noexcept
size_t discardMultiple(size_t len) noexcept
size_t peekMultiple(uint8_t *dst, size_t len) noexcept
size_t appendMultiple(const uint8_t *data, size_t len) noexcept