From f8d8287cdbd7da9cd9392bcddf04860a10fa598e Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 10 Nov 2008 18:43:09 +0000 Subject: Import Iconv sources svn path=/trunk/iconv/; revision=5677 --- src/alias.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/alias.c (limited to 'src/alias.c') diff --git a/src/alias.c b/src/alias.c new file mode 100644 index 0000000..ebc1b78 --- /dev/null +++ b/src/alias.c @@ -0,0 +1,89 @@ +#include +#include +#include + +#include "unicode/charsets.h" +#include "unicode/encoding.h" + +#include "internal.h" + +struct table_entry { + const char *alias; + const char *encname; +}; + +/* This table contains special cases to allow us to use UnicodeLib sensibly. */ +static const struct table_entry mapping_table[] = { + {"/UTF-7/UNICODE-1-1-UTF-7/UNICODE-2-0-UTF-7/", "UTF-7" }, + {"/ISO-10646-UCS-4/UCS-4/UTF-32/", "ISO-10646-UCS-4" }, + {"/UTF-16/UCS-2/ISO-10646-UCS-2/UNICODE-1-1/UNICODE-2-0/", "UTF-16" }, + {"/ISO-2022/", "ISO-2022" }, +}; + +#define TABLE_SIZE (sizeof(mapping_table) / sizeof(mapping_table[0])) + +/** + * Look up an encoding number, based on its name + * + * \param name The encoding name + * \return The encoding number, or 0 if not found. + */ +int iconv_encoding_number_from_name(const char *name) +{ + unsigned int i; + char buf[256]; + struct canon *c; + + if (!name) + return 0; + + snprintf(buf, sizeof buf, "/%s/", name); + + /* convert to upper case */ + for (i = 0; i != strlen(buf); i++) { + if (buf[i] >= 'a' && buf[i] <= 'z') + buf[i] = buf[i] - 32; + } + + for (i = 0; i != TABLE_SIZE; i++) + if (strstr(mapping_table[i].alias, buf) != NULL) + return encoding_number_from_name(mapping_table[i].encname); + + c = alias_canonicalise(name); + if (!c) + return 0; + + return encoding_number_from_name(c->name); +} + +/** + * Look up an encoding name, based on its MIB number + * + * \param number The encoding MIB number + * \return Pointer to encoding name, or NULL if not found + */ +const char *iconv_encoding_name_from_number(int number) +{ + const char *ret = NULL; + /* This is a PITA - UnicodeLib doesn't have a call to do this, + * so implement it ourselves. */ + switch (number) { + case csUnicode11UTF7: + ret = mapping_table[0].alias; + break; + case csUCS4: + ret = mapping_table[1].alias; + break; + case csUnicode11: + ret = mapping_table[2].alias; + break; + case csVenturaMath: + ret = mapping_table[3].alias; + break; + default: + ret = mibenum_to_name(number); + break; + } + + return ret; +} -- cgit v1.2.3