Fixed CLI array assignment. (#5589)

This commit is contained in:
Michael Keller 2018-04-01 10:57:19 +12:00 committed by GitHub
parent 1a29e88f57
commit c3cb2e1605
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 26 deletions

View File

@ -2998,59 +2998,64 @@ STATIC_UNIT_TESTED void cliSet(char *cmdline)
const uint8_t arrayLength = val->config.array.length; const uint8_t arrayLength = val->config.array.length;
char *valPtr = eqptr; char *valPtr = eqptr;
for (int i = 0; i < arrayLength; i++) { int i = 0;
while (i < arrayLength && valPtr != NULL) {
// skip spaces // skip spaces
valPtr = skipSpace(valPtr); valPtr = skipSpace(valPtr);
// find next comma (or end of string)
char *valEndPtr = strchr(valPtr, ',');
// comma found or last item? // process substring starting at valPtr
if ((valEndPtr != NULL) || (i == arrayLength - 1)){ // note: no need to copy substrings for atoi()
// process substring [valPtr, valEndPtr[ // it stops at the first character that cannot be converted...
// note: no need to copy substrings for atoi() switch (val->type & VALUE_TYPE_MASK) {
// it stops at the first character that cannot be converted... default:
switch (val->type & VALUE_TYPE_MASK) { case VAR_UINT8:
default: {
case VAR_UINT8: {
// fetch data pointer // fetch data pointer
uint8_t *data = (uint8_t *)cliGetValuePointer(val) + i; uint8_t *data = (uint8_t *)cliGetValuePointer(val) + i;
// store value // store value
*data = (uint8_t)atoi((const char*) valPtr); *data = (uint8_t)atoi((const char*) valPtr);
} }
break;
case VAR_INT8: { break;
case VAR_INT8:
{
// fetch data pointer // fetch data pointer
int8_t *data = (int8_t *)cliGetValuePointer(val) + i; int8_t *data = (int8_t *)cliGetValuePointer(val) + i;
// store value // store value
*data = (int8_t)atoi((const char*) valPtr); *data = (int8_t)atoi((const char*) valPtr);
} }
break;
case VAR_UINT16: { break;
case VAR_UINT16:
{
// fetch data pointer // fetch data pointer
uint16_t *data = (uint16_t *)cliGetValuePointer(val) + i; uint16_t *data = (uint16_t *)cliGetValuePointer(val) + i;
// store value // store value
*data = (uint16_t)atoi((const char*) valPtr); *data = (uint16_t)atoi((const char*) valPtr);
} }
break;
case VAR_INT16: { break;
case VAR_INT16:
{
// fetch data pointer // fetch data pointer
int16_t *data = (int16_t *)cliGetValuePointer(val) + i; int16_t *data = (int16_t *)cliGetValuePointer(val) + i;
// store value // store value
*data = (int16_t)atoi((const char*) valPtr); *data = (int16_t)atoi((const char*) valPtr);
}
break;
} }
// mark as changed
valueChanged = true;
// prepare to parse next item break;
valPtr = valEndPtr + 1;
} }
// find next comma (or end of string)
valPtr = strchr(valPtr, ',') + 1;
i++;
} }
} }
// mark as changed
valueChanged = true;
break; break;
} }