added time functions
This commit is contained in:
		
							
								
								
									
										192
									
								
								stio/lib/stio-tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								stio/lib/stio-tim.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,192 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2015-2016 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "stio-tim.h"
 | 
			
		||||
#include "stio-prv.h"
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#	include <windows.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#elif defined(__OS2__)
 | 
			
		||||
#	define INCL_DOSDATETIME
 | 
			
		||||
#	define INCL_DOSERRORS
 | 
			
		||||
#	include <os2.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#elif defined(__DOS__)
 | 
			
		||||
#	include <dos.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#else
 | 
			
		||||
#	if defined(HAVE_SYS_TIME_H)
 | 
			
		||||
#		include <sys/time.h>
 | 
			
		||||
#	endif
 | 
			
		||||
#	if defined(HAVE_TIME_H)
 | 
			
		||||
#		include <time.h>
 | 
			
		||||
#	endif
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	#define EPOCH_DIFF_YEARS (STIO_EPOCH_YEAR-STIO_EPOCH_YEAR_WIN)
 | 
			
		||||
	#define EPOCH_DIFF_DAYS  ((stio_intptr_t)EPOCH_DIFF_YEARS*365+EPOCH_DIFF_YEARS/4-3)
 | 
			
		||||
	#define EPOCH_DIFF_SECS  ((stio_intptr_t)EPOCH_DIFF_DAYS*24*60*60)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int stio_gettime (stio_ntime_t* t)
 | 
			
		||||
{
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	SYSTEMTIME st;
 | 
			
		||||
	FILETIME ft;
 | 
			
		||||
	ULARGE_INTEGER li;
 | 
			
		||||
 | 
			
		||||
	/* 
 | 
			
		||||
	 * MSDN: The FILETIME structure is a 64-bit value representing the 
 | 
			
		||||
	 *       number of 100-nanosecond intervals since January 1, 1601 (UTC).
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	GetSystemTime (&st);
 | 
			
		||||
	if (SystemTimeToFileTime (&st, &ft) == FALSE) return -1;
 | 
			
		||||
 | 
			
		||||
	li.LowPart = ft.dwLowDateTime;
 | 
			
		||||
	li.HighPart = ft.dwHighDateTime;
 | 
			
		||||
 | 
			
		||||
     /* li.QuadPart is in the 100-nanosecond intervals */
 | 
			
		||||
	t->sec = (li.QuadPart / (STIO_NSECS_PER_SEC / 100)) - EPOCH_DIFF_SECS;
 | 
			
		||||
	t->nsec = (li.QuadPart % (STIO_NSECS_PER_SEC / 100)) * 100;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
#elif defined(__OS2__)
 | 
			
		||||
 | 
			
		||||
	APIRET rc;
 | 
			
		||||
	DATETIME dt;
 | 
			
		||||
	stio_btime_t bt;
 | 
			
		||||
 | 
			
		||||
	/* Can I use DosQuerySysInfo(QSV_TIME_LOW) and 
 | 
			
		||||
	 * DosQuerySysInfo(QSV_TIME_HIGH) for this instead? 
 | 
			
		||||
	 * Maybe, resolution too low as it returns values 
 | 
			
		||||
	 * in seconds. */
 | 
			
		||||
 | 
			
		||||
	rc = DosGetDateTime (&dt);
 | 
			
		||||
	if (rc != NO_ERROR) return -1;
 | 
			
		||||
 | 
			
		||||
	bt.year = dt.year - STIO_BTIME_YEAR_BASE;
 | 
			
		||||
	bt.mon = dt.month - 1;
 | 
			
		||||
	bt.mday = dt.day;
 | 
			
		||||
	bt.hour = dt.hours;
 | 
			
		||||
	bt.min = dt.minutes;
 | 
			
		||||
	bt.sec = dt.seconds;
 | 
			
		||||
	/*bt.msec = dt.hundredths * 10;*/
 | 
			
		||||
	bt.isdst = -1; /* determine dst for me */
 | 
			
		||||
 | 
			
		||||
	if (stio_timelocal (&bt, t) <= -1) return -1;
 | 
			
		||||
	t->nsec = STIO_MSEC_TO_NSEC(dt.hundredths * 10);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
#elif defined(__DOS__)
 | 
			
		||||
 | 
			
		||||
	struct dostime_t dt;
 | 
			
		||||
	struct dosdate_t dd;
 | 
			
		||||
	stio_btime_t bt;
 | 
			
		||||
 | 
			
		||||
	_dos_gettime (&dt);
 | 
			
		||||
	_dos_getdate (&dd);
 | 
			
		||||
 | 
			
		||||
	bt.year = dd.year - STIO_BTIME_YEAR_BASE;
 | 
			
		||||
	bt.mon = dd.month - 1;
 | 
			
		||||
	bt.mday = dd.day;
 | 
			
		||||
	bt.hour = dt.hour;
 | 
			
		||||
	bt.min = dt.minute;
 | 
			
		||||
	bt.sec = dt.second;
 | 
			
		||||
	/*bt.msec = dt.hsecond * 10; */
 | 
			
		||||
	bt.isdst = -1; /* determine dst for me */
 | 
			
		||||
 | 
			
		||||
	if (stio_timelocal (&bt, t) <= -1) return -1;
 | 
			
		||||
	t->nsec = STIO_MSEC_TO_NSEC(dt.hsecond * 10);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
#elif defined(macintosh)
 | 
			
		||||
	unsigned long tv;
 | 
			
		||||
 | 
			
		||||
	GetDateTime (&tv);
 | 
			
		||||
 | 
			
		||||
	t->sec = tv;
 | 
			
		||||
	tv->nsec = 0;
 | 
			
		||||
	
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
#elif defined(HAVE_GETTIMEOFDAY)
 | 
			
		||||
	struct timeval tv;
 | 
			
		||||
	int n;
 | 
			
		||||
 | 
			
		||||
	/* TODO: consider using clock_gettime() if it's avaialble.. -lrt may be needed */
 | 
			
		||||
	n = gettimeofday (&tv, STIO_NULL);
 | 
			
		||||
	if (n == -1) 
 | 
			
		||||
	{
 | 
			
		||||
/* TODO: set stio->errnum using errno... */
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t->sec = tv.tv_sec;
 | 
			
		||||
	t->nsec = STIO_USEC_TO_NSEC(tv.tv_usec);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
	t->sec = STIO_TIME (STIO_NULL);
 | 
			
		||||
	t->nsec = 0;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stio_addtime (const stio_ntime_t* x, const stio_ntime_t* y, stio_ntime_t* z)
 | 
			
		||||
{
 | 
			
		||||
	STIO_ASSERT (x->nsec >= 0 && x->nsec < STIO_NSECS_PER_SEC);
 | 
			
		||||
	STIO_ASSERT (y->nsec >= 0 && y->nsec < STIO_NSECS_PER_SEC);
 | 
			
		||||
 | 
			
		||||
	z->sec = x->sec + y->sec;
 | 
			
		||||
	z->nsec = x->nsec + y->nsec;
 | 
			
		||||
 | 
			
		||||
	if (z->nsec >= STIO_NSECS_PER_SEC)
 | 
			
		||||
	{
 | 
			
		||||
		z->sec = z->sec + 1;
 | 
			
		||||
		z->nsec = z->nsec - STIO_NSECS_PER_SEC;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stio_subtime (const stio_ntime_t* x, const stio_ntime_t* y, stio_ntime_t* z)
 | 
			
		||||
{
 | 
			
		||||
	STIO_ASSERT (x->nsec >= 0 && x->nsec < STIO_NSECS_PER_SEC);
 | 
			
		||||
	STIO_ASSERT (y->nsec >= 0 && y->nsec < STIO_NSECS_PER_SEC);
 | 
			
		||||
 | 
			
		||||
	z->sec = x->sec - y->sec;
 | 
			
		||||
	z->nsec = x->nsec - y->nsec;
 | 
			
		||||
 | 
			
		||||
	if (z->nsec < 0)
 | 
			
		||||
	{
 | 
			
		||||
		z->sec = z->sec - 1;
 | 
			
		||||
		z->nsec = z->nsec + STIO_NSECS_PER_SEC;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										135
									
								
								stio/lib/stio-tim.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								stio/lib/stio-tim.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,135 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2015-2016 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _STIO_TIME_H_
 | 
			
		||||
#define _STIO_TIME_H_
 | 
			
		||||
 | 
			
		||||
#include <stio.h>
 | 
			
		||||
 | 
			
		||||
#define STIO_EPOCH_YEAR  (1970)
 | 
			
		||||
#define STIO_EPOCH_MON   (1)
 | 
			
		||||
#define STIO_EPOCH_DAY   (1)
 | 
			
		||||
#define STIO_EPOCH_WDAY  (4)
 | 
			
		||||
 | 
			
		||||
/* windows specific epoch time */
 | 
			
		||||
#define STIO_EPOCH_YEAR_WIN   (1601)
 | 
			
		||||
#define STIO_EPOCH_MON_WIN    (1)
 | 
			
		||||
#define STIO_EPOCH_DAY_WIN    (1)
 | 
			
		||||
 | 
			
		||||
#define STIO_DAYS_PER_WEEK  (7)
 | 
			
		||||
#define STIO_MONS_PER_YEAR  (12)
 | 
			
		||||
#define STIO_HOURS_PER_DAY  (24)
 | 
			
		||||
#define STIO_MINS_PER_HOUR  (60)
 | 
			
		||||
#define STIO_MINS_PER_DAY   (STIO_MINS_PER_HOUR*STIO_HOURS_PER_DAY)
 | 
			
		||||
#define STIO_SECS_PER_MIN   (60)
 | 
			
		||||
#define STIO_SECS_PER_HOUR  (STIO_SECS_PER_MIN*STIO_MINS_PER_HOUR)
 | 
			
		||||
#define STIO_SECS_PER_DAY   (STIO_SECS_PER_MIN*STIO_MINS_PER_DAY)
 | 
			
		||||
#define STIO_MSECS_PER_SEC  (1000)
 | 
			
		||||
#define STIO_MSECS_PER_MIN  (STIO_MSECS_PER_SEC*STIO_SECS_PER_MIN)
 | 
			
		||||
#define STIO_MSECS_PER_HOUR (STIO_MSECS_PER_SEC*STIO_SECS_PER_HOUR)
 | 
			
		||||
#define STIO_MSECS_PER_DAY  (STIO_MSECS_PER_SEC*STIO_SECS_PER_DAY)
 | 
			
		||||
 | 
			
		||||
#define STIO_USECS_PER_MSEC (1000)
 | 
			
		||||
#define STIO_NSECS_PER_USEC (1000)
 | 
			
		||||
#define STIO_NSECS_PER_MSEC (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC)
 | 
			
		||||
#define STIO_USECS_PER_SEC  (STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
 | 
			
		||||
#define STIO_NSECS_PER_SEC  (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
 | 
			
		||||
 | 
			
		||||
#define STIO_SECNSEC_TO_MSEC(sec,nsec) \
 | 
			
		||||
	(((stio_intptr_t)(sec) * STIO_MSECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_MSEC))
 | 
			
		||||
 | 
			
		||||
#define STIO_SECNSEC_TO_USEC(sec,nsec) \
 | 
			
		||||
	(((stio_intptr_t)(sec) * STIO_USECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_USEC))
 | 
			
		||||
 | 
			
		||||
#define STIO_SEC_TO_MSEC(sec) ((sec) * STIO_MSECS_PER_SEC)
 | 
			
		||||
#define STIO_MSEC_TO_SEC(sec) ((sec) / STIO_MSECS_PER_SEC)
 | 
			
		||||
 | 
			
		||||
#define STIO_USEC_TO_NSEC(usec) ((usec) * STIO_NSECS_PER_USEC)
 | 
			
		||||
#define STIO_NSEC_TO_USEC(nsec) ((nsec) / STIO_NSECS_PER_USEC)
 | 
			
		||||
 | 
			
		||||
#define STIO_MSEC_TO_NSEC(msec) ((msec) * STIO_NSECS_PER_MSEC)
 | 
			
		||||
#define STIO_NSEC_TO_MSEC(nsec) ((nsec) / STIO_NSECS_PER_MSEC)
 | 
			
		||||
 | 
			
		||||
#define STIO_SEC_TO_NSEC(sec) ((sec) * STIO_NSECS_PER_SEC)
 | 
			
		||||
#define STIO_NSEC_TO_SEC(nsec) ((nsec) / STIO_NSECS_PER_SEC)
 | 
			
		||||
 | 
			
		||||
#define STIO_SEC_TO_USEC(sec) ((sec) * STIO_USECS_PER_SEC)
 | 
			
		||||
#define STIO_USEC_TO_SEC(usec) ((usec) / STIO_USECS_PER_SEC)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The stio_ntime_t type defines a numeric time type expressed in the 
 | 
			
		||||
 *  number of milliseconds since the Epoch (00:00:00 UTC, Jan 1, 1970).
 | 
			
		||||
 */
 | 
			
		||||
typedef struct stio_ntime_t stio_ntime_t;
 | 
			
		||||
struct stio_ntime_t
 | 
			
		||||
{
 | 
			
		||||
	stio_intptr_t  sec;
 | 
			
		||||
	stio_int32_t nsec; /* nanoseconds */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define stio_inittime(x,s,ns) (((x)->sec = (s)), ((x)->nsec = (ns)))
 | 
			
		||||
#define stio_cleartime(x) stio_inittime(x,0,0)
 | 
			
		||||
/*#define stio_cleartime(x) ((x)->sec = (x)->nsec = 0)*/
 | 
			
		||||
#define stio_cmptime(x,y) \
 | 
			
		||||
	(((x)->sec == (y)->sec)? ((x)->nsec - (y)->nsec): \
 | 
			
		||||
	                         ((x)->sec -  (y)->sec))
 | 
			
		||||
 | 
			
		||||
#define stio_iszerotime(x) ((x)->sec == 0 && (x)->nsec == 0)
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The stio_gettime() function gets the current time.
 | 
			
		||||
 */
 | 
			
		||||
STIO_EXPORT int stio_gettime (
 | 
			
		||||
	stio_ntime_t* nt
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The stio_addtime() function adds x and y and stores the result in z 
 | 
			
		||||
 */
 | 
			
		||||
STIO_EXPORT void stio_addtime (
 | 
			
		||||
	const stio_ntime_t* x,
 | 
			
		||||
	const stio_ntime_t* y,
 | 
			
		||||
	stio_ntime_t*       z
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The stio_subtime() function subtract y from x and stores the result in z.
 | 
			
		||||
 */
 | 
			
		||||
STIO_EXPORT void stio_subtime (
 | 
			
		||||
	const stio_ntime_t* x,
 | 
			
		||||
	const stio_ntime_t* y,
 | 
			
		||||
	stio_ntime_t*       z
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user