compat: add timespec_get() replacement
[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 #ifndef HAVE_TIMESPEC_GET
202 #define TIME_UTC 1
203 int timespec_get(struct timespec *, int);
204 #endif
205
206 /* unistd.h */
207 #ifndef HAVE_GETPID
208 pid_t getpid (void) VLC_NOTHROW;
209 #endif
210
211 #ifndef HAVE_FSYNC
212 int fsync (int fd);
213 #endif
214
215 /* dirent.h */
216 #ifndef HAVE_DIRFD
217 int (dirfd) (DIR *);
218 #endif
219
220 #ifndef HAVE_FDOPENDIR
221 DIR *fdopendir (int);
222 #endif
223
224 #ifdef __cplusplus
225 } /* extern "C" */
226 #endif
227
228 /* stdlib.h */
229 #ifndef HAVE_GETENV
230 static inline char *getenv (const char *name)
231 {
232     (void)name;
233     return NULL;
234 }
235 #endif
236
237 #ifndef HAVE_SETENV
238 int setenv (const char *, const char *, int);
239 int unsetenv (const char *);
240 #endif
241
242 #ifndef HAVE_POSIX_MEMALIGN
243 int posix_memalign (void **, size_t, size_t);
244 #endif
245
246 /* locale.h */
247 #ifndef HAVE_USELOCALE
248 #define LC_ALL_MASK      0
249 #define LC_NUMERIC_MASK  0
250 #define LC_MESSAGES_MASK 0
251 #define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
252 typedef void *locale_t;
253 static inline locale_t uselocale(locale_t loc)
254 {
255     (void)loc;
256     return NULL;
257 }
258 static inline void freelocale(locale_t loc)
259 {
260     (void)loc;
261 }
262 static inline locale_t newlocale(int mask, const char * locale, locale_t base)
263 {
264     (void)mask; (void)locale; (void)base;
265     return NULL;
266 }
267 #endif
268
269 #if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
270 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
271 # define static_assert _Static_assert
272 #endif
273
274 /* Alignment of critical static data structures */
275 #ifdef ATTRIBUTE_ALIGNED_MAX
276 #   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
277 #else
278 #   define ATTR_ALIGN(align)
279 #endif
280
281 /* libintl support */
282 #define _(str)            vlc_gettext (str)
283 #define N_(str)           gettext_noop (str)
284 #define gettext_noop(str) (str)
285
286 #ifdef __cplusplus
287 extern "C" {
288 #endif
289
290 #ifndef HAVE_SWAB
291 void swab (const void *, void *, ssize_t);
292 #endif
293
294 /* Socket stuff */
295 #ifndef HAVE_INET_PTON
296 int inet_pton(int, const char *, void *);
297 const char *inet_ntop(int, const void *, char *, int);
298 #endif
299
300 #ifndef HAVE_STRUCT_POLLFD
301 enum
302 {
303     POLLERR=0x1,
304     POLLHUP=0x2,
305     POLLNVAL=0x4,
306     POLLWRNORM=0x10,
307     POLLWRBAND=0x20,
308     POLLRDNORM=0x100,
309     POLLRDBAND=0x200,
310     POLLPRI=0x400,
311 };
312 #define POLLIN  (POLLRDNORM|POLLRDBAND)
313 #define POLLOUT (POLLWRNORM|POLLWRBAND)
314
315 struct pollfd
316 {
317     int fd;
318     unsigned events;
319     unsigned revents;
320 };
321 #endif
322 #ifndef HAVE_POLL
323 struct pollfd;
324 int poll (struct pollfd *, unsigned, int);
325 #endif
326
327 #ifndef HAVE_IF_NAMEINDEX
328 #include <errno.h>
329 struct if_nameindex
330 {
331     unsigned if_index;
332     char    *if_name;
333 };
334 # ifndef HAVE_IF_NAMETOINDEX
335 #  define if_nametoindex(name)   atoi(name)
336 # endif
337 # define if_nameindex()         (errno = ENOBUFS, NULL)
338 # define if_freenameindex(list) (void)0
339 #endif
340
341 /* search.h */
342 #ifndef HAVE_SEARCH_H
343 typedef struct entry {
344     char *key;
345     void *data;
346 } ENTRY;
347
348 typedef enum {
349     FIND, ENTER
350 } ACTION;
351
352 typedef enum {
353     preorder,
354     postorder,
355     endorder,
356     leaf
357 } VISIT;
358
359 void *tsearch( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
360 void *tfind( const void *key, const void **rootp, int(*cmp)(const void *, const void *) );
361 void *tdelete( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
362 void twalk( const void *root, void(*action)(const void *nodep, VISIT which, int depth) );
363 void tdestroy( void *root, void (*free_node)(void *nodep) );
364 #else // HAVE_SEARCH_H
365 # ifndef HAVE_TDESTROY
366 #  define tdestroy vlc_tdestroy
367 # endif
368 #endif
369
370 /* Random numbers */
371 #ifndef HAVE_NRAND48
372 double erand48 (unsigned short subi[3]);
373 long jrand48 (unsigned short subi[3]);
374 long nrand48 (unsigned short subi[3]);
375 #endif
376
377 #ifdef __OS2__
378 # undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
379
380 struct addrinfo
381 {
382     int ai_flags;
383     int ai_family;
384     int ai_socktype;
385     int ai_protocol;
386     size_t ai_addrlen;
387     struct sockaddr *ai_addr;
388     char *ai_canonname;
389     struct addrinfo *ai_next;
390 };
391
392 void freeaddrinfo (struct addrinfo *res);
393 #endif
394
395 /* math.h */
396
397 #ifndef HAVE_NANF
398 #define nanf(tagp) NAN
399 #endif
400
401 #ifdef _WIN32
402 FILE *vlc_win32_tmpfile(void);
403 #endif
404
405 #ifdef __cplusplus
406 } /* extern "C" */
407 #endif
408
409 #endif /* !LIBVLC_FIXUPS_H */