--- /dev/null
+#ifndef unicode_h
+#define unicode_h
+
+/*
+** Copyright 2000-2001 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+** $Id: unicode.h,v 1.18 2008/07/20 16:24:52 mrsam Exp $
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "../unicode/unicode_config.h" /* VPATH build */
+
+#include <stdlib.h>
+
+#include <stdio.h>
+#if HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+#if HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+typedef wchar_t unicode_char;
+
+struct unicode_info {
+ const char *chset; /* Official character set */
+ int flags; /* Flags */
+
+#define UNICODE_UTF 1 /* Direct UTF mapping */
+#define UNICODE_MB 2 /* Multibyte characters present */
+#define UNICODE_SISO 4 /*
+ ** Composite mapping, using shift in/out
+ ** (verbatim text comparison may not work,
+ ** must convert to UTF, or something).
+ ** (replaces search_chset).
+ */
+
+#define UNICODE_USASCII 8 /* Character set is a US-ASCII superset */
+#define UNICODE_REPLACEABLE 16 /*
+ * Conversion errors can be replaced by
+ * adequate placeholders (replacement
+ * characters).
+ */
+#define UNICODE_HEADER_QUOPRI 32 /*
+ ** Quoted-printable (Q) encoding is preferred
+ ** for MIME message headers.
+ */
+#define UNICODE_HEADER_BASE64 64 /*
+ ** Base64 (B) encoding is preferred
+ ** for MIME message headers.
+ */
+#define UNICODE_BODY_QUOPRI 128 /*
+ ** Quoted-printable (Q) encoding is preferred
+ ** MIME message body.
+ */
+#define UNICODE_BODY_BASE64 256 /*
+ ** Base64 (B) encoding is preferred
+ ** for MIME message body.
+ */
+
+ unicode_char *(*c2u)(const struct unicode_info *, const char *, int *);
+ /* Convert character string in this charset to unicode */
+
+ char *(*u2c)(const struct unicode_info *, const unicode_char *, int *);
+ /* Convert unicode to character string in this charset */
+
+ /* Convert the string in this character set to upper/lower/titlecase */
+
+ char *(*toupper_func)(const struct unicode_info *,
+ const char *, int *);
+ char *(*tolower_func)(const struct unicode_info *,
+ const char *, int *);
+ char *(*totitle_func)(const struct unicode_info *,
+ const char *, int *);
+
+ const struct unicode_info *search_chset;
+ } ;
+
+extern const struct unicode_info unicode_ISO8859_1;
+extern const struct unicode_info unicode_UTF8;
+extern const struct unicode_info unicode_IMAP_MODUTF7;
+
+extern char *unicode_iso8859_u2c(const unicode_char *, int *,
+ const unicode_char *);
+
+extern char *unicode_windows874_u2c(const unicode_char *, int *,
+ const unicode_char *);
+
+/* ISO8859 charsets all share the same functions */
+
+extern unicode_char *unicode_iso8859_c2u(const char *, int *,
+ const unicode_char *);
+
+extern char *unicode_iso8859_convert(const char *, int *,
+ const char *);
+
+/* IBM864 charset has some funkiness */
+
+unicode_char *unicode_ibm864_c2u(const char *, int *,
+ const unicode_char *);
+
+char *unicode_ibm864_u2c(const unicode_char *, int *,
+ const unicode_char *);
+
+
+struct unicode_chsetlist {
+ const char *chsetname;
+ const struct unicode_info *ptr;
+ } ;
+
+extern const struct unicode_chsetlist unicode_chsetlist[];
+extern const char *unicode_default_chset();
+extern const struct unicode_info *unicode_find(const char *);
+
+/*
+** UTF8 functions
+*/
+
+ /* Convert Unicode to/from UTF-8 */
+
+extern char *unicode_toutf8(const unicode_char *);
+extern unicode_char *unicode_fromutf8(const char *);
+
+ /* Unicode upper/lower/title case conversion functions */
+
+extern unicode_char unicode_uc(unicode_char);
+extern unicode_char unicode_lc(unicode_char);
+extern unicode_char unicode_tc(unicode_char);
+
+ /* Convert charsets to/from UTF-8 */
+
+extern char *unicode_ctoutf8(const struct unicode_info *, const char *,
+ int *);
+extern char *unicode_cfromutf8(const struct unicode_info *, const char *,
+ int *);
+
+
+ /* Return width of unicode character */
+
+extern int unicode_wcwidth(unicode_char c);
+
+ /* Internal functions: */
+
+extern unicode_char *unicode_utf8_tou(const char *, int *);
+extern char *unicode_utf8_fromu(const unicode_char *, int *);
+
+size_t unicode_utf8_fromu_pass(const unicode_char *, char *);
+
+#define UNICODE_UTF8_MAXLEN 6
+
+extern char *unicode_convert(const char *txt,
+ const struct unicode_info *from,
+ const struct unicode_info *to);
+ /* errno=EINVAL if conversion could not be performed */
+
+extern char *unicode_xconvert(const char *txt,
+ const struct unicode_info *from,
+ const struct unicode_info *to);
+ /* Like unicode_convert(), except unconvertable chars are replaced
+ ** by periods (or something similar), instead of aborting with EINVAL
+ */
+
+
+extern char *unicode_convert_fromchset(const char *txt,
+ const char *from,
+ const struct unicode_info *to);
+ /* Like, unicode_convert, except that we search for a character set
+ ** from a list of chsets we support.
+ ** errno=EINVAL if 'to' character set does not exist.
+ */
+
+ /*
+ ** Convert between unicode and modified-UTF7 encoding used for
+ ** IMAP folder names.
+ */
+
+unicode_char *unicode_modutf7touc(const char *s, int *err);
+
+ /* err < 0 if out of memory, else ptr to first illegal modutf7-char */
+ /* This can be used to test if string is a valid mod-utf7 string */
+
+char *unicode_uctomodutf7(const unicode_char *);
+
+char *unicode_uctomodutf7x(const unicode_char *, const unicode_char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif