]> granicus.if.org Git - mutt/commitdiff
Generate the character set tables from i18n files.
authorThomas Roessler <roessler@does-not-exist.org>
Tue, 15 Sep 1998 13:36:40 +0000 (13:36 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Tue, 15 Sep 1998 13:36:40 +0000 (13:36 +0000)
Makefile.in
charset.c
charset.h
charsets/Makefile.in [new file with mode: 0644]
charsets/gen_charsets [new file with mode: 0755]
charsets/parse_i18n.c [new file with mode: 0644]
configure
configure.in
gen-charset.c [deleted file]

index 5d436be197fe32c4a3258e885908577abeffcdea..1ba958aa24269f79bf478f76d64e1456d9b06a35 100644 (file)
@@ -57,7 +57,7 @@ NONEXPORT=pgp.c pgp.h pgpinvoke.c pgpkey.c pgppubring.c sha.h sha1dgst.c \
        gnupgparse.c sha_locl.h OPS.PGP doc/pgp-Notes.txt doc/language.txt \
        doc/language50.txt
 
-all: mutt @DOTLOCK_TARGET@ gen-charset
+all: mutt @DOTLOCK_TARGET@ 
 
 mutt: keymap_defs.h $(OBJS) $(REGEX)
        $(CC) -o mutt $(OBJS) $(REGEX) $(LDFLAGS) $(LIBS)
@@ -65,14 +65,11 @@ mutt: keymap_defs.h $(OBJS) $(REGEX)
 dotlock: dotlock.o @SNPRINTFOBJS@
        $(CC) -o dotlock dotlock.o @SNPRINTFOBJS@
 
-gen-charset: gen-charset.o
-       $(CC) -o gen-charset gen-charset.o
-
 keymap_defs.h: Makefile $(OPS)
        rm -f keymap_defs.h
        $(srcdir)/gen_defs $(OPS) > keymap_defs.h
 
-install: mutt install.doc @DOTLOCK_INSTALL_TARGET@ gen-charset
+install: mutt install.doc @DOTLOCK_INSTALL_TARGET@
        $(srcdir)/mkinstalldirs $(bindir)
        -mv -f $(bindir)/mutt $(bindir)/mutt.old
        $(INSTALL) -m 755 mutt $(bindir)
@@ -83,8 +80,7 @@ install: mutt install.doc @DOTLOCK_INSTALL_TARGET@ gen-charset
        -if [ ! -f $(sharedir)/mime.types ]; then \
                $(INSTALL) -m 644 $(srcdir)/mime.types $(sharedir); \
        fi
-       $(srcdir)/mkinstalldirs $(sharedir)/charsets
-       ./gen-charset $(sharedir)/charsets
+       ( cd $(srcdir)/charsets && make install )
 
 install.dotlock: dotlock
        $(srcdir)/mkinstalldirs $(bindir)
@@ -92,13 +88,13 @@ install.dotlock: dotlock
        $(INSTALL) @DOTLOCK_GROUP@ -m @DOTLOCK_PERMISSION@ dotlock $(bindir)/mutt.dotlock
 
 install.doc: 
-       ( cd $(srcdir)/doc &&  make install )
+       ( cd $(srcdir)/doc &&  $(MAKE) install )
 
 uninstall: uninstall.doc
        rm -f $(bindir)/mutt $(sharedir)/Muttrc $(bindir)/mutt.dotlock
 
 uninstall.doc:
-       ( cd $(srcdir)/doc/ && make uninstall )
+       ( cd $(srcdir)/doc/ && $(MAKE) uninstall )
 
 $(srcdir)/configure: $(srcdir)/configure.in
        autoconf
@@ -127,6 +123,7 @@ clean-real:
 
 clean:
        rm -f $(CLEANFILES)
+       (cd $(srcdir)/charsets && $(MAKE) $@
 
 veryclean:
        rm -f $(VERYCLEANFILES)
@@ -134,6 +131,7 @@ veryclean:
 distclean:
        (cd $(srcdir) && rm -f $(DISTCLEANFILES))
        (cd $(srcdir)/doc && $(MAKE) $@)
+       (cd $(srcdir)/charsets && $(MAKE) $@)
 
 reldate:
        rm -f $(srcdir)/reldate.h
index 96e6b94a9f7f0c89339b14100736c2d86ba74625..1b6379fcfdcfee3f4175a3a8fdc732a983b8378e 100644 (file)
--- a/charset.c
+++ b/charset.c
@@ -91,7 +91,7 @@ static CHARSET *load_charset(const char *name)
 
   chs->map  = safe_malloc(sizeof(UNICODE_MAP));
   
-  for(i = 0; i < 128; i++)
+  for(i = 0; i < 256; i++)
   {
     if(fscanf(fp, "%i", &(*chs->map)[i]) != 1)
     {
@@ -110,8 +110,8 @@ static void init_charsets()
 {
   if(Charsets) return;
 
-  Charsets     = hash_create(16);
-  Translations = hash_create(32);
+  Charsets     = hash_create(128);
+  Translations = hash_create(256);
 }
 
 CHARSET *mutt_get_charset(const char *name)
@@ -134,11 +134,10 @@ static int translate_char(UNICODE_MAP *to, int ch)
   int i;
 
   if (ch == -1) return '?';
-  if (ch < 128) return ch;
-  for (i = 0; i < 128; i++)
+  for (i = 0; i < 256; i++)
   {
     if ((*to)[i] == ch) 
-      return (128 + i);
+      return i;
   }
   return '?';
 }
@@ -148,7 +147,7 @@ UNICODE_MAP *build_translation(UNICODE_MAP *from, UNICODE_MAP *to)
   int i;
   UNICODE_MAP *map = safe_malloc(sizeof(UNICODE_MAP));
 
-  for(i = 0; i < 128; i++)
+  for(i = 0; i < 256; i++)
     (*map)[i] = translate_char(to, (*from)[i]);
 
   return map;
@@ -191,10 +190,10 @@ UNICODE_MAP *mutt_get_translation(const char *_from, const char *_to)
 
 int mutt_display_char(int ch, UNICODE_MAP *map)
 {
-  if (!map || (ch < 128) || (ch > 255))
+  if (!map || (ch < 0) || (ch > 255))
     return ch;
-  
-  return (*map)[ch - 128];
+
+  return (*map)[ch];
 }
 
 int mutt_display_string(char *str, UNICODE_MAP *map)
index d60dfaf8a604fd20ff5929d25c6c4b7152e01b7d..88d53913f5a8fc100bae69316fb181f0c9ee15c6 100644 (file)
--- a/charset.h
+++ b/charset.h
 #ifndef _CHARSET_H
 #define _CHARSET_H
 
-typedef int UNICODE_MAP[128];
+#define CHARSET_MAGIC "Mutt Character Set Definition 1.1\n"
+
+#ifndef _GEN_CHARSETS
+
+typedef int UNICODE_MAP[256];
 
 typedef struct 
 {
@@ -27,10 +31,6 @@ typedef struct
   UNICODE_MAP *map;
 } CHARSET;
 
-#define CHARSET_MAGIC "Mutt Character Set Definition 1.0\n"
-
-#ifndef _GEN_CHARSETS
-
 CHARSET *mutt_get_charset(const char *);
 UNICODE_MAP *mutt_get_translation(const char *, const char *);
 int mutt_display_char(int, UNICODE_MAP *);
diff --git a/charsets/Makefile.in b/charsets/Makefile.in
new file mode 100644 (file)
index 0000000..689cf75
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 1998 Thomas Roessler <roessler@guug.de>
+#
+#     This program is free software; you can redistribute it and/or modify
+#     it under the terms of the GNU General Public License as published by
+#     the Free Software Foundation; either version 2 of the License, or
+#     (at your option) any later version.
+#
+#     This program is distributed in the hope that it will be useful,
+#     but WITHOUT ANY WARRANTY; without even the implied warranty of
+#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#     GNU General Public License for more details.
+#
+#     You should have received a copy of the GNU General Public License
+#     along with this program; if not, write to the Free Software
+#     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+SHELL=/bin/sh
+sharedir=@sharedir@
+CC=@CC@
+CFLAGS=@CFLAGS@
+LDFLAGS=@LDFLAGS@
+srcdir=@srcdir@
+VPATH=@srcdir@
+@SET_MAKE@
+INSTALL=@INSTALL@
+
+parse_i18n: parse_i18n.o
+       $(CC) -o parse_i18n parse_i18n.o
+
+clean:
+       -rm -f *.o *~ core parse_i18n
+
+distclean: clean
+       -rm -f Makefile
+
+veryclean:
+       -rm -f `cat charsets.list` charsets.list
+
+charmaps: parse_i18n
+       ( cd $(srcdir) && ./gen_charsets )
+
+install: charsets.list
+       $(srcdir)/../mkinstalldirs $(sharedir)/charsets
+       ( cd $(srcdir) && $(INSTALL) \
+               -m 644 `cat charsets.list` $(sharedir)/charsets )
+
diff --git a/charsets/gen_charsets b/charsets/gen_charsets
new file mode 100755 (executable)
index 0000000..4ab05ab
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh --
+
+dirs="/usr/local/lib/nls /usr/lib/nls /usr/local/share/nls /usr/share/nls"
+dirs="$dirs /usr/local/lib/i18n /usr/lib/i18n /usr/local/share/i18n"
+dirs="$dirs /usr/share/i18n"
+
+rm -f ./charsets.list
+
+for d in $dirs ; do
+  [ -d $d/charmaps ] && ./parse_i18n ./ $d/charmaps/* >> ./charsets.list
+done
diff --git a/charsets/parse_i18n.c b/charsets/parse_i18n.c
new file mode 100644 (file)
index 0000000..a832558
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) 1998 Thomas Roessler <roessler@guug.de>
+ * 
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */ 
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "../charset.h"
+
+#if 0
+#define DEBUG
+#endif
+
+static char *basedir = NULL;
+
+typedef int MAP[256];
+
+typedef struct
+{
+  char *charset;
+  char escape_char;
+  char comment_char;
+  short is_valid;
+  MAP map;
+} CHARMAP;
+
+static void *safe_malloc(size_t l)
+{
+  void *p = malloc(l);
+  if(!p)
+  {
+    perror("malloc");
+    exit(1);
+  }
+  return p;
+}
+
+static char *safe_strdup(const char *s)
+{
+  char *d;
+  
+  if(!s) 
+    return NULL;
+  
+  if(!(d = strdup(s)))
+  {
+    perror("strdup");
+    exit(1);
+  }
+  return d;
+}
+
+static void safe_free(void **p)
+{
+  if(!p || !*p) return;
+  free(*p);
+  *p = NULL;
+}
+
+static void canonical_charset(char *dest, size_t dlen, const char *name)
+{
+  int i;
+  
+  if(!strncasecmp(name, "x-", 2))
+    name = name + 2;
+  
+  for(i = 0; name[i] && i < dlen - 1; i++)
+  {
+    if(strchr("_/. ", name[i]))
+      dest[i] = '-';
+    else
+      dest[i] = tolower(name[i]);
+  }
+  
+  dest[i] = '\0';
+}
+
+static CHARMAP *charmap_new(void)
+{
+  int i;
+  CHARMAP *m = safe_malloc(sizeof(CHARMAP));
+  
+  m->charset = NULL;
+  m->escape_char = '\\';
+  m->comment_char = '#';
+  m->is_valid = 0;
+  
+  for(i = 0; i < 256; i++)
+    m->map[i] = -1;
+  
+  return m;
+}
+
+static void charmap_free(CHARMAP **cp)
+{
+  if(!cp || !*cp)
+    return ;
+  
+  safe_free((void **) &(*cp)->charset);
+  safe_free((void **) cp);
+  
+  return;
+}
+
+static CHARMAP *parse_charmap_header(FILE *fp, const char *prefix)
+{
+  char buffer[1024];
+  char *t, *u;
+  CHARMAP *m = charmap_new();
+  
+  while(fgets(buffer, sizeof(buffer), fp))
+  {
+    if((t = strchr(buffer, '\n')))
+      *t = '\0';
+    else
+    {
+      fprintf(stderr, "%s: Line too long.", prefix);
+      charmap_free(&m);
+      return NULL;
+    }
+
+    if(!strncmp(buffer, "CHARMAP", 7))
+      break;
+
+    if(*buffer == m->comment_char)
+      continue;
+    
+    if(!(t = strtok(buffer, "\t ")))
+      continue;
+    
+    if(!(u = strtok(NULL, "\t ")))
+    {
+      fprintf(stderr, "%s: Syntax error.\n", prefix);
+      charmap_free(&m);
+      return NULL;
+    }
+
+    if(!strcmp(t, "<code_set_name>"))
+    {
+      safe_free((void **) &m->charset);
+      canonical_charset(u, strlen(u) + 1, u);
+      m->charset = safe_strdup(u);
+#ifdef DEBUG
+      fprintf(stderr, "code_set_name: `%s'\n", m->charset);
+#endif
+    }
+    else if(!strcmp(t, "<comment_char>"))
+    {
+      m->comment_char = *u;
+#ifdef DEBUG
+      fprintf(stderr, "comment_char: `%c'\n", m->comment_char);
+#endif
+    }
+    else if(!strcmp(t, "<escape_char>"))
+    {
+      m->escape_char = *u;
+#ifdef DEBUG
+      fprintf(stderr, "escape_char: `%c'\n", m->escape_char);
+#endif
+    }
+  }
+  
+  return m;
+}
+
+static void parse_charmap_body(FILE *fp, CHARMAP *m, const char *prefix)
+{
+  char buffer[1024];
+  char *ch, *t;
+  int idx, value;
+  
+  while(fgets(buffer, sizeof(buffer), fp))
+  {
+    if((t = strchr(buffer, '\n')))
+      *t = '\0';
+    else
+    {
+      fprintf(stderr, "%s: Line too long.\n", prefix);
+      return;
+    }
+    
+    if(*buffer == m->comment_char)
+      continue;
+    
+    if(!strncmp(buffer, "END CHARMAP", 11))
+      break;
+    
+    if(!(ch = strtok(buffer, " \t")))
+      continue;
+    
+    if(!(t = strtok(NULL, " \t")))
+    {
+      fprintf(stderr, "%s: Syntax error in definition of `%s'.\n", prefix, ch);
+      continue;
+    }
+    
+    /* parse the character encoding */
+    if(*t++ != m->escape_char)
+    {
+      fprintf(stderr, "%s: Bad encoding for character `%s'.\n", prefix, ch);
+      continue;
+    }
+    
+    switch(*t++)
+    {
+      case 'x':
+        idx = strtol(t, NULL, 16);
+        break;
+      case 'd':
+        idx = strtol(t, NULL, 10);
+        break;
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+        idx = strtol(t, NULL, 8);
+        break;
+      default:
+        fprintf(stderr, "%s: Bad encoding for character `%s'.\n", prefix, ch);
+        continue;
+    }
+    
+    if(!(t = strtok(NULL, "\t ")))
+    {
+      fprintf(stderr, "%s: No comment for `%s'.\n", prefix, ch);
+      continue;
+    }
+    
+    if(strncmp(t, "<U", 2))
+    {
+      fprintf(stderr, "%s: No unicode value for `%s'.\n", prefix, ch);
+      continue;
+    }
+    
+    value = strtol(t + 2, NULL, 16);
+#if 0
+    if(value == LONG_MIN || value == LONG_MAX)
+    {
+      fprintf(stderr, "%s: Bad unicode value for `%s'.\n", prefix, ch);
+      continue;
+    }
+#endif
+    if(0 < idx && idx < 256)
+    {
+      m->map[idx] = value;
+      m->is_valid = 1;
+    }
+  }
+}
+
+static void write_charmap(FILE *fp, CHARMAP *m)
+{
+  int i;
+
+  fputs(CHARSET_MAGIC, fp);
+  
+  for(i = 0; i < 256; i++)
+    fprintf(fp, "%d\n", m->map[i]);
+}
+
+int main(int argc, const char *argv[])
+{
+  FILE *fp;
+  CHARMAP *m;
+  int i;
+  char buffer[1024];
+  
+  basedir = safe_strdup(argv[1]);
+  
+  for(i = 2; i < argc; i++)
+  {
+    if(!strcmp(argv[i], "-"))
+      fp = stdin;
+    else if(!(fp = fopen(argv[i], "r")))
+    {
+      perror(argv[i]);
+      continue;
+    }
+    
+    if((m = parse_charmap_header(fp, argv[i])))
+      parse_charmap_body(fp, m, argv[i]);
+    
+    fclose(fp);
+    
+    if(m && m->charset && m->is_valid)
+    {
+      snprintf(buffer, sizeof(buffer), "%s%s%s",
+              basedir ? basedir : "", basedir ? "/" : "",
+              m->charset);
+      
+      if((fp = fopen(buffer, "w")))
+      {
+       printf("%s\n", m->charset);
+       write_charmap(fp, m);
+       fclose(fp);
+      }
+      else
+      {
+       perror(buffer);
+      }
+    }
+    charmap_free(&m);
+  }
+  return 0;
+}
index 78bf0f168bb5ca1190a5a5749114569649778949..54817169670043a3e7a9242489165a942824c29c 100755 (executable)
--- a/configure
+++ b/configure
@@ -3126,7 +3126,7 @@ done
 ac_given_srcdir=$srcdir
 ac_given_INSTALL="$INSTALL"
 
-trap 'rm -fr `echo "Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man charsets/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 EOF
 cat >> $CONFIG_STATUS <<EOF
 
@@ -3222,7 +3222,7 @@ EOF
 
 cat >> $CONFIG_STATUS <<EOF
 
-CONFIG_FILES=\${CONFIG_FILES-"Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man"}
+CONFIG_FILES=\${CONFIG_FILES-"Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man charsets/Makefile"}
 EOF
 cat >> $CONFIG_STATUS <<\EOF
 for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
index f5e8af070c7387907c84027e0c711e1a54dbc4d3..684e68a9d830dd655d0434fa43654a07421af4e4 100644 (file)
@@ -433,4 +433,4 @@ AC_ARG_ENABLE(exact-address, [  --enable-exact-address     enable regeneration o
                AC_DEFINE(EXACT_ADDRESS)
        fi])
 
-AC_OUTPUT(Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man)
+AC_OUTPUT(Makefile rx/Makefile Muttrc doc/Makefile doc/dotlock.man doc/mutt.man charsets/Makefile)
diff --git a/gen-charset.c b/gen-charset.c
deleted file mode 100644 (file)
index dbc8eca..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 1998 Ruslan Ermilov <ru@ucb.crimea.ua>,
- *                    Thomas Roessler <roessler@guug.de>
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#define _GEN_CHARSETS
-#include "charset.h"
-
-static UNICODE_MAP iso_8859_1 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
-       0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-       0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
-       0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
-       0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-       0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
-       0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
-       0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
-       0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
-       0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
-       0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-       0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
-};
-
-static UNICODE_MAP iso_8859_2 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
-       0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
-       0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
-       0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
-       0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
-       0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
-       0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
-       0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
-       0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
-       0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
-       0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
-       0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
-};
-
-static UNICODE_MAP iso_8859_3 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4,     -1, 0x0124, 0x00A7,
-       0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD,     -1, 0x017B,
-       0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
-       0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD,     -1, 0x017C,
-       0x00C0, 0x00C1, 0x00C2,     -1, 0x00C4, 0x010A, 0x0108, 0x00C7,
-       0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
-           -1, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
-       0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
-       0x00E0, 0x00E1, 0x00E2,     -1, 0x00E4, 0x010B, 0x0109, 0x00E7,
-       0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
-           -1, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
-       0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
-};
-
-static UNICODE_MAP iso_8859_4 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
-       0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
-       0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
-       0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
-       0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
-       0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
-       0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
-       0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
-       0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
-       0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
-       0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-       0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
-};
-
-static UNICODE_MAP iso_8859_5 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
-       0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
-       0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
-       0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
-       0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-       0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
-       0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
-       0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
-       0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
-       0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
-       0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
-       0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
-};
-
-static UNICODE_MAP iso_8859_6 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0,     -1,     -1,     -1, 0x00A4,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1, 0x060C, 0x00AD,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1, 0x061B,     -1,     -1,     -1, 0x061F,
-           -1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
-       0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
-       0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
-       0x0638, 0x0639, 0x063A,     -1,     -1,     -1,     -1,     -1,
-       0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
-       0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
-       0x0650, 0x0651, 0x0652,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1
-};
-
-static UNICODE_MAP iso_8859_7 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x02BD, 0x02BC, 0x00A3,     -1,     -1, 0x00A6, 0x00A7,
-       0x00A8, 0x00A9,     -1, 0x00AB, 0x00AC, 0x00AD,     -1, 0x2015,
-       0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
-       0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
-       0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
-       0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
-       0x03A0, 0x03A1,     -1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
-       0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
-       0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
-       0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
-       0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
-       0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE,     -1
-};
-
-static UNICODE_MAP iso_8859_8 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0,     -1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
-       0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E,
-       0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
-       0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1, 0x2017,
-       0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
-       0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
-       0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
-       0x05E8, 0x05E9, 0x05EA,     -1,     -1,     -1,     -1,     -1
-};
-
-static UNICODE_MAP iso_8859_9 = {
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-           -1,     -1,     -1,     -1,     -1,     -1,     -1,     -1,
-       0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
-       0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
-       0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
-       0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
-       0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
-       0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
-       0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
-       0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
-       0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
-       0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
-       0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
-       0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
-};
-
-static UNICODE_MAP koi8_r = {
-       0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524,
-       0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
-       0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248,
-       0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7,
-       0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
-       0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e,
-       0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
-       0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9,
-       0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
-       0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
-       0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
-       0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
-       0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
-       0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
-       0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
-       0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a
-};
-
-static UNICODE_MAP microsoft_cp1251 = {
-       0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
-           -1, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
-       0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-           -1, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
-       0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
-       0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
-       0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
-       0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
-       0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
-       0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
-       0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-       0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
-       0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
-       0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
-       0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
-       0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
-};
-
-static UNICODE_MAP microsoft_cp866 = {
-       0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
-       0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
-       0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
-       0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
-       0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
-       0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
-       0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
-       0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
-       0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
-       0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
-       0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
-       0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
-       0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
-       0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
-       0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e,
-       0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0
-};
-
-static CHARSET Charsets[] = {
-       {"iso-8859-1",  &iso_8859_1},
-       {"iso-8859-2",  &iso_8859_2},
-       {"iso-8859-3",  &iso_8859_3},
-       {"iso-8859-4",  &iso_8859_4},
-       {"iso-8859-5",  &iso_8859_5},
-       {"iso-8859-6",  &iso_8859_6},
-       {"iso-8859-7",  &iso_8859_7},
-       {"iso-8859-8",  &iso_8859_8},
-       {"iso-8859-9",  &iso_8859_9},
-       {"koi8-r",      &koi8_r},
-       {"windows-1251",&microsoft_cp1251},
-       {"cp866",       &microsoft_cp866},
-       {NULL,          NULL}
-};
-
-int main (int argc, const char *argv[])
-{
-  int i, j;
-  FILE *f;
-  
-  if(argv[1])
-  {
-    if(chdir(argv[1]) == -1)
-    {
-      perror("chdir");
-      exit(1);
-    }
-  }
-  
-  for(i = 0; Charsets[i].name; i++)
-  {
-    printf("%s: %s\n", argv[0], Charsets[i].name);
-    if((f = fopen(Charsets[i].name, "w")) == NULL)
-    {
-      perror(Charsets[i].name);
-      exit(1);
-    }
-    
-    fputs(CHARSET_MAGIC, f);
-    for(j = 0; j < 128; j++)
-      fprintf(f, "%d\n",  (*Charsets[i].map)[j]);
-    
-    fclose(f);
-  }
-  
-  return 0;
-}