unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
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, &ltm);

    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;
}

  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).