1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#serial 6
dnl This macro is intended to be used solely in this file.
dnl These are the prerequisite macros for GNU's strftime.c replacement.
dnl FIXME: the list is far from complete
AC_DEFUN([_jm_STRFTIME_PREREQS],
[
dnl strftime.c uses localtime_r if it exists. Check for it.
AC_CHECK_FUNCS(localtime_r)
dnl FIXME: add tests for everything in strftime.c: e.g., HAVE_BCOPY,
dnl HAVE_TZNAME, HAVE_TZSET, HAVE_TM_ZONE, etc.
])
dnl Determine if the strftime function has all the features of the GNU one.
dnl
dnl From Jim Meyering.
dnl
AC_DEFUN([jm_FUNC_GNU_STRFTIME],
[AC_REQUIRE([AC_HEADER_TIME])dnl
_jm_STRFTIME_PREREQS
AC_REQUIRE([AC_C_CONST])dnl
AC_REQUIRE([AC_HEADER_STDC])dnl
AC_CHECK_HEADERS(sys/time.h)
AC_CACHE_CHECK([for working GNU strftime], jm_cv_func_working_gnu_strftime,
[AC_TRY_RUN(
changequote(<<, >>)dnl
<< /* Ulrich Drepper provided parts of the test program. */
#if STDC_HEADERS
# include <stdlib.h>
#endif
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
static int
compare (const char *fmt, const struct tm *tm, const char *expected)
{
char buf[99];
strftime (buf, 99, fmt, tm);
if (strcmp (buf, expected))
{
#ifdef SHOW_FAILURES
printf ("fmt: \"%s\", expected \"%s\", got \"%s\"\n",
fmt, expected, buf);
#endif
return 1;
}
return 0;
}
int
main ()
{
int n_fail = 0;
struct tm *tm;
time_t t = 738367; /* Fri Jan 9 13:06:07 1970 */
tm = gmtime (&t);
/* This is necessary to make strftime give consistent zone strings and
e.g., seconds since the epoch (%s). */
putenv ("TZ=GMT0");
#undef CMP
#define CMP(Fmt, Expected) n_fail += compare ((Fmt), tm, (Expected))
CMP ("%-m", "1"); /* GNU */
CMP ("%A", "Friday");
CMP ("%^A", "FRIDAY"); /* The ^ is a GNU extension. */
CMP ("%B", "January");
CMP ("%^B", "JANUARY");
CMP ("%C", "19"); /* POSIX.2 */
CMP ("%D", "01/09/70"); /* POSIX.2 */
CMP ("%F", "1970-01-09");
CMP ("%G", "1970"); /* GNU */
CMP ("%H", "13");
CMP ("%I", "01");
CMP ("%M", "06");
CMP ("%M", "06");
CMP ("%R", "13:06"); /* POSIX.2 */
CMP ("%S", "07");
CMP ("%T", "13:06:07"); /* POSIX.2 */
CMP ("%U", "01");
CMP ("%V", "02");
CMP ("%W", "01");
CMP ("%X", "13:06:07");
CMP ("%Y", "1970");
CMP ("%Z", "GMT");
CMP ("%_m", " 1"); /* GNU */
CMP ("%a", "Fri");
CMP ("%^a", "FRI");
CMP ("%b", "Jan");
CMP ("%^b", "JAN");
CMP ("%c", "Fri Jan 9 13:06:07 1970");
CMP ("%^c", "FRI JAN 9 13:06:07 1970");
CMP ("%d", "09");
CMP ("%e", " 9"); /* POSIX.2 */
CMP ("%g", "70"); /* GNU */
CMP ("%h", "Jan"); /* POSIX.2 */
CMP ("%^h", "JAN");
CMP ("%j", "009");
CMP ("%k", "13"); /* GNU */
CMP ("%l", " 1"); /* GNU */
CMP ("%m", "01");
CMP ("%n", "\n"); /* POSIX.2 */
CMP ("%p", "PM");
CMP ("%r", "01:06:07 PM"); /* POSIX.2 */
CMP ("%s", "738367"); /* GNU */
CMP ("%t", "\t"); /* POSIX.2 */
CMP ("%u", "5"); /* POSIX.2 */
CMP ("%w", "5");
CMP ("%x", "01/09/70");
CMP ("%y", "70");
CMP ("%z", "+0000"); /* GNU */
exit (n_fail ? 1 : 0);
}
>>,
changequote([, ])dnl
jm_cv_func_working_gnu_strftime=yes,
jm_cv_func_working_gnu_strftime=no,
dnl When crosscompiling, assume strftime is missing or broken.
jm_cv_func_working_gnu_strftime=no)
])
if test $jm_cv_func_working_gnu_strftime = no; then
AC_SUBST(LIBOBJS)
LIBOBJS="$LIBOBJS strftime.$ac_objext"
AC_DEFINE_UNQUOTED(strftime, gnu_strftime,
[Define to gnu_strftime if the replacement function should be used.])
fi
])
AC_DEFUN([jm_FUNC_STRFTIME],
[
_jm_STRFTIME_PREREQS
AC_REPLACE_FUNCS(strftime)
])
|