diff options
| author | rjohnson <rjohnson> | 1998-03-26 14:56:55 (GMT) | 
|---|---|---|
| committer | rjohnson <rjohnson> | 1998-03-26 14:56:55 (GMT) | 
| commit | 72d823b9193f9ee2b0318563b49363cd08c11f24 (patch) | |
| tree | c168cc164a71f320db9dcdfe7518ba7bd0d2c8d9 /unix/tclUnixTime.c | |
| parent | 2b5738da524e944cda39e24c0a87b745a43bd8c3 (diff) | |
| download | tcl-72d823b9193f9ee2b0318563b49363cd08c11f24.zip tcl-72d823b9193f9ee2b0318563b49363cd08c11f24.tar.gz tcl-72d823b9193f9ee2b0318563b49363cd08c11f24.tar.bz2  | |
Initial revision
Diffstat (limited to 'unix/tclUnixTime.c')
| -rw-r--r-- | unix/tclUnixTime.c | 236 | 
1 files changed, 236 insertions, 0 deletions
diff --git a/unix/tclUnixTime.c b/unix/tclUnixTime.c new file mode 100644 index 0000000..ba8d984 --- /dev/null +++ b/unix/tclUnixTime.c @@ -0,0 +1,236 @@ +/*  + * tclUnixTime.c -- + * + *	Contains Unix specific versions of Tcl functions that + *	obtain time values from the operating system. + * + * Copyright (c) 1995 Sun Microsystems, Inc. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * SCCS: @(#) tclUnixTime.c 1.13 97/10/31 15:04:58 + */ + +#include "tclInt.h" +#include "tclPort.h" + +/* + *----------------------------------------------------------------------------- + * + * TclpGetSeconds -- + * + *	This procedure returns the number of seconds from the epoch.  On + *	most Unix systems the epoch is Midnight Jan 1, 1970 GMT. + * + * Results: + *	Number of seconds from the epoch. + * + * Side effects: + *	None. + * + *----------------------------------------------------------------------------- + */ + +unsigned long +TclpGetSeconds() +{ +    return time((time_t *) NULL); +} + +/* + *----------------------------------------------------------------------------- + * + * TclpGetClicks -- + * + *	This procedure returns a value that represents the highest resolution + *	clock available on the system.  There are no garantees on what the + *	resolution will be.  In Tcl we will call this value a "click".  The + *	start time is also system dependant. + * + * Results: + *	Number of clicks from some start time. + * + * Side effects: + *	None. + * + *----------------------------------------------------------------------------- + */ + +unsigned long +TclpGetClicks() +{ +    unsigned long now; +#ifdef NO_GETTOD +    struct tms dummy; +#else +    struct timeval date; +    struct timezone tz; +#endif + +#ifdef NO_GETTOD +    now = (unsigned long) times(&dummy); +#else +    gettimeofday(&date, &tz); +    now = date.tv_sec*1000000 + date.tv_usec; +#endif + +    return now; +} + +/* + *---------------------------------------------------------------------- + * + * TclpGetTimeZone -- + * + *	Determines the current timezone.  The method varies wildly + *	between different platform implementations, so its hidden in + *	this function. + * + * Results: + *	The return value is the local time zone, measured in + *	minutes away from GMT (-ve for east, +ve for west). + * + * Side effects: + *	None. + * + *---------------------------------------------------------------------- + */ + +int +TclpGetTimeZone (currentTime) +    unsigned long  currentTime; +{ +    /* +     * Determine how a timezone is obtained from "struct tm".  If there is no +     * time zone in this struct (very lame) then use the timezone variable. +     * This is done in a way to make the timezone variable the method of last +     * resort, as some systems have it in addition to a field in "struct tm". +     * The gettimeofday system call can also be used to determine the time +     * zone. +     */ +     +#if defined(HAVE_TM_TZADJ) +#   define TCL_GOT_TIMEZONE +    time_t      curTime = (time_t) currentTime; +    struct tm  *timeDataPtr = localtime(&curTime); +    int         timeZone; + +    timeZone = timeDataPtr->tm_tzadj  / 60; +    if (timeDataPtr->tm_isdst) { +        timeZone += 60; +    } +     +    return timeZone; +#endif + +#if defined(HAVE_TM_GMTOFF) && !defined (TCL_GOT_TIMEZONE) +#   define TCL_GOT_TIMEZONE +    time_t     curTime = (time_t) currentTime; +    struct tm *timeDataPtr = localtime(&curTime); +    int        timeZone; + +    timeZone = -(timeDataPtr->tm_gmtoff / 60); +    if (timeDataPtr->tm_isdst) { +        timeZone += 60; +    } +     +    return timeZone; +#endif + +#if defined(USE_DELTA_FOR_TZ) +#define TCL_GOT_TIMEZONE 1 +    /* +     * This hack replaces using global var timezone or gettimeofday +     * in situations where they are buggy such as on AIX when libbsd.a +     * is linked in. +     */ + +    int timeZone; +    time_t tt; +    struct tm *stm; +    tt = 849268800L;      /*    1996-11-29 12:00:00  GMT */ +    stm = localtime(&tt); /* eg 1996-11-29  6:00:00  CST6CDT */ +    /* The calculation below assumes a max of +12 or -12 hours from GMT */ +    timeZone = (12 - stm->tm_hour)*60 + (0 - stm->tm_min); +    return timeZone;  /* eg +360 for CST6CDT */ +#endif + +    /* +     * Must prefer timezone variable over gettimeofday, as gettimeofday does +     * not return timezone information on many systems that have moved this +     * information outside of the kernel. +     */ +     +#if defined(HAVE_TIMEZONE_VAR) && !defined (TCL_GOT_TIMEZONE) +#   define TCL_GOT_TIMEZONE +    static int setTZ = 0; +    int        timeZone; + +    if (!setTZ) { +        tzset(); +        setTZ = 1; +    } + +    /* +     * Note: this is not a typo in "timezone" below!  See tzset +     * documentation for details. +     */ + +    timeZone = timezone / 60; + +    return timeZone; +#endif + +#if !defined(NO_GETTOD) && !defined (TCL_GOT_TIMEZONE) +#   define TCL_GOT_TIMEZONE +    struct timeval  tv; +    struct timezone tz; +    int timeZone; + +    gettimeofday(&tv, &tz); +    timeZone = tz.tz_minuteswest; +    if (tz.tz_dsttime) { +        timeZone += 60; +    } +     +    return timeZone; +#endif + +#ifndef TCL_GOT_TIMEZONE +    /* +     * Cause compile error, we don't know how to get timezone. +     */ +    error: autoconf did not figure out how to determine the timezone.  +#endif + +} + +/* + *---------------------------------------------------------------------- + * + * TclpGetTime -- + * + *	Gets the current system time in seconds and microseconds + *	since the beginning of the epoch: 00:00 UCT, January 1, 1970. + * + * Results: + *	Returns the current time in timePtr. + * + * Side effects: + *	None. + * + *---------------------------------------------------------------------- + */ + +void +TclpGetTime(timePtr) +    Tcl_Time *timePtr;		/* Location to store time information. */ +{ +    struct timeval tv; +    struct timezone tz; +     +    (void) gettimeofday(&tv, &tz); +    timePtr->sec = tv.tv_sec; +    timePtr->usec = tv.tv_usec; +}  | 
