From 52736ebb33c0e4ba015a1c7aafd3e21c67a3a82d Mon Sep 17 00:00:00 2001 From: Thomas Roessler Date: Tue, 15 Sep 1998 13:36:40 +0000 Subject: [PATCH] Generate the character set tables from i18n files. --- Makefile.in | 16 +-- charset.c | 19 ++- charset.h | 10 +- charsets/Makefile.in | 48 +++++++ charsets/gen_charsets | 11 ++ charsets/parse_i18n.c | 325 ++++++++++++++++++++++++++++++++++++++++++ configure | 4 +- configure.in | 2 +- gen-charset.c | 302 --------------------------------------- 9 files changed, 408 insertions(+), 329 deletions(-) create mode 100644 charsets/Makefile.in create mode 100755 charsets/gen_charsets create mode 100644 charsets/parse_i18n.c delete mode 100644 gen-charset.c diff --git a/Makefile.in b/Makefile.in index 5d436be1..1ba958aa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 diff --git a/charset.c b/charset.c index 96e6b94a..1b6379fc 100644 --- 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) diff --git a/charset.h b/charset.h index d60dfaf8..88d53913 100644 --- a/charset.h +++ b/charset.h @@ -19,7 +19,11 @@ #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 index 00000000..689cf751 --- /dev/null +++ b/charsets/Makefile.in @@ -0,0 +1,48 @@ +# +# Copyright (C) 1998 Thomas Roessler +# +# 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 index 00000000..4ab05ab7 --- /dev/null +++ b/charsets/gen_charsets @@ -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 index 00000000..a8325589 --- /dev/null +++ b/charsets/parse_i18n.c @@ -0,0 +1,325 @@ +/* + * Copyright (C) 1998 Thomas Roessler + * + * 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 +#include +#include +#include + +#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, "")) + { + 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, "")) + { + m->comment_char = *u; +#ifdef DEBUG + fprintf(stderr, "comment_char: `%c'\n", m->comment_char); +#endif + } + else if(!strcmp(t, "")) + { + 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, "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; +} diff --git a/configure b/configure index 78bf0f16..54817169 100755 --- 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 <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then diff --git a/configure.in b/configure.in index f5e8af07..684e68a9 100644 --- a/configure.in +++ b/configure.in @@ -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 index dbc8ecaf..00000000 --- a/gen-charset.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (C) 1998 Ruslan Ermilov , - * Thomas Roessler - * - * 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 -#include -#include - -#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",µsoft_cp1251}, - {"cp866", µsoft_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; -} -- 2.50.0