From 88c14dcf4d4df04f3c12f7d506484993850c55ad Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 29 Jan 2007 23:12:55 +0000 Subject: [PATCH] * lib/strptime.h (strptime): Use 'restrict' for args where POSIX requires this. * lib/strptime.c (strptime): Likewise. Change license notice from LGPL to GPL, since gnulib-tool will change this as needed. Include if _LIBC is not defined, not if HAVE_CONFIG_H is defined. Include "strptime.h" first, to check interface. Do not #undef _LIBC and _NL_CURRENT. Do not include ; no longer needed. Include "time_r.h" and declare ptime_locale_status only if _LIBC is not defined. (__P): Remove unused macro. (match_string): Bring back glibc version, but use it only if _LIBC is defined. (__strptime_internal): Compile tm_gmtoff code if _LIBC is defined, too. Remove unnecessary assertion and abort() call. Use #ifdef _NL_CURRENT rather than #if 0, for benefit of glibc. * m4/strptime.m4: Fix serial number comment. (gl_FUNC_STRPTIME): Require AC_C_RESTRICT, gl_TM_GMTOFF. * modules/strptime (Files): Add m4/tm_gmtoff.m4. (Depends-on): Add time_r. --- ChangeLog | 25 +++++++++++++++++++ lib/strptime.c | 75 ++++++++++++++++++++++++-------------------------------- lib/strptime.h | 3 ++- m4/strptime.m4 | 6 +++-- modules/strptime | 3 ++- 5 files changed, 65 insertions(+), 47 deletions(-) diff --git a/ChangeLog b/ChangeLog index abb8b8bc8..073fb774f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2007-01-29 Paul Eggert + + * lib/strptime.h (strptime): Use 'restrict' for args where + POSIX requires this. + * lib/strptime.c (strptime): Likewise. + Change license notice from LGPL to GPL, since gnulib-tool will + change this as needed. + Include if _LIBC is not defined, not if HAVE_CONFIG_H is + defined. + Include "strptime.h" first, to check interface. + Do not #undef _LIBC and _NL_CURRENT. + Do not include ; no longer needed. + Include "time_r.h" and declare ptime_locale_status + only if _LIBC is not defined. + (__P): Remove unused macro. + (match_string): Bring back glibc version, but use it only if _LIBC + is defined. + (__strptime_internal): Compile tm_gmtoff code if _LIBC is defined, too. + Remove unnecessary assertion and abort() call. + Use #ifdef _NL_CURRENT rather than #if 0, for benefit of glibc. + * m4/strptime.m4: Fix serial number comment. + (gl_FUNC_STRPTIME): Require AC_C_RESTRICT, gl_TM_GMTOFF. + * modules/strptime (Files): Add m4/tm_gmtoff.m4. + (Depends-on): Add time_r. + 2007-01-29 Bruno Haible * MODULES.html.sh (Support for systems lacking POSIX:2001): Add diff --git a/lib/strptime.c b/lib/strptime.c index 3471d9e27..9373b45d7 100644 --- a/lib/strptime.c +++ b/lib/strptime.c @@ -1,29 +1,25 @@ -/* Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2004, 2005, 2007 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. - The GNU C Library is distributed in the hope that it will be useful, + This program 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 - Lesser General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H +#ifndef _LIBC # include +# include "strptime.h" #endif -#undef _LIBC -#undef _NL_CURRENT - -#include #include #include #ifdef _LIBC @@ -38,29 +34,25 @@ # include "../locale/localeinfo.h" #endif -#include -#include "strptime.h" -#include "time_r.h" - - +#ifndef _LIBC +# include "time_r.h" enum ptime_locale_status { not, loc, raw }; - - -#ifndef __P -# if defined __GNUC__ || (defined __STDC__ && __STDC__) -# define __P(args) args -# else -# define __P(args) () -# endif /* GCC. */ -#endif /* Not __P. */ +#endif #define match_char(ch1, ch2) if (ch1 != ch2) return NULL - +#if defined _LIBC && defined __GNUC__ && __GNUC__ >= 2 +# define match_string(cs1, s2) \ + ({ size_t len = strlen (cs1); \ + int result = __strncasecmp_l ((cs1), (s2), len, locale) == 0; \ + if (result) (s2) += len; \ + result; }) +#else +/* Oh come on. Get a reasonable compiler. */ # define match_string(cs1, s2) \ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) - +#endif /* We intentionally do not use isdigit() for testing because this will lead to problems with the wide character version. */ #define get_number(from, to, n) \ @@ -271,7 +263,7 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) have_wday = want_xday = have_yday = have_mon = have_mday = have_uweek = 0; have_wweek = 0; - + while (*fmt != '\0') { /* A white space in the format string matches 0 more or white @@ -703,11 +695,11 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) } if (val > 1200) return NULL; -#ifdef HAVE_TM_GMTOFF +#if defined _LIBC || HAVE_TM_GMTOFF tm->tm_gmtoff = (val * 3600) / 100; if (neg) tm->tm_gmtoff = -tm->tm_gmtoff; -#endif +#endif } break; case 'E': @@ -1036,11 +1028,9 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) tm->tm_year = (century - 19) * 100; } - assert(era_cnt == -1); if (era_cnt != -1) { - abort(); -#if 0 +#ifdef _NL_CURRENT era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG); if (era == NULL) return NULL; @@ -1126,9 +1116,9 @@ __strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM) char * strptime (buf, format, tm LOCALE_PARAM) - const char *buf; - const char *format; - struct tm *tm; + const char *restrict buf; + const char *restrict format; + struct tm *restrict tm; LOCALE_PARAM_DECL { enum ptime_locale_status decided; @@ -1144,4 +1134,3 @@ strptime (buf, format, tm LOCALE_PARAM) #ifdef _LIBC weak_alias (__strptime_l, strptime_l) #endif - diff --git a/lib/strptime.h b/lib/strptime.h index 7f0b118a9..970574131 100644 --- a/lib/strptime.h +++ b/lib/strptime.h @@ -23,7 +23,8 @@ #if ! HAVE_STRPTIME /* See the POSIX:2001 specification . */ -extern char *strptime (const char *s, const char *format, struct tm *tm); +extern char *strptime (const char *restrict s, const char *restrict format, + struct tm *restrict tm); #endif #endif /* GNULIB_STRPTIME_H_ */ diff --git a/m4/strptime.m4 b/m4/strptime.m4 index 344ede356..e1236b933 100644 --- a/m4/strptime.m4 +++ b/m4/strptime.m4 @@ -1,10 +1,12 @@ -# strtol.m4 serial 4 -dnl Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc. +# strptime.m4 serial 2 +dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRPTIME], [ + AC_REQUIRE([AC_C_RESTRICT]) AC_REPLACE_FUNCS(strptime) + AC_REQUIRE([gl_TM_GMTOFF]) ]) diff --git a/modules/strptime b/modules/strptime index 866562f51..690c76241 100644 --- a/modules/strptime +++ b/modules/strptime @@ -5,12 +5,14 @@ Files: lib/strptime.h lib/strptime.c m4/strptime.m4 +m4/tm_gmtoff.m4 Depends-on: sys_time string strcase stdbool +time_r configure.ac: gl_FUNC_STRPTIME @@ -25,4 +27,3 @@ LGPL Maintainer: glibc - -- 2.11.0