vlc_common.h 45 KB
Newer Older
Sam Hocevar's avatar
   
Sam Hocevar committed
1
2
3
4
/*****************************************************************************
 * common.h: common definitions
 * Collection of useful common types and macros definitions
 *****************************************************************************
5
 * Copyright (C) 1998-2005 the VideoLAN team
6
 * $Id$
Sam Hocevar's avatar
   
Sam Hocevar committed
7
8
9
 *
 * Authors: Samuel Hocevar <sam@via.ecp.fr>
 *          Vincent Seguin <seguin@via.ecp.fr>
10
 *          Gildas Bazin <gbazin@videolan.org>
Sam Hocevar's avatar
   
Sam Hocevar committed
11
12
13
14
15
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
16
 *
Sam Hocevar's avatar
   
Sam Hocevar committed
17
18
19
20
21
22
23
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
dionoea's avatar
dionoea committed
24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
Sam Hocevar's avatar
   
Sam Hocevar committed
25
26
 *****************************************************************************/

27

zorglub's avatar
zorglub committed
28
/**
Sam Hocevar's avatar
Sam Hocevar committed
29
 * \file
zorglub's avatar
zorglub committed
30
31
32
 * This file is a collection of common definitions and types
 */

33
/*****************************************************************************
34
 * Required vlc headers
35
 *****************************************************************************/
36
37
38
39
40
41
#if defined( __BORLANDC__ )
#   undef PACKAGE
#endif

#include "config.h"

Sam Hocevar's avatar
Sam Hocevar committed
42
43
#if defined(PACKAGE)
#   undef PACKAGE_NAME
Sam Hocevar's avatar
Sam Hocevar committed
44
45
#   define PACKAGE_NAME PACKAGE
#endif
Sam Hocevar's avatar
Sam Hocevar committed
46
47
#if defined(VERSION)
#   undef PACKAGE_VERSION
Sam Hocevar's avatar
Sam Hocevar committed
48
49
50
#   define PACKAGE_VERSION VERSION
#endif

51
52
53
#if defined( __BORLANDC__ )
#   undef HAVE_VARIADIC_MACROS
#   undef HAVE_STDINT_H
54
#   undef HAVE_INTTYPES_H
55
#   undef off_t
gbazin's avatar
   
gbazin committed
56
57
#elif defined( _MSC_VER )
#   pragma warning( disable : 4244 )
58
59
#endif

60
61
62
#include "vlc_config.h"
#include "modules_inner.h"

Sam Hocevar's avatar
   
Sam Hocevar committed
63
64
65
/*****************************************************************************
 * Required system headers
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
66
#include <stdlib.h>
67
68
#include <stdarg.h>

Sam Hocevar's avatar
   
Sam Hocevar committed
69
70
71
72
73
74
75
#ifdef HAVE_STRING_H
#   include <string.h>                                         /* strerror() */
#endif

#ifdef HAVE_SYS_TYPES_H
#   include <sys/types.h>
#endif
Sam Hocevar's avatar
   
Sam Hocevar committed
76
77
78
79

/*****************************************************************************
 * Basic types definitions
 *****************************************************************************/
80
#if defined( HAVE_STDINT_H )
81
#   include <stdint.h>
82
83
#elif defined( HAVE_INTTYPES_H )
#   include <inttypes.h>
84
85
86
87
88
89
90
#elif defined( SYS_CYGWIN )
#   include <sys/types.h>
    /* Cygwin only defines half of these... */
    typedef u_int8_t            uint8_t;
    typedef u_int16_t           uint16_t;
    typedef u_int32_t           uint32_t;
    typedef u_int64_t           uint64_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
91
#else
92
93
94
95
96
97
98
    /* Fallback types (very x86-centric, sorry) */
    typedef unsigned char       uint8_t;
    typedef signed char         int8_t;
    typedef unsigned short      uint16_t;
    typedef signed short        int16_t;
    typedef unsigned int        uint32_t;
    typedef signed int          int32_t;
99
100
101
#   if defined( _MSC_VER ) \
      || defined( UNDER_CE ) \
      || ( defined( WIN32 ) && !defined( __MINGW32__ ) )
102
103
    typedef unsigned __int64    uint64_t;
    typedef signed __int64      int64_t;
104
#   else
105
106
    typedef unsigned long long  uint64_t;
    typedef signed long long    int64_t;
107
#   endif
Sam Hocevar's avatar
Sam Hocevar committed
108
109
    typedef uint32_t            uintptr_t;
    typedef int32_t             intptr_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
110
111
#endif

112
typedef uint8_t                 byte_t;
113

114
115
116
117
118
119
120
121
122
/* Systems that don't have stdint.h may not define INT64_MIN and
   INT64_MAX */
#ifndef INT64_MIN
#define INT64_MIN (-9223372036854775807LL-1)
#endif
#ifndef INT64_MAX
#define INT64_MAX (9223372036854775807LL)
#endif

Sam Hocevar's avatar
   
Sam Hocevar committed
123
124
125
126
127
128
129
130
131
132
133
134
/* ptrdiff_t definition */
#ifdef HAVE_STDDEF_H
#   include <stddef.h>
#else
#   include <malloc.h>
#   ifndef _PTRDIFF_T
#       define _PTRDIFF_T
/* Not portable in a 64-bit environment. */
typedef int                 ptrdiff_t;
#   endif
#endif

135
#if defined( WIN32 ) || defined( UNDER_CE )
gbazin's avatar
   
gbazin committed
136
#   include <malloc.h>
137
138
139
#   ifndef PATH_MAX
#       define PATH_MAX MAX_PATH
#   endif
gbazin's avatar
   
gbazin committed
140
141
#endif

142
#if (defined( WIN32 ) || defined( UNDER_CE )) && !defined( _SSIZE_T_ )
gbazin's avatar
   
gbazin committed
143
typedef int                 ssize_t;
Xavier Marchesini's avatar
   
Xavier Marchesini committed
144
145
#endif

Sam Hocevar's avatar
   
Sam Hocevar committed
146
147
148
149
/* Counter for statistics and profiling */
typedef unsigned long       count_t;

/* DCT elements types */
150
typedef int16_t             dctelem_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
151
152

/* Video buffer types */
153
typedef uint8_t             yuv_data_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
154

155
/* Audio volume */
156
157
typedef uint16_t            audio_volume_t;

158
159
160
161
#ifndef HAVE_SOCKLEN_T
typedef int                 socklen_t;
#endif

sigmunau's avatar
sigmunau committed
162
163
164
/**
 * High precision date or time interval
 *
165
166
 * Store a high precision date or time interval. The maximum precision is the
 * microsecond, and a 64 bits integer is used to avoid overflows (maximum
Sam Hocevar's avatar
   
Sam Hocevar committed
167
 * time interval is then 292271 years, which should be long enough for any
168
169
 * video). Dates are stored as microseconds since a common date (usually the
 * epoch). Note that date and time intervals can be manipulated using regular
Sam Hocevar's avatar
   
Sam Hocevar committed
170
 * arithmetic operators, and that no special functions are required.
sigmunau's avatar
sigmunau committed
171
 */
172
typedef int64_t mtime_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
173

sigmunau's avatar
sigmunau committed
174
/**
175
 * The vlc_fourcc_t type.
sigmunau's avatar
sigmunau committed
176
 *
177
 * See http://www.webartz.com/fourcc/ for a very detailed list.
sigmunau's avatar
sigmunau committed
178
 */
179
typedef uint32_t vlc_fourcc_t;
180

181
182
#ifdef WORDS_BIGENDIAN
#   define VLC_FOURCC( a, b, c, d ) \
183
184
        ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
           | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
185
#   define VLC_TWOCC( a, b ) \
186
        ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
187

188
189
#else
#   define VLC_FOURCC( a, b, c, d ) \
190
191
        ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
           | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
192
#   define VLC_TWOCC( a, b ) \
193
        ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
194
195

#endif
196

Sam Hocevar's avatar
   
Sam Hocevar committed
197
198
199
200
/*****************************************************************************
 * Classes declaration
 *****************************************************************************/

201
202
/* Internal types */
typedef struct libvlc_t libvlc_t;
Sam Hocevar's avatar
Sam Hocevar committed
203
204
typedef struct vlc_t vlc_t;
typedef struct variable_t variable_t;
205
typedef struct date_t date_t;
zorglub's avatar
zorglub committed
206
207
typedef struct dict_entry_t dict_entry_t;
typedef struct dict_t dict_t;
208
typedef struct gc_object_t gc_object_t ;
209

210
/* Messages */
211
typedef struct msg_bank_t msg_bank_t;
212
typedef struct msg_queue_t msg_queue_t;
213
typedef struct msg_subscription_t msg_subscription_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
214

gbazin's avatar
   
gbazin committed
215
/* Playlist */
hartman's avatar
hartman committed
216
217
218
219
220
221

/* FIXME */
/**
 * Playlist commands
 */
typedef enum {
zorglub's avatar
zorglub committed
222
    PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
223
    PLAYLIST_AUTOPLAY,  /**< No arg.                            res=cant fail*/
224
225
    PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
                        /**  arg2 = playlist_item_t*          , res=can fail */
zorglub's avatar
zorglub committed
226
227
228
    PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
    PLAYLIST_STOP,      /**< No arg                             res=can fail*/
    PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
hartman's avatar
hartman committed
229
230
231
} playlist_command_t;


232
233
typedef struct playlist_t playlist_t;
typedef struct playlist_item_t playlist_item_t;
zorglub's avatar
zorglub committed
234
typedef struct playlist_view_t playlist_view_t;
zorglub's avatar
zorglub committed
235
typedef struct playlist_export_t playlist_export_t;
zorglub's avatar
zorglub committed
236
237
typedef struct services_discovery_t services_discovery_t;
typedef struct services_discovery_sys_t services_discovery_sys_t;
zorglub's avatar
zorglub committed
238
typedef struct playlist_add_t playlist_add_t;
239
typedef struct playlist_preparse_t playlist_preparse_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
240

241
/* Modules */
242
243
244
245
typedef struct module_bank_t module_bank_t;
typedef struct module_t module_t;
typedef struct module_config_t module_config_t;
typedef struct module_symbols_t module_symbols_t;
246
typedef struct module_cache_t module_cache_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
247

zorglub's avatar
zorglub committed
248
249
typedef struct config_category_t config_category_t;

Sam Hocevar's avatar
   
Sam Hocevar committed
250
/* Interface */
251
252
253
254
typedef struct intf_thread_t intf_thread_t;
typedef struct intf_sys_t intf_sys_t;
typedef struct intf_console_t intf_console_t;
typedef struct intf_msg_t intf_msg_t;
255
256
257
typedef struct interaction_t interaction_t;
typedef struct interaction_dialog_t interaction_dialog_t;
typedef struct user_widget_t user_widget_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
258
259

/* Input */
260
typedef struct input_thread_t input_thread_t;
261
typedef struct input_thread_sys_t input_thread_sys_t;
262
typedef struct input_item_t input_item_t;
263
typedef struct access_t access_t;
264
typedef struct access_sys_t access_sys_t;
265
266
267
typedef struct stream_t     stream_t;
typedef struct stream_sys_t stream_sys_t;
typedef struct demux_t  demux_t;
268
typedef struct demux_sys_t demux_sys_t;
269
270
271
typedef struct es_out_t     es_out_t;
typedef struct es_out_id_t  es_out_id_t;
typedef struct es_out_sys_t es_out_sys_t;
272
typedef struct es_descriptor_t es_descriptor_t;
gbazin's avatar
gbazin committed
273
typedef struct seekpoint_t seekpoint_t;
274
275
typedef struct info_t info_t;
typedef struct info_category_t info_category_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
276

277
278
279
280
/* Format */
typedef struct audio_format_t audio_format_t;
typedef struct video_format_t video_format_t;
typedef struct subs_format_t subs_format_t;
gbazin's avatar
   
gbazin committed
281
282
typedef struct es_format_t es_format_t;
typedef struct video_palette_t video_palette_t;
283

Sam Hocevar's avatar
   
Sam Hocevar committed
284
/* Audio */
285
286
typedef struct aout_instance_t aout_instance_t;
typedef struct aout_sys_t aout_sys_t;
287
typedef struct aout_fifo_t aout_fifo_t;
288
289
typedef struct aout_input_t aout_input_t;
typedef struct aout_buffer_t aout_buffer_t;
gbazin's avatar
   
gbazin committed
290
typedef audio_format_t audio_sample_format_t;
291
typedef struct audio_date_t audio_date_t;
gbazin's avatar
   
gbazin committed
292
typedef struct aout_filter_t aout_filter_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
293
294

/* Video */
295
296
typedef struct vout_thread_t vout_thread_t;
typedef struct vout_sys_t vout_sys_t;
297
typedef struct vout_synchro_t vout_synchro_t;
298
typedef struct chroma_sys_t chroma_sys_t;
299

gbazin's avatar
   
gbazin committed
300
typedef video_format_t video_frame_format_t;
301
302
303
typedef struct picture_t picture_t;
typedef struct picture_sys_t picture_sys_t;
typedef struct picture_heap_t picture_heap_t;
304

305
/* Subpictures */
306
typedef struct spu_t spu_t;
307
308
typedef struct subpicture_t subpicture_t;
typedef struct subpicture_sys_t subpicture_sys_t;
309
typedef struct subpicture_region_t subpicture_region_t;
310
typedef struct text_style_t text_style_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
311

312
313
typedef struct image_handler_t image_handler_t;

314
315
/* Stream output */
typedef struct sout_instance_t sout_instance_t;
316
317
typedef struct sout_instance_sys_t sout_instance_sys_t;

318
typedef struct sout_input_t sout_input_t;
319
typedef struct sout_packetizer_input_t sout_packetizer_input_t;
320

321
typedef struct sout_access_out_t sout_access_out_t;
322
323
typedef struct sout_access_out_sys_t   sout_access_out_sys_t;

324
typedef struct sout_mux_t sout_mux_t;
325
326
typedef struct sout_mux_sys_t sout_mux_sys_t;

327
typedef struct sout_stream_t    sout_stream_t;
328
329
typedef struct sout_stream_sys_t sout_stream_sys_t;

330
typedef struct sout_cfg_t       sout_cfg_t;
zorglub's avatar
zorglub committed
331
332
333
334
335
336
typedef struct sap_session_t    sap_session_t;
typedef struct sap_address_t sap_address_t;
typedef struct session_descriptor_t session_descriptor_t;
typedef struct announce_method_t announce_method_t;
typedef struct announce_handler_t announce_handler_t;
typedef struct sap_handler_t sap_handler_t;
337

338
339
typedef struct sout_param_t sout_param_t;
typedef struct sout_pcat_t sout_pcat_t;
340
341
342
343
344
345
346
347
typedef struct sout_std_t sout_std_t;
typedef struct sout_display_t sout_display_t;
typedef struct sout_duplicate_t sout_duplicate_t;
typedef struct sout_transcode_t sout_transcode_t;
typedef struct sout_chain_t sout_chain_t;
typedef struct streaming_profile_t streaming_profile_t;
typedef struct sout_module_t sout_module_t;
typedef struct sout_gui_descr_t sout_gui_descr_t;
zorglub's avatar
zorglub committed
348
typedef struct profile_parser_t profile_parser_t;
349

Sam Hocevar's avatar
   
Sam Hocevar committed
350
/* Decoders */
gbazin's avatar
   
gbazin committed
351
352
typedef struct decoder_t      decoder_t;
typedef struct decoder_sys_t  decoder_sys_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
353

gbazin's avatar
   
gbazin committed
354
355
356
357
/* Encoders */
typedef struct encoder_t      encoder_t;
typedef struct encoder_sys_t  encoder_sys_t;

358
359
360
361
/* Filters */
typedef struct filter_t filter_t;
typedef struct filter_sys_t filter_sys_t;

362
/* Network */
363
typedef struct network_socket_t network_socket_t;
364
typedef struct virtual_socket_t v_socket_t;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
365
366
typedef struct sockaddr sockaddr;
typedef struct addrinfo addrinfo;
367
typedef struct vlc_acl_t vlc_acl_t;
368

369
370
/* Misc */
typedef struct iso639_lang_t iso639_lang_t;
zorglub's avatar
zorglub committed
371
typedef struct device_t device_t;
372
373
typedef struct device_probe_t device_probe_t;
typedef struct probe_sys_t probe_sys_t;
374

375
376
377
378
/* block */
typedef struct block_t      block_t;
typedef struct block_fifo_t block_fifo_t;

379
380
381
382
383
384
385
386
387
388
/* httpd */
typedef struct httpd_t          httpd_t;
typedef struct httpd_host_t     httpd_host_t;
typedef struct httpd_url_t      httpd_url_t;
typedef struct httpd_client_t   httpd_client_t;
typedef struct httpd_callback_sys_t httpd_callback_sys_t;
typedef struct httpd_message_t  httpd_message_t;
typedef int    (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, httpd_message_t *query );
typedef struct httpd_file_t     httpd_file_t;
typedef struct httpd_file_sys_t httpd_file_sys_t;
389
390
391
typedef int (*httpd_file_callback_t)( httpd_file_sys_t *, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
typedef struct httpd_handler_t  httpd_handler_t;
typedef struct httpd_handler_sys_t httpd_handler_sys_t;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
392
typedef int (*httpd_handler_callback_t)( httpd_handler_sys_t *, httpd_handler_t *, char *psz_url, uint8_t *psz_request, int i_type, uint8_t *p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data );
393
394
395
typedef struct httpd_redirect_t httpd_redirect_t;
typedef struct httpd_stream_t httpd_stream_t;

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
396
397
398
399
400
/* TLS support */
typedef struct tls_t tls_t;
typedef struct tls_server_t tls_server_t;
typedef struct tls_session_t tls_session_t;

401
402
403
/* Hashing */
typedef struct md5_s md5_t;

gbazin's avatar
gbazin committed
404
405
406
407
408
409
/* XML */
typedef struct xml_t xml_t;
typedef struct xml_sys_t xml_sys_t;
typedef struct xml_reader_t xml_reader_t;
typedef struct xml_reader_sys_t xml_reader_sys_t;

410
411
412
/* vod server */
typedef struct vod_t     vod_t;
typedef struct vod_sys_t vod_sys_t;
413
typedef struct vod_media_t vod_media_t;
414

415
416
417
418
/* opengl */
typedef struct opengl_t     opengl_t;
typedef struct opengl_sys_t opengl_sys_t;

419
420
421
422
423
424
425
/* osdmenu */
typedef struct osd_menu_t   osd_menu_t;
typedef struct osd_state_t  osd_state_t;
typedef struct osd_event_t  osd_event_t;
typedef struct osd_button_t osd_button_t;
typedef struct osd_menu_state_t osd_menu_state_t;

426
/* VLM */
427
428
typedef struct vlm_t         vlm_t;
typedef struct vlm_message_t vlm_message_t;
429
430
431
432
433
typedef struct vlm_media_t   vlm_media_t;
typedef struct vlm_schedule_t vlm_schedule_t;

/* divers */
typedef struct vlc_meta_t    vlc_meta_t;
434

435
/* Stats */
436
437
438
typedef struct counter_t     counter_t;
typedef struct counter_sample_t counter_sample_t;
typedef struct stats_handler_t stats_handler_t;
zorglub's avatar
zorglub committed
439
typedef struct input_stats_t input_stats_t;
zorglub's avatar
zorglub committed
440
typedef struct global_stats_t global_stats_t;
441

442
443
444
/* Update */
typedef struct update_t update_t;
typedef struct update_iterator_t update_iterator_t;
445

446
447
448
449
450
451
452
453
454
/*****************************************************************************
 * Variable callbacks
 *****************************************************************************/
typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
                                   char const *,            /* variable name */
                                   vlc_value_t,                 /* old value */
                                   vlc_value_t,                 /* new value */
                                   void * );                /* callback data */

gbazin's avatar
   
gbazin committed
455
456
457
/*****************************************************************************
 * Plug-in stuff
 *****************************************************************************/
458
#if !defined (__PLUGIN__) || defined (HAVE_SHARED_LIBVLC)
459
460
461
462
463
#   ifdef __cplusplus
#      define VLC_EXPORT( type, name, args ) extern "C" type name args
#   else
#      define VLC_EXPORT( type, name, args ) type name args
#   endif
gbazin's avatar
   
gbazin committed
464
#else
465
#   define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
gbazin's avatar
   
gbazin committed
466
467
468
    extern module_symbols_t* p_symbols;
#endif

469
470
471
/*****************************************************************************
 * OS-specific headers and thread types
 *****************************************************************************/
472
#if defined( WIN32 ) || defined( UNDER_CE )
473
474
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
475
476
477
478
479
#   if defined( UNDER_CE )
#      define IS_WINNT 0
#   else
#      define IS_WINNT ( GetVersion() < 0x80000000 )
#   endif
480
481
#endif

482
483
484
485
486
487
488
489
#include "vlc_threads.h"

/*****************************************************************************
 * Common structure members
 *****************************************************************************/

/* VLC_COMMON_MEMBERS : members common to all basic vlc objects */
#define VLC_COMMON_MEMBERS                                                  \
490
491
492
493
/** \name VLC_COMMON_MEMBERS                                                \
 * these members are common for all vlc objects                             \
 */                                                                         \
/**@{*/                                                                     \
494
495
    int   i_object_id;                                                      \
    int   i_object_type;                                                    \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
496
    const char *psz_object_type;                                            \
497
498
    char *psz_object_name;                                                  \
                                                                            \
499
500
    /* Messages header */                                                   \
    char *psz_header;                                                       \
501
    int  i_flags;                                                           \
502
                                                                            \
503
504
505
    /* Thread properties, if any */                                         \
    vlc_bool_t   b_thread;                                                  \
    vlc_thread_t thread_id;                                                 \
Sam Hocevar's avatar
Sam Hocevar committed
506
507
508
509
                                                                            \
    /* Object access lock */                                                \
    vlc_mutex_t  object_lock;                                               \
    vlc_cond_t   object_wait;                                               \
510
                                                                            \
Sam Hocevar's avatar
Sam Hocevar committed
511
    /* Object properties */                                                 \
512
513
514
515
    volatile vlc_bool_t b_error;                  /**< set by the object */ \
    volatile vlc_bool_t b_die;                   /**< set by the outside */ \
    volatile vlc_bool_t b_dead;                   /**< set by the object */ \
    volatile vlc_bool_t b_attached;               /**< set by the object */ \
516
    vlc_bool_t b_force;      /**< set by the outside (eg. module_Need()) */ \
517
                                                                            \
Sam Hocevar's avatar
Sam Hocevar committed
518
519
520
521
522
523
    /* Object variables */                                                  \
    vlc_mutex_t     var_lock;                                               \
    int             i_vars;                                                 \
    variable_t *    p_vars;                                                 \
                                                                            \
    /* Stuff related to the libvlc structure */                             \
524
525
    libvlc_t *      p_libvlc;                      /**< root of all evil */ \
    vlc_t *         p_vlc;                   /**< (root of all evil) - 1 */ \
526
                                                                            \
527
528
529
    volatile int    i_refcount;                         /**< usage count */ \
    vlc_object_t *  p_parent;                            /**< our parent */ \
    vlc_object_t ** pp_children;                       /**< our children */ \
530
531
    volatile int    i_children;                                             \
                                                                            \
532
533
534
    /* Private data */                                                      \
    void *          p_private;                                              \
                                                                            \
535
    /** Just a reminder so that people don't cast garbage */                \
536
    int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;                        \
537
/**@}*/                                                                     \
538

539
540
/* VLC_OBJECT: attempt at doing a clever cast */
#define VLC_OBJECT( x ) \
541
    ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
542

543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
#define VLC_GC_MEMBERS                                                       \
/** \name VLC_GC_MEMBERS                                                     \
 * these members are common to all objects that wish to be garbage-collected \
 */                                                                          \
/**@{*/                                                                      \
    int i_gc_refcount;                                                       \
    void (*pf_destructor) ( gc_object_t * );                                 \
    void *p_destructor_arg;                                                  \
/**@}*/

struct gc_object_t
{
            VLC_GC_MEMBERS
};

static inline void __vlc_gc_incref( gc_object_t * p_gc )
{
    p_gc->i_gc_refcount ++;
};

static inline void __vlc_gc_decref( gc_object_t *p_gc )
{
    p_gc->i_gc_refcount -- ;

    if( p_gc->i_gc_refcount == 0 )
    {
        p_gc->pf_destructor( p_gc );
        /* Do not use the p_gc pointer from now on ! */
     }
}

#define vlc_gc_incref( a ) __vlc_gc_incref( (gc_object_t *)a )
#define vlc_gc_decref( a ) __vlc_gc_decref( (gc_object_t *)a )
#define vlc_gc_init( a,b,c ) {  ((gc_object_t *)a)->i_gc_refcount = 0; \
                              ((gc_object_t *)a)->pf_destructor = b; \
                              ((gc_object_t *)a)->p_destructor_arg = c; }


Sam Hocevar's avatar
   
Sam Hocevar committed
581
582
583
584
585
586
/*****************************************************************************
 * Macros and inline functions
 *****************************************************************************/
#ifdef NTOHL_IN_SYS_PARAM_H
#   include <sys/param.h>

587
#elif !defined(WIN32) && !defined( UNDER_CE )
Sam Hocevar's avatar
   
Sam Hocevar committed
588
589
590
591
592
593
594
595
596
597
#   include <netinet/in.h>

#endif /* NTOHL_IN_SYS_PARAM_H || WIN32 */

/* CEIL: division with round to nearest greater integer */
#define CEIL(n, d)  ( ((n) / (d)) + ( ((n) % (d)) ? 1 : 0) )

/* PAD: PAD(n, d) = CEIL(n ,d) * d */
#define PAD(n, d)   ( ((n) % (d)) ? ((((n) / (d)) + 1) * (d)) : (n) )

Sam Hocevar's avatar
   
Sam Hocevar committed
598
599
600
/* __MAX and __MIN: self explanatory */
#ifndef __MAX
#   define __MAX(a, b)   ( ((a) > (b)) ? (a) : (b) )
Sam Hocevar's avatar
   
Sam Hocevar committed
601
#endif
Sam Hocevar's avatar
   
Sam Hocevar committed
602
603
#ifndef __MIN
#   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
Sam Hocevar's avatar
   
Sam Hocevar committed
604
605
#endif

606
607
608
609
610
611
static int64_t GCD( int64_t a, int64_t b )
{
    if( b ) return GCD( b, a % b );
    else return a;
}

612
613
614
615
616
617
618
619
620
621
622
/* Malloc with automatic error */
#define MALLOC_VOID( var, type ) { var = (type*)malloc( sizeof( type) ); \
                                   if( !var ) return; }
#define MALLOC_NULL( var, type ) { var = (type*)malloc( sizeof( type) ); \
                                   if( !var ) return NULL; }
#define MALLOC_ERR( var, type ) { var = (type*)malloc( sizeof( type) ); \
                                   if( !var ) return VLC_ENOMEM; }
#define MALLOC_GOTOERR( var, type ) { var = (type*)malloc( sizeof( type) ); \
                                      if( !var ) goto error; }
#define DECMALLOC_VOID( var, type ) type* var = (type*)malloc( sizeof(type) );\
                                    if( !var ) return;
623
624
#define DECMALLOC_ERR( var, type ) type* var = (type*)malloc( sizeof(type) );\
                                    if( !var ) return VLC_ENOMEM;
625
626
627
#define DECMALLOC_NULL( var, type ) type* var = (type*)malloc( sizeof(type) );\
                                    if( !var ) return NULL;

zorglub's avatar
zorglub committed
628
#define FREENULL(a) if( a ) { free( a ); a = NULL; }
629
#define FREE(a) if( a ) { free( a ); }
zorglub's avatar
zorglub committed
630

631
/* Dynamic array handling: realloc array, move data, increment position */
gbazin's avatar
gbazin committed
632
#if defined( _MSC_VER ) && _MSC_VER < 1300 && !defined( UNDER_CE )
633
634
635
636
#   define VLCCVP (void**) /* Work-around for broken compiler */
#else
#   define VLCCVP
#endif
637
638
639
#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )                           \
    do                                                                        \
    {                                                                         \
640
641
        if( !i_oldsize ) (p_ar) = NULL;                                       \
        (p_ar) = VLCCVP realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \
gbazin's avatar
   
gbazin committed
642
643
        if( (i_oldsize) - (i_pos) )                                           \
        {                                                                     \
644
            memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos),                  \
gbazin's avatar
   
gbazin committed
645
646
                     ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );           \
        }                                                                     \
647
648
649
650
651
652
653
654
        (p_ar)[i_pos] = elem;                                                 \
        (i_oldsize)++;                                                        \
    }                                                                         \
    while( 0 )

#define REMOVE_ELEM( p_ar, i_oldsize, i_pos )                                 \
    do                                                                        \
    {                                                                         \
gbazin's avatar
   
gbazin committed
655
656
657
658
659
660
        if( (i_oldsize) - (i_pos) - 1 )                                       \
        {                                                                     \
            memmove( (p_ar) + (i_pos),                                        \
                     (p_ar) + (i_pos) + 1,                                    \
                     ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) );       \
        }                                                                     \
661
662
663
664
665
666
667
668
669
670
671
672
673
674
        if( i_oldsize > 1 )                                                   \
        {                                                                     \
            (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) );  \
        }                                                                     \
        else                                                                  \
        {                                                                     \
            free( p_ar );                                                     \
            (p_ar) = NULL;                                                    \
        }                                                                     \
        (i_oldsize)--;                                                        \
    }                                                                         \
    while( 0 )


675
676
677
#define TAB_APPEND( count, tab, p )             \
    if( (count) > 0 )                           \
    {                                           \
678
        (tab) = realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \
679
680
681
    }                                           \
    else                                        \
    {                                           \
682
        (tab) = malloc( sizeof( void ** ) );    \
683
    }                                           \
684
    (tab)[count] = (p);        \
685
686
687
688
689
690
691
692
    (count)++

#define TAB_FIND( count, tab, p, index )        \
    {                                           \
        int _i_;                                \
        (index) = -1;                           \
        for( _i_ = 0; _i_ < (count); _i_++ )    \
        {                                       \
693
            if( (tab)[_i_] == (p) )  \
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
            {                                   \
                (index) = _i_;                  \
                break;                          \
            }                                   \
        }                                       \
    }

#define TAB_REMOVE( count, tab, p )             \
    {                                           \
        int _i_index_;                          \
        TAB_FIND( count, tab, p, _i_index_ );   \
        if( _i_index_ >= 0 )                    \
        {                                       \
            if( (count) > 1 )                     \
            {                                   \
                memmove( ((void**)(tab) + _i_index_),    \
                         ((void**)(tab) + _i_index_+1),  \
                         ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\
            }                                   \
713
714
            (count)--;                          \
            if( (count) == 0 )                  \
715
716
717
718
719
720
721
            {                                   \
                free( tab );                    \
                (tab) = NULL;                   \
            }                                   \
        }                                       \
    }

zorglub's avatar
zorglub committed
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
/* Binary search in an array */
#define BSEARCH( entries, count, elem, zetype, key, answer ) {  \
    int low = 0, high = count - 1;   \
    answer = -1; \
    while( low <= high ) {\
        int mid = (low + high ) / 2; /* Just don't care about 2^30 tables */ \
        zetype mid_val = entries[mid] elem;\
        if( mid_val < key ) \
            low = mid + 1; \
        else if ( mid_val > key ) \
            high = mid -1;  \
        else    \
        {   \
            answer = mid;  break;   \
        }\
    } \
}

/* Dictionnary handling */
struct dict_entry_t
zorglub's avatar
zorglub committed
742
{
zorglub's avatar
zorglub committed
743
744
    int       i_int;
    char     *psz_string;
zorglub's avatar
zorglub committed
745
746
747
748
    uint64_t  i_hash;
    void     *p_data;
};

zorglub's avatar
zorglub committed
749
750
751
752
753
struct dict_t
{
    dict_entry_t *p_entries;
    int i_entries;
};
zorglub's avatar
zorglub committed
754

zorglub's avatar
zorglub committed
755
756
757
758
759
VLC_EXPORT( dict_t *, vlc_DictNew, (void) );
VLC_EXPORT( void, vlc_DictClear, (dict_t * ) );
VLC_EXPORT( void, vlc_DictInsert, (dict_t *, int, const char *, void * ) );
VLC_EXPORT( void*, vlc_DictGet, (dict_t *, int, const char * ) );
VLC_EXPORT( int, vlc_DictLookup, (dict_t *, int, const char * ) );
zorglub's avatar
zorglub committed
760

Sam Hocevar's avatar
   
Sam Hocevar committed
761
762
763
/* MSB (big endian)/LSB (little endian) conversions - network order is always
 * MSB, and should be used for both network communications and files. Note that
 * byte orders other than little and big endians are not supported, but only
764
 * the VAX seems to have such exotic properties. */
Sam Hocevar's avatar
Sam Hocevar committed
765
static inline uint16_t U16_AT( void const * _p )
766
{
767
768
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint16_t)p[0] << 8) | p[1] );
769
}
Sam Hocevar's avatar
Sam Hocevar committed
770
static inline uint32_t U32_AT( void const * _p )
771
{
772
773
774
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
              | ((uint32_t)p[2] << 8) | p[3] );
775
}
Sam Hocevar's avatar
Sam Hocevar committed
776
static inline uint64_t U64_AT( void const * _p )
777
{
778
779
780
781
782
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
              | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
              | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
              | ((uint64_t)p[6] << 8) | p[7] );
783
}
784

Sam Hocevar's avatar
Sam Hocevar committed
785
static inline uint16_t GetWLE( void const * _p )
786
787
788
789
{
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint16_t)p[1] << 8) | p[0] );
}
Sam Hocevar's avatar
Sam Hocevar committed
790
static inline uint32_t GetDWLE( void const * _p )
791
792
793
794
795
{
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
              | ((uint32_t)p[1] << 8) | p[0] );
}
Sam Hocevar's avatar
Sam Hocevar committed
796
static inline uint64_t GetQWLE( void const * _p )
797
798
799
800
801
802
803
804
805
806
807
808
{
    uint8_t * p = (uint8_t *)_p;
    return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
              | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
              | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
              | ((uint64_t)p[1] << 8) | p[0] );
}

#define GetWBE( p )     U16_AT( p )
#define GetDWBE( p )    U32_AT( p )
#define GetQWBE( p )    U64_AT( p )

gbazin's avatar
   
gbazin committed
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
/* Helper writer functions */
#define SetWLE( p, v ) _SetWLE( (uint8_t*)p, v)
static inline void _SetWLE( uint8_t *p, uint16_t i_dw )
{
    p[1] = ( i_dw >>  8 )&0xff;
    p[0] = ( i_dw       )&0xff;
}

#define SetDWLE( p, v ) _SetDWLE( (uint8_t*)p, v)
static inline void _SetDWLE( uint8_t *p, uint32_t i_dw )
{
    p[3] = ( i_dw >> 24 )&0xff;
    p[2] = ( i_dw >> 16 )&0xff;
    p[1] = ( i_dw >>  8 )&0xff;
    p[0] = ( i_dw       )&0xff;
}
#define SetQWLE( p, v ) _SetQWLE( (uint8_t*)p, v)
static inline void _SetQWLE( uint8_t *p, uint64_t i_qw )
{
    SetDWLE( p,   i_qw&0xffffffff );
    SetDWLE( p+4, ( i_qw >> 32)&0xffffffff );
}
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
#define SetWBE( p, v ) _SetWBE( (uint8_t*)p, v)
static inline void _SetWBE( uint8_t *p, uint16_t i_dw )
{
    p[0] = ( i_dw >>  8 )&0xff;
    p[1] = ( i_dw       )&0xff;
}

#define SetDWBE( p, v ) _SetDWBE( (uint8_t*)p, v)
static inline void _SetDWBE( uint8_t *p, uint32_t i_dw )
{
    p[0] = ( i_dw >> 24 )&0xff;
    p[1] = ( i_dw >> 16 )&0xff;
    p[2] = ( i_dw >>  8 )&0xff;
    p[3] = ( i_dw       )&0xff;
}
#define SetQWBE( p, v ) _SetQWBE( (uint8_t*)p, v)
static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
{
    SetDWBE( p+4,   i_qw&0xffffffff );
    SetDWBE( p, ( i_qw >> 32)&0xffffffff );
}
852

Sam Hocevar's avatar
   
Sam Hocevar committed
853
#if WORDS_BIGENDIAN
854
855
#   define hton16(i)   ( i )
#   define hton32(i)   ( i )
Sam Hocevar's avatar
   
Sam Hocevar committed
856
#   define hton64(i)   ( i )
857
858
#   define ntoh16(i)   ( i )
#   define ntoh32(i)   ( i )
Sam Hocevar's avatar
   
Sam Hocevar committed
859
860
#   define ntoh64(i)   ( i )
#else
861
862
863
864
865
866
#   define hton16(i)   U16_AT(&i)
#   define hton32(i)   U32_AT(&i)
#   define hton64(i)   U64_AT(&i)
#   define ntoh16(i)   U16_AT(&i)
#   define ntoh32(i)   U32_AT(&i)
#   define ntoh64(i)   U64_AT(&i)
Sam Hocevar's avatar
   
Sam Hocevar committed
867
868
#endif

869
870
871
872
873
874
875
/* Format string sanity checks */
#ifdef HAVE_ATTRIBUTE_FORMAT
#   define ATTRIBUTE_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
#else
#   define ATTRIBUTE_FORMAT(x,y)
#endif

Sam Hocevar's avatar
   
Sam Hocevar committed
876
877
878
879
880
881
882
/* Alignment of critical static data structures */
#ifdef ATTRIBUTE_ALIGNED_MAX
#   define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
#else
#   define ATTR_ALIGN(align)
#endif

gbazin's avatar
   
gbazin committed
883
884
885
886
887
888
889
890
891
892
893
894
/* Alignment of critical dynamic data structure
 *
 * Not all platforms support memalign so we provide a vlc_memalign wrapper
 * void *vlc_memalign( size_t align, size_t size, void **pp_orig )
 * *pp_orig is the pointer that has to be freed afterwards.
 */
#if 0
#ifdef HAVE_POSIX_MEMALIGN
#   define vlc_memalign(align,size,pp_orig) \
    ( !posix_memalign( pp_orig, align, size ) ? *(pp_orig) : NULL )
#endif
#endif
Sam Hocevar's avatar
   
Sam Hocevar committed
895
896
897
#ifdef HAVE_MEMALIGN
    /* Some systems have memalign() but no declaration for it */
    void * memalign( size_t align, size_t size );
gbazin's avatar
   
gbazin committed
898

899
#   define vlc_memalign(pp_orig,align,size) \
gbazin's avatar
   
gbazin committed
900
901
902
    ( *(pp_orig) = memalign( align, size ) )

#else /* We don't have any choice but to align manually */
903
904
905
#   define vlc_memalign(pp_orig,align,size) \
    (( *(pp_orig) = malloc( size + align - 1 )) \
        ? (void *)( (((unsigned long)*(pp_orig)) + (unsigned long)(align-1) ) \
906
                       & (~(unsigned long)(align-1)) ) \
907
        : NULL )
gbazin's avatar
   
gbazin committed
908

Sam Hocevar's avatar
   
Sam Hocevar committed
909
910
#endif

911
/* Stuff defined in src/extras/libc.c */
912
#ifndef HAVE_STRDUP
913
914
915
916
#   define strdup vlc_strdup
    VLC_EXPORT( char *, vlc_strdup, ( const char *s ) );
#elif !defined(__PLUGIN__)
#   define vlc_strdup NULL
917
#endif
918

919
#if !defined(HAVE_VASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS)
920
#   define vasprintf vlc_vasprintf
921
    VLC_EXPORT( int, vlc_vasprintf, (char **, const char *, va_list ) );
922
923
924
925
#elif !defined(__PLUGIN__)
#   define vlc_vasprintf NULL
#endif

926
#if !defined(HAVE_ASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS)
gbazin's avatar
   
gbazin committed
927
928
929
930
931
932
#   define asprintf vlc_asprintf
    VLC_EXPORT( int, vlc_asprintf, (char **, const char *, ... ) );
#elif !defined(__PLUGIN__)
#   define vlc_asprintf NULL
#endif

933
#ifndef HAVE_STRNDUP
934
#   if defined(STRNDUP_IN_GNOME_H) && \
935
936
        (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\
         defined(MODULE_NAME_IS_gnome2)||defined(MODULE_NAME_IS_gnome2_main))
937
938
939
940
941
        /* Do nothing: gnome.h defines strndup for us */
#   else
#       define strndup vlc_strndup
        VLC_EXPORT( char *, vlc_strndup, ( const char *s, size_t n ) );
#   endif
942
943
#elif !defined(__PLUGIN__)
#   define vlc_strndup NULL
944
945
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
946
947
948
949
950
951
952
#ifndef HAVE_STRLCPY
#   define strlcpy vlc_strlcpy
    VLC_EXPORT( size_t, vlc_strlcpy, ( char *, const char *, size_t ) );
#elif !defined(__PLUGIN__)
#   define vlc_strlcpy NULL
#endif

953
#ifndef HAVE_ATOF
954
955
956
957
#   define atof vlc_atof
    VLC_EXPORT( double, vlc_atof, ( const char *nptr ) );
#elif !defined(__PLUGIN__)
#   define vlc_atof NULL
958
959
#endif

960
961
962
963
964
965
#ifndef HAVE_STRTOF
#   ifdef HAVE_STRTOD
#       define strtof strtod
#   endif
#endif

966
967
968
969
970
#ifndef HAVE_ATOLL
#   define atoll vlc_atoll
    VLC_EXPORT( int64_t, vlc_atoll, ( const char *nptr ) );
#elif !defined(__PLUGIN__)
#   define vlc_atoll NULL
971
972
973
974
975
976
977
#endif

#ifndef HAVE_STRTOLL
#   define strtoll vlc_strtoll
    VLC_EXPORT( int64_t, vlc_strtoll, ( const char *nptr, char **endptr, int base ) );
#elif !defined(__PLUGIN__)
#   define vlc_strtoll NULL
978
979
#endif

980
#if defined(SYS_BEOS)
981
982
983
984
985
986
987
988
989
990
    typedef struct {
        long long quot; /* Quotient. */
        long long rem;  /* Remainder. */
    } lldiv_t;
#   define lldiv vlc_lldiv
    VLC_EXPORT( lldiv_t, vlc_lldiv, ( long long numer, long long denom ) );
#elif !defined(__PLUGIN__)
#   define vlc_lldiv NULL
#endif

991
992
993
#ifndef HAVE_SCANDIR
#   define scandir vlc_scandir
#   define alphasort vlc_alphasort
994
    struct dirent;
995
996
    VLC_EXPORT( int, vlc_scandir, ( const char *name, struct dirent ***namelist, int (*filter) ( const struct dirent * ), int (*compar) ( const struct dirent **, const struct dirent ** ) ) );
    VLC_EXPORT( int, vlc_alphasort, ( const struct dirent **a, const struct dirent **b ) );
997
998
999
1000
1001
#elif !defined(__PLUGIN__)
#   define vlc_scandir NULL
#   define vlc_alphasort NULL
#endif

1002
#ifndef HAVE_GETENV
1003
1004
1005
1006
#   define getenv vlc_getenv
    VLC_EXPORT( char *, vlc_getenv, ( const char *name ) );
#elif !defined(__PLUGIN__)
#   define vlc_getenv NULL
1007
1008
1009
#endif

#ifndef HAVE_STRCASECMP
1010
1011
1012
1013
#   ifndef HAVE_STRICMP
#       define strcasecmp vlc_strcasecmp
        VLC_EXPORT( int, vlc_strcasecmp, ( const char *s1, const char *s2 ) );
#   else
1014
#       define strcasecmp stricmp
gbazin's avatar
   
gbazin committed
1015
1016
1017
#       if !defined(__PLUGIN__)
#           define vlc_strcasecmp NULL
#       endif
1018
#   endif
1019
1020
#elif !defined(__PLUGIN__)
#   define vlc_strcasecmp NULL
1021
1022
1023
#endif

#ifndef HAVE_STRNCASECMP
1024
1025
1026
1027
#   ifndef HAVE_STRNICMP
#       define strncasecmp vlc_strncasecmp
        VLC_EXPORT( int, vlc_strncasecmp, ( const char *s1, const char *s2, size_t n ) );
#   else
1028
#       define strncasecmp strnicmp
gbazin's avatar
   
gbazin committed
1029
1030
1031
#       if !defined(__PLUGIN__)
#           define vlc_strncasecmp NULL
#       endif
1032
#   endif
1033
1034
#elif !defined(__PLUGIN__)
#   define vlc_strncasecmp NULL
1035
1036
#endif

1037
#ifndef HAVE_STRCASESTR
1038
1039
1040
1041
#   ifndef HAVE_STRISTR
#       define strcasestr vlc_strcasestr
        VLC_EXPORT( char *, vlc_strcasestr, ( const char *s1, const char *s2 ) );
#   else
1042
1043
1044
1045
1046
1047
1048
1049
1050
#       define strcasestr stristr
#       if !defined(__PLUGIN__)
#           define vlc_strcasestr NULL
#       endif
#   endif
#elif !defined(__PLUGIN__)
#   define vlc_strcasestr NULL
#endif

1051
#ifndef HAVE_DIRENT_H
1052
    typedef void DIR;
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
#   ifndef FILENAME_MAX
#       define FILENAME_MAX (260)
#   endif
    struct dirent
    {
        long            d_ino;          /* Always zero. */
        unsigned short  d_reclen;       /* Always zero. */
        unsigned short  d_namlen;       /* Length of name in d_name. */
        char            d_name[FILENAME_MAX]; /* File name. */
    };
#   define opendir vlc_opendir
#   define readdir vlc_readdir
#   define closedir vlc_closedir
1066
1067
1068
    VLC_EXPORT( void *, vlc_opendir, ( const char * ) );
    VLC_EXPORT( void *, vlc_readdir, ( void * ) );
    VLC_EXPORT( int, vlc_closedir, ( void * ) );
1069
1070
1071
1072
1073
1074
1075
#else
    struct dirent;  /* forward declaration for vlc_symbols.h */
#   if !defined(__PLUGIN__)
#       define vlc_opendir  NULL
#       define vlc_readdir  NULL
#       define vlc_closedir NULL
#   endif
1076
1077
#endif

1078
1079
1080
1081
    VLC_EXPORT( void *, vlc_opendir_wrapper, ( const char * ) );
    VLC_EXPORT( struct dirent *, vlc_readdir_wrapper, ( void * ) );
    VLC_EXPORT( int, vlc_closedir_wrapper, ( void * ) );

gbazin's avatar
   
gbazin committed
1082
/* Format type specifiers for 64 bits numbers */
damienf's avatar
damienf committed
1083
#if defined(__CYGWIN32__) || (!defined(WIN32) && !defined(UNDER_CE))
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
#   if defined(__WORDSIZE) && __WORDSIZE == 64
#       define I64Fd "%ld"
#       define I64Fi "%li"
#       define I64Fo "%lo"
#       define I64Fu "%lu"
#       define I64Fx "%lx"
#       define I64FX "%lX"
#   else
#       define I64Fd "%lld"
#       define I64Fi "%lli"
#       define I64Fo "%llo"
#       define I64Fu "%llu"
#       define I64Fx "%llx"
#       define I64FX "%llX"
#   endif
gbazin's avatar
   
gbazin committed
1099
1100
1101
1102
1103
1104
1105
#else
#   define I64Fd "%I64d"
#   define I64Fi "%I64i"
#   define I64Fo "%I64o"
#   define I64Fu "%I64u"
#   define I64Fx "%I64x"
#   define I64FX "%I64X"
1106
#endif /* defined(WIN32)||defined(UNDER_CE) */
gbazin's avatar
   
gbazin committed
1107
1108

/* 64 bits integer constant suffix */
gbazin's avatar
   
gbazin committed
1109
#if defined( __MINGW32__ ) || (!defined(WIN32) && !defined(UNDER_CE))
1110
1111
1112
1113
1114
1115
1116
#   if defined(__WORDSIZE) && __WORDSIZE == 64
#       define I64C(x)         x##L
#       define UI64C(x)        x##UL
#   else
#       define I64C(x)         x##LL
#       define UI64C(x)        x##ULL
#   endif
gbazin's avatar
   
gbazin committed
1117
1118
#else
#   define I64C(x)         x##i64
gbazin's avatar
   
gbazin committed
1119
#   define UI64C(x)        x##ui64
1120
#endif /* defined(WIN32)||defined(UNDER_CE) */
Sam Hocevar's avatar
   
Sam Hocevar committed
1121

1122
#if defined(WIN32) || defined(UNDER_CE)
Sam Hocevar's avatar
   
Sam Hocevar committed
1123
/* win32, cl and icl support */
Sam Hocevar's avatar
   
Sam Hocevar committed
1124
#   if defined( _MSC_VER ) || !defined( __MINGW32__ )
Sam Hocevar's avatar
   
Sam Hocevar committed
1125
1126
#       define __attribute__(x)
#       define __inline__      __inline
gbazin's avatar
   
gbazin committed
1127
#       define S_IFBLK         0x3000  /* Block */
Sam Hocevar's avatar
   
Sam Hocevar committed
1128
1129
1130
1131
1132
1133
1134
1135
1136
#       define S_ISBLK(m)      (0)
#       define S_ISCHR(m)      (0)
#       define S_ISFIFO(m)     (((m)&_S_IFMT) == _S_IFIFO)
#       define S_ISREG(m)      (((m)&_S_IFMT) == _S_IFREG)
#   endif

/* several type definitions */
#   if defined( __MINGW32__ )
#       if !defined( _OFF_T_ )
1137
1138
            typedef long long _off_t;
            typedef _off_t off_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
1139
1140
#           define _OFF_T_
#       else
gbazin's avatar
   
gbazin committed
1141
1142
1143
#           ifdef off_t
#               undef off_t
#           endif
Sam Hocevar's avatar
   
Sam Hocevar committed
1144
1145
1146
1147
#           define off_t long long
#       endif
#   endif

1148
#   if defined( _MSC_VER ) && !defined( __WXMSW__ )
Sam Hocevar's avatar
   
Sam Hocevar committed
1149
#       if !defined( _OFF_T_DEFINED )
1150
            typedef __int64 off_t;
Sam Hocevar's avatar
   
Sam Hocevar committed
1151
1152
#           define _OFF_T_DEFINED
#       else
1153
            /* for wx compatibility typedef long off_t; */
Sam Hocevar's avatar
   
Sam Hocevar committed
1154
1155
1156
1157
#           define off_t __int64
#       endif
#   endif

ipkiss's avatar
   
ipkiss committed
1158
#   if defined( __BORLANDC__ )
Sam Hocevar's avatar
   
Sam Hocevar committed
1159
#       undef off_t
ipkiss's avatar
   
ipkiss committed
1160
#       define off_t unsigned __int64
Sam Hocevar's avatar
   
Sam Hocevar committed
1161
1162
#   endif

gbazin's avatar
   
gbazin committed
1163
1164
#   ifndef O_NONBLOCK
#       define O_NONBLOCK 0
gbazin's avatar
   
gbazin committed
1165
1166
1167
1168
#   endif

#   ifndef alloca
#       define alloca _alloca
gbazin's avatar
   
gbazin committed
1169
1170
#   endif

1171
    /* These two are not defined in mingw32 (bug?) */
Sam Hocevar's avatar
   
Sam Hocevar committed
1172
#   ifndef snprintf
1173
1174
1175
1176
#       define snprintf _snprintf
#   endif
#   ifndef vsnprintf
#       define vsnprintf _vsnprintf
Sam Hocevar's avatar
   
Sam Hocevar committed
1177
1178
#   endif

1179
#   include <tchar.h>
Sam Hocevar's avatar
   
Sam Hocevar committed
1180
1181
#endif