vlc_fixups.h 14.5 KB
Newer Older
1
/*****************************************************************************
Pere Orga's avatar
Pere Orga committed
2
 * vlc_fixups.h: portability fixups included from config.h
3
 *****************************************************************************
4
 * Copyright © 1998-2008 the VideoLAN project
5
 *
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
6
7
8
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
9
10
11
12
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
13
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
15
 *
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
16
17
18
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19
20
21
22
23
24
25
 *****************************************************************************/

/**
 * \file
 * This file is a collection of portability fixes
 */

26
27
28
#ifndef LIBVLC_FIXUPS_H
# define LIBVLC_FIXUPS_H 1

29
30
31
32
33
/* needed to detect uClibc */
#ifdef HAVE_FEATURES_H
#include <features.h>
#endif

34
35
/* C++11 says there's no need to define __STDC_*_MACROS when including
 * inttypes.h and stdint.h. */
36
#if defined (__cplusplus) && (defined(__MINGW32__) || defined(__UCLIBC__))
37
38
39
40
41
42
43
44
45
# ifndef __STDC_FORMAT_MACROS
#  define __STDC_FORMAT_MACROS 1
# endif
# ifndef __STDC_CONSTANT_MACROS
#  define __STDC_CONSTANT_MACROS 1
# endif
# ifndef __STDC_LIMIT_MACROS
#  define __STDC_LIMIT_MACROS 1
# endif
46
47
#endif

48
49
50
51
52
53
54
55
56
57
58
59
#ifndef __cplusplus
# ifdef HAVE_THREADS_H
#  include <threads.h>
# elif !defined(thread_local)
#  ifdef HAVE_THREAD_LOCAL
#   define thread_local _Thread_local
#  elif defined(_MSC_VER)
#   define thread_local __declspec(thread)
#  endif
# endif
#endif

60
61
#if !defined (HAVE_GMTIME_R) || !defined (HAVE_LOCALTIME_R) \
 || !defined (HAVE_TIMEGM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
62
63
64
# include <time.h> /* time_t */
#endif

65
66
67
68
69
70
71
72
#ifndef HAVE_GETTIMEOFDAY
#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/time.h>
#endif
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
73
74
75
76
77
78
79
80
#ifndef HAVE_LLDIV
typedef struct
{
    long long quot; /* Quotient. */
    long long rem;  /* Remainder. */
} lldiv_t;
#endif

81
82
#if !defined(HAVE_GETENV) || \
    !defined(HAVE_USELOCALE)
Rafaël Carré's avatar
Rafaël Carré committed
83
# include <stddef.h> /* NULL */
84
85
#endif

86
#if !defined (HAVE_REWIND) || \
87
    !defined (HAVE_GETDELIM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
88
89
90
# include <stdio.h> /* FILE */
#endif

91
#if !defined (HAVE_ALIGNED_ALLOC) || \
92
    !defined (HAVE_MEMRCHR) || \
93
    !defined (HAVE_POSIX_MEMALIGN) || \
94
    !defined (HAVE_QSORT_R) || \
95
    !defined (HAVE_STRLCPY) || \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
96
    !defined (HAVE_STRNDUP) || \
97
98
    !defined (HAVE_STRNLEN) || \
    !defined (HAVE_STRNSTR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
99
100
101
102
103
104
105
# include <stddef.h> /* size_t */
#endif

#ifndef HAVE_VASPRINTF
# include <stdarg.h> /* va_list */
#endif

106
#if !defined (HAVE_GETDELIM) || \
107
108
109
    !defined (HAVE_GETPID)   || \
    !defined (HAVE_SWAB)
# include <sys/types.h> /* ssize_t, pid_t */
110
111
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
112
113
#if !defined (HAVE_DIRFD) || \
    !defined (HAVE_FDOPENDIR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
114
115
116
# include <dirent.h>
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
117
#ifdef __cplusplus
118
# define VLC_NOTHROW throw ()
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
119
extern "C" {
120
121
#else
# define VLC_NOTHROW
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
122
123
#endif

124
/* stddef.h */
125
#if !defined (__cplusplus) && !defined (HAVE_MAX_ALIGN_T)
126
127
128
129
130
131
typedef struct {
  long long ll;
  long double ld;
} max_align_t;
#endif

132
133
134
135
136
/* stdio.h */
#ifndef HAVE_ASPRINTF
int asprintf (char **, const char *, ...);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
137
138
139
140
141
142
143
144
145
#ifndef HAVE_FLOCKFILE
void flockfile (FILE *);
void funlockfile (FILE *);
int getc_unlocked (FILE *);
int getchar_unlocked (void);
int putc_unlocked (int, FILE *);
int putchar_unlocked (int);
#endif

146
#ifndef HAVE_GETDELIM
147
148
149
150
151
152
ssize_t getdelim (char **, size_t *, int, FILE *);
ssize_t getline (char **, size_t *, FILE *);
#endif

#ifndef HAVE_REWIND
void rewind (FILE *);
153
154
155
#endif

#ifndef HAVE_VASPRINTF
156
int vasprintf (char **, const char *, va_list);
157
158
#endif

159
/* string.h */
160
161
162
163
#ifndef HAVE_MEMRCHR
void *memrchr(const void *, int, size_t);
#endif

164
165
166
167
168
169
170
171
172
173
174
175
#ifndef HAVE_STRCASECMP
int strcasecmp (const char *, const char *);
#endif

#ifndef HAVE_STRCASESTR
char *strcasestr (const char *, const char *);
#endif

#ifndef HAVE_STRDUP
char *strdup (const char *);
#endif

176
177
178
179
#ifndef HAVE_STRVERSCMP
int strverscmp (const char *, const char *);
#endif

180
#ifndef HAVE_STRNLEN
181
size_t strnlen (const char *, size_t);
182
183
#endif

François Cartegnie's avatar
François Cartegnie committed
184
185
186
187
#ifndef HAVE_STRNSTR
char * strnstr (const char *, const char *, size_t);
#endif

188
#ifndef HAVE_STRNDUP
189
char *strndup (const char *, size_t);
190
191
192
#endif

#ifndef HAVE_STRLCPY
193
size_t strlcpy (char *, const char *, size_t);
194
195
#endif

196
197
#ifndef HAVE_STRSEP
char *strsep (char **, const char *);
198
#endif
199
200
201

#ifndef HAVE_STRTOK_R
char *strtok_r(char *, const char *, char **);
202
#endif
203

204
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
205
#ifndef HAVE_ATOF
206
#ifndef __ANDROID__
207
double atof (const char *);
208
#endif
209
#endif
210

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
211
#ifndef HAVE_ATOLL
212
long long atoll (const char *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
213
214
#endif

215
#ifndef HAVE_LLDIV
216
lldiv_t lldiv (long long, long long);
217
218
#endif

219
220
221
#ifndef HAVE_STRTOF
#ifndef __ANDROID__
float strtof (const char *, char **);
222
223
224
#endif
#endif

225
226
#ifndef HAVE_STRTOLL
long long int strtoll (const char *, char **, int);
227
228
#endif

229
/* time.h */
230
231
232
#ifndef HAVE_GMTIME_R
struct tm *gmtime_r (const time_t *, struct tm *);
#endif
233

234
235
236
#ifndef HAVE_LOCALTIME_R
struct tm *localtime_r (const time_t *, struct tm *);
#endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
237

238
#ifndef HAVE_TIMEGM
239
time_t timegm(struct tm *);
240
241
#endif

242
243
#ifndef HAVE_TIMESPEC_GET
#define TIME_UTC 1
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
244
struct timespec;
245
246
247
int timespec_get(struct timespec *, int);
#endif

248
249
/* sys/time.h */
#ifndef HAVE_GETTIMEOFDAY
250
struct timezone;
251
252
253
int gettimeofday(struct timeval *, struct timezone *);
#endif

254
/* unistd.h */
255
#ifndef HAVE_GETPID
256
pid_t getpid (void) VLC_NOTHROW;
257
258
#endif

259
260
261
262
#ifndef HAVE_FSYNC
int fsync (int fd);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
263
264
/* dirent.h */
#ifndef HAVE_DIRFD
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
265
int (dirfd) (DIR *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
266
267
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
268
269
270
271
#ifndef HAVE_FDOPENDIR
DIR *fdopendir (int);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
272
273
274
275
#ifdef __cplusplus
} /* extern "C" */
#endif

276
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
277
278
279
280
281
282
283
284
#ifndef HAVE_GETENV
static inline char *getenv (const char *name)
{
    (void)name;
    return NULL;
}
#endif

285
286
287
288
#ifdef __cplusplus
extern "C" {
#endif

289
290
291
292
293
#ifndef HAVE_SETENV
int setenv (const char *, const char *, int);
int unsetenv (const char *);
#endif

294
295
296
297
#ifndef HAVE_POSIX_MEMALIGN
int posix_memalign(void **, size_t, size_t);
#endif

298
299
#ifndef HAVE_ALIGNED_ALLOC
void *aligned_alloc(size_t, size_t);
300
301
#endif

302
303
304
305
#ifdef __cplusplus
} /* extern "C" */
#endif

306
307
308
309
310
311
312
313
#if defined (_WIN32) && defined(__MINGW32__)
#define aligned_free(ptr)  __mingw_aligned_free(ptr)
#elif defined (_WIN32) && defined(_MSC_VER)
#define aligned_free(ptr)  _aligned_free(ptr)
#else
#define aligned_free(ptr)  free(ptr)
#endif

314
315
316
317
318
#if !defined(HAVE_NEWLOCALE) && defined(HAVE_CXX_LOCALE_T) && defined(__cplusplus)
# include <locale>
# define HAVE_NEWLOCALE
#endif

319
/* locale.h */
320
#ifndef HAVE_USELOCALE
321
322
323
324
325
# ifndef HAVE_NEWLOCALE
#  define LC_ALL_MASK      0
#  define LC_NUMERIC_MASK  0
#  define LC_MESSAGES_MASK 0
#  define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
326
typedef void *locale_t;
327

328
329
static inline void freelocale(locale_t loc)
{
330
    (void)loc;
331
}
332
static inline locale_t newlocale(int mask, const char * locale, locale_t base)
333
{
334
    (void)mask; (void)locale; (void)base;
335
336
    return NULL;
}
337
338
339
340
341
342
343
344
345
# else
#  include <locale.h>
# endif

static inline locale_t uselocale(locale_t loc)
{
    (void)loc;
    return NULL;
}
346
347
#endif

348
#if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
Thomas Guillem's avatar
Thomas Guillem committed
349
350
351
# define STATIC_ASSERT_CONCAT_(a, b) a##b
# define STATIC_ASSERT_CONCAT(a, b) STATIC_ASSERT_CONCAT_(a, b)
# define _Static_assert(x, s) extern char STATIC_ASSERT_CONCAT(static_assert_, __LINE__)[sizeof(struct { unsigned:-!(x); })]
352
353
354
# define static_assert _Static_assert
#endif

355
/* libintl support */
356
357
#define _(str)            vlc_gettext (str)
#define N_(str)           gettext_noop (str)
358
359
#define gettext_noop(str) (str)

360
361
362
363
#ifdef __cplusplus
extern "C" {
#endif

364
365
366
367
#ifndef HAVE_SWAB
void swab (const void *, void *, ssize_t);
#endif

368
369
/* Socket stuff */
#ifndef HAVE_INET_PTON
370
# ifndef _WIN32
371
#  include <sys/socket.h>
372
#else
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
373
typedef int socklen_t;
374
# endif
375
int inet_pton(int, const char *, void *);
376
const char *inet_ntop(int, const void *, char *, socklen_t);
377
378
#endif

379
#ifndef HAVE_STRUCT_POLLFD
380
381
enum
{
382
383
384
385
386
387
388
389
    POLLERR=0x1,
    POLLHUP=0x2,
    POLLNVAL=0x4,
    POLLWRNORM=0x10,
    POLLWRBAND=0x20,
    POLLRDNORM=0x100,
    POLLRDBAND=0x200,
    POLLPRI=0x400,
390
};
391
392
#define POLLIN  (POLLRDNORM|POLLRDBAND)
#define POLLOUT (POLLWRNORM|POLLWRBAND)
393
394
395
396

struct pollfd
{
    int fd;
397
398
    short events;
    short revents;
399
};
400
#endif
401
402
403
404
#ifndef HAVE_POLL
struct pollfd;
int poll (struct pollfd *, unsigned, int);
#endif
405

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
406
#ifndef HAVE_IF_NAMEINDEX
407
#include <errno.h>
408
# ifndef HAVE_STRUCT_IF_NAMEINDEX
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
409
410
411
412
413
struct if_nameindex
{
    unsigned if_index;
    char    *if_name;
};
414
# endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
415
416
417
418
# define if_nameindex()         (errno = ENOBUFS, NULL)
# define if_freenameindex(list) (void)0
#endif

419
420
421
422
423
424
425
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
    time_t  tv_sec;   /* Seconds */
    long    tv_nsec;  /* Nanoseconds */
};
#endif

426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
#ifdef _WIN32
struct iovec
{
    void  *iov_base;
    size_t iov_len;
};
#define IOV_MAX 255
struct msghdr
{
    void         *msg_name;
    size_t        msg_namelen;
    struct iovec *msg_iov;
    size_t        msg_iovlen;
    void         *msg_control;
    size_t        msg_controllen;
    int           msg_flags;
};
443
444
445
446
447
448
449
450

# ifndef HAVE_IF_NAMETOINDEX
#  include <stdlib.h> /* a define may change from the real atoi declaration */
static inline int if_nametoindex(const char *name)
{
    return atoi(name);
}
# endif
451
452
#endif

453
454
455
456
#ifdef _NEWLIB_VERSION
#define IOV_MAX 255
#endif

457
458
459
460
461
#ifndef HAVE_RECVMSG
struct msghdr;
ssize_t recvmsg(int, struct msghdr *, int);
#endif

462
463
464
465
466
#ifndef HAVE_SENDMSG
struct msghdr;
ssize_t sendmsg(int, const struct msghdr *, int);
#endif

467
/* search.h */
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
#ifndef HAVE_SEARCH_H
typedef struct entry {
    char *key;
    void *data;
} ENTRY;

typedef enum {
    FIND, ENTER
} ACTION;

typedef enum {
    preorder,
    postorder,
    endorder,
    leaf
} VISIT;

void *tsearch( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
486
void *tfind( const void *key, void * const *rootp, int(*cmp)(const void *, const void *) );
487
488
void *tdelete( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
void twalk( const void *root, void(*action)(const void *nodep, VISIT which, int depth) );
489
490
void *lfind( const void *key, const void *base, size_t *nmemb,
             size_t size, int(*cmp)(const void *, const void *) );
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
491
#endif /* HAVE_SEARCH_H */
492
493
494
495
496
497
498
499
500
501

#ifdef _WIN64
# ifdef HAVE_SEARCH_H
#  include <search.h>
# endif
/* the Win32 prototype of lfind() expects an unsigned* for 'nelp' */
# define lfind(a,b,c,d,e) \
         lfind((a),(b), &(unsigned){ (*(c) > UINT_MAX) ? UINT_MAX : *(c) }, (d),(e))
#endif /* _WIN64 */

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
502
#ifndef HAVE_TDESTROY
503
void tdestroy( void *root, void (*free_node)(void *nodep) );
504
505
#endif

506
507
508
509
510
/* sys/auxv.h */
#ifndef HAVE_GETAUXVAL
unsigned long getauxval(unsigned long);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
511
512
/* Random numbers */
#ifndef HAVE_NRAND48
513
514
double erand48 (unsigned short subi[3]);
long jrand48 (unsigned short subi[3]);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
515
516
517
long nrand48 (unsigned short subi[3]);
#endif

ivoire's avatar
ivoire committed
518
519
#ifdef __OS2__
# undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
520

521
522
523
524
# define SHUT_RD    0
# define SHUT_WR    1
# define SHUT_RDWR  2

525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
/* GAI error codes */
# ifndef EAI_BADFLAGS
#  define EAI_BADFLAGS -1
# endif
# ifndef EAI_NONAME
#  define EAI_NONAME -2
# endif
# ifndef EAI_AGAIN
#  define EAI_AGAIN -3
# endif
# ifndef EAI_FAIL
#  define EAI_FAIL -4
# endif
# ifndef EAI_NODATA
#  define EAI_NODATA -5
# endif
# ifndef EAI_FAMILY
#  define EAI_FAMILY -6
# endif
# ifndef EAI_SOCKTYPE
#  define EAI_SOCKTYPE -7
# endif
# ifndef EAI_SERVICE
#  define EAI_SERVICE -8
# endif
# ifndef EAI_ADDRFAMILY
#  define EAI_ADDRFAMILY -9
# endif
# ifndef EAI_MEMORY
#  define EAI_MEMORY -10
# endif
# ifndef EAI_OVERFLOW
#  define EAI_OVERFLOW -11
# endif
# ifndef EAI_SYSTEM
#  define EAI_SYSTEM -12
# endif

563
564
565
566
567
568
569
570
# ifndef NI_NUMERICHOST
#  define NI_NUMERICHOST 0x01
#  define NI_NUMERICSERV 0x02
#  define NI_NOFQDN      0x04
#  define NI_NAMEREQD    0x08
#  define NI_DGRAM       0x10
# endif

571
572
573
574
575
# ifndef NI_MAXHOST
#  define NI_MAXHOST 1025
#  define NI_MAXSERV 32
# endif

576
577
578
579
# define AI_PASSIVE     1
# define AI_CANONNAME   2
# define AI_NUMERICHOST 4

580
581
582
583
584
585
586
587
588
589
590
struct addrinfo
{
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
    size_t ai_addrlen;
    struct sockaddr *ai_addr;
    char *ai_canonname;
    struct addrinfo *ai_next;
};
591

592
593
594
595
const char *gai_strerror (int);

int  getaddrinfo  (const char *node, const char *service,
                   const struct addrinfo *hints, struct addrinfo **res);
596
void freeaddrinfo (struct addrinfo *res);
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
int  getnameinfo  (const struct sockaddr *sa, socklen_t salen,
                   char *host, int hostlen, char *serv, int servlen,
                   int flags);

/* OS/2 does not support IPv6, yet. But declare these only for compilation */
# include <stdint.h>

struct in6_addr
{
    uint8_t s6_addr[16];
};

struct sockaddr_in6
{
    uint8_t         sin6_len;
    uint8_t         sin6_family;
    uint16_t        sin6_port;
    uint32_t        sin6_flowinfo;
    struct in6_addr sin6_addr;
    uint32_t        sin6_scope_id;
};

# define IN6_IS_ADDR_MULTICAST(a)   (((__const uint8_t *) (a))[0] == 0xff)

static const struct in6_addr in6addr_any =
    { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
623
624
625
626
627

# include <errno.h>
# ifndef EPROTO
#  define EPROTO (ELAST + 1)
# endif
628
629
630
631

# ifndef HAVE_IF_NAMETOINDEX
#  define if_nametoindex(name)  atoi(name)
# endif
ivoire's avatar
ivoire committed
632
633
#endif

634
635
/* math.h */

Thomas Guillem's avatar
Thomas Guillem committed
636
#ifndef HAVE_NANF
637
638
639
#define nanf(tagp) NAN
#endif

640
641
642
643
644
#ifndef HAVE_SINCOS
void sincos(double, double *, double *);
void sincosf(float, float *, float *);
#endif

645
646
647
648
#ifndef HAVE_REALPATH
char *realpath(const char * restrict pathname, char * restrict resolved_path);
#endif

649
650
651
652
653
/* mingw-w64 has a broken IN6_IS_ADDR_MULTICAST macro */
#if defined(_WIN32) && defined(__MINGW64_VERSION_MAJOR)
# define IN6_IS_ADDR_MULTICAST IN6_IS_ADDR_MULTICAST
#endif

654
655
#ifdef __APPLE__
# define fdatasync fsync
656
657

# include <time.h>
658
659
660
# ifndef TIMER_ABSTIME
#  define TIMER_ABSTIME 0x01
# endif
661
662
663
664
665
666
667
668
669
# ifndef CLOCK_REALTIME
#  define CLOCK_REALTIME 0
# endif
# ifndef CLOCK_MONOTONIC
#  define CLOCK_MONOTONIC 6
# endif
# ifndef HAVE_CLOCK_GETTIME
int clock_gettime(clockid_t clock_id, struct timespec *tp);
# endif
670
671
672
# ifndef HAVE_CLOCK_GETRES
int clock_getres(clockid_t clock_id, struct timespec *tp);
# endif
673
674
675
#endif

#ifndef _WIN32
676
# ifndef HAVE_CLOCK_NANOSLEEP
677
# include <time.h>
678
679
680
int clock_nanosleep(clockid_t clock_id, int flags,
        const struct timespec *rqtp, struct timespec *rmtp);
# endif
681
682
#endif

683
684
685
686
#ifdef __cplusplus
} /* extern "C" */
#endif

687
688
689
690
691
692
693
#if defined(__cplusplus)
#ifndef HAVE_CXX_TYPEOF
# include <type_traits>
# define typeof(t) std::remove_reference<decltype(t)>::type
#endif
#endif

694
#endif /* !LIBVLC_FIXUPS_H */