Skip to content

Commit 70783a4

Browse files
committed
Merge branch 'msvc'
This topic branch provides compatibility for Windows, without the MINGW32 dependency. It is based on #22. Signed-off-by: Johannes Schindelin <[email protected]>
2 parents 50dbe1d + 54b2400 commit 70783a4

File tree

10 files changed

+389
-32
lines changed

10 files changed

+389
-32
lines changed

compat/msvc/stdint.h

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
// ISO C9x compliant stdint.h for Microsoft Visual Studio
2+
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
3+
//
4+
// Copyright (c) 2006-2008 Alexander Chemeris
5+
//
6+
// Redistribution and use in source and binary forms, with or without
7+
// modification, are permitted provided that the following conditions are met:
8+
//
9+
// 1. Redistributions of source code must retain the above copyright notice,
10+
// this list of conditions and the following disclaimer.
11+
//
12+
// 2. Redistributions in binary form must reproduce the above copyright
13+
// notice, this list of conditions and the following disclaimer in the
14+
// documentation and/or other materials provided with the distribution.
15+
//
16+
// 3. The name of the author may be used to endorse or promote products
17+
// derived from this software without specific prior written permission.
18+
//
19+
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
20+
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21+
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
22+
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24+
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25+
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26+
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27+
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28+
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
//
30+
///////////////////////////////////////////////////////////////////////////////
31+
32+
#ifndef _MSC_VER // [
33+
#error "Use this header only with Microsoft Visual C++ compilers!"
34+
#endif // _MSC_VER ]
35+
36+
#ifndef _MSC_STDINT_H_ // [
37+
#define _MSC_STDINT_H_
38+
39+
#if _MSC_VER > 1000
40+
#pragma once
41+
#endif
42+
43+
#include <limits.h>
44+
45+
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
46+
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
47+
// or compiler give many errors like this:
48+
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
49+
#ifdef __cplusplus
50+
extern "C" {
51+
#endif
52+
# include <wchar.h>
53+
#ifdef __cplusplus
54+
}
55+
#endif
56+
57+
// Define _W64 macros to mark types changing their size, like intptr_t.
58+
#ifndef _W64
59+
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
60+
# define _W64 __w64
61+
# else
62+
# define _W64
63+
# endif
64+
#endif
65+
66+
67+
// 7.18.1 Integer types
68+
69+
// 7.18.1.1 Exact-width integer types
70+
71+
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
72+
// realize that, e.g. char has the same size as __int8
73+
// so we give up on __intX for them.
74+
#if (_MSC_VER < 1300)
75+
typedef char int8_t;
76+
typedef short int16_t;
77+
typedef int int32_t;
78+
typedef unsigned char uint8_t;
79+
typedef unsigned short uint16_t;
80+
typedef unsigned int uint32_t;
81+
#else
82+
typedef __int8 int8_t;
83+
typedef __int16 int16_t;
84+
typedef __int32 int32_t;
85+
typedef unsigned __int8 uint8_t;
86+
typedef unsigned __int16 uint16_t;
87+
typedef unsigned __int32 uint32_t;
88+
#endif
89+
typedef __int64 int64_t;
90+
typedef unsigned __int64 uint64_t;
91+
92+
93+
// 7.18.1.2 Minimum-width integer types
94+
typedef int8_t int_least8_t;
95+
typedef int16_t int_least16_t;
96+
typedef int32_t int_least32_t;
97+
typedef int64_t int_least64_t;
98+
typedef uint8_t uint_least8_t;
99+
typedef uint16_t uint_least16_t;
100+
typedef uint32_t uint_least32_t;
101+
typedef uint64_t uint_least64_t;
102+
103+
// 7.18.1.3 Fastest minimum-width integer types
104+
typedef int8_t int_fast8_t;
105+
typedef int16_t int_fast16_t;
106+
typedef int32_t int_fast32_t;
107+
typedef int64_t int_fast64_t;
108+
typedef uint8_t uint_fast8_t;
109+
typedef uint16_t uint_fast16_t;
110+
typedef uint32_t uint_fast32_t;
111+
typedef uint64_t uint_fast64_t;
112+
113+
// 7.18.1.4 Integer types capable of holding object pointers
114+
#ifdef _WIN64 // [
115+
typedef __int64 intptr_t;
116+
typedef unsigned __int64 uintptr_t;
117+
#else // _WIN64 ][
118+
typedef _W64 int intptr_t;
119+
typedef _W64 unsigned int uintptr_t;
120+
#endif // _WIN64 ]
121+
122+
// 7.18.1.5 Greatest-width integer types
123+
typedef int64_t intmax_t;
124+
typedef uint64_t uintmax_t;
125+
126+
127+
// 7.18.2 Limits of specified-width integer types
128+
129+
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
130+
131+
// 7.18.2.1 Limits of exact-width integer types
132+
#define INT8_MIN ((int8_t)_I8_MIN)
133+
#define INT8_MAX _I8_MAX
134+
#define INT16_MIN ((int16_t)_I16_MIN)
135+
#define INT16_MAX _I16_MAX
136+
#define INT32_MIN ((int32_t)_I32_MIN)
137+
#define INT32_MAX _I32_MAX
138+
#define INT64_MIN ((int64_t)_I64_MIN)
139+
#define INT64_MAX _I64_MAX
140+
#define UINT8_MAX _UI8_MAX
141+
#define UINT16_MAX _UI16_MAX
142+
#define UINT32_MAX _UI32_MAX
143+
#define UINT64_MAX _UI64_MAX
144+
145+
// 7.18.2.2 Limits of minimum-width integer types
146+
#define INT_LEAST8_MIN INT8_MIN
147+
#define INT_LEAST8_MAX INT8_MAX
148+
#define INT_LEAST16_MIN INT16_MIN
149+
#define INT_LEAST16_MAX INT16_MAX
150+
#define INT_LEAST32_MIN INT32_MIN
151+
#define INT_LEAST32_MAX INT32_MAX
152+
#define INT_LEAST64_MIN INT64_MIN
153+
#define INT_LEAST64_MAX INT64_MAX
154+
#define UINT_LEAST8_MAX UINT8_MAX
155+
#define UINT_LEAST16_MAX UINT16_MAX
156+
#define UINT_LEAST32_MAX UINT32_MAX
157+
#define UINT_LEAST64_MAX UINT64_MAX
158+
159+
// 7.18.2.3 Limits of fastest minimum-width integer types
160+
#define INT_FAST8_MIN INT8_MIN
161+
#define INT_FAST8_MAX INT8_MAX
162+
#define INT_FAST16_MIN INT16_MIN
163+
#define INT_FAST16_MAX INT16_MAX
164+
#define INT_FAST32_MIN INT32_MIN
165+
#define INT_FAST32_MAX INT32_MAX
166+
#define INT_FAST64_MIN INT64_MIN
167+
#define INT_FAST64_MAX INT64_MAX
168+
#define UINT_FAST8_MAX UINT8_MAX
169+
#define UINT_FAST16_MAX UINT16_MAX
170+
#define UINT_FAST32_MAX UINT32_MAX
171+
#define UINT_FAST64_MAX UINT64_MAX
172+
173+
// 7.18.2.4 Limits of integer types capable of holding object pointers
174+
#ifdef _WIN64 // [
175+
# define INTPTR_MIN INT64_MIN
176+
# define INTPTR_MAX INT64_MAX
177+
# define UINTPTR_MAX UINT64_MAX
178+
#else // _WIN64 ][
179+
# define INTPTR_MIN INT32_MIN
180+
# define INTPTR_MAX INT32_MAX
181+
# define UINTPTR_MAX UINT32_MAX
182+
#endif // _WIN64 ]
183+
184+
// 7.18.2.5 Limits of greatest-width integer types
185+
#define INTMAX_MIN INT64_MIN
186+
#define INTMAX_MAX INT64_MAX
187+
#define UINTMAX_MAX UINT64_MAX
188+
189+
// 7.18.3 Limits of other integer types
190+
191+
#ifdef _WIN64 // [
192+
# define PTRDIFF_MIN _I64_MIN
193+
# define PTRDIFF_MAX _I64_MAX
194+
#else // _WIN64 ][
195+
# define PTRDIFF_MIN _I32_MIN
196+
# define PTRDIFF_MAX _I32_MAX
197+
#endif // _WIN64 ]
198+
199+
#define SIG_ATOMIC_MIN INT_MIN
200+
#define SIG_ATOMIC_MAX INT_MAX
201+
202+
#ifndef SIZE_MAX // [
203+
# ifdef _WIN64 // [
204+
# define SIZE_MAX _UI64_MAX
205+
# else // _WIN64 ][
206+
# define SIZE_MAX _UI32_MAX
207+
# endif // _WIN64 ]
208+
#endif // SIZE_MAX ]
209+
210+
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
211+
#ifndef WCHAR_MIN // [
212+
# define WCHAR_MIN 0
213+
#endif // WCHAR_MIN ]
214+
#ifndef WCHAR_MAX // [
215+
# define WCHAR_MAX _UI16_MAX
216+
#endif // WCHAR_MAX ]
217+
218+
#define WINT_MIN 0
219+
#define WINT_MAX _UI16_MAX
220+
221+
#endif // __STDC_LIMIT_MACROS ]
222+
223+
224+
// 7.18.4 Limits of other integer types
225+
226+
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
227+
228+
// 7.18.4.1 Macros for minimum-width integer constants
229+
230+
#define INT8_C(val) val##i8
231+
#define INT16_C(val) val##i16
232+
#define INT32_C(val) val##i32
233+
#define INT64_C(val) val##i64
234+
235+
#define UINT8_C(val) val##ui8
236+
#define UINT16_C(val) val##ui16
237+
#define UINT32_C(val) val##ui32
238+
#define UINT64_C(val) val##ui64
239+
240+
// 7.18.4.2 Macros for greatest-width integer constants
241+
#define INTMAX_C INT64_C
242+
#define UINTMAX_C UINT64_C
243+
244+
#endif // __STDC_CONSTANT_MACROS ]
245+
246+
247+
#endif // _MSC_STDINT_H_ ]

compat/msvc/sys/time.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#pragma once
2+
3+
//http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/430449b3-f6dd-4e18-84de-eebd26a8d668
4+
#include < time.h >
5+
#include <windows.h> //I've ommited this line.
6+
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
7+
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
8+
#else
9+
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
10+
#endif
11+
12+
struct timespec {
13+
14+
time_t tv_sec; /* Seconds since 00:00:00 GMT, */
15+
16+
/* 1 January 1970 */
17+
18+
long tv_nsec; /* Additional nanoseconds since */
19+
20+
/* tv_sec */
21+
22+
};
23+
24+
struct timezone
25+
{
26+
int tz_minuteswest; /* minutes W of Greenwich */
27+
int tz_dsttime; /* type of dst correction */
28+
};
29+
30+
static __inline int gettimeofday(struct timeval *tv, struct timezone *tz)
31+
{
32+
FILETIME ft;
33+
unsigned __int64 tmpres = 0;
34+
static int tzflag;
35+
36+
if (NULL != tv)
37+
{
38+
GetSystemTimeAsFileTime(&ft);
39+
40+
tmpres |= ft.dwHighDateTime;
41+
tmpres <<= 32;
42+
tmpres |= ft.dwLowDateTime;
43+
44+
/*converting file time to unix epoch*/
45+
tmpres -= DELTA_EPOCH_IN_MICROSECS;
46+
tv->tv_sec = (long)(tmpres / 1000000UL);
47+
tv->tv_usec = (long)(tmpres % 1000000UL);
48+
}
49+
50+
if (NULL != tz)
51+
{
52+
if (!tzflag)
53+
{
54+
_tzset();
55+
tzflag++;
56+
}
57+
tz->tz_minuteswest = _timezone / 60;
58+
tz->tz_dsttime = _daylight;
59+
}
60+
61+
return 0;
62+
}

compat/msvc/unistd.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
#include <process.h>

libvncclient/listen.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@
2727
#endif
2828
#include <unistd.h>
2929
#include <sys/types.h>
30-
#ifdef __MINGW32__
30+
#ifdef WIN32
3131
#define close closesocket
3232
#include <winsock2.h>
33+
#ifdef _MINGW32
3334
#undef max
34-
#else
35+
#endif // #ifdef _MINGW32
36+
#else // #ifdef WIN32
3537
#include <sys/wait.h>
3638
#include <sys/utsname.h>
3739
#endif
@@ -46,7 +48,7 @@
4648
void
4749
listenForIncomingConnections(rfbClient* client)
4850
{
49-
#ifdef __MINGW32__
51+
#ifdef WIN32
5052
/* FIXME */
5153
rfbClientErr("listenForIncomingConnections on MinGW32 NOT IMPLEMENTED\n");
5254
return;

libvncclient/rfbproto.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@
6464
#include "minilzo.h"
6565
#include "tls.h"
6666

67+
#ifdef _MSC_VER
68+
# define snprintf _snprintf
69+
#endif
70+
6771
/*
6872
* rfbClientLog prints a time-stamped message to the log file (stderr).
6973
*/

libvncclient/sockets.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
#ifdef WIN32
3939
#undef SOCKET
4040
#include <winsock2.h>
41+
#ifdef MINGW32
4142
#define EWOULDBLOCK WSAEWOULDBLOCK
43+
#endif
4244
#define close closesocket
4345
#define read(sock,buf,len) recv(sock,buf,len,0)
4446
#define write(sock,buf,len) send(sock,buf,len,0)
@@ -57,6 +59,10 @@
5759
#endif
5860
#include "tls.h"
5961

62+
#ifdef _MSC_VER
63+
# define snprintf _snprintf
64+
#endif
65+
6066
void PrintInHex(char *buf, int len);
6167

6268
rfbBool errorMessageOnReadFailure = TRUE;
@@ -105,7 +111,7 @@ ReadFromRFBServer(rfbClient* client, char *out, unsigned int n)
105111
diff.tv_sec--;
106112
diff.tv_usec+=1000000;
107113
}
108-
#ifndef __MINGW32__
114+
#ifndef WIN32
109115
sleep (diff.tv_sec);
110116
usleep (diff.tv_usec);
111117
#else

0 commit comments

Comments
 (0)