Added extractModeName() utility function.
This commit is contained in:
parent
be8a9ae73b
commit
6e0e5c102e
@ -222,6 +222,7 @@ void sendSysInfoUDP();
|
||||
//bool isAsterisksOnly(const char* str, byte maxLen);
|
||||
bool requestJSONBufferLock(uint8_t module=255);
|
||||
void releaseJSONBufferLock();
|
||||
uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen);
|
||||
|
||||
//um_manager.cpp
|
||||
class Usermod {
|
||||
|
@ -31,3 +31,38 @@ void releaseJSONBufferLock()
|
||||
fileDoc = nullptr;
|
||||
jsonBufferLock = 0;
|
||||
}
|
||||
|
||||
|
||||
// extracts effect mode (or palette) name from names serialized string
|
||||
// caller must provide large enough buffer for name (incluing SR extensions)!
|
||||
uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen)
|
||||
{
|
||||
uint8_t qComma = 0;
|
||||
bool insideQuotes = false;
|
||||
uint8_t printedChars = 0;
|
||||
char singleJsonSymbol;
|
||||
size_t len = strlen_P(src);
|
||||
|
||||
// Find the mode name in JSON
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
singleJsonSymbol = pgm_read_byte_near(src + i);
|
||||
if (singleJsonSymbol == '\0') break;
|
||||
if (singleJsonSymbol == '@' && insideQuotes && qComma == mode) break; //stop when SR extension encountered
|
||||
switch (singleJsonSymbol) {
|
||||
case '"':
|
||||
insideQuotes = !insideQuotes;
|
||||
break;
|
||||
case '[':
|
||||
case ']':
|
||||
break;
|
||||
case ',':
|
||||
if (!insideQuotes) qComma++;
|
||||
default:
|
||||
if (!insideQuotes || (qComma != mode)) break;
|
||||
dest[printedChars++] = singleJsonSymbol;
|
||||
}
|
||||
if ((qComma > mode) || (printedChars >= maxLen)) break;
|
||||
}
|
||||
dest[printedChars] = '\0';
|
||||
return strlen(dest);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user