FastLED 3.10.9
Loading...
Searching...
No Matches

◆ unescape_string()

fl::string fl::anonymous_namespace{json.cpp.hpp}::unescape_string ( const fl::span< const char > & span)

Definition at line 676 of file json.cpp.hpp.

676 {
678 result.reserve(span.size());
679
680 for (size_t i = 0; i < span.size(); i++) {
681 if (span[i] == '\\' && i + 1 < span.size()) {
682 char next = span[i + 1];
683 switch (next) {
684 case '"': result += '"'; i++; break;
685 case '\\': result += '\\'; i++; break;
686 case '/': result += '/'; i++; break;
687 case 'b': result += '\b'; i++; break;
688 case 'f': result += '\f'; i++; break;
689 case 'n': result += '\n'; i++; break;
690 case 'r': result += '\r'; i++; break;
691 case 't': result += '\t'; i++; break;
692 case 'u': {
693 long cp = read_hex4(span, i + 2);
694 if (cp < 0) {
695 result += span[i]; // Malformed: pass through
696 break;
697 }
698 size_t consumed = 5;
699 // Combine a UTF-16 surrogate pair into one code point.
700 if (cp >= 0xD800 && cp <= 0xDBFF && i + 11 < span.size() &&
701 span[i + 6] == '\\' && span[i + 7] == 'u') {
702 long lo = read_hex4(span, i + 8);
703 if (lo >= 0xDC00 && lo <= 0xDFFF) {
704 cp = 0x10000 + ((cp - 0xD800) << 10) + (lo - 0xDC00);
705 consumed = 11;
706 }
707 }
708 // An unpaired surrogate has no UTF-8 encoding; emit U+FFFD.
709 if (cp >= 0xD800 && cp <= 0xDFFF) {
710 cp = 0xFFFD;
711 }
712 append_utf8(result, static_cast<unsigned long>(cp));
713 i += consumed;
714 break;
715 }
716 default: result += span[i]; break; // Pass through unknown escapes
717 }
718 } else {
719 result += span[i];
720 }
721 }
722
723 return result;
724}
constexpr fl::size size() const FL_NO_EXCEPT
Definition span.h:483
long read_hex4(const fl::span< const char > &span, size_t pos) FL_NO_EXCEPT
Definition json.cpp.hpp:642
void append_utf8(fl::string &out, unsigned long cp) FL_NO_EXCEPT
Definition json.cpp.hpp:657
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31

References append_utf8(), fl::FL_NO_EXCEPT, read_hex4(), fl::span< T, Extent >::size(), and unescape_string().

Referenced by fl::anonymous_namespace{json.cpp.hpp}::JsonBuilder::on_token(), and unescape_string().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: