Re: [PATCH 4/4] timegm: add portable implementation (Solaris support)
authorBlake Jones <blakej@foo.net>
Tue, 20 Aug 2013 15:33:19 +0000 (08:33 +1700)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:56:29 +0000 (09:56 -0800)
0a/ced169d252dcee0e2a0f25c428727bb0214647 [new file with mode: 0644]

diff --git a/0a/ced169d252dcee0e2a0f25c428727bb0214647 b/0a/ced169d252dcee0e2a0f25c428727bb0214647
new file mode 100644 (file)
index 0000000..a170da5
--- /dev/null
@@ -0,0 +1,219 @@
+Return-Path: <blakej@foo.net>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 47A2C431FD8\r
+       for <notmuch@notmuchmail.org>; Tue, 20 Aug 2013 08:33:29 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
+       autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id E1Gh1fSFyAih for <notmuch@notmuchmail.org>;\r
+       Tue, 20 Aug 2013 08:33:23 -0700 (PDT)\r
+Received: from foo.net (70-36-235-136.dsl.static.sonic.net [70.36.235.136])\r
+       (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id B7AD7431FB6\r
+       for <notmuch@notmuchmail.org>; Tue, 20 Aug 2013 08:33:22 -0700 (PDT)\r
+Received: from foo.net (localhost [127.0.0.1])\r
+       by foo.net (8.14.5+Sun/8.14.5) with ESMTP id r7KFXJuU014322;\r
+       Tue, 20 Aug 2013 08:33:19 -0700 (PDT)\r
+To: Vladimir.Marek@oracle.com\r
+Subject: Re: [PATCH 4/4] timegm: add portable implementation (Solaris support)\r
+In-Reply-To: Your message of "Tue, 20 Aug 2013 11:28:55 +0200."\r
+       <1376990935-12411-1-git-send-email-Vladimir.Marek@oracle.com> \r
+Date: Tue, 20 Aug 2013 08:33:19 -0700\r
+Message-ID: <14321.1377012799@foo.net>\r
+From: Blake Jones <blakej@foo.net>\r
+X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0.2\r
+       (foo.net [127.0.0.1]); Tue, 20 Aug 2013 08:33:19 -0700 (PDT)\r
+Cc: notmuch@notmuchmail.org, Vladimir Marek <vlmarek@volny.cz>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 20 Aug 2013 15:33:29 -0000\r
+\r
+> From: Blake Jones <blakej@foo.net>\r
+> \r
+> The timegm(3) function is a non-standard extension to libc which is\r
+> available in GNU libc and on some BSDs.  Although SunOS had this\r
+> function in its libc, Solaris (unfortunately) removed it.  This patch\r
+> implements a very simple version of timegm() which is good enough for\r
+> parse-time-string.c.\r
+\r
+LGTM.\r
+\r
+Blake\r
+\r
+> Signed-off-by: Vladimir Marek <vlmarek@volny.cz>\r
+> ---\r
+>  compat/Makefile.local                 |    4 +++\r
+>  compat/compat.h                       |    5 +++\r
+>  compat/have_timegm.c                  |    7 ++++\r
+>  compat/timegm.c                       |   57 +++++++++++++++++++++++++++++++++\r
+>  configure                             |   11 +++++++\r
+>  parse-time-string/parse-time-string.c |    1 +\r
+>  6 files changed, 85 insertions(+)\r
+>  create mode 100644 compat/have_timegm.c\r
+>  create mode 100644 compat/timegm.c\r
+> \r
+> diff --git a/compat/Makefile.local b/compat/Makefile.local\r
+> index 2c4f65f..b0d5417 100644\r
+> --- a/compat/Makefile.local\r
+> +++ b/compat/Makefile.local\r
+> @@ -17,4 +17,8 @@ ifneq ($(HAVE_STRSEP),1)\r
+>  notmuch_compat_srcs += $(dir)/strsep.c\r
+>  endif\r
+>  \r
+> +ifneq ($(HAVE_TIMEGM),1)\r
+> +notmuch_compat_srcs += $(dir)/timegm.c\r
+> +endif\r
+> +\r
+>  SRCS := $(SRCS) $(notmuch_compat_srcs)\r
+> diff --git a/compat/compat.h b/compat/compat.h\r
+> index ae762c3..5a402d5 100644\r
+> --- a/compat/compat.h\r
+> +++ b/compat/compat.h\r
+> @@ -57,6 +57,11 @@ char* strcasestr(const char *haystack, const char *needle);\r
+>  char *strsep(char **stringp, const char *delim);\r
+>  #endif /* !HAVE_STRSEP */\r
+>  \r
+> +#if !HAVE_TIMEGM\r
+> +#include <time.h>\r
+> +time_t timegm (struct tm *tm);\r
+> +#endif /* !HAVE_TIMEGM */\r
+> +\r
+>  /* Silence gcc warnings about unused results.  These warnings exist\r
+>   * for a reason; any use of this needs to be justified. */\r
+>  #ifdef __GNUC__\r
+> diff --git a/compat/have_timegm.c b/compat/have_timegm.c\r
+> new file mode 100644\r
+> index 0000000..b62b793\r
+> --- /dev/null\r
+> +++ b/compat/have_timegm.c\r
+> @@ -0,0 +1,7 @@\r
+> +#include <time.h>\r
+> +#include "compat.h"\r
+> +\r
+> +int main()\r
+> +{\r
+> +    return (int) timegm((struct tm *)0);\r
+> +}\r
+> diff --git a/compat/timegm.c b/compat/timegm.c\r
+> new file mode 100644\r
+> index 0000000..213963b\r
+> --- /dev/null\r
+> +++ b/compat/timegm.c\r
+> @@ -0,0 +1,57 @@\r
+> +/* timegm.c --- Implementation of replacement timegm function.\r
+> +   Copyright (C) 2012 Free Software Foundation, Inc.\r
+> +\r
+> +   This program is free software; you can redistribute it and/or\r
+> +   modify it under the terms of the GNU General Public License as\r
+> +   published by the Free Software Foundation; either version 3, or (at\r
+> +   your option) any later version.\r
+> +\r
+> +   This program is distributed in the hope that it will be useful, but\r
+> +   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+> +   General Public License for more details.\r
+> +\r
+> +   You should have received a copy of the GNU General Public License\r
+> +   along with this program; if not, write to the Free Software\r
+> +   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+> +   02110-1301, USA.  */\r
+> +\r
+> +/* Written by Blake Jones. */\r
+> +\r
+> +#include <time.h>\r
+> +#include "compat.h"\r
+> +\r
+> +static int\r
+> +leapyear (int year)\r
+> +{\r
+> +    return ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0));\r
+> +}\r
+> +\r
+> +/*\r
+> + * This is a simple implementation of timegm() which does what is needed\r
+> + * by create_output() -- just turns the "struct tm" into a GMT time_t.\r
+> + * It does not normalize any of the fields of the "struct tm", nor does\r
+> + * it set tm_wday or tm_yday.\r
+> + */\r
+> +time_t\r
+> +timegm (struct tm *tm)\r
+> +{\r
+> +    int     monthlen[2][12] = {\r
+> +    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\r
+> +    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\r
+> +    };\r
+> +    int     year, month, days;\r
+> +\r
+> +    days = 365 * (tm->tm_year - 70);\r
+> +    for (year = 70; year < tm->tm_year; year++) {\r
+> +    if (leapyear(1900 + year)) {\r
+> +        days++;\r
+> +    }\r
+> +    }\r
+> +    for (month = 0; month < tm->tm_mon; month++) {\r
+> +    days += monthlen[leapyear(1900 + year)][month];\r
+> +    }\r
+> +    days += tm->tm_mday - 1;\r
+> +\r
+> +    return ((((days * 24) + tm->tm_hour) * 60 + tm->tm_min) * 60 + tm->tm_sec);\r
+> +}\r
+> diff --git a/configure b/configure\r
+> index ac44857..6166917 100755\r
+> --- a/configure\r
+> +++ b/configure\r
+> @@ -530,6 +530,17 @@ else\r
+>  fi\r
+>  rm -f compat/have_strsep\r
+>  \r
+> +printf "Checking for timegm... "\r
+> +if ${CC} -o compat/have_timegm "$srcdir"/compat/have_timegm.c > /dev/null 2>&1\r
+> +then\r
+> +    printf "Yes.\n"\r
+> +    have_timegm="1"\r
+> +else\r
+> +    printf "No (will use our own instead).\n"\r
+> +    have_timegm="0"\r
+> +fi\r
+> +rm -f compat/have_timegm\r
+> +\r
+>  printf "Checking for standard version of getpwuid_r... "\r
+>  if ${CC} -o compat/check_getpwuid "$srcdir"/compat/check_getpwuid.c > /dev/null 2>&1\r
+>  then\r
+> diff --git a/parse-time-string/parse-time-string.c b/parse-time-string/parse-time-string.c\r
+> index 584067d..ccad422 100644\r
+> --- a/parse-time-string/parse-time-string.c\r
+> +++ b/parse-time-string/parse-time-string.c\r
+> @@ -32,6 +32,7 @@\r
+>  #include <sys/time.h>\r
+>  #include <sys/types.h>\r
+>  \r
+> +#include "compat.h"\r
+>  #include "parse-time-string.h"\r
+>  \r
+>  /*\r
+> -- \r
+> 1.7.9.2\r
+> \r
+> _______________________________________________\r
+> notmuch mailing list\r
+> notmuch@notmuchmail.org\r
+> http://notmuchmail.org/mailman/listinfo/notmuch\r
+> \r