Helper: Unescape JSON string (only call if has_escape_sequences() returns true)
| 629 | |
| 630 | // Helper: Unescape JSON string (only call if has_escape_sequences() returns true) |
| 631 | fl::string unescape_string(const fl::span<const char>& span) { |
| 632 | fl::string result; |
| 633 | result.reserve(span.size()); |
| 634 | |
| 635 | for (size_t i = 0; i < span.size(); i++) { |
| 636 | if (span[i] == '\\' && i + 1 < span.size()) { |
| 637 | char next = span[i + 1]; |
| 638 | switch (next) { |
| 639 | case '"': result += '"'; i++; break; |
| 640 | case '\\': result += '\\'; i++; break; |
| 641 | case '/': result += '/'; i++; break; |
| 642 | case 'b': result += '\b'; i++; break; |
| 643 | case 'f': result += '\f'; i++; break; |
| 644 | case 'n': result += '\n'; i++; break; |
| 645 | case 'r': result += '\r'; i++; break; |
| 646 | case 't': result += '\t'; i++; break; |
| 647 | default: result += span[i]; break; // Pass through unknown escapes |
| 648 | } |
| 649 | } else { |
| 650 | result += span[i]; |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | return result; |
| 655 | } |
| 656 | |
| 657 | // Array optimization helpers (Milestone 9) |
| 658 | enum ArrayType { ALL_UINT8, ALL_INT16, ALL_FLOATS, GENERIC_ARRAY }; |