finished merge of cairocanvas with windows and windows+cc branches
[ardour.git] / msvc_extra_headers / ardourext / misc.h.input
1 /*
2     Copyright (C) 2009 John Emmas
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_msvc_extensions_h__
21 #define __ardour_msvc_extensions_h__
22
23 #ifndef _WIN32_WINNT
24 #define _WIN32_WINNT 0x0500
25 #endif
26 #ifndef _CPP_VECTOR
27 #define _CPP_VECTOR  1
28 #endif
29
30 #ifdef __cplusplus
31 #include <vector>
32 #endif
33
34 #include <math.h>
35 #include <float.h>
36 #include <direct.h>
37 #include <boost/regex.h>
38 #include <glib.h>
39 #include <ardourext/float_cast.h>
40
41 // 'std::isnan()' is not available in MSVC. Assume '_isnan(double)'
42 #define isnan(val)  _isnan((double)val)
43
44 // 'std::isinf()' is not available in MSVC. Assume '!_finite(double)'
45 #define isinf(val) !_finite((double)val)
46
47 // 'INFINITY' is not defined in MSVC. Assume 'HUGE_VAL'
48 #ifndef INFINITY
49 #define INFINITY    HUGE_VAL
50 #endif
51
52 // File access modes copied from unistd.h
53 #define F_OK 0
54 #define R_OK 4
55 #define W_OK 2
56 #define X_OK 1
57
58 // Miscellaneous #defines
59 #define __attribute__(x)
60 #define llabs      _abs64
61 #define atoll      _atoi64
62 #define access     _access
63 #define getcwd     _getcwd
64 #define getpid     _getpid
65 #define snprintf   _snprintf
66 #define random      rand
67 #define link        ntfs_link
68 #define unlink      ntfs_unlink
69 #define strcasecmp  stricmp
70 #define strncasecmp strnicmp
71 #define strtok_r( _s, _sep, _lasts ) \
72         ( *(_lasts) = strtok( (_s), (_sep) ) )
73
74 #ifndef PATH_MAX
75 #define PATH_MAX _MAX_PATH
76 #endif
77 #define DECLARE_DEFAULT_COMPARISONS(Type) \
78         extern bool operator >  (const Type& lhs, const Type& rhs); \
79         extern bool operator <  (const Type& lhs, const Type& rhs); \
80         extern bool operator != (const Type& lhs, const Type& rhs); \
81         extern bool operator == (const Type& lhs, const Type& rhs);
82
83 // Types missing from Win32 'stat.h' (hopefully Windows
84 // will either act sensibly or ignore most of them).
85 #define _S_IFBLK                0x3000
86 #define S_IRWXU                 _S_IRWXU
87 #define S_IXUSR                 _S_IXUSR
88 #define S_IWUSR                 _S_IWUSR
89 #define S_IRUSR                 _S_IRUSR
90 #define S_IXGRP                 _S_IXGRP
91 #define S_IWGRP                 _S_IWGRP
92 #define S_IRGRP                 _S_IRGRP
93 #define S_IXOTH                 _S_IXOTH
94 #define S_IWOTH                 _S_IWOTH
95 #define S_IROTH                 _S_IROTH
96
97 #define _S_IRWXU                (_S_IREAD | _S_IWRITE | _S_IEXEC)
98 #define _S_IXUSR                _S_IEXEC
99 #define _S_IWUSR                _S_IWRITE
100 #define _S_IRUSR                _S_IREAD
101 #define _S_IXGRP                _S_IEXEC
102 #define _S_IWGRP                _S_IWRITE
103 #define _S_IRGRP                _S_IREAD
104 #define _S_IXOTH                _S_IEXEC
105 #define _S_IWOTH                _S_IWRITE
106 #define _S_IROTH                _S_IREAD
107
108 #define S_ISFIFO(m)             _S_ISFIFO(m)
109 #define S_ISDIR(m)              _S_ISDIR(m)
110 #define S_ISCHR(m)              _S_ISCHR(m)
111 #define S_ISBLK(m)              _S_ISBLK(m)
112 #define S_ISREG(m)              _S_ISREG(m)
113
114 #define _S_ISFIFO(m)    (((m) & _S_IFMT) == _S_IFIFO)
115 #define _S_ISDIR(m)             (((m) & _S_IFMT) == _S_IFDIR)
116 #define _S_ISCHR(m)             (((m) & _S_IFMT) == _S_IFCHR)
117 #define _S_ISBLK(m)             (((m) & _S_IFMT) == _S_IFBLK)
118 #define _S_ISREG(m)             (((m) & _S_IFMT) == _S_IFREG)
119
120
121 #if defined(__USE_BSD) || defined(_BSD_SOURCE)
122 /* Convenience macros for operations on timevals.
123    NOTE: `timercmp' does not work for >= or <=.
124    Note also that 'timerset', 'timerclear' and
125    'timercmp' are (perhaps strangely) already
126    defined, along with various other 'time'
127    functions in WinSock.h  */
128 # define timeradd(a, b, result)                                               \
129   do {                                                                        \
130     (result)->tv_sec = (a)->tv_sec + (b)->tv_sec;                             \
131     (result)->tv_usec = (a)->tv_usec + (b)->tv_usec;                          \
132     if ((result)->tv_usec >= 1000000)                                         \
133       {                                                                       \
134     ++(result)->tv_sec;                                               \
135     (result)->tv_usec -= 1000000;                                             \
136       }                                                                       \
137   } while (0)
138 # define timersub(a, b, result)                                               \
139   do {                                                                        \
140     (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;                             \
141     (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;                          \
142     if ((result)->tv_usec < 0) {                                              \
143       --(result)->tv_sec;                                                     \
144       (result)->tv_usec += 1000000;                                           \
145     }                                                                         \
146   } while (0)
147 #endif  /* BSD */
148
149 #if !defined(__BIT_TYPES_DEFINED) || !defined(__BIT_TYPES_DEFINED__)
150 #define __BIT_TYPES_DEFINED__ 1
151 // Doesn't yet define all 'bit types'. Only those
152 // needed by Ardour. More can be added as needed.
153 #ifndef __int8_t_defined
154 #define __int8_t_defined
155 typedef unsigned char      u_int8_t;
156 typedef unsigned short int u_int16_t;
157 typedef unsigned int       u_int32_t;
158 typedef unsigned __int64   u_int64_t;
159
160 typedef signed char        int8_t;
161 typedef unsigned char      uint8_t;
162 typedef short              int16_t;
163 typedef unsigned short     uint16_t;
164 typedef int                int32_t;
165 typedef unsigned           uint32_t;
166 typedef long long          int64_t;
167 typedef unsigned long long uint64_t;
168 #endif  // __int8_t
169
170 #ifndef __register_t_defined
171 #define __register_t_defined
172 typedef int register_t;
173 #endif  // __register_t
174 #endif  // __BIT_TYPESD
175
176 // throw()
177 #ifndef __THROW
178 #ifdef __cplusplus
179 #define __THROW  throw()
180 #else
181 #define __THROW
182 #endif
183 #endif
184
185 // round().... Unlike Linux, Windows doesn't seem to support the
186 // concept of a system-wide (or programmable) rounding direction.
187 // Fortunately, 'round to nearest' seems to be the default action
188 // under Linux, so let's copy that until we find out otherwise.
189 #define rint(value)  round(value)
190 #if !defined(PBD_API) || defined(PBD_IS_IN_WIN_STATIC_LIB)
191 extern  double round(double x);
192 #endif
193
194 // System V compatibility
195 typedef unsigned short ushort;
196 typedef unsigned int   uint;
197
198 // mode_t
199 #ifndef _MODE_T_
200 #define _MODE_T_
201 typedef unsigned short _mode_t;
202
203 #ifndef NO_OLDNAMES
204 typedef _mode_t mode_t;
205 #endif /* NO_OLDNAMES */
206 #endif /* _MODE_T_ */
207
208 // int64 abs()
209 #ifdef __cplusplus // Normal 'C' doesn't permit over-ridden functions !!
210 inline uint64_t abs(int64_t val)
211 {
212         if (val < 0)
213                 return val * (-1);
214         else
215                 return val;
216 }
217 #endif
218
219 // fmin() and fmax()
220 #define fmin(a, b) min((double)a, (double)b)
221 #define fmax(a, b) max((double)a, (double)b)
222
223 // approximate POSIX pipe()
224 #define pipe(handles) _pipe(handles, 4096, _O_BINARY)
225
226 // Windows mkdir() doesn't care about access privileges
227 #define mkdir(path, mode) _mkdir(path)
228
229 // Redefine 'ftruncate()' to use the glib-win32 version
230 #define ftruncate(fd, len) g_win32_ftruncate((gint)fd, (guint)len)
231
232
233 // #include the main headers for Ardour MSVC
234 #ifdef __cplusplus
235 #if defined(BUILDING_PBD) || defined(PBD_IS_IN_WIN_STATIC_LIB)
236 #include <pbd/msvc_pbd.h>
237 #endif
238 #if defined(BUILDING_LIBARDOUR) || defined(LIBARDOUR_IS_IN_WIN_STATIC_LIB)
239 #include <ardour/msvc_libardour.h>
240 #endif
241 #if defined(BUILDING_RUBBERBAND) || defined(RUBBERBAND_IS_IN_WIN_STATIC_LIB)
242 #include <rubberband/msvc_rubberband.h>
243 #endif
244 #endif // __cplusplus
245
246 #endif /* __ardour_msvc_extensions_h__ */