From dc394c00301ef5c2b9fe9f0cc87d1ca3ba5a436b Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Mon, 24 Aug 2009 02:00:39 +0000 Subject: [PATCH] Add win32 version of gmtime_r. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@18277 57a11ea4-9604-0410-9ed3-97b8803252fd --- configure.in | 2 +- lib/libc/Makefile.am | 12 +++++- lib/libc/gmtime_r.c | 68 +++++++++++++++++++++++++++++++ lib/libc/gmtime_r.h | 35 ++++++++++++++++ src/backend/dbi/gnc-backend-dbi.c | 3 ++ 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 lib/libc/gmtime_r.c create mode 100644 lib/libc/gmtime_r.h diff --git a/configure.in b/configure.in index bb5ffc40b4..e96cf09405 100644 --- a/configure.in +++ b/configure.in @@ -1367,7 +1367,7 @@ fi ###------------------------------------------------------------------------- AC_CHECK_FUNCS(pthread_mutex_init) -AC_REPLACE_FUNCS(strptime localtime_r) +AC_REPLACE_FUNCS(strptime localtime_r gmtime_r) #AC_REPLACE_FUNCS(scm_strptime) if test x$am_cv_val_LC_MESSAGES = "xno"; then diff --git a/lib/libc/Makefile.am b/lib/libc/Makefile.am index 74eabae943..08d5c20433 100644 --- a/lib/libc/Makefile.am +++ b/lib/libc/Makefile.am @@ -2,12 +2,20 @@ noinst_LTLIBRARIES = libc-missing.la # All header files must be listed. noinst_HEADERS = \ - localtime_r.h setenv.h strptime.h pow.h + gmtime_r.h \ + localtime_r.h \ + setenv.h \ + strptime.h \ + pow.h # No sources should be listed. libc_missing_la_SOURCES = libc-missing-noop.c -EXTRA_libc_missing_la_SOURCES = localtime_r.c setenv.c strptime.c +EXTRA_libc_missing_la_SOURCES = \ + gmtime_r.c \ + localtime_r.c \ + setenv.c \ + strptime.c # This will automatically be filled in with the necessary object file # names. Configure does this based upon the AC_REPLACE_FUNCS macros. diff --git a/lib/libc/gmtime_r.c b/lib/libc/gmtime_r.c new file mode 100644 index 0000000000..8018708bd6 --- /dev/null +++ b/lib/libc/gmtime_r.c @@ -0,0 +1,68 @@ +/******************************************************************** + * File: gmtime_r.c + * Renamed from: core-utils.h + * + * Copyright (C) 2001 Linux Developers Group + * + * 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 of the + * License, or (at your option) any later version. + * + * 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 + * General Public License for more details. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + ********************************************************************/ + +#include "config.h" + +#if !HAVE_GMTIME_R +#include +#include +#include "gmtime_r.h" + +#if HAVE_PTHREAD_MUTEX_INIT +#include +struct tm * +gmtime_r(const time_t *const timep, struct tm *p_tm) +{ + static pthread_mutex_t time_mutex; + static int time_mutex_inited = 0; + struct tm *tmp; + + if (!time_mutex_inited) { + time_mutex_inited = 1; + pthread_mutex_init(&time_mutex, NULL); + } + + pthread_mutex_lock(&time_mutex); + tmp = gmtime(timep); + if (tmp) { + memcpy(p_tm, tmp, sizeof(struct tm)); + tmp = p_tm; + } + pthread_mutex_unlock(&time_mutex); + + return tmp; +} +#else +struct tm * +gmtime_r(const time_t *const timep, struct tm *p_tm) +{ + static struct tm* tmp; + tmp = gmtime(timep); + if (tmp) { + memcpy(p_tm, tmp, sizeof(struct tm)); + tmp = p_tm; + } + return tmp; +} +#endif /* HAVE_PTHREAD_MUTEX_INIT */ + +#endif /* !HAVE_GMTIME_R */ diff --git a/lib/libc/gmtime_r.h b/lib/libc/gmtime_r.h new file mode 100644 index 0000000000..91c1f14eea --- /dev/null +++ b/lib/libc/gmtime_r.h @@ -0,0 +1,35 @@ +/******************************************************************** + * File: gmtime_r.h + * + * Copyright (C) 2001 Linux Developers Group + * Copyright (C) 2009 Phil Longstaff + * + * 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 of the + * License, or (at your option) any later version. + * + * 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 + * General Public License for more details. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + ********************************************************************/ + +#ifndef __GMTIME_R_H__ +#define __GMTIME_R_H__ + +#if !HAVE_GMTIME_R +#include +/* + * Version of "gmtime_r()", for the benefit of OSes that don't have it. + */ +extern struct tm *gmtime_r(const time_t *const timep, struct tm *p_tm); +#endif + +#endif + diff --git a/src/backend/dbi/gnc-backend-dbi.c b/src/backend/dbi/gnc-backend-dbi.c index 27e2e6ac90..b329a584a6 100644 --- a/src/backend/dbi/gnc-backend-dbi.c +++ b/src/backend/dbi/gnc-backend-dbi.c @@ -32,6 +32,9 @@ #include #include #include +#if !HAVE_GMTIME_R +#include "gmtime_r.h" +#endif #include