| 699 | // ============================================================================= |
| 700 | |
| 701 | fl::string JSONReporter::escapeJson(const char* text) FL_NOEXCEPT { |
| 702 | if (!text) return fl::string(); |
| 703 | |
| 704 | fl::string result; |
| 705 | for (const char* p = text; *p; ++p) { |
| 706 | switch (*p) { |
| 707 | case '\\': result += "\\\\"; break; |
| 708 | case '"': result += "\\\""; break; |
| 709 | case '\n': result += "\\n"; break; |
| 710 | case '\r': result += "\\r"; break; |
| 711 | case '\t': result += "\\t"; break; |
| 712 | default: |
| 713 | // Handle control characters |
| 714 | if (static_cast<unsigned char>(*p) < 32) { |
| 715 | // Skip control characters or encode them |
| 716 | result += "\\u00"; |
| 717 | char hex[3]; |
| 718 | hex[0] = "0123456789abcdef"[(*p >> 4) & 0xF]; |
| 719 | hex[1] = "0123456789abcdef"[*p & 0xF]; |
| 720 | hex[2] = '\0'; |
| 721 | result += hex; |
| 722 | } else { |
| 723 | result += *p; |
| 724 | } |
| 725 | break; |
| 726 | } |
| 727 | } |
| 728 | return result; |
| 729 | } |
| 730 | |
| 731 | void JSONReporter::testRunStart() FL_NOEXCEPT { |
| 732 | mTestResults.clear(); |