diff options
48 files changed, 6501 insertions, 6412 deletions
@@ -1,3 +1,72 @@ +2004-03-14 Ulrich Drepper <drepper@redhat.com> + + Make the non-_l functions wrappers around the _l functions. + * include/monetary.h: Declare __vstrmon_l. + * include/string.h: Add libc_hidden_proto for __strcoll_l and + __strxfrm_l. + * include/time.h: Define ptime_locale_status. Declare + __strptime_internal. + * include/wchar.h: Add libc_hidden_proto for __wcscoll_l and + __wcsxfrm_l. + * stdlib/strfmon.c: Move the code to strfmon_l.c. Add little + wrapper around __vstrfmon_l. + * stdlib/strfmon_l.c: Add real implementation. Split into new + function __vstrfmon_l to allow calling it from strfmon. + * stdlib/strtod.c: Move real code to strtod_l.c and add wrapper. + * stdlib/strtod_l.c: Add real implementation. + * stdlib/strtof.c: Adjust to changed strtod.c. + * stdlib/strtof_l.c: Include strtod_l.c now. + * stdlib/strtold.c: New file. + * stdlib/strtold_l.c: Removed. + * string/strcoll.c: Move real code to strcoll_l.c: Add wrapper. + * string/strcoll_l.c: Add real implementation. + * string/strxfrm.c: Move real code to strxfrm_l.c: Add wrapper. + * string/strxfrm_l.c: Add real implementation. + * sysdeps/generic/strtol.c: Move real implementation to strtol_l.c. + Add wrappers. + * sysdeps/generic/strtol_l.c: Add real implementation. + * sysdeps/generic/strtold.c: Removed. + * sysdeps/generic/strtold_l.c: New file. + * sysdeps/generic/strtoll_l.c: Include strtol_l.c now. Adjust + #defines. + * sysdeps/generic/strtoul_l.c: Likewise. + * sysdeps/generic/strtoull_l.c: Likewise. + * sysdeps/generic/wcstol_l.c: Likewise. + * sysdeps/generic/wcstoll_l.c: Likewise. + * sysdeps/generic/wcstoul_l.c: Likewise. + * sysdeps/generic/wcstoull_l.c: Likewise. + * sysdeps/ieee754/ldbl-128/strtold.c: Removed. + * sysdeps/ieee754/ldbl-128/strtold_l.c: New file. + * sysdeps/ieee754/ldbl-96/strtold.c: Removed. + * sysdeps/ieee754/ldbl-96/strtold_l.c: New file. + * sysdeps/m68k/strtold.c: Removed. + * sysdeps/m68k/strtold_l.c: New file. + * time/strftime.c: Move real code to strftime_l.c. Add wrapper. + * time/strftime_l.c: Add real implementation. + * time/strptime.c: Move real code to strptime_l.c. Add wrapper. + * time/strptime_l.c: Add real implementation. + * time/wcsftime.c: Simplify since only wrappers are defined in + strftime.c. + * time/wcsftime_l.c: Include strftime_l.c. + * wcsmbs/wcscoll.c: Simplify since the file is not used by wcscoll_l.c + anymore. + * wcsmbs/wcscoll_l.c: Include strcoll_l.c. + * wcsmbs/wcsxfrm.c: Simplify since the file is not used by wcsxfrm_l.c + anymore. + * wcsmbs/wcsxfrm_l.c: Include strxfrm_l.c. + * wcsmbs/wcstod.c: Prepare to include new strtod.c. + * wcsmbs/wcstod_l.c: Include strtod_l.c. + * wcsmbs/wcstof.c: Prepare to include new strtof.c. + * wcsmbs/wcstof_l.c: Include strtof_l.c. + * wcsmbs/wcstold.c: Prepare to include new strtold.c. + * wcsmbs/wcstold_l.c: Include strtold_l.c. + + * locale/uselocale.c: Use _NL_CURRENT_LOCALE instead of __libc_tsd_get. + + * sysdeps/generic/strcasecmp.c: Optimize a bit. It's better to get + a reference to the current locale and then use the _l functions. + * sysdeps/generic/strncase.c: Likewise. + 2004-03-11 Jeroen Dekkers <jeroen@dekkers.cx> * cppflags-iterator.mk: Change libof-$(cpp-src) to diff --git a/include/monetary.h b/include/monetary.h index 4735dc6c8a..98b3dbf294 100644 --- a/include/monetary.h +++ b/include/monetary.h @@ -1 +1,5 @@ #include <stdlib/monetary.h> +#include <stdarg.h> + +extern ssize_t __vstrfmon_l (char *s, size_t maxsize, __locale_t loc, + const char *format, va_list ap); diff --git a/include/string.h b/include/string.h index 041590b1db..42d9362dfc 100644 --- a/include/string.h +++ b/include/string.h @@ -78,6 +78,8 @@ libc_hidden_proto (__strerror_r) libc_hidden_proto (__strverscmp) libc_hidden_proto (basename) libc_hidden_proto (strcoll) +libc_hidden_proto (__strcoll_l) +libc_hidden_proto (__strxfrm_l) libc_hidden_builtin_proto (memchr) libc_hidden_builtin_proto (memcpy) diff --git a/include/time.h b/include/time.h index 87e0f08f8d..5a95be5a4e 100644 --- a/include/time.h +++ b/include/time.h @@ -3,6 +3,7 @@ # include <time/time.h> #else # include <time/time.h> +# include <xlocale.h> extern __typeof (strftime_l) __strftime_l; libc_hidden_proto (__strftime_l) @@ -84,6 +85,18 @@ extern int __getdate_r (__const char *__string, struct tm *__resbufp); extern int __getclktck (void); +/* strptime support. */ +/* Status of lookup: do we use the locale data or the raw data? */ +enum ptime_locale_status { not, loc, raw }; + +extern char * __strptime_internal (const char *rp, const char *fmt, + struct tm *tm, + enum ptime_locale_status *decided, + int era_cnt, __locale_t loc) + internal_function; + + + /* Use in the clock_* functions. Size of the field representing the actual clock ID. */ #ifndef _ISOMAC diff --git a/include/wchar.h b/include/wchar.h index f69463f57a..73bd4a8fef 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -29,6 +29,9 @@ libc_hidden_proto (__wcstoull_internal) libc_hidden_proto (__wcscasecmp_l) libc_hidden_proto (__wcsncasecmp_l) +libc_hidden_proto (__wcscoll_l) +libc_hidden_proto (__wcsxfrm_l) + libc_hidden_proto (fputws_unlocked) libc_hidden_proto (putwc_unlocked) libc_hidden_proto (putwc) diff --git a/locale/uselocale.c b/locale/uselocale.c index e2f38c10ba..4e63dabd8e 100644 --- a/locale/uselocale.c +++ b/locale/uselocale.c @@ -1,5 +1,5 @@ /* uselocale -- fetch and set the current per-thread locale - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,7 +29,7 @@ locale_t __uselocale (locale_t newloc) { - locale_t oldloc = __libc_tsd_get (LOCALE); + locale_t oldloc = _NL_CURRENT_LOCALE; if (newloc != NULL) { diff --git a/stdlib/strfmon.c b/stdlib/strfmon.c index b17dc9823c..b11f95c9ac 100644 --- a/stdlib/strfmon.c +++ b/stdlib/strfmon.c @@ -19,645 +19,21 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <ctype.h> -#include <errno.h> -#include <langinfo.h> -#include <locale.h> #include <monetary.h> -#ifdef USE_IN_LIBIO -# include "../libio/libioP.h" -# include "../libio/strfile.h" -#endif -#include <printf.h> #include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include "../locale/localeinfo.h" +#include <locale/localeinfo.h> -#define out_char(Ch) \ - do { \ - if (dest >= s + maxsize - 1) \ - { \ - __set_errno (E2BIG); \ - va_end (ap); \ - return -1; \ - } \ - *dest++ = (Ch); \ - } while (0) - -#define out_string(String) \ - do { \ - const char *_s = (String); \ - while (*_s) \ - out_char (*_s++); \ - } while (0) - -#define out_nstring(String, N) \ - do { \ - int _n = (N); \ - const char *_s = (String); \ - while (_n-- > 0) \ - out_char (*_s++); \ - } while (0) - -#define to_digit(Ch) ((Ch) - '0') - - -/* We use this code also for the extended locale handling where the - function gets as an additional argument the locale which has to be - used. To access the values we have to redefine the _NL_CURRENT - macro. */ -#ifdef USE_IN_EXTENDED_LOCALE_MODEL -# undef _NL_CURRENT -# define _NL_CURRENT(category, item) \ - (current->values[_NL_ITEM_INDEX (item)].string) -#endif - -extern int __printf_fp (FILE *, const struct printf_info *, - const void *const *); -libc_hidden_proto (__printf_fp) -/* This function determines the number of digit groups in the output. - The definition is in printf_fp.c. */ -extern unsigned int __guess_grouping (unsigned int intdig_max, - const char *grouping, wchar_t sepchar); - - -/* We have to overcome some problems with this implementation. On the - one hand the strfmon() function is specified in XPG4 and of course - it has to follow this. But on the other hand POSIX.2 specifies - some information in the LC_MONETARY category which should be used, - too. Some of the information contradicts the information which can - be specified in format string. */ -#ifndef USE_IN_EXTENDED_LOCALE_MODEL ssize_t strfmon (char *s, size_t maxsize, const char *format, ...) -#else -ssize_t -__strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) -#endif { -#ifdef USE_IN_EXTENDED_LOCALE_MODEL - struct locale_data *current = loc->__locales[LC_MONETARY]; -#endif -#ifdef USE_IN_LIBIO - _IO_strfile f; -# ifdef _IO_MTSAFE_IO - _IO_lock_t lock; -# endif -#else - FILE f; -#endif - struct printf_info info; - va_list ap; /* Scan through the varargs. */ - char *dest; /* Pointer so copy the output. */ - const char *fmt; /* Pointer that walks through format. */ + va_list ap; va_start (ap, format); - dest = s; - fmt = format; - - /* Loop through the format-string. */ - while (*fmt != '\0') - { - /* The floating-point value to output. */ - union - { - double dbl; - __long_double_t ldbl; - } - fpnum; - int int_format; - int print_curr_symbol; - int left_prec; - int left_pad; - int right_prec; - int group; - char pad; - int is_long_double; - int p_sign_posn; - int n_sign_posn; - int sign_posn; - int other_sign_posn; - int left; - int is_negative; - int sep_by_space; - int other_sep_by_space; - int cs_precedes; - int other_cs_precedes; - const char *sign_string; - const char *other_sign_string; - int done; - const char *currency_symbol; - size_t currency_symbol_len; - int width; - char *startp; - const void *ptr; - char space_char; - - /* Process all character which do not introduce a format - specification. */ - if (*fmt != '%') - { - out_char (*fmt++); - continue; - } - - /* "%%" means a single '%' character. */ - if (fmt[1] == '%') - { - out_char (*++fmt); - ++fmt; - continue; - } - - /* Defaults for formatting. */ - int_format = 0; /* Use international curr. symbol */ - print_curr_symbol = 1; /* Print the currency symbol. */ - left_prec = -1; /* No left precision specified. */ - right_prec = -1; /* No right precision specified. */ - group = 1; /* Print digits grouped. */ - pad = ' '; /* Fill character is <SP>. */ - is_long_double = 0; /* Double argument by default. */ - p_sign_posn = -1; /* This indicates whether the */ - n_sign_posn = -1; /* '(' flag is given. */ - width = -1; /* No width specified so far. */ - left = 0; /* Right justified by default. */ - - /* Parse group characters. */ - while (1) - { - switch (*++fmt) - { - case '=': /* Set fill character. */ - pad = *++fmt; - if (pad == '\0') - { - /* Premature EOS. */ - __set_errno (EINVAL); - va_end (ap); - return -1; - } - continue; - case '^': /* Don't group digits. */ - group = 0; - continue; - case '+': /* Use +/- for sign of number. */ - if (n_sign_posn != -1) - { - __set_errno (EINVAL); - |
