| 88 | }; |
| 89 | |
| 90 | struct DiffIdentifier : public DiffBase<std::array<uint8_t, sizeof(KTX_header2::identifier)>> { |
| 91 | DiffIdentifier(const std::string_view textHeaderIn, const std::string_view jsonPathIn, |
| 92 | const KTX_header2& value1, const KTX_header2& value2) |
| 93 | : DiffBase<std::array<uint8_t, sizeof(KTX_header2::identifier)>>(textHeaderIn, jsonPathIn, |
| 94 | to_array(value1), to_array(value2)) { |
| 95 | } |
| 96 | |
| 97 | virtual std::string value(std::size_t index, OutputFormat format) const override { |
| 98 | // Convert identifier for better display. |
| 99 | auto identifier = rawValue(index); |
| 100 | uint32_t idlen = 0; |
| 101 | char u8identifier[30]; |
| 102 | for (uint32_t i = 0; i < 12 && idlen < sizeof(u8identifier); i++, idlen++) { |
| 103 | // Convert the angle brackets to utf-8 for better printing. The |
| 104 | // conversion below only works for characters whose msb's are 10. |
| 105 | if (identifier[i] == U'\xAB') { |
| 106 | u8identifier[idlen++] = '\xc2'; |
| 107 | u8identifier[idlen] = identifier[i]; |
| 108 | } else if (identifier[i] == U'\xBB') { |
| 109 | u8identifier[idlen++] = '\xc2'; |
| 110 | u8identifier[idlen] = identifier[i]; |
| 111 | } else if (identifier[i] < '\x20') { |
| 112 | uint32_t nchars; |
| 113 | switch (identifier[i]) { |
| 114 | case '\n': |
| 115 | u8identifier[idlen++] = '\\'; |
| 116 | u8identifier[idlen] = 'n'; |
| 117 | break; |
| 118 | case '\r': |
| 119 | u8identifier[idlen++] = '\\'; |
| 120 | u8identifier[idlen] = 'r'; |
| 121 | break; |
| 122 | default: |
| 123 | nchars = snprintf(&u8identifier[idlen], |
| 124 | sizeof(u8identifier) - idlen, |
| 125 | format == OutputFormat::text ? "\\x%02X" : "\\u%04X", |
| 126 | identifier[i]); |
| 127 | idlen += nchars - 1; |
| 128 | } |
| 129 | } else { |
| 130 | u8identifier[idlen] = identifier[i]; |
| 131 | } |
| 132 | } |
| 133 | if (format == OutputFormat::text) { |
| 134 | return std::string(u8identifier, idlen); |
| 135 | } else { |
| 136 | return fmt::format("\"{}\"", std::string(u8identifier, idlen)); |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | private: |
| 141 | static std::array<uint8_t, sizeof(KTX_header2::identifier)> to_array(const KTX_header2& header) { |
| 142 | std::array<uint8_t, sizeof(KTX_header2::identifier)> arr{}; |
| 143 | for (std::size_t i = 0; i < sizeof(KTX_header2::identifier); ++i) { |
| 144 | arr[i] = header.identifier[i]; |
| 145 | } |
| 146 | return arr; |
| 147 | } |