diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2000-05-04 02:46:54 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2000-05-04 02:46:54 +0000 |
| commit | 17c389fc2b8bdc74ae136c933988ad5d89f6350e (patch) | |
| tree | d9f06e66be27ed5a2b1b021684de02745b3e594b | |
| parent | 160016c945d49cfe43f6d34aa077ea04309c983b (diff) | |
| download | glibc-17c389fc2b8bdc74ae136c933988ad5d89f6350e.tar.xz glibc-17c389fc2b8bdc74ae136c933988ad5d89f6350e.zip | |
Update.
* libio/stdio.h: Make fseeko and ftello prototypes available is
__USE_LARGEFILE. Patch by Paul Eggert <eggert@twinsun.com>.
* sysdeps/generic/dl-environ.c (unsetenv): Follow change to the
real unsetenv implementation from 1999-07-29 [PR libc/1714].
2000-05-03 Bruno Haible <haible@clisp.cons.org>
* intl/dcigettext.c (dcigettext): Do the defaulting of 'domainname'
before calling tfind.
2000-03-05 Jakub Jelinek <jakub@redhat.com>
* resolv/resolv.h (res_querydomain): Remove redefinition to
__res_querydomain (reported by Owen Taylor <otaylor@redhat.com>).
2000-05-03 Ulrich Drepper <drepper@redhat.com>
* po/gl.po: Update from translation team.
* manual/intro.texi (Program Basics): Change section title.
* manual/process.texi: Fix reference.
(Executing a File): Add reference exec in other section.
* manual/signal.texi: Fix reference.
* manual/startup.texi: Document syscall function.
Patches by Bryan Henderson <bryanh@giraffe-data.com>.
2000-04-29 Bruno Haible <haible@clisp.cons.org>
* intl/libintl.h (bind_textdomain_codeset): New declaration.
* intl/bindtextdom.c (set_binding_values): New function.
(bindtextdomain): Call it.
(bind_textdomain_codeset): New function.
* intl/dcigettext.c (dcigettext): Pass binding to _nl_find_domain.
(free_mem): Free each binding's codeset.
* intl/gettextP.h (struct binding): Add codeset field.
(_nl_find_domain): Add domainbinding argument.
* intl/finddomain.c (_nl_find_domain): Add domainbinding argument.
Pass it to _nl_make_l10nflist.
* intl/loadinfo.h (struct loaded_l10nfile): Add domainbinding field.
(_nl_make_l10nflist): Add domainbinding argument.
* intl/l10nflist.c (_nl_make_l10nflist): Add domainbinding argument.
* intl/loadmsgcat.c (_nl_load_domain): Look at the domainbinding's
codeset when determining outcharset. If !_LIBC && HAVE_ICONV, call
locale_charset().
* manual/message.texi: New node "Charset conversion in gettext".
2000-04-30 Bruno Haible <haible@clisp.cons.org>
* catgets/open_catalog.c (__open_catalog): Use __builtin_expect where
appropriate. Handle possible __read error.
2000-04-29 Bruno Haible <haible@clisp.cons.org>
* intl/gettextP.h (__builtin_expect): Define as empty if not a
compiler builtin.
* intl/loadinfo.h (__builtin_expect): Likewise.
* intl/dcigettext.c (dcigettext, _nl_find_msg): Use
__builtin_expect where appropriate.
* intl/loadmsgcat.c (_nl_load_domain): Likewise.
* intl/localealias.c (extend_alias_table): Return an error indicator.
(read_alias_file): Bail out if extend_alias_table fails.
2000-04-29 Bruno Haible <haible@clisp.cons.org>
* intl/loadmsgcat.c: Define _GNU_SOURCE as early as possible.
* intl/localealias.c: Likewise.
2000-05-01 Bruno Haible <haible@clisp.cons.org>
* intl/loadmsgcat.c (_nl_load_domain): Initialize domain->conv_tab.
Initialize domain->plural and domain->nplurals even if there is no
nullentry.
2000-05-01 Bruno Haible <haible@clisp.cons.org>
* intl/dcigettext.c (_nl_find_msg): Terminate __gconv loop if return
value is == __GCONV_OK or == __GCONV_EMPTY_INPUT, not != __GCONV_OK.
In case of failure, goto converted.
2000-05-01 Bruno Haible <haible@clisp.cons.org>
* wcsmbs/wcsmbsload.c (norm_add_slashes): Move away.
* iconv/gconv_int.h (norm_add_slashes): Move to here.
* intl/loadmsgcat.c (_nl_load_domain): Normalize strings passed to
__gconv_open.
2000-04-29 Bruno Haible <haible@clisp.cons.org>
* intl/dcigettext.c (transcmp): Compare the domains as well.
(dcigettext): Call strlen (msgid1) after testing msgid1 against NULL,
not before.
* intl/loadmsgcat.c (_nl_load_domain): Deal with EINTR. Include
<errno.h>.
2000-05-03 Ulrich Drepper <drepper@redhat.com>
| -rw-r--r-- | ChangeLog | 97 | ||||
| -rw-r--r-- | catgets/open_catalog.c | 10 | ||||
| -rw-r--r-- | iconv/gconv_int.h | 28 | ||||
| -rw-r--r-- | intl/bindtextdom.c | 268 | ||||
| -rw-r--r-- | intl/dcigettext.c | 103 | ||||
| -rw-r--r-- | intl/finddomain.c | 9 | ||||
| -rw-r--r-- | intl/gettextP.h | 10 | ||||
| -rw-r--r-- | intl/l10nflist.c | 7 | ||||
| -rw-r--r-- | intl/libintl.h | 5 | ||||
| -rw-r--r-- | intl/loadinfo.h | 10 | ||||
| -rw-r--r-- | intl/loadmsgcat.c | 89 | ||||
| -rw-r--r-- | intl/localealias.c | 23 | ||||
| -rw-r--r-- | libio/stdio.h | 10 | ||||
| -rw-r--r-- | manual/intro.texi | 2 | ||||
| -rw-r--r-- | manual/message.texi | 66 | ||||
| -rw-r--r-- | manual/process.texi | 5 | ||||
| -rw-r--r-- | manual/signal.texi | 2 | ||||
| -rw-r--r-- | manual/startup.texi | 183 | ||||
| -rw-r--r-- | po/gl.po | 6 | ||||
| -rw-r--r-- | resolv/resolv.h | 1 | ||||
| -rw-r--r-- | sysdeps/generic/dl-environ.c | 9 | ||||
| -rw-r--r-- | wcsmbs/wcsmbsload.c | 28 |
22 files changed, 745 insertions, 226 deletions
@@ -1,5 +1,102 @@ 2000-05-03 Ulrich Drepper <drepper@redhat.com> + * libio/stdio.h: Make fseeko and ftello prototypes available is + __USE_LARGEFILE. Patch by Paul Eggert <eggert@twinsun.com>. + + * sysdeps/generic/dl-environ.c (unsetenv): Follow change to the + real unsetenv implementation from 1999-07-29 [PR libc/1714]. + +2000-05-03 Bruno Haible <haible@clisp.cons.org> + + * intl/dcigettext.c (dcigettext): Do the defaulting of 'domainname' + before calling tfind. + +2000-03-05 Jakub Jelinek <jakub@redhat.com> + + * resolv/resolv.h (res_querydomain): Remove redefinition to + __res_querydomain (reported by Owen Taylor <otaylor@redhat.com>). + +2000-05-03 Ulrich Drepper <drepper@redhat.com> + + * po/gl.po: Update from translation team. + + * manual/intro.texi (Program Basics): Change section title. + * manual/process.texi: Fix reference. + (Executing a File): Add reference exec in other section. + * manual/signal.texi: Fix reference. + * manual/startup.texi: Document syscall function. + Patches by Bryan Henderson <bryanh@giraffe-data.com>. + +2000-04-29 Bruno Haible <haible@clisp.cons.org> + + * intl/libintl.h (bind_textdomain_codeset): New declaration. + * intl/bindtextdom.c (set_binding_values): New function. + (bindtextdomain): Call it. + (bind_textdomain_codeset): New function. + * intl/dcigettext.c (dcigettext): Pass binding to _nl_find_domain. + (free_mem): Free each binding's codeset. + * intl/gettextP.h (struct binding): Add codeset field. + (_nl_find_domain): Add domainbinding argument. + * intl/finddomain.c (_nl_find_domain): Add domainbinding argument. + Pass it to _nl_make_l10nflist. + * intl/loadinfo.h (struct loaded_l10nfile): Add domainbinding field. + (_nl_make_l10nflist): Add domainbinding argument. + * intl/l10nflist.c (_nl_make_l10nflist): Add domainbinding argument. + * intl/loadmsgcat.c (_nl_load_domain): Look at the domainbinding's + codeset when determining outcharset. If !_LIBC && HAVE_ICONV, call + locale_charset(). + * manual/message.texi: New node "Charset conversion in gettext". + +2000-04-30 Bruno Haible <haible@clisp.cons.org> + + * catgets/open_catalog.c (__open_catalog): Use __builtin_expect where + appropriate. Handle possible __read error. + +2000-04-29 Bruno Haible <haible@clisp.cons.org> + + * intl/gettextP.h (__builtin_expect): Define as empty if not a + compiler builtin. + * intl/loadinfo.h (__builtin_expect): Likewise. + * intl/dcigettext.c (dcigettext, _nl_find_msg): Use + __builtin_expect where appropriate. + * intl/loadmsgcat.c (_nl_load_domain): Likewise. + * intl/localealias.c (extend_alias_table): Return an error indicator. + (read_alias_file): Bail out if extend_alias_table fails. + +2000-04-29 Bruno Haible <haible@clisp.cons.org> + + * intl/loadmsgcat.c: Define _GNU_SOURCE as early as possible. + * intl/localealias.c: Likewise. + +2000-05-01 Bruno Haible <haible@clisp.cons.org> + + * intl/loadmsgcat.c (_nl_load_domain): Initialize domain->conv_tab. + Initialize domain->plural and domain->nplurals even if there is no + nullentry. + +2000-05-01 Bruno Haible <haible@clisp.cons.org> + + * intl/dcigettext.c (_nl_find_msg): Terminate __gconv loop if return + value is == __GCONV_OK or == __GCONV_EMPTY_INPUT, not != __GCONV_OK. + In case of failure, goto converted. + +2000-05-01 Bruno Haible <haible@clisp.cons.org> + + * wcsmbs/wcsmbsload.c (norm_add_slashes): Move away. + * iconv/gconv_int.h (norm_add_slashes): Move to here. + * intl/loadmsgcat.c (_nl_load_domain): Normalize strings passed to + __gconv_open. + +2000-04-29 Bruno Haible <haible@clisp.cons.org> + + * intl/dcigettext.c (transcmp): Compare the domains as well. + (dcigettext): Call strlen (msgid1) after testing msgid1 against NULL, + not before. + * intl/loadmsgcat.c (_nl_load_domain): Deal with EINTR. Include + <errno.h>. + +2000-05-03 Ulrich Drepper <drepper@redhat.com> + * string/bits/string2.h: Declare __strdup and __strndup if necessary. Reported by Bruno Haible. diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c index c5193e166d..4a63a138e0 100644 --- a/catgets/open_catalog.c +++ b/catgets/open_catalog.c @@ -50,7 +50,7 @@ __open_catalog (__nl_catd catalog) __libc_lock_lock (catalog->lock); /* Check whether there was no other thread faster. */ - if (catalog->status != closed) + if (__builtin_expect (catalog->status != closed, 0)) /* While we waited some other thread tried to open the catalog. */ goto unlock_return; @@ -60,7 +60,7 @@ __open_catalog (__nl_catd catalog) { const char *run_nlspath = catalog->nlspath; #define ENOUGH(n) \ - if (bufact + (n) >=bufmax) \ + if (__builtin_expect (bufact + (n) >= bufmax, 0)) \ { \ char *old_buf = buf; \ bufmax += 256 + (n); \ @@ -251,8 +251,12 @@ __open_catalog (__nl_catd catalog) { size_t now = __read (fd, (((char *) &catalog->file_ptr) + (st.st_size - todo)), todo); - if (now == 0) + if (now == 0 || now == (size_t) -1) { +#ifdef EINTR + if (now == (size_t) -1 && errno == EINTR) + continue; +#endif free ((void *) catalog->file_ptr); catalog->status = nonexisting; goto close_unlock_return; diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h index 4c8024be3e..8624f74967 100644 --- a/iconv/gconv_int.h +++ b/iconv/gconv_int.h @@ -100,6 +100,34 @@ extern size_t __gconv_nmodules; extern struct gconv_module *__gconv_modules_db; +/* The gconv functions expects the name to be in upper case and complete, + including the trailing slashes if necessary. */ +#define norm_add_slashes(str) \ + ({ \ + const char *cp = (str); \ + char *result; \ + char *tmp; \ + size_t cnt = 0; \ + \ + while (*cp != '\0') \ + if (*cp++ == '/') \ + ++cnt; \ + \ + tmp = result = alloca (cp - (str) + 3); \ + cp = (str); \ + while (*cp != '\0') \ + *tmp++ = _toupper (*cp++); \ + if (cnt < 2) \ + { \ + *tmp++ = '/'; \ + if (cnt < 1) \ + *tmp++ = '/'; \ + } \ + *tmp = '\0'; \ + result; \ + }) + + /* Return in *HANDLE decriptor for transformation from FROMSET to TOSET. */ extern int __gconv_open (const char *__toset, const char *__fromset, __gconv_t *__handle, int flags) diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c index c5d4901a85..3d49344aaf 100644 --- a/intl/bindtextdom.c +++ b/intl/bindtextdom.c @@ -75,29 +75,44 @@ __libc_rwlock_define (extern, _nl_state_lock) prefix. So we have to make a difference here. */ #ifdef _LIBC # define BINDTEXTDOMAIN __bindtextdomain +# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define BINDTEXTDOMAIN bindtextdomain__ +# define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__ #endif -/* Specify that the DOMAINNAME message catalog will be found - in DIRNAME rather than in the system locale data base. */ -char * -BINDTEXTDOMAIN (domainname, dirname) +/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP + to be used for the DOMAINNAME message catalog. + If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not + modified, only the current value is returned. + If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither + modified nor returned. */ +static void +set_binding_values (domainname, dirnamep, codesetp) const char *domainname; - const char *dirname; + const char **dirnamep; + const char **codesetp; { struct binding *binding; - char *result; + int modified; /* Some sanity checks. */ if (domainname == NULL || domainname[0] == '\0') - return NULL; + { + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + return; + } __libc_rwlock_wrlock (_nl_state_lock); + modified = 0; + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); @@ -112,40 +127,96 @@ BINDTEXTDOMAIN (domainname, dirname) } } - if (dirname == NULL) - /* The current binding has be to returned. */ - result = binding == NULL ? (char *) _nl_default_dirname : binding->dirname; - else if (binding != NULL) + if (binding != NULL) { - /* The domain is already bound. If the new value and the old - one are equal we simply do nothing. Otherwise replace the - old binding. */ - result = binding->dirname; - if (strcmp (dirname, result) != 0) + if (dirnamep) { - if (strcmp (dirname, _nl_default_dirname) == 0) - result = (char *) _nl_default_dirname; + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The current binding has be to returned. */ + *dirnamep = binding->dirname; else { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->dirname; + if (strcmp (dirname, result) != 0) + { + if (strcmp (dirname, _nl_default_dirname) == 0) + result = (char *) _nl_default_dirname; + else + { #if defined _LIBC || defined HAVE_STRDUP - result = strdup (dirname); + result = strdup (dirname); #else - size_t len = strlen (dirname) + 1; - result = (char *) malloc (len); - if (result != NULL) - memcpy (result, dirname, len); + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, dirname, len); #endif + } + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = result; + modified = 1; + } + } + *dirnamep = result; } + } + + if (codesetp) + { + const char *codeset = *codesetp; - if (result != NULL) + if (codeset == NULL) + /* The current binding has be to returned. */ + *codesetp = binding->codeset; + else { - if (binding->dirname != _nl_default_dirname) - free (binding->dirname); + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->codeset; + if (result == NULL || strcmp (codeset, result) != 0) + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, codeset, len); +#endif - binding->dirname = result; + if (__builtin_expect (result != NULL, 1)) + { + if (binding->codeset != NULL) + free (binding->codeset); + + binding->codeset = result; + modified = 1; + } + } + *codesetp = result; } } } + else if ((dirnamep == NULL || *dirnamep == NULL) + && (codesetp == NULL || *codesetp == NULL)) + { + /* Simply return the default values. */ + if (dirnamep) + *dirnamep = _nl_default_dirname; + if (codesetp) + *codesetp = NULL; + } else { /* We have to create a new binding. */ @@ -153,61 +224,140 @@ BINDTEXTDOMAIN (domainname, dirname) struct binding *new_binding = (struct binding *) malloc (sizeof (*new_binding) + len); - if (new_binding == NULL) - result = NULL; - else + if (__builtin_expect (new_binding == NULL, 0)) + goto failed; + + memcpy (new_binding->domainname, domainname, len); + + if (dirnamep) { - memcpy (new_binding->domainname, domainname, len); + const char *dirname = *dirnamep; - if (strcmp (dirname, _nl_default_dirname) == 0) - result = new_binding->dirname = (char *) _nl_default_dirname; + if (dirname == NULL) + /* The default value. */ + dirname = _nl_default_dirname; else { + if (strcmp (dirname, _nl_default_dirname) == 0) + dirname = _nl_default_dirname; + else + { + char *result; #if defined _LIBC || defined HAVE_STRDUP - result = new_binding->dirname = strdup (dirname); + result = strdup (dirname); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; #else - len = strlen (dirname) + 1; - result = new_binding->dirname = (char *) malloc (len); - if (result != NULL) - memcpy (new_binding->dirname, dirname, len); + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; + memcpy (result, dirname, len); #endif + dirname = result; + } } + *dirnamep = dirname; + new_binding->dirname = (char *) dirname; } + else + /* The default value. */ + new_binding->dirname = (char *) _nl_default_dirname; - if (result != NULL) + if (codesetp) { - /* Now enqueue it. */ - if (_nl_domain_bindings == NULL - || strcmp (domainname, _nl_domain_bindings->domainname) < 0) - { - new_binding->next = _nl_domain_bindings; - _nl_domain_bindings = new_binding; - } - else + const char *codeset = *codesetp; + + if (codeset != NULL) { - binding = _nl_domain_bindings; - while (binding->next != NULL - && strcmp (domainname, binding->next->domainname) > 0) - binding = binding->next; + char *result; - new_binding->next = binding->next; - binding->next = new_binding; +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; + memcpy (result, codeset, len); +#endif + codeset = result; } + *codesetp = codeset; + new_binding->codeset = (char *) codeset; + } + else + new_binding->codeset = NULL; + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + modified = 1; + + /* Here we deal with memory allocation failures. */ + if (0) + { + failed_codeset: + if (new_binding->dirname != _nl_default_dirname) + free (new_binding->dirname); + failed_dirname: + free (new_binding); + failed: + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; } - else if (new_binding != NULL) - free (new_binding); } - /* For a succesful call we flush the caches. */ - if (result != NULL) + /* If we modified any binding, we flush the caches. */ + if (modified) ++_nl_msg_cat_cntr; __libc_rwlock_unlock (_nl_state_lock); +} + +/ |
