diff options
Diffstat (limited to 'gtk/Converter.h')
| -rw-r--r-- | gtk/Converter.h | 31 | 
1 files changed, 11 insertions, 20 deletions
| diff --git a/gtk/Converter.h b/gtk/Converter.h index be530341f..f17949d98 100644 --- a/gtk/Converter.h +++ b/gtk/Converter.h @@ -10,21 +10,13 @@  namespace Scintilla {  #endif -typedef GIConv ConverterHandle; -const ConverterHandle iconvhBad = (ConverterHandle)(-1); -// Since various versions of iconv can not agree on whether the src argument -// is char ** or const char ** provide a templatised adaptor. -template<typename T> -size_t iconv_adaptor(size_t(*f_iconv)(ConverterHandle, T, size_t *, char **, size_t *), -		ConverterHandle cd, char** src, size_t *srcleft, -		char **dst, size_t *dstleft) { -	return f_iconv(cd, (T)src, srcleft, dst, dstleft); -} +const GIConv iconvhBad = (GIConv)(-1); +const gsize sizeFailure = static_cast<gsize>(-1);  /** - * Encapsulate iconv safely and avoid iconv_adaptor complexity in client code. + * Encapsulate g_iconv safely.   */  class Converter { -	ConverterHandle iconvh; +	GIConv iconvh;  	void OpenHandle(const char *fullDestination, const char *charSetSource) {  		iconvh = g_iconv_open(fullDestination, charSetSource);  	} @@ -45,15 +37,14 @@ public:  	operator bool() const {  		return Succeeded();  	} -	void Open(const char *charSetDestination, const char *charSetSource, bool transliterations=true) { +	void Open(const char *charSetDestination, const char *charSetSource, bool transliterations) {  		Close();  		if (*charSetSource) {  			// Try allowing approximate transliterations  			if (transliterations) { -				char fullDest[200]; -				g_strlcpy(fullDest, charSetDestination, sizeof(fullDest)); -				g_strlcat(fullDest, "//TRANSLIT", sizeof(fullDest)); -				OpenHandle(fullDest, charSetSource); +				std::string fullDest(charSetDestination); +				fullDest.append("//TRANSLIT"); +				OpenHandle(fullDest.c_str(), charSetSource);  			}  			if (!Succeeded()) {  				// Transliterations failed so try basic name @@ -67,11 +58,11 @@ public:  			iconvh = iconvhBad;  		}  	} -	size_t Convert(char** src, size_t *srcleft, char **dst, size_t *dstleft) const { +	gsize Convert(char** src, gsize *srcleft, char **dst, gsize *dstleft) const {  		if (!Succeeded()) { -			return (size_t)(-1); +			return sizeFailure;  		} else { -			return iconv_adaptor(g_iconv, iconvh, src, srcleft, dst, dstleft); +			return g_iconv(iconvh, src, srcleft, dst, dstleft);  		}  	}  }; | 
