| #if !defined(__GNUC__) |
| /* ///////////////////////////////////////////////////////////////////////////// |
| * File: time.c |
| * |
| * Purpose: gettimeofday() for the Win32 platform. |
| * |
| * Created: 1st November 2003 |
| * Updated: 22nd April 2008 |
| * |
| * Home: http://synesis.com.au/software/ |
| * |
| * Copyright (c) 2003-2008, Matthew Wilson and Synesis Software |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * - Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * - 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. |
| * - Neither the names of Matthew Wilson and Synesis Software nor the names of |
| * any contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 UNIXEM_DOCUMENTATION_SKIP_SECTION |
| # define _SYNSOFT_VER_C_TIME_MAJOR 2 |
| # define _SYNSOFT_VER_C_TIME_MINOR 0 |
| # define _SYNSOFT_VER_C_TIME_REVISION 8 |
| # define _SYNSOFT_VER_C_TIME_EDIT 20 |
| #endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ |
| |
| /* ///////////////////////////////////////////////////////////////////////////// |
| * Includes |
| */ |
| |
| /* If we're going to include 'windows.h', then it has to be included first, so |
| * as to put off the defintion of timeval in sys/time.h. Regrettably, the |
| * WinSock header defines it without any conception of sys/time.h. Thanks MS! |
| */ |
| #ifndef __MWERKS__ |
| # include <windows.h> |
| #endif /* !__MWERKS__ */ |
| |
| #if defined(_MSC_VER) |
| #include <winsock2.h> |
| #else |
| #include <sys/time.h> |
| #endif |
| |
| struct timezone; |
| |
| #include <windows.h> |
| |
| /* ///////////////////////////////////////////////////////////////////////////// |
| * Helper functions |
| */ |
| |
| /** This function is from the STLSoft libraries */ |
| extern long FILETIMEToUNIXTime(FILETIME const *ft, long *microseconds) |
| { |
| #if defined(__COMO__) |
| long long i; |
| #else /* ? compiler */ |
| LONGLONG i; |
| #endif /* compiler */ |
| |
| i = ft->dwHighDateTime; |
| i <<= 32; |
| i |= ft->dwLowDateTime; |
| |
| #if ( ( defined(__BORLANDC__) && \ |
| __BORLANDC__ >= 0x0582) || \ |
| defined(__DMC__) || \ |
| defined(__COMO__) || \ |
| defined(__GNUC__) || \ |
| defined(__MWERKS__)) |
| i -= 116444736000000000LL; |
| #else |
| i -= 116444736000000000L; |
| #endif /* compiler */ |
| if(NULL != microseconds) |
| { |
| *microseconds = (long)((i % 10000000) / 10); |
| } |
| i /= 10000000; |
| |
| return (long)i; |
| } |
| |
| /* ///////////////////////////////////////////////////////////////////////////// |
| * API functions |
| */ |
| |
| void gettimeofday(struct timeval *tv, void *dummy) |
| { |
| SYSTEMTIME st; |
| FILETIME ft; |
| |
| ((void)dummy); |
| |
| GetSystemTime(&st); |
| (void)SystemTimeToFileTime(&st, &ft); |
| |
| tv->tv_sec = FILETIMEToUNIXTime(&ft, &tv->tv_usec); |
| } |
| |
| /* ////////////////////////////////////////////////////////////////////////// */ |
| #endif |