From 6e0e5c102e449d4a27979c8f86e088e33b9141ad Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 31 Jan 2022 20:43:35 +0100 Subject: [PATCH] Added extractModeName() utility function. --- wled00/fcn_declare.h | 1 + wled00/util.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index a139cb2f7..411fa892f 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -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 { diff --git a/wled00/util.cpp b/wled00/util.cpp index 5027e7ff8..3f15412ad 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -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); +}