diff --git a/src/nfc.cc b/src/nfc.cc index c7885f5..2c178f3 100644 --- a/src/nfc.cc +++ b/src/nfc.cc @@ -378,6 +378,10 @@ void UTF::generate(const char32_t c, OutIter& out) *out++ = char( 0x80 + (c & 63)); }else if(c<=0xFFFF) { + if(c>=0xD800 && c<=0xDFFF) + { + throw unexpected_surrogate(c); + } *out++ = char( 0xE0 + (c>>12) ); *out++ = char( 0x80 + ((c>>6) & 63)); *out++ = char( 0x80 + (c & 63)); @@ -637,6 +641,10 @@ size_t UTF::utf_length(u32string_view s) len += 2; }else if(c<=0xffff) { + if(c>=0xD800 && c<=0xDFFF) + { + throw unexpected_surrogate(c); + } len += 3; }else if(c<=0x10ffff) { @@ -650,6 +658,31 @@ size_t UTF::utf_length(u32string_view s) } +template<> +size_t UTF::utf_length(u32string_view s) +{ + size_t len = 0; + for(const char32_t c : s) + { + if(c <= 0xffff) + { + if(c>=0xD800 && c<=0xDFFF) + { + throw unexpected_surrogate(c); + } + len += 1; + }else if(c<=0x10ffff) + { + len += 2; + }else{ + throw too_big(0, c); + } + } + + return len; +} + + // convenience function to avoid ::strdup(pEp::toNFC(text).c_str()); // and unecessary temporary std::string etc. char* strdup_NFC(string_view s)