* locale/xlocale.h (struct __locale_struct): New member `__names'.

* locale/xlocale.c (_nl_C_locobj): Update initializer.
	* locale/global-locale.c (_nl_global_locale): Likewise.
	* locale/duplocale.c (__duplocale): strdup __names elements.
	* locale/freelocale.c (__freelocale): Free __names elements.
	* locale/localename.c (_nl_current_names): Variable removed.
	(__current_locale_name): Use _NL_CURRENT_LOCALE->__names instead.
	* locale/localeinfo.h (_nl_current_names): Removed decl.
	* locale/setlocale.c: Use _nl_global_locale->__names in place of
	_nl_current_names throughout.

	* locale/setlocale.c (setlocale): strdup -> __strdup (not ISO C).

	* sysdeps/gnu/errlist-compat.awk: Emit link_warnings for sys_errlist
	and sys_nerr in the output file.

	* sunrpc/Makefile (rpcgen-cmd): Pass CPP in rpcgen's environment.
	* scripts/cpp: Just use the environment variable.

	* libio/tst-mmap-setvbuf.c (main): Use 'm' fopen flag.
	* libio/tst-mmap-offend.c (do_test): Likewise.
	* libio/tst-mmap-fflushsync.c (do_test): Likewise.
	* libio/tst-mmap-eofsync.c (do_test): Likewise.
	* libio/tst-mmap2-eofsync.c (do_test): Likewise.
This commit is contained in:
Roland McGrath 2002-08-30 10:36:44 +00:00
parent ccaf730670
commit 1ce8aaaedb
17 changed files with 105 additions and 61 deletions

View File

@ -1,5 +1,30 @@
2002-08-30 Roland McGrath <roland@redhat.com> 2002-08-30 Roland McGrath <roland@redhat.com>
* locale/xlocale.h (struct __locale_struct): New member `__names'.
* locale/xlocale.c (_nl_C_locobj): Update initializer.
* locale/global-locale.c (_nl_global_locale): Likewise.
* locale/duplocale.c (__duplocale): strdup __names elements.
* locale/freelocale.c (__freelocale): Free __names elements.
* locale/localename.c (_nl_current_names): Variable removed.
(__current_locale_name): Use _NL_CURRENT_LOCALE->__names instead.
* locale/localeinfo.h (_nl_current_names): Removed decl.
* locale/setlocale.c: Use _nl_global_locale->__names in place of
_nl_current_names throughout.
* locale/setlocale.c (setlocale): strdup -> __strdup (not ISO C).
* sysdeps/gnu/errlist-compat.awk: Emit link_warnings for sys_errlist
and sys_nerr in the output file.
* sunrpc/Makefile (rpcgen-cmd): Pass CPP in rpcgen's environment.
* scripts/cpp: Just use the environment variable.
* libio/tst-mmap-setvbuf.c (main): Use 'm' fopen flag.
* libio/tst-mmap-offend.c (do_test): Likewise.
* libio/tst-mmap-fflushsync.c (do_test): Likewise.
* libio/tst-mmap-eofsync.c (do_test): Likewise.
* libio/tst-mmap2-eofsync.c (do_test): Likewise.
* locale/localename.c: If the current locale is the global locale, use * locale/localename.c: If the current locale is the global locale, use
_nl_current_names; otherwise use the locale object. _nl_current_names; otherwise use the locale object.

View File

@ -38,7 +38,7 @@ do_test (void)
int result = 0; int result = 0;
int c; int c;
f = fopen (temp_file, "r"); f = fopen (temp_file, "rm");
if (f == NULL) if (f == NULL)
{ {
perror (temp_file); perror (temp_file);

View File

@ -38,7 +38,7 @@ do_test (void)
int result = 0; int result = 0;
int c; int c;
f = fopen (temp_file, "r"); f = fopen (temp_file, "rm");
if (f == NULL) if (f == NULL)
{ {
perror (temp_file); perror (temp_file);

View File

@ -34,7 +34,7 @@ do_test (void)
{ {
unsigned char buffer[8192]; unsigned char buffer[8192];
int result = 0; int result = 0;
FILE *f = fopen (temp_file, "r"); FILE *f = fopen (temp_file, "rm");
size_t cc; size_t cc;
if (f == NULL) if (f == NULL)

View File

@ -48,7 +48,7 @@ int main (void)
fputs (test, f); fputs (test, f);
fclose (f); fclose (f);
f = fopen (name, "r"); f = fopen (name, "rm");
if (f == NULL) if (f == NULL)
{ {
printf ("%u: cannot fopen temporary file: %m\n", __LINE__); printf ("%u: cannot fopen temporary file: %m\n", __LINE__);

View File

@ -44,7 +44,7 @@ do_test (void)
int result = 0; int result = 0;
int c; int c;
f = fopen (temp_file, "r"); f = fopen (temp_file, "rm");
if (f == NULL) if (f == NULL)
{ {
perror (temp_file); perror (temp_file);

View File

@ -33,15 +33,39 @@ __locale_t
__duplocale (__locale_t dataset) __duplocale (__locale_t dataset)
{ {
__locale_t result; __locale_t result;
int cnt;
/* We modify global data. */ /* We modify global data. */
__libc_lock_lock (__libc_setlocale_lock); __libc_lock_lock (__libc_setlocale_lock);
/* Get memory. */ /* Get memory. */
result = (__locale_t) malloc (sizeof (struct __locale_struct)); result = (__locale_t) malloc (sizeof (struct __locale_struct));
if (result != NULL)
/* Duplicate the names in a separate loop first so we can
bail out if strdup fails and not have touched usage_counts. */
for (cnt = 0; cnt < __LC_LAST; ++cnt)
if (cnt != LC_ALL)
{
if (dataset->__names[cnt] == _nl_C_name)
result->__names[cnt] = _nl_C_name;
else
{
result->__names[cnt] = __strdup (dataset->__names[cnt]);
if (result->__names[cnt] == NULL)
{
while (cnt-- > 0)
if (dataset->__names[cnt] != _nl_C_name)
free ((char *) dataset->__names[cnt]);
free (result);
result = NULL;
break;
}
}
}
if (result != NULL) if (result != NULL)
{ {
int cnt;
for (cnt = 0; cnt < __LC_LAST; ++cnt) for (cnt = 0; cnt < __LC_LAST; ++cnt)
if (cnt != LC_ALL) if (cnt != LC_ALL)
{ {

View File

@ -38,9 +38,14 @@ __freelocale (__locale_t dataset)
__libc_lock_lock (__libc_setlocale_lock); __libc_lock_lock (__libc_setlocale_lock);
for (cnt = 0; cnt < __LC_LAST; ++cnt) for (cnt = 0; cnt < __LC_LAST; ++cnt)
if (cnt != LC_ALL && dataset->__locales[cnt]->usage_count != UNDELETABLE) if (cnt != LC_ALL)
/* We can remove the data. */ {
_nl_remove_locale (cnt, dataset->__locales[cnt]); if (dataset->__locales[cnt]->usage_count != UNDELETABLE)
/* We can remove the data. */
_nl_remove_locale (cnt, dataset->__locales[cnt]);
if (dataset->__names[cnt] != _nl_C_name)
free ((char *) dataset->__names[cnt]);
}
/* Free the locale_t handle itself. */ /* Free the locale_t handle itself. */
free (dataset); free (dataset);

View File

@ -44,6 +44,14 @@ struct __locale_struct _nl_global_locale attribute_hidden =
#define DEFINE_CATEGORY(category, category_name, items, a) \ #define DEFINE_CATEGORY(category, category_name, items, a) \
[category] = &_nl_C_##category, [category] = &_nl_C_##category,
#include "categories.def" #include "categories.def"
#undef DEFINE_CATEGORY
},
.__names =
{
[LC_ALL] = _nl_C_name,
#define DEFINE_CATEGORY(category, category_name, items, a) \
[category] = _nl_C_name,
#include "categories.def"
#undef DEFINE_CATEGORY #undef DEFINE_CATEGORY
}, },
.__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128, .__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128,

View File

@ -177,10 +177,6 @@ extern const char _nl_POSIX_name[] attribute_hidden;
/* The standard codeset. */ /* The standard codeset. */
extern const char _nl_C_codeset[] attribute_hidden; extern const char _nl_C_codeset[] attribute_hidden;
/* Name of current locale for each individual category.
Each is malloc'd unless it is _nl_C_name. */
extern const char *_nl_current_names[] attribute_hidden;
/* This is the internal locale_t object that holds the global locale /* This is the internal locale_t object that holds the global locale
controlled by calls to setlocale. A thread's TSD locale pointer controlled by calls to setlocale. A thread's TSD locale pointer
points to this when `uselocale (LC_GLOBAL_LOCALE)' is in effect. */ points to this when `uselocale (LC_GLOBAL_LOCALE)' is in effect. */

View File

@ -19,22 +19,9 @@
#include "localeinfo.h" #include "localeinfo.h"
/* Name of current locale for each individual category.
Each is malloc'd unless it is _nl_C_name. */
const char *_nl_current_names[] attribute_hidden =
{
#define DEFINE_CATEGORY(category, category_name, items, a) \
[category] = _nl_C_name,
#include "categories.def"
#undef DEFINE_CATEGORY
[LC_ALL] = _nl_C_name /* For LC_ALL. */
};
const char * const char *
attribute_hidden attribute_hidden
__current_locale_name (int category) __current_locale_name (int category)
{ {
return (_NL_CURRENT_LOCALE == &_nl_global_locale return _NL_CURRENT_LOCALE->__names[category];
? _nl_current_names[category]
: _NL_CURRENT_LOCALE->__locales[category]->name);
} }

View File

@ -136,7 +136,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST])
{ {
const char *name = (category == LC_ALL ? newnames[i] : const char *name = (category == LC_ALL ? newnames[i] :
category == i ? newnames[0] : category == i ? newnames[0] :
_nl_current_names[i]); _nl_global_locale.__names[i]);
last_len = strlen (name); last_len = strlen (name);
cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1; cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
if (i > 0 && same && strcmp (name, newnames[0]) != 0) if (i > 0 && same && strcmp (name, newnames[0]) != 0)
@ -165,7 +165,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST])
/* Add "CATEGORY=NAME;" to the string. */ /* Add "CATEGORY=NAME;" to the string. */
const char *name = (category == LC_ALL ? newnames[i] : const char *name = (category == LC_ALL ? newnames[i] :
category == i ? newnames[0] : category == i ? newnames[0] :
_nl_current_names[i]); _nl_global_locale.__names[i]);
p = __stpcpy (p, _nl_category_names[i]); p = __stpcpy (p, _nl_category_names[i]);
*p++ = '='; *p++ = '=';
p = __stpcpy (p, name); p = __stpcpy (p, name);
@ -176,17 +176,17 @@ new_composite_name (int category, const char *newnames[__LC_LAST])
} }
/* Put NAME in _nl_current_names. */ /* Put NAME in _nl_global_locale.__names. */
static inline void static inline void
setname (int category, const char *name) setname (int category, const char *name)
{ {
if (_nl_current_names[category] == name) if (_nl_global_locale.__names[category] == name)
return; return;
if (_nl_current_names[category] != _nl_C_name) if (_nl_global_locale.__names[category] != _nl_C_name)
free ((char *) _nl_current_names[category]); free ((char *) _nl_global_locale.__names[category]);
_nl_current_names[category] = name; _nl_global_locale.__names[category] = name;
} }
/* Put DATA in *_nl_current[CATEGORY]. */ /* Put DATA in *_nl_current[CATEGORY]. */
@ -216,11 +216,11 @@ setlocale (int category, const char *locale)
/* Does user want name of current locale? */ /* Does user want name of current locale? */
if (locale == NULL) if (locale == NULL)
return (char *) _nl_current_names[category]; return (char *) _nl_global_locale.__names[category];
if (strcmp (locale, _nl_current_names[category]) == 0) if (strcmp (locale, _nl_global_locale.__names[category]) == 0)
/* Changing to the same thing. */ /* Changing to the same thing. */
return (char *) _nl_current_names[category]; return (char *) _nl_global_locale.__names[category];
/* We perhaps really have to load some data. So we determine the /* We perhaps really have to load some data. So we determine the
path in which to look for the data now. The environment variable path in which to look for the data now. The environment variable
@ -324,7 +324,7 @@ setlocale (int category, const char *locale)
/* Make a copy of locale name. */ /* Make a copy of locale name. */
if (newnames[category] != _nl_C_name) if (newnames[category] != _nl_C_name)
{ {
newnames[category] = strdup (newnames[category]); newnames[category] = __strdup (newnames[category]);
if (newnames[category] == NULL) if (newnames[category] == NULL)
break; break;
} }
@ -389,7 +389,7 @@ setlocale (int category, const char *locale)
/* Make a copy of locale name. */ /* Make a copy of locale name. */
if (newname[0] != _nl_C_name) if (newname[0] != _nl_C_name)
{ {
newname[0] = strdup (newname[0]); newname[0] = __strdup (newname[0]);
if (newname[0] == NULL) if (newname[0] == NULL)
goto abort_single; goto abort_single;
} }

View File

@ -39,6 +39,14 @@ struct __locale_struct _nl_C_locobj attribute_hidden =
#define DEFINE_CATEGORY(category, category_name, items, a) \ #define DEFINE_CATEGORY(category, category_name, items, a) \
[category] = &_nl_C_##category, [category] = &_nl_C_##category,
#include "categories.def" #include "categories.def"
#undef DEFINE_CATEGORY
},
.__names =
{
[LC_ALL] = _nl_C_name,
#define DEFINE_CATEGORY(category, category_name, items, a) \
[category] = _nl_C_name,
#include "categories.def"
#undef DEFINE_CATEGORY #undef DEFINE_CATEGORY
}, },
.__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128, .__ctype_b = (const unsigned short int *) _nl_C_LC_CTYPE_class + 128,

View File

@ -1,5 +1,5 @@
/* Definition of locale datatype. /* Definition of locale datatype.
Copyright (C) 1997, 2000 Free Software Foundation, Inc. Copyright (C) 1997,2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -29,6 +29,7 @@ typedef struct __locale_struct
{ {
/* Note: LC_ALL is not a valid index into this array. */ /* Note: LC_ALL is not a valid index into this array. */
struct locale_data *__locales[13]; /* 13 = __LC_LAST. */ struct locale_data *__locales[13]; /* 13 = __LC_LAST. */
const char *__names[13];
/* To increase the speed of this solution we add some special members. */ /* To increase the speed of this solution we add some special members. */
const unsigned short int *__ctype_b; const unsigned short int *__ctype_b;

View File

@ -1,22 +1,6 @@
#! /bin/sh #! /bin/sh
cpp=`which cpp 2>/dev/null`
if test $? -ne 0; then
if type cpp 2>/dev/null >/dev/null; then
cpp=`type cpp 2>/dev/null | awk '{ print $NF }'`
else
cpp=`gcc -print-file-name=cpp 2>/dev/null`
if test $? -ne 0; then
if test -x /lib/cpp; then
cpp=/lib/cpp
else
echo "cpp not found" 1>&2
exit 1
fi
fi
fi
fi
exec $cpp $* # This script is used solely by rpcgen when run by sunrpc/Makefile,
Local Variables: # which passes CPP in the environment to tell us what to run.
mode: sh
End: exec ${CPP} "$@"

View File

@ -132,7 +132,7 @@ $(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) \
$(+link) $(+link)
# Tell rpcgen where to find the C preprocessor. # Tell rpcgen where to find the C preprocessor.
rpcgen-cmd = $(built-program-cmd) -Y ../scripts rpcgen-cmd = CPP='$(CC) -E -x c-header' $(built-program-cmd) -Y ../scripts
# Install the rpc data base file. # Install the rpc data base file.
$(inst_sysconfdir)/rpc: etc.rpc $(+force) $(inst_sysconfdir)/rpc: etc.rpc $(+force)

View File

@ -113,4 +113,10 @@ versioned_symbol (libc, __sys_errlist_internal, _sys_errlist, %s);\n\
versioned_symbol (libc, _sys_nerr_internal, sys_nerr, %s);\n\ versioned_symbol (libc, _sys_nerr_internal, sys_nerr, %s);\n\
versioned_symbol (libc, __sys_nerr_internal, _sys_nerr, %s);\n", \ versioned_symbol (libc, __sys_nerr_internal, _sys_nerr, %s);\n", \
lastv, lastv, lastv, lastv; lastv, lastv, lastv, lastv;
print "\n\
link_warning (sys_errlist, \"\
`sys_errlist' is deprecated; use `strerror' or `strerror_r' instead\")\n\
link_warning (sys_nerr, \"\
`sys_nerr' is deprecated; use `strerror' or `strerror_r' instead\")";
} }