summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2007-01-29 23:12:55 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2007-01-29 23:12:55 +0000
commit88c14dcf4d4df04f3c12f7d506484993850c55ad (patch)
treea6a663a5e3da0d4a8f6b02df957792aa2607f2c4
parent0730a6cdc74a97b1b5b507c0be6116cc0967c056 (diff)
downloadgnulib-88c14dcf4d4df04f3c12f7d506484993850c55ad.tar.gz
* 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 <config.h> 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 <stdlib.h>; 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.
-rw-r--r--ChangeLog25
-rw-r--r--lib/strptime.c75
-rw-r--r--lib/strptime.h3
-rw-r--r--m4/strptime.m46
-rw-r--r--modules/strptime3
5 files changed, 65 insertions, 47 deletions
diff --git a/ChangeLog b/ChangeLog
index abb8b8bc80..073fb774fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2007-01-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ * 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 <config.h> 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 <stdlib.h>; 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 <bruno@clisp.org>
* MODULES.html.sh (Support for systems lacking POSIX:2001): Add
diff --git a/lib/strptime.c b/lib/strptime.c
index 3471d9e276..9373b45d7e 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 <config.h>
+# include "strptime.h"
#endif
-#undef _LIBC
-#undef _NL_CURRENT
-
-#include <sys/time.h>
#include <assert.h>
#include <ctype.h>
#ifdef _LIBC
@@ -38,29 +34,25 @@
# include "../locale/localeinfo.h"
#endif
-#include <stdlib.h>
-#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 7f0b118a91..970574131f 100644
--- a/lib/strptime.h
+++ b/lib/strptime.h
@@ -23,7 +23,8 @@
#if ! HAVE_STRPTIME
/* See the POSIX:2001 specification
<http://www.opengroup.org/susv3xsh/strptime.html>. */
-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 344ede3560..e1236b9339 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 866562f511..690c762413 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
-