unicode: add normalize
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
475f05b6d2
commit
5215d5e6dc
@ -798,6 +798,161 @@ namespace stdex
|
||||
{
|
||||
return wstr2str(src.c_str(), src.size(), charset);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and append to string
|
||||
///
|
||||
/// \param[in,out] dst String to append normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
/// \param[in] count_src String to normalize code unit limit
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <class _Traits = std::char_traits<wchar_t>, class _Alloc = std::allocator<wchar_t>>
|
||||
inline size_t normalizecat(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits, _Alloc>& dst,
|
||||
_In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src)
|
||||
{
|
||||
count_src = stdex::strnlen(src, count_src);
|
||||
size_t count_dst = dst.size();
|
||||
dst.resize(count_dst + count_src);
|
||||
_Assume_(count_src + 1 < INT_MAX);
|
||||
int r = NormalizeString(NormalizationC, src, static_cast<int>(count_src), dst.data() + count_dst, static_cast<int>(count_src + 1));
|
||||
if (r >= 0)
|
||||
dst.resize(count_dst + r);
|
||||
else
|
||||
memcpy(dst.data() + count_dst, src, count_src * sizeof(wchar_t));
|
||||
return dst.size();
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and append to string
|
||||
///
|
||||
/// \param[in,out] dst String to append normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <size_t _Size, class _Traits = std::char_traits<wchar_t>, class _Alloc = std::allocator<wchar_t>>
|
||||
inline size_t normalizecat(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits, _Alloc>& dst,
|
||||
_In_ const wchar_t (&src)[_Size])
|
||||
{
|
||||
return normalizecat(dst, src, _Size);
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and append to string
|
||||
///
|
||||
/// \param[in,out] dst String to append normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <class _Traits_dst = std::char_traits<wchar_t>, class _Alloc_dst = std::allocator<wchar_t>, class _Traits_src = std::char_traits<wchar_t>, class _Alloc_src = std::allocator<wchar_t>>
|
||||
inline size_t normalizecat(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits_dst, _Alloc_dst>& dst,
|
||||
_In_ const std::basic_string<wchar_t, _Traits_src, _Alloc_src>& src)
|
||||
{
|
||||
return normalizecat(dst, src.data(), src.size());
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and assign to string
|
||||
///
|
||||
/// \param[in,out] dst String to assign normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
/// \param[in] count_src String to normalize code unit limit
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <class _Traits = std::char_traits<wchar_t>, class _Alloc = std::allocator<wchar_t>>
|
||||
inline size_t normalize(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits, _Alloc>& dst,
|
||||
_In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src)
|
||||
{
|
||||
dst.clear();
|
||||
return normalizecat(dst, src, count_src);
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and assign to string
|
||||
///
|
||||
/// \param[in,out] dst String to assign normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <size_t _Size, class _Traits = std::char_traits<wchar_t>, class _Alloc = std::allocator<wchar_t>>
|
||||
inline size_t normalize(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits, _Alloc>& dst,
|
||||
_In_ const wchar_t(&src)[_Size])
|
||||
{
|
||||
return normalize(dst, src, _Size);
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15 and assign to string
|
||||
///
|
||||
/// \param[in,out] dst String to assign normalized string to
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Number of code units excluding zero terminator in the dst string after the operation.
|
||||
///
|
||||
template <class _Traits_dst = std::char_traits<wchar_t>, class _Alloc_dst = std::allocator<wchar_t>, class _Traits_src = std::char_traits<wchar_t>, class _Alloc_src = std::allocator<wchar_t>>
|
||||
inline size_t normalize(
|
||||
_Inout_ std::basic_string<wchar_t, _Traits_dst, _Alloc_dst>& dst,
|
||||
_In_ const std::basic_string<wchar_t, _Traits_src, _Alloc_src>& src)
|
||||
{
|
||||
return normalize(dst, src.data(), src.size());
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15
|
||||
///
|
||||
/// \param[in] src String to normalize
|
||||
/// \param[in] count_src String to normalize code unit limit
|
||||
///
|
||||
/// \return Normalized string
|
||||
///
|
||||
inline std::wstring normalize(_In_reads_or_z_opt_(count_src) const wchar_t* src, _In_ size_t count_src)
|
||||
{
|
||||
std::wstring dst;
|
||||
normalizecat(dst, src, count_src);
|
||||
return dst;
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15
|
||||
///
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Normalized string
|
||||
///
|
||||
template <size_t _Size>
|
||||
inline std::wstring normalize(_In_ const wchar_t(&src)[_Size])
|
||||
{
|
||||
std::wstring dst;
|
||||
normalizecat(dst, src, _Size);
|
||||
return dst;
|
||||
}
|
||||
|
||||
///
|
||||
/// Normalize characters of a text string according to Unicode 4.0 TR#15
|
||||
///
|
||||
/// \param[in] src String to normalize
|
||||
///
|
||||
/// \return Normalized string
|
||||
///
|
||||
template <class _Traits = std::char_traits<wchar_t>, class _Alloc = std::allocator<wchar_t>>
|
||||
inline std::wstring normalize(_In_ const std::basic_string<wchar_t, _Traits, _Alloc>& src)
|
||||
{
|
||||
std::wstring dst;
|
||||
normalizecat(dst, src.data(), src.size());
|
||||
return dst;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
|
Loading…
x
Reference in New Issue
Block a user