From: Tomi Ollila <tomi.ollila@iki.fi>
To: Blake Jones <blakej@foo.net>, Jani Nikula <jani@nikula.org>
Cc: notmuch@notmuchmail.org
Subject: Re: [PATCH 10/10] timegm: add portable implementation (Solaris support)
Date: Mon, 05 Nov 2012 14:09:33 +0200 [thread overview]
Message-ID: <m2txt4jloi.fsf@guru.guru-group.fi> (raw)
In-Reply-To: <12349.1352043650@foo.net>
[-- Attachment #1: Type: text/plain, Size: 1069 bytes --]
On Sun, Nov 04 2012, Blake Jones wrote:
> Hi Jani,
>
>> I'd prefer to use timegm() where available, and the suggested
>> alternative [1] elsewhere.
>>
>> [1] http://www.kernel.org/doc/man-pages/online/pages/man3/timegm.3.html
>
> I considered this alternative, but decided against it because it's
> completely MT-unsafe. I don't know whether libnotmuch itself is
> MT-safe, but a process which called this routine in one thread would
> temporarily throw off any timezone-related work that any other threads
> were doing, even if they weren't using libnotmuch.
Yet another idea for an alternative. Compile by entering 'sh xtimegm.c'
and then run ./xtimegm
Simple cases seems to work. Dst change may (or then may not) give one
hour difference to the expected. The test "coverage" could be easily
expanded to that ;)
Hmm, I also found this:
http://lists.gnu.org/archive/html/bug-gnulib/2003-09/msg00004.html
which does 2 mktime's and one gmtime_r (without allocating tg!)...
Pick any of these 3 -- or something different (e.g. less NIH if there is)
> Blake
Tomi
[-- Attachment #2: yet another attempt for timegm() implementation --]
[-- Type: text/plain, Size: 2225 bytes --]
#if 0 /* -*- mode: c; c-file-style: "stroustrup"; tab-width: 8; -*-
set -eu; trg=`basename "$0" .c`; rm -f "$trg"
WARN="-Wall -Wno-long-long -Wstrict-prototypes -pedantic"
WARN="$WARN -Wcast-align -Wpointer-arith " # -Wfloat-equal #-Werror
WARN="$WARN -W -Wwrite-strings -Wcast-qual -Wshadow" # -Wconversion
case ${1-} in '') set x -O2; shift; esac
#case ${1-} in '') set x -ggdb; shift; esac
set -x; exec ${CC:-gcc} -std=c99 $WARN "$@" -o "$trg" "$0"
exit $?
*/
#endif
/*
* $ xtimegm.c $
*
* Author: Tomi Ollila -- too ät iki piste fi
*
* Created: Mon 05 Nov 2012 07:54:35 EET too
* Last modified: Mon 05 Nov 2012 08:27:52 EET too
*
* Public domain.
*/
#define _POSIX_SOURCE
#include <time.h>
time_t xtimegm(struct tm * atm)
{
struct tm ltm;
time_t t = mktime(atm);
int sd;
int dd;
(void)gmtime_r(&t, <m);
sd = (atm->tm_hour - ltm.tm_hour) * 3600 + (atm->tm_min - ltm.tm_min) * 60
+ (atm->tm_sec - ltm.tm_sec);
dd = (atm->tm_mday - ltm.tm_mday);
if (dd == 0)
;
else if (dd == -1) sd -= 86400; /* e.g. 3, 2 */
else if (dd == 1) sd += 86400; /* e.g. 2, 3 */
else if (dd > 1) sd -= 86400; /* e.g. 1, 31 */
else /* dd < 1 */ sd += 86400; /* e.g. 31, 1 */
printf("sd: %d\n", sd); // test line.
return t + sd;
}
#include <stdio.h>
void test(int hour, int mday)
{
struct tm mtm;
time_t t;
struct tm * otm;
mtm.tm_sec = 0;
mtm.tm_min = 0;
mtm.tm_hour = hour;
mtm.tm_mday = mday;
mtm.tm_mon = 11;
mtm.tm_year = 100;
mtm.tm_isdst = -1;
t = xtimegm(&mtm);
otm = gmtime(&t);
printf("%2d %02d:%02d:%02d\n", otm->tm_mday,
otm->tm_hour, otm->tm_min, otm->tm_sec);
}
void tests(const char * tz)
{
printf("TZ: %s\n", tz);
setenv("TZ", tz, 1);
tzset();
test(23, 30);
test(23, 31);
test(23, 1);
test(23, 2);
printf("--\n");
test(1, 30);
test(1, 31);
test(1, 1);
test(1, 2);
}
int main(int argc, char * argv[])
{
// ls /usr/share/zoneinfo...
tests("EET");
tests("MST");
tests("HST");
tests("NZ");
return 0;
}
next prev parent reply other threads:[~2012-11-05 12:09 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-04 3:15 [PATCH 00/10] Solaris support Blake Jones
2012-11-04 3:15 ` [PATCH 01/10] getpwuid: check for standards compliance (Solaris support) Blake Jones
2012-11-04 3:15 ` [PATCH 02/10] asctime: " Blake Jones
2012-11-04 3:15 ` [PATCH 03/10] gethostbyname: check for libnsl " Blake Jones
2012-11-04 3:15 ` [PATCH 04/10] configure: check for -Wl,-rpath " Blake Jones
2012-11-04 3:15 ` [PATCH 05/10] install: check for non-SysV version " Blake Jones
2012-11-04 21:31 ` Jani Nikula
2012-11-05 5:27 ` Blake Jones
2012-11-05 11:29 ` Jani Nikula
2012-11-05 14:52 ` Blake Jones
2012-11-04 3:15 ` [PATCH 06/10] strsep: check for availability " Blake Jones
2012-11-04 3:15 ` [PATCH 07/10] gen-version-script: parse Solaris "nm" output " Blake Jones
2012-11-04 3:16 ` [PATCH 08/10] notmuch-config: header for index() prototype " Blake Jones
2012-11-04 21:16 ` Jani Nikula
2012-11-04 21:47 ` Tomi Ollila
2012-11-05 4:52 ` Blake Jones
2012-11-04 3:16 ` [PATCH 09/10] debugger.c: correct return type from getppid() " Blake Jones
2012-11-04 3:16 ` [PATCH 10/10] timegm: add portable implementation " Blake Jones
2012-11-04 10:21 ` Jani Nikula
2012-11-04 15:40 ` Blake Jones
2012-11-04 20:58 ` Jani Nikula
2012-11-05 4:50 ` Blake Jones
2012-11-05 12:09 ` Tomi Ollila [this message]
2012-11-05 15:47 ` Blake Jones
2012-11-05 17:36 ` Tomi Ollila
2012-11-05 18:33 ` Blake Jones
2012-11-04 21:35 ` [PATCH 00/10] Solaris support Jani Nikula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2txt4jloi.fsf@guru.guru-group.fi \
--to=tomi.ollila@iki.fi \
--cc=blakej@foo.net \
--cc=jani@nikula.org \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).