#pragma once #include "codepage.h" #include // WARNING: Do not use this functions - use functions from wide.h or recyr.hh instead. namespace NICONVPrivate { inline const char* CharsetName(ECharset code) { return NameByCharset(code); } inline const char* CharsetName(const char* code) { return code; } template inline const char* UnicodeNameBySize(); template <> inline const char* UnicodeNameBySize<1>() { return "UTF-8"; } template <> inline const char* UnicodeNameBySize<2>() { return "UTF-16LE"; } template <> inline const char* UnicodeNameBySize<4>() { return "UCS-4LE"; } template inline const char* UnicodeName() { return UnicodeNameBySize(); } class TDescriptor : NNonCopyable::TNonCopyable { private: void* Descriptor_; const char* From_; const char* To_; public: template inline TDescriptor(TFrom from, TTo to) : TDescriptor(CharsetName(from), CharsetName(to)) { } TDescriptor(const char* from, const char* to); ~TDescriptor(); inline void* Get() const { return Descriptor_; } inline bool Invalid() const { return Descriptor_ == (void*)(-1); } inline const char* From() const noexcept { return From_; } inline const char* To() const noexcept { return To_; } }; template inline bool CanConvert(TFrom from, TTo to) { TDescriptor descriptor(from, to); return !descriptor.Invalid(); } size_t RecodeImpl(const TDescriptor& descriptor, const char* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written); void DoRecode(const TDescriptor& descriptor, const char* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written); template inline void Recode(TFrom from, TTo to, const char* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { TDescriptor descriptor(from, to); DoRecode(descriptor, in, out, inSize, outSize, read, written); } template inline void RecodeToUnicode(ECharset from, const char* in, TCharType* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { const size_t charSize = sizeof(TCharType); Recode(from, UnicodeName(), in, reinterpret_cast(out), inSize, outSize * charSize, read, written); written /= charSize; } template inline void RecodeFromUnicode(ECharset to, const TCharType* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { const size_t charSize = sizeof(TCharType); Recode(UnicodeName(), to, reinterpret_cast(in), out, inSize * charSize, outSize, read, written); read /= charSize; } RECODE_RESULT DoRecodeNoThrow(const TDescriptor& d, const char* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written); template inline RECODE_RESULT RecodeNoThrow(TFrom from, TTo to, const char* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { TDescriptor descriptor(from, to); return DoRecodeNoThrow(descriptor, in, out, inSize, outSize, read, written); } template inline RECODE_RESULT RecodeToUnicodeNoThrow(ECharset from, const char* in, TCharType* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { const size_t charSize = sizeof(TCharType); RECODE_RESULT res = RecodeNoThrow(from, UnicodeName(), in, reinterpret_cast(out), inSize, outSize * charSize, read, written); written /= charSize; return res; } template inline RECODE_RESULT RecodeFromUnicodeNoThrow(ECharset to, const TCharType* in, char* out, size_t inSize, size_t outSize, size_t& read, size_t& written) { const size_t charSize = sizeof(TCharType); RECODE_RESULT res = RecodeNoThrow(UnicodeName(), to, reinterpret_cast(in), out, inSize * charSize, outSize, read, written); read /= charSize; return res; } }