501c0ba9e357df06d829bf610cfa1832531f97b0
[vlc.git] / include / vlc_fixups.h
1 /*****************************************************************************
2  * vlc_fixups.h: portability fixups included from config.h
3  *****************************************************************************
4  * Copyright © 1998-2008 the VideoLAN project
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 /**
22  * \file
23  * This file is a collection of portability fixes
24  */
25
26 #ifndef LIBVLC_FIXUPS_H
27 # define LIBVLC_FIXUPS_H 1
28
29 /* C++11 says there's no need to define __STDC_*_MACROS when including
30  * inttypes.h and stdint.h. */
31 #if defined (__cplusplus) && (!defined(HAVE_CXX11) || defined(__MINGW32__))
32 # ifndef __STDC_FORMAT_MACROS
33 #  define __STDC_FORMAT_MACROS 1
34 # endif
35 # ifndef __STDC_CONSTANT_MACROS
36 #  define __STDC_CONSTANT_MACROS 1
37 # endif
38 # ifndef __STDC_LIMIT_MACROS
39 #  define __STDC_LIMIT_MACROS 1
40 # endif
41 #endif
42
43 #if !defined (HAVE_GMTIME_R) || !defined (HAVE_LOCALTIME_R)
44 # include <time.h> /* time_t */
45 #endif
46
47 #ifndef HAVE_LLDIV
48 typedef struct
49 {
50     long long quot; /* Quotient. */
51     long long rem;  /* Remainder. */
52 } lldiv_t;
53 #endif
54
55 #if !defined(HAVE_GETENV) || \
56     !defined(HAVE_USELOCALE)
57 # include <stddef.h> /* NULL */
58 #endif
59
60 #if !defined (HAVE_REWIND) || \
61     !defined (HAVE_GETDELIM)
62 # include <stdio.h> /* FILE */
63 #endif
64
65 #if !defined (HAVE_POSIX_MEMALIGN) || \
66     !defined (HAVE_STRLCPY) || \
67     !defined (HAVE_STRNDUP) || \
68     !defined (HAVE_STRNLEN)
69 # include <stddef.h> /* size_t */
70 #endif
71
72 #ifndef HAVE_VASPRINTF
73 # include <stdarg.h> /* va_list */
74 #endif
75
76 #if !defined (HAVE_GETDELIM) || \
77     !defined (HAVE_GETPID)   || \
78     !defined (HAVE_SWAB)
79 # include <sys/types.h> /* ssize_t, pid_t */
80 #endif
81
82 #if !defined (HAVE_DIRFD) || \
83     !defined (HAVE_FDOPENDIR)
84 # include <dirent.h>
85 #endif
86
87 #ifdef __cplusplus
88 # define VLC_NOTHROW throw ()
89 extern "C" {
90 #else
91 # define VLC_NOTHROW
92 #endif
93
94 /* stdio.h */
95 #ifndef HAVE_ASPRINTF
96 int asprintf (char **, const char *, ...);
97 #endif
98
99 #ifndef HAVE_FLOCKFILE
100 void flockfile (FILE *);
101 int ftrylockfile (FILE *);
102 void funlockfile (FILE *);
103 int getc_unlocked (FILE *);
104 int getchar_unlocked (void);
105 int putc_unlocked (int, FILE *);
106 int putchar_unlocked (int);
107 #endif
108
109 #ifndef HAVE_GETDELIM
110 ssize_t getdelim (char **, size_t *, int, FILE *);
111 ssize_t getline (char **, size_t *, FILE *);
112 #endif
113
114 #ifndef HAVE_REWIND
115 void rewind (FILE *);
116 #endif
117
118 #ifndef HAVE_VASPRINTF
119 int vasprintf (char **, const char *, va_list);
120 #endif
121
122 /* string.h */
123 #ifndef HAVE_FFSLL
124 int ffsll(unsigned long long);
125 #endif
126
127 #ifndef HAVE_STRCASECMP
128 int strcasecmp (const char *, const char *);
129 #endif
130
131 #ifndef HAVE_STRCASESTR
132 char *strcasestr (const char *, const char *);
133 #endif
134
135 #ifndef HAVE_STRDUP
136 char *strdup (const char *);
137 #endif
138
139 #ifndef HAVE_STRVERSCMP
140 int strverscmp (const char *, const char *);
141 #endif
142
143 #ifndef HAVE_STRNLEN
144 size_t strnlen (const char *, size_t);
145 #endif
146
147 #ifndef HAVE_STRNSTR
148 char * strnstr (const char *, const char *, size_t);
149 #endif
150
151 #ifndef HAVE_STRNDUP
152 char *strndup (const char *, size_t);
153 #endif
154
155 #ifndef HAVE_STRLCPY
156 size_t strlcpy (char *, const char *, size_t);
157 #endif
158
159 #ifndef HAVE_STRSEP
160 char *strsep (char **, const char *);
161 #endif
162
163 #ifndef HAVE_STRTOK_R
164 char *strtok_r(char *, const char *, char **);
165 #endif
166
167 /* stdlib.h */
168 #ifndef HAVE_ATOF
169 #ifndef __ANDROID__
170 double atof (const char *);
171 #endif
172 #endif
173
174 #ifndef HAVE_ATOLL
175 long long atoll (const char *);
176 #endif
177
178 #ifndef HAVE_LLDIV
179 lldiv_t lldiv (long long, long long);
180 #endif
181
182 #ifndef HAVE_STRTOF
183 #ifndef __ANDROID__
184 float strtof (const char *, char **);
185 #endif
186 #endif
187
188 #ifndef HAVE_STRTOLL
189 long long int strtoll (const char *, char **, int);
190 #endif
191
192 /* time.h */
193 #ifndef HAVE_GMTIME_R
194 struct tm *gmtime_r (const time_t *, struct tm *);
195 #endif
196
197 #ifndef HAVE_LOCALTIME_R
198 struct tm *localtime_r (const time_t *, struct tm *);
199 #endif
200
201 /* unistd.h */
202 #ifndef HAVE_GETPID
203 pid_t getpid (void) VLC_NOTHROW;
204 #endif
205
206 #ifndef HAVE_FSYNC
207 int fsync (int fd);
208 #endif
209
210 /* dirent.h */
211 #ifndef HAVE_DIRFD
212 int (dirfd) (DIR *);
213 #endif
214
215 #ifndef HAVE_FDOPENDIR
216 DIR *fdopendir (int);
217 #endif
218
219 #ifdef __cplusplus
220 } /* extern "C" */
221 #endif
222
223 /* stdlib.h */
224 #ifndef HAVE_GETENV
225 static inline char *getenv (const char *name)
226 {
227     (void)name;
228     return NULL;
229 }
230 #endif
231
232 #ifndef HAVE_SETENV
233 int setenv (const char *, const char *, int);
234 int unsetenv (const char *);
235 #endif
236
237 #ifndef HAVE_POSIX_MEMALIGN
238 int posix_memalign (void **, size_t, size_t);
239 #endif
240
241 /* locale.h */
242 #ifndef HAVE_USELOCALE
243 #define LC_ALL_MASK      0
244 #define LC_NUMERIC_MASK  0
245 #define LC_MESSAGES_MASK 0
246 #define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
247 typedef void *locale_t;
248 static inline locale_t uselocale(locale_t loc)
249 {
250     (void)loc;
251     return NULL;
252 }
253 static inline void freelocale(locale_t loc)
254 {
255     (void)loc;
256 }
257 static inline locale_t newlocale(int mask, const char * locale, locale_t base)
258 {
259     (void)mask; (void)locale; (void)base;
260     return NULL;
261 }
262 #endif
263
264 #if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
265 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
266 # define static_assert _Static_assert
267 #endif
268
269 /* Alignment of critical static data structures */
270 #ifdef ATTRIBUTE_ALIGNED_MAX
271 #   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
272 #else
273 #   define ATTR_ALIGN(align)
274 #endif
275
276 /* libintl support */
277 #define _(str)            vlc_gettext (str)
278 #define N_(str)           gettext_noop (str)
279 #define gettext_noop(str) (str)
280
281 #ifdef __cplusplus
282 extern "C" {
283 #endif
284
285 #ifndef HAVE_SWAB
286 void swab (const void *, void *, ssize_t);
287 #endif
288
289 /* Socket stuff */
290 #ifndef HAVE_INET_PTON
291 int inet_pton(int, const char *, void *);
292 const char *inet_ntop(int, const void *, char *, int);
293 #endif
294
295 #ifndef HAVE_STRUCT_POLLFD
296 enum
297 {
298     POLLERR=0x1,
299     POLLHUP=0x2,
300     POLLNVAL=0x4,
301     POLLWRNORM=0x10,
302     POLLWRBAND=0x20,
303     POLLRDNORM=0x100,
304     POLLRDBAND=0x200,
305     POLLPRI=0x400,
306 };
307 #define POLLIN  (POLLRDNORM|POLLRDBAND)
308 #define POLLOUT (POLLWRNORM|POLLWRBAND)
309
310 struct pollfd
311 {
312     int fd;
313     unsigned events;
314     unsigned revents;
315 };
316 #endif
317 #ifndef HAVE_POLL
318 struct pollfd;
319 int poll (struct pollfd *, unsigned, int);
320 #endif
321
322 #ifndef HAVE_IF_NAMEINDEX
323 #include <errno.h>
324 struct if_nameindex
325 {
326     unsigned if_index;
327     char    *if_name;
328 };
329 # ifndef HAVE_IF_NAMETOINDEX
330 #  define if_nametoindex(name)   atoi(name)
331 # endif
332 # define if_nameindex()         (errno = ENOBUFS, NULL)
333 # define if_freenameindex(list) (void)0
334 #endif
335
336 /* search.h */
337 #ifndef HAVE_SEARCH_H
338 typedef struct entry {
339     char *key;
340     void *data;
341 } ENTRY;
342
343 typedef enum {
344     FIND, ENTER
345 } ACTION;
346
347 typedef enum {
348     preorder,
349     postorder,
350     endorder,
351     leaf
352 } VISIT;
353
354 void *tsearch( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
355 void *tfind( const void *key, const void **rootp, int(*cmp)(const void *, const void *) );
356 void *tdelete( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
357 void twalk( const void *root, void(*action)(const void *nodep, VISIT which, int depth) );
358 void tdestroy( void *root, void (*free_node)(void *nodep) );
359 #else // HAVE_SEARCH_H
360 # ifndef HAVE_TDESTROY
361 #  define tdestroy vlc_tdestroy
362 # endif
363 #endif
364
365 /* Random numbers */
366 #ifndef HAVE_NRAND48
367 double erand48 (unsigned short subi[3]);
368 long jrand48 (unsigned short subi[3]);
369 long nrand48 (unsigned short subi[3]);
370 #endif
371
372 #ifdef __OS2__
373 # undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
374
375 struct addrinfo
376 {
377     int ai_flags;
378     int ai_family;
379     int ai_socktype;
380     int ai_protocol;
381     size_t ai_addrlen;
382     struct sockaddr *ai_addr;
383     char *ai_canonname;
384     struct addrinfo *ai_next;
385 };
386
387 void freeaddrinfo (struct addrinfo *res);
388 #endif
389
390 /* math.h */
391
392 #ifndef HAVE_NANF
393 #define nanf(tagp) NAN
394 #endif
395
396 #ifdef _WIN32
397 FILE *vlc_win32_tmpfile(void);
398 #endif
399
400 #ifdef __cplusplus
401 } /* extern "C" */
402 #endif
403
404 #endif /* !LIBVLC_FIXUPS_H */