#include #include // https://hackage-content.haskell.org/package/mustache-2.4.3.1/src/src/Text/Mustache/Internal.hs // // escapeXML :: String -> String // escapeXML = concatMap $ \x -> IntMap.findWithDefault [x] (ord x) mp // where mp = IntMap.fromList [(ord b, "&"++a++";") | (a,[b]) <- xmlEntities] // // xmlEntities :: [(String, String)] // xmlEntities = // [ ("quot", "\"") // , ("#39", "'") // , ("amp" , "&") // , ("lt" , "<") // , ("gt" , ">") // ] #define ENTITIES_XLIST \ X('"', 6, """) \ X('\'', 5, "'") \ X('&', 5, "&") \ X('<', 4, "<") \ X('>', 4, ">") size_t tirclogv_escapexml_len(const uint8_t *src, size_t src_off, size_t src_len) { size_t reslen = 0; for (size_t i = 0; i < src_len; i++) { switch (src[src_off + i]) { #define X(ch, len, _str) case ch: reslen += len; break; ENTITIES_XLIST #undef X default: reslen += 1; break; } } return reslen; } void tirclogv_escapexml(uint8_t *dst, const uint8_t *src, size_t src_off, size_t src_len) { for (size_t i = 0, j = 0; i < src_len; i++) { const uint8_t c = src[src_off + i]; switch (c) { #define X(ch, len, str) case ch: memcpy(&dst[j], str, len); j += len; break; ENTITIES_XLIST #undef X default: dst[j++] = c; break; } } }