]> git.sesse.net Git - vlc/blob - include/vlc_common.h
* ALL: improved hotkeys support.
[vlc] / include / vlc_common.h
1 /*****************************************************************************
2  * common.h: common definitions
3  * Collection of useful common types and macros definitions
4  *****************************************************************************
5  * Copyright (C) 1998, 1999, 2000 VideoLAN
6  * $Id: vlc_common.h,v 1.84 2003/10/29 01:33:27 gbazin Exp $
7  *
8  * Authors: Samuel Hocevar <sam@via.ecp.fr>
9  *          Vincent Seguin <seguin@via.ecp.fr>
10  *          Gildas Bazin <gbazin@netcourrier.com>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
25  *****************************************************************************/
26
27 /**
28  * \file
29  * This file is a collection of common definitions and types
30  */
31
32 /*****************************************************************************
33  * Required vlc headers
34  *****************************************************************************/
35 #if defined( __BORLANDC__ )
36 #   undef PACKAGE
37 #endif
38
39 #include "config.h"
40
41 #if defined( __BORLANDC__ )
42 #   undef HAVE_VARIADIC_MACROS
43 #   undef HAVE_STDINT_H
44 #   undef HAVE_INTTYPES_H
45 #   undef off_t
46 #endif
47
48 #include "vlc_config.h"
49 #include "modules_inner.h"
50
51 /*****************************************************************************
52  * Required system headers
53  *****************************************************************************/
54 #include <stdarg.h>
55
56 #ifdef HAVE_STRING_H
57 #   include <string.h>                                         /* strerror() */
58 #endif
59
60 #ifdef HAVE_SYS_TYPES_H
61 #   include <sys/types.h>
62 #endif
63
64 /*****************************************************************************
65  * Basic types definitions
66  *****************************************************************************/
67 #if defined( HAVE_STDINT_H )
68 #   include <stdint.h>
69 #elif defined( HAVE_INTTYPES_H )
70 #   include <inttypes.h>
71 #elif defined( SYS_CYGWIN )
72 #   include <sys/types.h>
73     /* Cygwin only defines half of these... */
74     typedef u_int8_t            uint8_t;
75     typedef u_int16_t           uint16_t;
76     typedef u_int32_t           uint32_t;
77     typedef u_int64_t           uint64_t;
78 #else
79     /* Fallback types (very x86-centric, sorry) */
80     typedef unsigned char       uint8_t;
81     typedef signed char         int8_t;
82     typedef unsigned short      uint16_t;
83     typedef signed short        int16_t;
84     typedef unsigned int        uint32_t;
85     typedef signed int          int32_t;
86 #   if defined( _MSC_VER ) \
87       || defined( UNDER_CE ) \
88       || ( defined( WIN32 ) && !defined( __MINGW32__ ) )
89     typedef unsigned __int64    uint64_t;
90     typedef signed __int64      int64_t;
91 #   else
92     typedef unsigned long long  uint64_t;
93     typedef signed long long    int64_t;
94 #   endif
95 #endif
96
97 typedef uint8_t                 byte_t;
98
99 /* ptrdiff_t definition */
100 #ifdef HAVE_STDDEF_H
101 #   include <stddef.h>
102 #else
103 #   include <malloc.h>
104 #   ifndef _PTRDIFF_T
105 #       define _PTRDIFF_T
106 /* Not portable in a 64-bit environment. */
107 typedef int                 ptrdiff_t;
108 #   endif
109 #endif
110
111 #if defined( WIN32 )
112 #   include <malloc.h>
113 #define PATH_MAX MAX_PATH
114 #endif
115
116 #if (defined( WIN32 ) || defined( UNDER_CE )) && !defined( _SSIZE_T_ )
117 typedef int                 ssize_t;
118 #endif
119
120 /* Counter for statistics and profiling */
121 typedef unsigned long       count_t;
122
123 /* DCT elements types */
124 typedef int16_t             dctelem_t;
125
126 /* Video buffer types */
127 typedef uint8_t             yuv_data_t;
128
129 /* Audio volume */
130 typedef uint16_t            audio_volume_t;
131
132 #ifndef HAVE_SOCKLEN_T
133 typedef int                 socklen_t;
134 #endif
135
136 /*****************************************************************************
137  * mtime_t: high precision date or time interval
138  *****************************************************************************
139  * Store a high precision date or time interval. The maximum precision is the
140  * microsecond, and a 64 bits integer is used to avoid overflows (maximum
141  * time interval is then 292271 years, which should be long enough for any
142  * video). Dates are stored as microseconds since a common date (usually the
143  * epoch). Note that date and time intervals can be manipulated using regular
144  * arithmetic operators, and that no special functions are required.
145  *****************************************************************************/
146 typedef int64_t mtime_t;
147
148 /*****************************************************************************
149  * The vlc_fourcc_t type.
150  *****************************************************************************
151  * See http://www.webartz.com/fourcc/ for a very detailed list.
152  *****************************************************************************/
153 typedef uint32_t vlc_fourcc_t;
154
155 #ifdef WORDS_BIGENDIAN
156 #   define VLC_FOURCC( a, b, c, d ) \
157         ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
158            | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
159 #   define VLC_TWOCC( a, b ) \
160         ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
161
162 #else
163 #   define VLC_FOURCC( a, b, c, d ) \
164         ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
165            | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
166 #   define VLC_TWOCC( a, b ) \
167         ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
168
169 #endif
170
171 /*****************************************************************************
172  * Classes declaration
173  *****************************************************************************/
174
175 /* Internal types */
176 typedef struct libvlc_t libvlc_t;
177 typedef struct vlc_t vlc_t;
178 typedef struct variable_t variable_t;
179
180 /* Messages */
181 typedef struct msg_bank_t msg_bank_t;
182 typedef struct msg_subscription_t msg_subscription_t;
183
184 /* Playlist */
185 typedef struct playlist_t playlist_t;
186 typedef struct playlist_item_t playlist_item_t;
187
188 /* Modules */
189 typedef struct module_bank_t module_bank_t;
190 typedef struct module_t module_t;
191 typedef struct module_config_t module_config_t;
192 typedef struct module_symbols_t module_symbols_t;
193
194 /* Interface */
195 typedef struct intf_thread_t intf_thread_t;
196 typedef struct intf_sys_t intf_sys_t;
197 typedef struct intf_console_t intf_console_t;
198 typedef struct intf_msg_t intf_msg_t;
199 typedef struct intf_channel_t intf_channel_t;
200
201 /* Input */
202 typedef struct input_thread_t input_thread_t;
203 typedef struct input_thread_sys_t input_thread_sys_t;
204 typedef struct input_area_t input_area_t;
205 typedef struct input_buffers_t input_buffers_t;
206 typedef struct input_socket_t input_socket_t;
207 typedef struct input_info_t input_info_t;
208 typedef struct input_info_category_t input_info_category_t;
209 typedef struct access_sys_t access_sys_t;
210 typedef struct demux_sys_t demux_sys_t;
211 typedef struct es_descriptor_t es_descriptor_t;
212 typedef struct es_sys_t es_sys_t;
213 typedef struct pgrm_descriptor_t pgrm_descriptor_t;
214 typedef struct pgrm_sys_t pgrm_sys_t;
215 typedef struct stream_descriptor_t stream_descriptor_t;
216 typedef struct stream_sys_t stream_sys_t;
217
218 /* NInput */
219 typedef struct stream_t stream_t;
220 typedef struct es_out_t     es_out_t;
221 typedef struct es_out_id_t  es_out_id_t;
222 typedef struct es_out_sys_t es_out_sys_t;
223
224
225 /* Audio */
226 typedef struct aout_instance_t aout_instance_t;
227 typedef struct aout_sys_t aout_sys_t;
228 typedef struct aout_fifo_t aout_fifo_t;
229 typedef struct aout_input_t aout_input_t;
230 typedef struct aout_buffer_t aout_buffer_t;
231 typedef struct audio_sample_format_t audio_sample_format_t;
232 typedef struct audio_date_t audio_date_t;
233
234 /* Video */
235 typedef struct vout_thread_t vout_thread_t;
236 typedef struct vout_sys_t vout_sys_t;
237 typedef struct chroma_sys_t chroma_sys_t;
238 typedef struct video_frame_format_t video_frame_format_t;
239 typedef struct picture_t picture_t;
240 typedef struct picture_sys_t picture_sys_t;
241 typedef struct picture_heap_t picture_heap_t;
242 typedef struct subpicture_t subpicture_t;
243 typedef struct subpicture_sys_t subpicture_sys_t;
244 typedef struct vout_synchro_t vout_synchro_t;
245 typedef struct text_renderer_sys_t text_renderer_sys_t;
246 typedef struct text_style_t text_style_t;
247
248 /* Stream output */
249 typedef struct sout_instance_t sout_instance_t;
250 typedef struct sout_fifo_t sout_fifo_t;
251 typedef struct sout_input_t sout_input_t;
252 typedef struct sout_packetizer_input_t sout_packetizer_input_t;
253 typedef struct sout_buffer_t sout_buffer_t;
254 typedef struct sout_access_out_t sout_access_out_t;
255 typedef struct sout_mux_t sout_mux_t;
256 typedef struct sout_stream_t    sout_stream_t;
257 typedef struct sout_cfg_t       sout_cfg_t;
258 typedef struct sout_format_t    sout_format_t;
259 /*typedef struct sap_session_t    sap_session_t;
260 typedef struct slp_session_t    slp_session_t;*/
261
262 /* Decoders */
263 typedef struct decoder_fifo_t decoder_fifo_t;
264 typedef struct decoder_t      decoder_t;
265 typedef struct decoder_sys_t  decoder_sys_t;
266
267 /* Encoders */
268 typedef struct encoder_t      encoder_t;
269 typedef struct encoder_sys_t  encoder_sys_t;
270
271 /* Misc */
272 typedef struct data_packet_t data_packet_t;
273 typedef struct data_buffer_t data_buffer_t;
274 typedef struct stream_position_t stream_position_t;
275 typedef struct stream_ctrl_t stream_ctrl_t;
276 typedef struct pes_packet_t pes_packet_t;
277 typedef struct bit_stream_t bit_stream_t;
278 typedef struct network_socket_t network_socket_t;
279 typedef struct iso639_lang_t iso639_lang_t;
280
281 /* block */
282 typedef struct block_t      block_t;
283 typedef struct block_fifo_t block_fifo_t;
284
285 /*****************************************************************************
286  * Variable callbacks
287  *****************************************************************************/
288 typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
289                                    char const *,            /* variable name */
290                                    vlc_value_t,                 /* old value */
291                                    vlc_value_t,                 /* new value */
292                                    void * );                /* callback data */
293
294 /*****************************************************************************
295  * Plug-in stuff
296  *****************************************************************************/
297 #ifndef __PLUGIN__
298 #   define VLC_EXPORT( type, name, args ) type name args
299 #else
300 #   define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
301     extern module_symbols_t* p_symbols;
302 #endif
303
304 /*****************************************************************************
305  * OS-specific headers and thread types
306  *****************************************************************************/
307 #if defined( WIN32 ) || defined( UNDER_CE )
308 #   define WIN32_LEAN_AND_MEAN
309 #   include <windows.h>
310 #   define IS_WINNT ( GetVersion() < 0x80000000 )
311 #endif
312
313 #include "vlc_threads.h"
314
315 /*****************************************************************************
316  * Common structure members
317  *****************************************************************************/
318
319 /* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
320 #define VLC_COMMON_MEMBERS                                                  \
321 /** \name VLC_COMMON_MEMBERS                                                \
322  * these members are common for all vlc objects                             \
323  */                                                                         \
324 /**@{*/                                                                     \
325     int   i_object_id;                                                      \
326     int   i_object_type;                                                    \
327     char *psz_object_type;                                                  \
328     char *psz_object_name;                                                  \
329                                                                             \
330     /* Thread properties, if any */                                         \
331     vlc_bool_t   b_thread;                                                  \
332     vlc_thread_t thread_id;                                                 \
333                                                                             \
334     /* Object access lock */                                                \
335     vlc_mutex_t  object_lock;                                               \
336     vlc_cond_t   object_wait;                                               \
337                                                                             \
338     /* Object properties */                                                 \
339     volatile vlc_bool_t b_error;                  /**< set by the object */ \
340     volatile vlc_bool_t b_die;                   /**< set by the outside */ \
341     volatile vlc_bool_t b_dead;                   /**< set by the object */ \
342     volatile vlc_bool_t b_attached;               /**< set by the object */ \
343                                                                             \
344     /* Object variables */                                                  \
345     vlc_mutex_t     var_lock;                                               \
346     int             i_vars;                                                 \
347     variable_t *    p_vars;                                                 \
348                                                                             \
349     /* Stuff related to the libvlc structure */                             \
350     libvlc_t *      p_libvlc;                      /**< root of all evil */ \
351     vlc_t *         p_vlc;                   /**< (root of all evil) - 1 */ \
352                                                                             \
353     volatile int    i_refcount;                         /**< usage count */ \
354     vlc_object_t *  p_parent;                            /**< our parent */ \
355     vlc_object_t ** pp_children;                       /**< our children */ \
356     volatile int    i_children;                                             \
357                                                                             \
358     /* Private data */                                                      \
359     void *          p_private;                                              \
360                                                                             \
361     /** Just a reminder so that people don't cast garbage */                \
362     int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;                        \
363 /**@}*/                                                                     \
364
365 /* VLC_OBJECT: attempt at doing a clever cast */
366 #define VLC_OBJECT( x ) \
367     ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
368
369 /*****************************************************************************
370  * Macros and inline functions
371  *****************************************************************************/
372 #ifdef NTOHL_IN_SYS_PARAM_H
373 #   include <sys/param.h>
374
375 #elif !defined(WIN32) && !defined( UNDER_CE )
376 #   include <netinet/in.h>
377
378 #endif /* NTOHL_IN_SYS_PARAM_H || WIN32 */
379
380 /* CEIL: division with round to nearest greater integer */
381 #define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )
382
383 /* PAD: PAD(n, d) = CEIL(n ,d) * d */
384 #define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )
385
386 /* __MAX and __MIN: self explanatory */
387 #ifndef __MAX
388 #   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
389 #endif
390 #ifndef __MIN
391 #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
392 #endif
393
394 /* Dynamic array handling: realloc array, move data, increment position */
395 #define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )                           \
396     do                                                                        \
397     {                                                                         \
398         if( i_oldsize )                                                       \
399         {                                                                     \
400             (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) );  \
401         }                                                                     \
402         else                                                                  \
403         {                                                                     \
404             (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) );         \
405         }                                                                     \
406         if( (i_oldsize) - (i_pos) )                                           \
407         {                                                                     \
408             memmove( (p_ar) + (i_pos) + 1,                                    \
409                      (p_ar) + (i_pos),                                        \
410                      ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );           \
411         }                                                                     \
412         (p_ar)[i_pos] = elem;                                                 \
413         (i_oldsize)++;                                                        \
414     }                                                                         \
415     while( 0 )
416
417 #define REMOVE_ELEM( p_ar, i_oldsize, i_pos )                                 \
418     do                                                                        \
419     {                                                                         \
420         if( (i_oldsize) - (i_pos) - 1 )                                       \
421         {                                                                     \
422             memmove( (p_ar) + (i_pos),                                        \
423                      (p_ar) + (i_pos) + 1,                                    \
424                      ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) );       \
425         }                                                                     \
426         if( i_oldsize > 1 )                                                   \
427         {                                                                     \
428             (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) );  \
429         }                                                                     \
430         else                                                                  \
431         {                                                                     \
432             free( p_ar );                                                     \
433             (p_ar) = NULL;                                                    \
434         }                                                                     \
435         (i_oldsize)--;                                                        \
436     }                                                                         \
437     while( 0 )
438
439
440 #define TAB_APPEND( count, tab, p )             \
441     if( (count) > 0 )                           \
442     {                                           \
443         (tab) = realloc( (tab), sizeof( void ** ) * ( (count) + 1 ) ); \
444     }                                           \
445     else                                        \
446     {                                           \
447         (tab) = malloc( sizeof( void ** ) );    \
448     }                                           \
449     (void**)(tab)[(count)] = (void*)(p);        \
450     (count)++
451
452 #define TAB_FIND( count, tab, p, index )        \
453     {                                           \
454         int _i_;                                \
455         (index) = -1;                           \
456         for( _i_ = 0; _i_ < (count); _i_++ )    \
457         {                                       \
458             if((void**)(tab)[_i_]==(void*)(p))  \
459             {                                   \
460                 (index) = _i_;                  \
461                 break;                          \
462             }                                   \
463         }                                       \
464     }
465
466 #define TAB_REMOVE( count, tab, p )             \
467     {                                           \
468         int _i_index_;                          \
469         TAB_FIND( count, tab, p, _i_index_ );   \
470         if( _i_index_ >= 0 )                    \
471         {                                       \
472             if( (count) > 1 )                     \
473             {                                   \
474                 memmove( ((void**)(tab) + _i_index_),    \
475                          ((void**)(tab) + _i_index_+1),  \
476                          ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\
477             }                                   \
478             else                                \
479             {                                   \
480                 free( tab );                    \
481                 (tab) = NULL;                   \
482             }                                   \
483             (count)--;                          \
484         }                                       \
485     }
486
487 /* MSB (big endian)/LSB (little endian) conversions - network order is always
488  * MSB, and should be used for both network communications and files. Note that
489  * byte orders other than little and big endians are not supported, but only
490  * the VAX seems to have such exotic properties. */
491 static inline uint16_t U16_AT( void * _p )
492 {
493     uint8_t * p = (uint8_t *)_p;
494     return ( ((uint16_t)p[0] << 8) | p[1] );
495 }
496 static inline uint32_t U32_AT( void * _p )
497 {
498     uint8_t * p = (uint8_t *)_p;
499     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
500               | ((uint32_t)p[2] << 8) | p[3] );
501 }
502 static inline uint64_t U64_AT( void * _p )
503 {
504     uint8_t * p = (uint8_t *)_p;
505     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
506               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
507               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
508               | ((uint64_t)p[6] << 8) | p[7] );
509 }
510
511 static inline uint16_t GetWLE( void * _p )
512 {
513     uint8_t * p = (uint8_t *)_p;
514     return ( ((uint16_t)p[1] << 8) | p[0] );
515 }
516 static inline uint32_t GetDWLE( void * _p )
517 {
518     uint8_t * p = (uint8_t *)_p;
519     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
520               | ((uint32_t)p[1] << 8) | p[0] );
521 }
522 static inline uint64_t GetQWLE( void * _p )
523 {
524     uint8_t * p = (uint8_t *)_p;
525     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
526               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
527               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
528               | ((uint64_t)p[1] << 8) | p[0] );
529 }
530
531 #define GetWBE( p )     U16_AT( p )
532 #define GetDWBE( p )    U32_AT( p )
533 #define GetQWBE( p )    U64_AT( p )
534
535
536 #if WORDS_BIGENDIAN
537 #   define hton16(i)   ( i )
538 #   define hton32(i)   ( i )
539 #   define hton64(i)   ( i )
540 #   define ntoh16(i)   ( i )
541 #   define ntoh32(i)   ( i )
542 #   define ntoh64(i)   ( i )
543 #else
544 #   define hton16(i)   U16_AT(&i)
545 #   define hton32(i)   U32_AT(&i)
546 #   define hton64(i)   U64_AT(&i)
547 #   define ntoh16(i)   U16_AT(&i)
548 #   define ntoh32(i)   U32_AT(&i)
549 #   define ntoh64(i)   U64_AT(&i)
550 #endif
551
552 /* Format string sanity checks */
553 #ifdef HAVE_ATTRIBUTE_FORMAT
554 #   define ATTRIBUTE_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
555 #else
556 #   define ATTRIBUTE_FORMAT(x,y)
557 #endif
558
559 /* Alignment of critical static data structures */
560 #ifdef ATTRIBUTE_ALIGNED_MAX
561 #   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
562 #else
563 #   define ATTR_ALIGN(align)
564 #endif
565
566 /* Alignment of critical dynamic data structure
567  *
568  * Not all platforms support memalign so we provide a vlc_memalign wrapper
569  * void *vlc_memalign( size_t align, size_t size, void **pp_orig )
570  * *pp_orig is the pointer that has to be freed afterwards.
571  */
572 #if 0
573 #ifdef HAVE_POSIX_MEMALIGN
574 #   define vlc_memalign(align,size,pp_orig) \
575     ( !posix_memalign( pp_orig, align, size ) ? *(pp_orig) : NULL )
576 #endif
577 #endif
578 #ifdef HAVE_MEMALIGN
579     /* Some systems have memalign() but no declaration for it */
580     void * memalign( size_t align, size_t size );
581
582 #   define vlc_memalign(pp_orig,align,size) \
583     ( *(pp_orig) = memalign( align, size ) )
584
585 #else /* We don't have any choice but to align manually */
586 #   define vlc_memalign(pp_orig,align,size) \
587     (( *(pp_orig) = malloc( size + align - 1 )) \
588         ? (void *)( (((unsigned long)*(pp_orig)) + (unsigned long)(align-1) ) \
589                        & (~(unsigned long)(align-1)) ) \
590         : NULL )
591
592 #endif
593
594 /* Stuff defined in src/extras/libc.c */
595 #ifndef HAVE_STRDUP
596 #   define strdup vlc_strdup
597     VLC_EXPORT( char *, vlc_strdup, ( const char *s ) );
598 #elif !defined(__PLUGIN__)
599 #   define vlc_strdup NULL
600 #endif
601
602 #ifndef HAVE_STRNDUP
603 #   if defined(STRNDUP_IN_GNOME_H) && \
604         (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
605          defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main))
606         /* Do nothing: gnome.h defines strndup for us */
607 #   else
608 #       define strndup vlc_strndup
609         VLC_EXPORT( char *, vlc_strndup, ( const char *s, size_t n ) );
610 #   endif
611 #elif !defined(__PLUGIN__)
612 #   define vlc_strndup NULL
613 #endif
614
615 #ifndef HAVE_ATOF
616 #   define atof vlc_atof
617     VLC_EXPORT( double, vlc_atof, ( const char *nptr ) );
618 #elif !defined(__PLUGIN__)
619 #   define vlc_atof NULL
620 #endif
621
622 #ifndef HAVE_ATOLL
623 #   define atoll vlc_atoll
624     VLC_EXPORT( int64_t, vlc_atoll, ( const char *nptr ) );
625 #elif !defined(__PLUGIN__)
626 #   define vlc_atoll NULL
627 #endif
628
629 #ifndef HAVE_GETENV
630 #   define getenv vlc_getenv
631     VLC_EXPORT( char *, vlc_getenv, ( const char *name ) );
632 #elif !defined(__PLUGIN__)
633 #   define vlc_getenv NULL
634 #endif
635
636 #ifndef HAVE_STRCASECMP
637 #   ifdef HAVE_STRICMP
638 #       define strcasecmp stricmp
639 #       if !defined(__PLUGIN__)
640 #           define vlc_strcasecmp NULL
641 #       endif
642 #   elif !defined(__PLUGIN__)
643 #       define strcasecmp vlc_strcasecmp
644         VLC_EXPORT( int, vlc_strcasecmp, ( const char *s1, const char *s2 ) );
645 #   endif
646 #elif !defined(__PLUGIN__)
647 #   define vlc_strcasecmp NULL
648 #endif
649
650 #ifndef HAVE_STRNCASECMP
651 #   ifdef HAVE_STRNICMP
652 #       define strncasecmp strnicmp
653 #       if !defined(__PLUGIN__)
654 #           define vlc_strncasecmp NULL
655 #       endif
656 #   elif !defined(__PLUGIN__)
657 #       define strncasecmp vlc_strncasecmp
658         VLC_EXPORT( int, vlc_strncasecmp, ( const char *s1, const char *s2, size_t n ) );
659 #   endif
660 #elif !defined(__PLUGIN__)
661 #   define vlc_strncasecmp NULL
662 #endif
663
664 /* Format type specifiers for 64 bits numbers */
665 #if !defined(WIN32) && !defined(UNDER_CE)
666 #   define I64Fd "%lld"
667 #   define I64Fi "%lli"
668 #   define I64Fo "%llo"
669 #   define I64Fu "%llu"
670 #   define I64Fx "%llx"
671 #   define I64FX "%llX"
672 #else
673 #   define I64Fd "%I64d"
674 #   define I64Fi "%I64i"
675 #   define I64Fo "%I64o"
676 #   define I64Fu "%I64u"
677 #   define I64Fx "%I64x"
678 #   define I64FX "%I64X"
679 #endif /* defined(WIN32)||defined(UNDER_CE) */
680
681 /* 64 bits integer constant suffix */
682 #if defined( __MINGW32__ ) || (!defined(WIN32) && !defined(UNDER_CE))
683 #   define I64C(x)         x##LL
684 #else
685 #   define I64C(x)         x##i64
686 #endif /* defined(WIN32)||defined(UNDER_CE) */
687
688 #if defined(WIN32) || defined(UNDER_CE)
689 /* win32, cl and icl support */
690 #   if defined( _MSC_VER ) || !defined( __MINGW32__ )
691 #       define __attribute__(x)
692 #       define __inline__      __inline
693 #       define S_IFBLK         0x3000  /* Block */
694 #       define S_ISBLK(m)      (0)
695 #       define S_ISCHR(m)      (0)
696 #       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
697 #       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
698 #   endif
699
700 /* several type definitions */
701 #   if defined( __MINGW32__ )
702 #       if !defined( _OFF_T_ )
703 typedef long long _off_t;
704 typedef _off_t off_t;
705 #           define _OFF_T_
706 #       else
707 #           ifdef off_t
708 #               undef off_t
709 #           endif
710 #           define off_t long long
711 #       endif
712 #   endif
713
714 #   if defined( _MSC_VER )
715 #       if !defined( _OFF_T_DEFINED )
716 typedef __int64 off_t;
717 #           define _OFF_T_DEFINED
718 #       else
719 #           define off_t __int64
720 #       endif
721 #   endif
722
723 #   if defined( __BORLANDC__ )
724 #       undef off_t
725 #       define off_t unsigned __int64
726 #   endif
727
728 #   ifndef O_NONBLOCK
729 #       define O_NONBLOCK 0
730 #   endif
731
732 #   ifndef alloca
733 #       define alloca _alloca
734 #   endif
735
736     /* These two are not defined in mingw32 (bug?) */
737 #   ifndef snprintf
738 #       define snprintf _snprintf
739 #   endif
740 #   ifndef vsnprintf
741 #       define vsnprintf _vsnprintf
742 #   endif
743
744 #endif
745
746 /* lseek (defined in src/extras/libc.c) */
747 #ifndef HAVE_LSEEK
748 #   define lseek vlc_lseek
749     VLC_EXPORT( off_t, vlc_lseek, ( int fildes, off_t offset, int whence ) );
750 #elif !defined(__PLUGIN__)
751 #   define vlc_lseek NULL
752 #endif
753
754 /* vlc_wraptext (defined in src/extras/libc.c) */
755 #define wraptext vlc_wraptext
756 VLC_EXPORT( char *, vlc_wraptext, ( const char *, int, vlc_bool_t ) );
757
758 /*****************************************************************************
759  * CPU capabilities
760  *****************************************************************************/
761 #define CPU_CAPABILITY_NONE    0
762 #define CPU_CAPABILITY_486     (1<<0)
763 #define CPU_CAPABILITY_586     (1<<1)
764 #define CPU_CAPABILITY_PPRO    (1<<2)
765 #define CPU_CAPABILITY_MMX     (1<<3)
766 #define CPU_CAPABILITY_3DNOW   (1<<4)
767 #define CPU_CAPABILITY_MMXEXT  (1<<5)
768 #define CPU_CAPABILITY_SSE     (1<<6)
769 #define CPU_CAPABILITY_ALTIVEC (1<<16)
770 #define CPU_CAPABILITY_FPU     (1<<31)
771
772 /*****************************************************************************
773  * I18n stuff
774  *****************************************************************************/
775 VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) );
776
777 #if defined( ENABLE_NLS ) && \
778      (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
779       defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main))
780     /* Declare nothing: gnome.h will do it for us */
781 #elif defined( ENABLE_NLS )
782 #if defined( HAVE_INCLUDED_GETTEXT )
783 #   include "libintl.h"
784 #else
785 #   include <libintl.h>
786 #endif
787 #   undef _
788 #if defined( __BORLANDC__ )
789 #define _(String) vlc_dgettext (PACKAGE_TARNAME, String)
790 #else
791 #   define _(String) vlc_dgettext (PACKAGE, String)
792 #endif
793 #   define N_(String) ((char*)(String))
794 #else
795 #   define _(String) ((char*)(String))
796 #   define N_(String) ((char*)(String))
797 #endif
798
799 /*****************************************************************************
800  * Additional vlc stuff
801  *****************************************************************************/
802 #include "vlc_symbols.h"
803 #include "os_specific.h"
804 #include "vlc_messages.h"
805 #include "variables.h"
806 #include "vlc_objects.h"
807 #include "vlc_threads_funcs.h"
808 #include "mtime.h"
809 #include "modules.h"
810 #include "main.h"
811 #include "configuration.h"
812
813 #if defined( __BORLANDC__ )
814 #   undef PACKAGE
815 #   define PACKAGE
816 #endif
817