From 0b39b2ad6c827cfe8920e17bee27bde1ae5e930c Mon Sep 17 00:00:00 2001 From: Marcelo Roberto Jimenez Date: Sun, 9 Mar 2008 01:16:58 +0000 Subject: [PATCH] * SF Bug Tracker [ 1902668 ] Cannot compile on MSVC Submitted By Luke Kim - nereusuj Version 1.6.5 cannot be compiled because of some changes in 1.6.3. MSVC does not support stdint.h, gettimeofday(), sys/param.h, const int variables in array size and Windows does not define _WINDOWS_ but define _WINDOWS. * MSVC does not understand "const int"'s as declarators of array dimensions, we must use #define'd constants. * Use WIN32 instead of _WINDOWS_ or _WINDOWS. git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@331 119443c7-1b9e-41f8-b6fc-b9c35fce742c --- ChangeLog | 11 ++ THANKS | 2 +- build/msvc/stdint.h | 222 +++++++++++++++++++++++ threadutil/inc/ThreadPool.h | 15 +- threadutil/src/LinkedList.c | 9 +- threadutil/src/ThreadPool.c | 42 +++++ upnp/inc/upnp.h | 4 +- upnp/src/genlib/net/http/httpreadwrite.c | 8 + upnp/src/genlib/net/http/webserver.c | 2 - upnp/src/uuid/sysdep.c | 16 +- 10 files changed, 315 insertions(+), 16 deletions(-) create mode 100644 build/msvc/stdint.h diff --git a/ChangeLog b/ChangeLog index 1cdf8b3..6bde0dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,17 @@ Version 1.6.6 ******************************************************************************* +2008-03-08 Marcelo Jimenez + * SF Bug Tracker [ 1902668 ] Cannot compile on MSVC + Submitted By Luke Kim - nereusuj + Version 1.6.5 cannot be compiled because of some changes in 1.6.3. + MSVC does not support stdint.h, gettimeofday(), sys/param.h, const int + variables in array size and Windows does not define _WINDOWS_ but define + _WINDOWS. + * MSVC does not understand "const int"'s as declarators of array + dimensions, we must use #define'd constants. + * Use WIN32 instead of _WINDOWS_ or _WINDOWS. + 2008-02-22 Marcelo Jimenez * No longer ignore "upnp:rootdevice" advertisement. Thanks to Bob Ciora. diff --git a/THANKS b/THANKS index f226472..2e52e2c 100644 --- a/THANKS +++ b/THANKS @@ -30,7 +30,7 @@ exempt of errors. - Keith Brindley - Leuk_He - Loigu -- Luke Kim +- Luke Kim (nereusuj) - Marcelo Roberto Jimenez (mroberto) - Markus Strobl - Nektarios K. Papadopoulos (npapadop) diff --git a/build/msvc/stdint.h b/build/msvc/stdint.h new file mode 100644 index 0000000..7e200dc --- /dev/null +++ b/build/msvc/stdint.h @@ -0,0 +1,222 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006 Alexander Chemeris +// +// 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. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// 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 _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if (_MSC_VER < 1300) && defined(__cplusplus) + extern "C++" { +#endif +# include +#if (_MSC_VER < 1300) && defined(__cplusplus) + } +#endif + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types +typedef __int8 int8_t; +typedef __int16 int16_t; +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef int intptr_t; + typedef unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/threadutil/inc/ThreadPool.h b/threadutil/inc/ThreadPool.h index 6b20753..b7d8799 100644 --- a/threadutil/inc/ThreadPool.h +++ b/threadutil/inc/ThreadPool.h @@ -79,7 +79,20 @@ typedef enum priority {LOW_PRIORITY, #endif #include "LinkedList.h" -#include /* for gettimeofday() */ + +#ifdef WIN32 + #include + #include + struct timezone + { + int tz_minuteswest; /* minutes W of Greenwich */ + int tz_dsttime; /* type of dst correction */ + }; + int gettimeofday(struct timeval *tv, struct timezone *tz); +#else /* WIN32 */ + #include /* for gettimeofday() */ +#endif + #include "FreeList.h" #include "ithread.h" diff --git a/threadutil/src/LinkedList.c b/threadutil/src/LinkedList.c index a67330f..c5060a9 100644 --- a/threadutil/src/LinkedList.c +++ b/threadutil/src/LinkedList.c @@ -30,11 +30,13 @@ /////////////////////////////////////////////////////////////////////////// #include "LinkedList.h" -#include +#ifndef WIN32 + #include +#endif #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__) -#include + #include #else -#include + #include #endif #include @@ -532,3 +534,4 @@ ListSize( LinkedList * list ) return list->size; } + diff --git a/threadutil/src/ThreadPool.c b/threadutil/src/ThreadPool.c index 0085c89..0161546 100644 --- a/threadutil/src/ThreadPool.c +++ b/threadutil/src/ThreadPool.c @@ -1597,3 +1597,45 @@ int ThreadPoolGetStats( ThreadPool *tp, ThreadPoolStats *stats ) #endif /* STATS */ +#ifdef WIN32 +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +#else + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL +#endif + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + unsigned __int64 tmpres = 0; + static int tzflag; + + if (NULL != tv) + { + GetSystemTimeAsFileTime(&ft); + + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + /*converting file time to unix epoch*/ + tmpres /= 10; /*convert into microseconds*/ + tmpres -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long)(tmpres / 1000000UL); + tv->tv_usec = (long)(tmpres % 1000000UL); + } + + if (NULL != tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} +#endif /* WIN32 */ diff --git a/upnp/inc/upnp.h b/upnp/inc/upnp.h index 14d31a0..1b9b277 100644 --- a/upnp/inc/upnp.h +++ b/upnp/inc/upnp.h @@ -47,7 +47,9 @@ #include -#include +#ifndef WIN32 + #include +#endif #if (defined(BSD) && BSD >= 199306) #include #endif diff --git a/upnp/src/genlib/net/http/httpreadwrite.c b/upnp/src/genlib/net/http/httpreadwrite.c index ce74813..de5a979 100644 --- a/upnp/src/genlib/net/http/httpreadwrite.c +++ b/upnp/src/genlib/net/http/httpreadwrite.c @@ -71,8 +71,16 @@ #include "webserver.h" +/* + * Please, do not change these to const int while MSVC cannot understand + * const int in array dimensions. + */ +/* const int CHUNK_HEADER_SIZE = 10; const int CHUNK_TAIL_SIZE = 10; +*/ +#define CHUNK_HEADER_SIZE 10 +#define CHUNK_TAIL_SIZE 10 /************************************************************************ diff --git a/upnp/src/genlib/net/http/webserver.c b/upnp/src/genlib/net/http/webserver.c index 5ac80dd..ef73b62 100644 --- a/upnp/src/genlib/net/http/webserver.c +++ b/upnp/src/genlib/net/http/webserver.c @@ -38,11 +38,9 @@ #include #include #ifndef UPNP_USE_BCBPP -#ifndef UPNP_USE_MSVCPP #include #include #endif -#endif #include "util.h" #include "strintmap.h" #include "membuffer.h" diff --git a/upnp/src/uuid/sysdep.c b/upnp/src/uuid/sysdep.c index b776af5..c90467b 100644 --- a/upnp/src/uuid/sysdep.c +++ b/upnp/src/uuid/sysdep.c @@ -18,11 +18,11 @@ */ #include "config.h" -#ifndef WIN32 - #include -#else - #include -#endif +#ifdef WIN32 + #include +#else /* WIN32 */ + #include +#endif /* WIN32 */ #include #include #include "sysdep.h" @@ -56,7 +56,7 @@ get_ieee_node_identifier(uuid_node_t *node) less than 100ns. */ -#ifdef _WINDOWS_ +#ifdef WIN32 void get_system_time( uuid_time_t * uuid_time ) @@ -119,7 +119,7 @@ get_random_info(char seed[16]) MD5Final(seed, &c); }; -#else /* _WINDOWS_ */ +#else /* WIN32 */ /*-----------------------------------------------------------------------------*/ void @@ -163,5 +163,5 @@ get_random_info(char seed[16]) MD5Final(seed, &c); }; -#endif /* _WINDOWS_ */ +#endif /* WIN32 */