changeset 22849:01666acde1a8

lib-charset: Allow plugins to replace charset_* functions They just need to point charset_utf8_vfuncs to their own implementation.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 15:18:29 +0200
parents 170f155eb2b2
children 11dcd0b74b86
files src/lib-charset/Makefile.am src/lib-charset/charset-iconv.c src/lib-charset/charset-utf8-only.c src/lib-charset/charset-utf8-private.h src/lib-charset/charset-utf8.c
diffstat 5 files changed, 92 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-charset/Makefile.am	Thu Nov 09 15:12:05 2017 +0200
+++ b/src/lib-charset/Makefile.am	Thu Nov 09 15:18:29 2017 +0200
@@ -11,7 +11,8 @@
 	charset-utf8-only.c
 
 headers = \
-	charset-utf8.h
+	charset-utf8.h \
+	charset-utf8-private.h
 
 pkginc_libdir=$(pkgincludedir)
 pkginc_lib_HEADERS = $(headers)
--- a/src/lib-charset/charset-iconv.c	Thu Nov 09 15:12:05 2017 +0200
+++ b/src/lib-charset/charset-iconv.c	Thu Nov 09 15:18:29 2017 +0200
@@ -2,8 +2,7 @@
 
 #include "lib.h"
 #include "buffer.h"
-#include "unichar.h"
-#include "charset-utf8.h"
+#include "charset-utf8-private.h"
 
 #ifdef HAVE_ICONV
 
@@ -15,8 +14,9 @@
 	normalizer_func_t *normalizer;
 };
 
-int charset_to_utf8_begin(const char *charset, normalizer_func_t *normalizer,
-			  struct charset_translation **t_r)
+static int
+iconv_charset_to_utf8_begin(const char *charset, normalizer_func_t *normalizer,
+			    struct charset_translation **t_r)
 {
 	struct charset_translation *t;
 	iconv_t cd;
@@ -38,18 +38,14 @@
 	return 0;
 }
 
-void charset_to_utf8_end(struct charset_translation **_t)
+static void iconv_charset_to_utf8_end(struct charset_translation *t)
 {
-	struct charset_translation *t = *_t;
-
-	*_t = NULL;
-
 	if (t->cd != (iconv_t)-1)
 		iconv_close(t->cd);
 	i_free(t);
 }
 
-void charset_to_utf8_reset(struct charset_translation *t)
+static void iconv_charset_to_utf8_reset(struct charset_translation *t)
 {
 	if (t->cd != (iconv_t)-1)
 		(void)iconv(t->cd, NULL, NULL, NULL, NULL);
@@ -103,9 +99,10 @@
 	return ret;
 }
 
-enum charset_result
-charset_to_utf8(struct charset_translation *t,
-		const unsigned char *src, size_t *src_size, buffer_t *dest)
+static enum charset_result
+iconv_charset_to_utf8(struct charset_translation *t,
+		      const unsigned char *src, size_t *src_size,
+		      buffer_t *dest)
 {
 	enum charset_result result;
 	size_t pos, size;
@@ -140,4 +137,11 @@
 	return result;
 }
 
+const struct charset_utf8_vfuncs charset_iconv = {
+	.to_utf8_begin = iconv_charset_to_utf8_begin,
+	.to_utf8_end = iconv_charset_to_utf8_end,
+	.to_utf8_reset = iconv_charset_to_utf8_reset,
+	.to_utf8 = iconv_charset_to_utf8,
+};
+
 #endif
--- a/src/lib-charset/charset-utf8-only.c	Thu Nov 09 15:12:05 2017 +0200
+++ b/src/lib-charset/charset-utf8-only.c	Thu Nov 09 15:18:29 2017 +0200
@@ -1,7 +1,7 @@
 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
-#include "charset-utf8.h"
+#include "charset-utf8-private.h"
 
 #ifndef HAVE_ICONV
 
@@ -9,8 +9,10 @@
 	normalizer_func_t *normalizer;
 };
 
-int charset_to_utf8_begin(const char *charset, normalizer_func_t *normalizer,
-			  struct charset_translation **t_r)
+static int
+utf8only_charset_to_utf8_begin(const char *charset,
+			       normalizer_func_t *normalizer,
+			       struct charset_translation **t_r)
 {
 	struct charset_translation *t;
 
@@ -25,23 +27,29 @@
 	return 0;
 }
 
-void charset_to_utf8_end(struct charset_translation **_t)
+static void utf8only_charset_to_utf8_end(struct charset_translation *t)
 {
-	struct charset_translation *t = *_t;
-
-	*_t = NULL;
 	i_free(t);
 }
 
-void charset_to_utf8_reset(struct charset_translation *t ATTR_UNUSED)
+static void
+utf8only_charset_to_utf8_reset(struct charset_translation *t ATTR_UNUSED)
 {
 }
 
-enum charset_result
-charset_to_utf8(struct charset_translation *t,
-		const unsigned char *src, size_t *src_size, buffer_t *dest)
+static enum charset_result
+utf8only_charset_to_utf8(struct charset_translation *t,
+			 const unsigned char *src, size_t *src_size,
+			 buffer_t *dest)
 {
 	return charset_utf8_to_utf8(t->normalizer, src, src_size, dest);
 }
 
+const struct charset_utf8_vfuncs charset_utf8only = {
+	.to_utf8_begin = utf8only_charset_to_utf8_begin,
+	.to_utf8_end = utf8only_charset_to_utf8_end,
+	.to_utf8_reset = utf8only_charset_to_utf8_reset,
+	.to_utf8 = utf8only_charset_to_utf8,
+};
+
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-charset/charset-utf8-private.h	Thu Nov 09 15:18:29 2017 +0200
@@ -0,0 +1,21 @@
+#ifndef CHARSET_UTF8_PRIVATE_H
+#define CHARSET_UTF8_PRIVATE_H
+
+#include "unichar.h"
+#include "charset-utf8.h"
+
+struct charset_utf8_vfuncs {
+	int (*to_utf8_begin)(const char *charset, normalizer_func_t *normalizer,
+			     struct charset_translation **t_r);
+	void (*to_utf8_end)(struct charset_translation *t);
+	void (*to_utf8_reset)(struct charset_translation *t);
+
+	enum charset_result (*to_utf8)(struct charset_translation *t,
+				       const unsigned char *src,
+				       size_t *src_size, buffer_t *dest);
+};
+
+extern const struct charset_utf8_vfuncs charset_utf8only;
+extern const struct charset_utf8_vfuncs charset_iconv;
+
+#endif
--- a/src/lib-charset/charset-utf8.c	Thu Nov 09 15:12:05 2017 +0200
+++ b/src/lib-charset/charset-utf8.c	Thu Nov 09 15:18:29 2017 +0200
@@ -3,11 +3,16 @@
 #include "lib.h"
 #include "buffer.h"
 #include "str.h"
-#include "unichar.h"
-#include "charset-utf8.h"
+#include "charset-utf8-private.h"
 
 #include <ctype.h>
 
+#ifdef HAVE_ICONV
+const struct charset_utf8_vfuncs *charset_utf8_vfuncs = &charset_iconv;
+#else
+const struct charset_utf8_vfuncs *charset_utf8_vfuncs = &charset_utf8only;
+#endif
+
 bool charset_is_utf8(const char *charset)
 {
 	return strcasecmp(charset, "us-ascii") == 0 ||
@@ -66,3 +71,29 @@
 	}
 	return res;
 }
+
+int charset_to_utf8_begin(const char *charset, normalizer_func_t *normalizer,
+			  struct charset_translation **t_r)
+{
+	return charset_utf8_vfuncs->to_utf8_begin(charset, normalizer, t_r);
+}
+
+void charset_to_utf8_end(struct charset_translation **_t)
+{
+	struct charset_translation *t = *_t;
+
+	*_t = NULL;
+	charset_utf8_vfuncs->to_utf8_end(t);
+}
+
+void charset_to_utf8_reset(struct charset_translation *t)
+{
+	charset_utf8_vfuncs->to_utf8_reset(t);
+}
+
+enum charset_result
+charset_to_utf8(struct charset_translation *t,
+		const unsigned char *src, size_t *src_size, buffer_t *dest)
+{
+	return charset_utf8_vfuncs->to_utf8(t, src, src_size, dest);
+}