diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-04-06 17:49:18 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-04-06 17:49:18 +0000 |
commit | e7f21fa6fbbad55ff2654e39732f54bf147cbfce (patch) | |
tree | 9797799d8e0cc2e33746ec176d611cac4571916e /iconv | |
parent | ee62473f2bd030dc42b601c06dae78e69b6cdaec (diff) | |
download | glibc-e7f21fa6fbbad55ff2654e39732f54bf147cbfce.zip glibc-e7f21fa6fbbad55ff2654e39732f54bf147cbfce.tar.gz glibc-e7f21fa6fbbad55ff2654e39732f54bf147cbfce.tar.bz2 |
Update.
2001-04-06 Ulrich Drepper <drepper@redhat.com>
* iconv/iconv_open.c: Move strip and upstr definitions...
* iconv/gconv_charset.h: ...here. New file.
* iconv/gconv_db.c (once): Move to file level.
(do_lookup_alias): Split out from __gconv_find_transform.
(__gconv_find_transform): Call do_lookup_alias.
(__gconv_loopup_alias): New function.
* locale/langinfo.h: Define _NL_*_CODESET values for all categories
but LC_CTYPE.
* locale/categories.def: Add entries for new _NL_*_CODESET values.
* locale/C-ctype.c: Use _nl_C_codeset to initialize CODESET entry.
* locale/C-address.c: Initialize _NL_*_CODESET element.
* locale/C-collate.c: Likewise.
* locale/C-identification.c: Likewise.
* locale/C-measurement.c: Likewise.
* locale/C-messages.c: Likewise.
* locale/C-monetary.c: Likewise.
* locale/C-name.c: Likewise.
* locale/C-numeric.c: Likewise.
* locale/C-paper.c: Likewise.
* locale/C-telephone.c: Likewise.
* locale/C-time.c: Likewise.
* locale/localeinfo.h: Declare _nl_C_codeset.
* locale/C_name.c: Define _nl_C_codeset.
* locale/findlocale.c: Before accepting locale check that the used
charset does not conflict with what the locale name said.
* locale/programs/ld-address.c: Emit codeset information.
* locale/programs/ld-collate.c: Likewise.
* locale/programs/ld-identification.c: Likewise.
* locale/programs/ld-measurement.c: Likewise.
* locale/programs/ld-messages.c: Likewise.
* locale/programs/ld-monetary.c: Likewise.
* locale/programs/ld-name.c: Likewise.
* locale/programs/ld-numeric.c: Likewise.
* locale/programs/ld-paper.c: Likewise.
* locale/programs/ld-telephone.c: Likewise.
* locale/programs/ld-time.c: Likewise.
* localedata/tests-mbwc/tst_funcs.h (TST_HEAD_LOCALE): It is an error
if the locale data couldn't be found.
* string/Makefile: Define tst-strxfrm-ENV.
* ysdeps/unix/sysv/linux/ia64/getcontext.S: Fix comment.
Diffstat (limited to 'iconv')
-rw-r--r-- | iconv/gconv_charset.h | 60 | ||||
-rw-r--r-- | iconv/gconv_db.c | 39 |
2 files changed, 88 insertions, 11 deletions
diff --git a/iconv/gconv_charset.h b/iconv/gconv_charset.h new file mode 100644 index 0000000..334bb5f --- /dev/null +++ b/iconv/gconv_charset.h @@ -0,0 +1,60 @@ +/* Charset name normalization. + Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <ctype.h> + + +static inline void +strip (char *wp, const char *s) +{ + int slash_count = 0; + + while (*s != '\0') + { + if (isalnum (*s) || *s == '_' || *s == '-' || *s == '.') + *wp++ = toupper (*s); + else if (*s == '/') + { + if (++slash_count == 3) + break; + *wp++ = '/'; + } + ++s; + } + + while (slash_count++ < 2) + *wp++ = '/'; + + *wp = '\0'; +} + + +static char * +upstr (char *dst, const char *str) +{ + char *cp = dst; + while ((*cp++ = toupper (*str++)) != '\0') + /* nothing */; + return dst; +} + + +/* If NAME is an codeset alias expand it. */ +extern const char *__gconv_lookup_alias (const char *name); diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c index c4ebc4f..71d64b4 100644 --- a/iconv/gconv_db.c +++ b/iconv/gconv_db.c @@ -614,13 +614,38 @@ find_derivation (const char *toset, const char *toset_expand, } +/* Control of initialization. */ +__libc_once_define (static, once); + + +static const char * +do_lookup_alias (const char *name) +{ + struct gconv_alias key; + struct gconv_alias **found; + + key.fromname = (char *) name; + found = __tfind (&key, &__gconv_alias_db, __gconv_alias_compare); + return found != NULL ? (*found)->toname : NULL; +} + + +const char * +__gconv_lookup_alias (const char *name) +{ + /* Ensure that the configuration data is read. */ + __libc_once (once, __gconv_read_conf); + + return do_lookup_alias (name) ?: name; +} + + int internal_function __gconv_find_transform (const char *toset, const char *fromset, struct __gconv_step **handle, size_t *nsteps, int flags) { - __libc_once_define (static, once); const char *fromset_expand = NULL; const char *toset_expand = NULL; int result; @@ -641,16 +666,8 @@ __gconv_find_transform (const char *toset, const char *fromset, /* See whether the names are aliases. */ if (__gconv_alias_db != NULL) { - struct gconv_alias key; - struct gconv_alias **found; - - key.fromname = (char *) fromset; - found = __tfind (&key, &__gconv_alias_db, __gconv_alias_compare); - fromset_expand = found != NULL ? (*found)->toname : NULL; - - key.fromname = (char *) toset; - found = __tfind (&key, &__gconv_alias_db, __gconv_alias_compare); - toset_expand = found != NULL ? (*found)->toname : NULL; + fromset_expand = do_lookup_alias (fromset); + toset_expand = do_lookup_alias (toset); } if (__builtin_expect (flags & GCONV_AVOID_NOCONV, 0) |