Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / unicode / utf8_chset.c
diff --git a/unicode/utf8_chset.c b/unicode/utf8_chset.c
new file mode 100644 (file)
index 0000000..11270d7
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+** Copyright 2000 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+** $Id: utf8_chset.c,v 1.5 2004/05/23 14:28:25 mrsam Exp $
+*/
+
+#include "unicode.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+** UTF8.toupper/tolower/totitle is implemented by converting UTF8 to
+** UCS-4, applying the unicode table lookup, then converting it back to
+** UTF8
+*/
+
+static char *toupper_func(const struct unicode_info *u,
+                         const char *cp, int *ip)
+{
+       unicode_char *uc=unicode_utf8_tou(cp, ip), *p;
+       char *s;
+
+       if (!uc) return (0);
+
+       for (p=uc; *p; p++)
+               *p=unicode_uc(*p);
+
+       s=unicode_utf8_fromu(uc, NULL);
+       free(uc);
+       return (s);
+}
+
+static char *tolower_func(const struct unicode_info *u,
+                         const char *cp, int *ip)
+{
+       unicode_char *uc=unicode_utf8_tou(cp, ip), *p;
+       char *s;
+
+       if (!uc) return (0);
+
+       for (p=uc; *p; p++)
+               *p=unicode_lc(*p);
+
+       s=unicode_utf8_fromu(uc, NULL);
+       free(uc);
+       return (s);
+}
+
+static char *totitle_func(const struct unicode_info *u,
+                         const char *cp, int *ip)
+{
+       unicode_char *uc=unicode_utf8_tou(cp, ip), *p;
+       char *s;
+
+       if (!uc) return (0);
+
+       for (p=uc; *p; p++)
+               *p=unicode_tc(*p);
+
+       s=unicode_utf8_fromu(uc, NULL);
+       free(uc);
+       return (s);
+}
+
+static unicode_char *tou(const struct unicode_info *i, const char *p,
+                        int *err)
+{
+       return unicode_utf8_tou(p, err);
+}
+
+static char *fromu(const struct unicode_info *i, const unicode_char *p,
+                  int *err)
+{
+       return unicode_utf8_fromu(p, err);
+}
+
+const struct unicode_info unicode_UTF8 = {
+       "UTF-8",
+       UNICODE_UTF | UNICODE_MB | UNICODE_USASCII | UNICODE_HEADER_QUOPRI
+       | UNICODE_BODY_QUOPRI,
+       tou,
+       fromu,
+       toupper_func,
+       tolower_func,
+       totitle_func};
+