X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_common.h;h=7a9bbae3fabb451bc9fd6d27401d2d72952e556b;hb=1b09c02c7e8162abb14d6f30980b09c7d7b34200;hp=6ee1c7b6ab4d076dd67fc6ab707f8571acc8c7bd;hpb=c370d8acd4dc539344acfe6cd3f2fb7e6eafb53a;p=vlc diff --git a/include/vlc_common.h b/include/vlc_common.h index 6ee1c7b6ab..7719c0fe34 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -2,7 +2,7 @@ * common.h: common definitions * Collection of useful common types and macros definitions ***************************************************************************** - * Copyright (C) 1998-2005 VideoLAN + * Copyright (C) 1998-2005 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar @@ -21,7 +21,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /** @@ -29,24 +29,14 @@ * This file is a collection of common definitions and types */ +#ifndef PACKAGE +/* Temporary regression test */ +#error You probably forgot to include config.h!! +#endif + /***************************************************************************** * Required vlc headers *****************************************************************************/ -#if defined( __BORLANDC__ ) -# undef PACKAGE -#endif - -#include "config.h" - -#if defined(PACKAGE) -# undef PACKAGE_NAME -# define PACKAGE_NAME PACKAGE -#endif -#if defined(VERSION) -# undef PACKAGE_VERSION -# define PACKAGE_VERSION VERSION -#endif - #if defined( __BORLANDC__ ) # undef HAVE_VARIADIC_MACROS # undef HAVE_STDINT_H @@ -57,7 +47,6 @@ #endif #include "vlc_config.h" -#include "modules_inner.h" /***************************************************************************** * Required system headers @@ -65,9 +54,8 @@ #include #include -#ifdef HAVE_STRING_H -# include /* strerror() */ -#endif +#include +#include #ifdef HAVE_SYS_TYPES_H # include @@ -193,18 +181,40 @@ typedef uint32_t vlc_fourcc_t; #endif +static inline void __vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) +{ +#ifdef WORDS_BIGENDIAN + psz_fourcc[0] = (uint32_t) (fcc >> 24); + psz_fourcc[1] = (uint32_t) (fcc >> 16); + psz_fourcc[2] = (uint32_t) (fcc >> 8); + psz_fourcc[3] = (uint32_t) (fcc); +#else + psz_fourcc[3] = (uint32_t) (fcc >> 24); + psz_fourcc[2] = (uint32_t) (fcc >> 16); + psz_fourcc[1] = (uint32_t) (fcc >> 8); + psz_fourcc[0] = (uint32_t) (fcc); +#endif +} + +#define vlc_fourcc_to_char( a, b ) \ + __vlc_fourcc_to_char( (vlc_fourcc_t)(a), (char *)(b) ) + /***************************************************************************** * Classes declaration *****************************************************************************/ /* Internal types */ -typedef struct libvlc_t libvlc_t; -typedef struct vlc_t vlc_t; +typedef struct libvlc_global_data_t libvlc_global_data_t; +typedef struct libvlc_int_t libvlc_int_t; typedef struct variable_t variable_t; typedef struct date_t date_t; +typedef struct dict_entry_t dict_entry_t; +typedef struct dict_t dict_t; +typedef struct gc_object_t gc_object_t ; /* Messages */ typedef struct msg_bank_t msg_bank_t; +typedef struct msg_queue_t msg_queue_t; typedef struct msg_subscription_t msg_subscription_t; /* Playlist */ @@ -216,14 +226,11 @@ typedef struct msg_subscription_t msg_subscription_t; typedef enum { PLAYLIST_PLAY, /**< No arg. res=can fail*/ PLAYLIST_AUTOPLAY, /**< No arg. res=cant fail*/ - PLAYLIST_VIEWPLAY, /**< arg1= int, arg2= playlist_item_t*,*/ - /** arg3 = playlist_item_t* , res=can fail */ - PLAYLIST_ITEMPLAY, /** +struct _stati64; +#define stat _stati64 +#define fstat _fstati64 +/* You should otherwise use utf8_stat and utf8_lstat. */ +#else +struct stat; +#endif /***************************************************************************** * Variable callbacks @@ -423,11 +476,46 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ /***************************************************************************** * Plug-in stuff *****************************************************************************/ -#ifndef __PLUGIN__ -# define VLC_EXPORT( type, name, args ) type name args + +#include "vlc_modules_macros.h" + +#if defined (WIN32) && defined (DLL_EXPORT) +# ifdef __cplusplus +# define VLC_PUBLIC_API __declspec(dllexport) +# define VLC_PRIVATE_API __declspec(dllexport) +# define VLC_EXPORT( type, name, args ) extern "C" __declspec(dllexport) type name args +# define VLC_INTERNAL( type, name, args ) extern "C" type name args +# else +# define VLC_PUBLIC_API extern __declspec(dllexport) +# define VLC_PRIVATE_API extern __declspec(dllexport) +# define VLC_EXPORT( type, name, args ) __declspec(dllexport) type name args +# define VLC_INTERNAL( type, name, args ) type name args +# endif #else -# define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_ - extern module_symbols_t* p_symbols; +# ifdef __cplusplus +# if HAVE_ATTRIBUTE_VISIBILITY +# define VLC_PUBLIC_API __attribute__((visibility("default"))) +# define VLC_PRIVATE_API __attribute__((visibility("default"))) +# define VLC_EXPORT( type, name, args ) extern "C" __attribute__((visibility("default"))) type name args +# define VLC_INTERNAL( type, name, args ) extern "C" __attribute__((visibility("hidden"))) type name args +# else +# define VLC_PUBLIC_API +# define VLC_EXPORT( type, name, args ) extern "C" type name args +# define VLC_INTERNAL( type, name, args ) extern "C" type name args +# endif +# else +# if HAVE_ATTRIBUTE_VISIBILITY +# define VLC_PUBLIC_API extern __attribute__((visibility("default"))) +# define VLC_PRIVATE_API extern __attribute__((visibility("default"))) +# define VLC_EXPORT( type, name, args ) __attribute__((visibility("default"))) type name args +# define VLC_INTERNAL( type, name, args ) __attribute__((visibility("hidden"))) type name args +# else +# define VLC_PUBLIC_API extern +# define VLC_PRIVATE_API extern +# define VLC_EXPORT( type, name, args ) type name args +# define VLC_INTERNAL( type, name, args ) type name args +# endif +# endif #endif /***************************************************************************** @@ -445,6 +533,8 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ #include "vlc_threads.h" +typedef struct vlc_object_internals_t vlc_object_internals_t; + /***************************************************************************** * Common structure members *****************************************************************************/ @@ -455,14 +545,15 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ * these members are common for all vlc objects \ */ \ /**@{*/ \ + vlc_object_internals_t *p_internals; \ int i_object_id; \ int i_object_type; \ - char *psz_object_type; \ - char *psz_object_name; \ + const char *psz_object_type; \ + const char *psz_object_name; \ \ - /* Thread properties, if any */ \ - vlc_bool_t b_thread; \ - vlc_thread_t thread_id; \ + /* Messages header */ \ + char *psz_header; \ + int i_flags; \ \ /* Object access lock */ \ vlc_mutex_t object_lock; \ @@ -472,19 +563,11 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ 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 */ \ vlc_bool_t b_force; /**< set by the outside (eg. module_Need()) */ \ \ - /* Object variables */ \ - vlc_mutex_t var_lock; \ - int i_vars; \ - variable_t * p_vars; \ - \ /* Stuff related to the libvlc structure */ \ - libvlc_t * p_libvlc; /**< root of all evil */ \ - vlc_t * p_vlc; /**< (root of all evil) - 1 */ \ + libvlc_int_t *p_libvlc; /**< (root of all evil) - 1 */ \ \ - volatile int i_refcount; /**< usage count */ \ vlc_object_t * p_parent; /**< our parent */ \ vlc_object_t ** pp_children; /**< our children */ \ volatile int i_children; \ @@ -500,6 +583,59 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ #define VLC_OBJECT( x ) \ ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct +#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 +}; + +#include /* FIXME: should not be included here */ + +static inline void __vlc_gc_incref( gc_object_t * p_gc ) +{ + assert( p_gc->i_gc_refcount > 0 ); + + p_gc->i_gc_refcount ++; +}; + +static inline void __vlc_gc_decref( gc_object_t *p_gc ) +{ + if( !p_gc ) return; + + assert( p_gc->i_gc_refcount > 0 ); + + 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 ! */ + } +} + +static inline void +__vlc_gc_init( gc_object_t * p_gc, void (*pf_destructor)( gc_object_t * ), + void * arg) +{ + p_gc->i_gc_refcount = 1; + p_gc->pf_destructor = pf_destructor; + p_gc->p_destructor_arg = arg; +} + +#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 ) __vlc_gc_init( (gc_object_t *)a,b,c ) + + /***************************************************************************** * Macros and inline functions *****************************************************************************/ @@ -525,141 +661,86 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ # define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) #endif -static int64_t GCD( int64_t a, int64_t b ) +static inline int64_t GCD( int64_t a, int64_t b ) { - if( b ) return GCD( b, a % b ); - else return a; + while( b ) + { + int64_t c = a % b; + a = b; + b = c; + } + return a; } -/* Dynamic array handling: realloc array, move data, increment position */ -#if defined( _MSC_VER ) -# define VLCCVP (void**) /* Work-around for broken compiler */ -#else -# define VLCCVP -#endif -#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) \ - do \ - { \ - if( !i_oldsize ) (p_ar) = NULL; \ - (p_ar) = VLCCVP realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \ - if( (i_oldsize) - (i_pos) ) \ - { \ - memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos), \ - ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); \ - } \ - (p_ar)[i_pos] = elem; \ - (i_oldsize)++; \ - } \ - while( 0 ) - -#define REMOVE_ELEM( p_ar, i_oldsize, i_pos ) \ - do \ - { \ - if( (i_oldsize) - (i_pos) - 1 ) \ - { \ - memmove( (p_ar) + (i_pos), \ - (p_ar) + (i_pos) + 1, \ - ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ - } \ - 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 ) - - -#define TAB_APPEND( count, tab, p ) \ - if( (count) > 0 ) \ - { \ - (tab) = realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \ - } \ - else \ - { \ - (tab) = malloc( sizeof( void ** ) ); \ - } \ - (tab)[count] = (p); \ - (count)++ - -#define TAB_FIND( count, tab, p, index ) \ - { \ - int _i_; \ - (index) = -1; \ - for( _i_ = 0; _i_ < (count); _i_++ ) \ - { \ - if( (tab)[_i_] == (p) ) \ - { \ - (index) = _i_; \ - break; \ - } \ - } \ - } +/* function imported from libavutil/common.h */ +static inline uint8_t clip_uint8_vlc( int32_t a ) +{ + if( a&(~255) ) return (-a)>>31; + else return a; +} -#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* ) );\ - } \ - (count)--; \ - if( (count) == 0 ) \ - { \ - free( tab ); \ - (tab) = NULL; \ - } \ - } \ - } +/* Malloc with automatic error */ +#define MALLOC_VOID( var, type ) do { var = (type*)malloc( sizeof( type) ); \ + if( !var ) return; } while(0) +#define MALLOC_NULL( var, type ) do { var = (type*)malloc( sizeof( type) ); \ + if( !var ) return NULL; } while(0) +#define MALLOC_ERR( var, type ) do { var = (type*)malloc( sizeof( type) ); \ + if( !var ) return VLC_ENOMEM; } while(0) +#define MALLOC_GOTOERR( var, type ) do { var = (type*)malloc( sizeof( type) ); \ + if( !var ) goto error; } while(0) +#define DECMALLOC_VOID( var, type ) type* var = (type*)malloc( sizeof(type) );\ + if( !var ) return; +#define DECMALLOC_ERR( var, type ) type* var = (type*)malloc( sizeof(type) );\ + if( !var ) return VLC_ENOMEM; +#define DECMALLOC_NULL( var, type ) type* var = (type*)malloc( sizeof(type) );\ + if( !var ) return NULL; + +#define FREENULL(a) do { free( a ); a = NULL; } while(0) + +#define EMPTY_STR(str) (!str || !*str) + +VLC_EXPORT( char const *, vlc_error, ( int ) ); + +#include /* 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 * the VAX seems to have such exotic properties. */ -static inline uint16_t U16_AT( void const * _p ) +static inline uint16_t U16_AT( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const uint8_t *)_p; return ( ((uint16_t)p[0] << 8) | p[1] ); } -static inline uint32_t U32_AT( void const * _p ) +static inline uint32_t U32_AT( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const uint8_t *)_p; return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | p[3] ); } -static inline uint64_t U64_AT( void const * _p ) +static inline uint64_t U64_AT( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const 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] ); } -static inline uint16_t GetWLE( void const * _p ) +static inline uint16_t GetWLE( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const uint8_t *)_p; return ( ((uint16_t)p[1] << 8) | p[0] ); } -static inline uint32_t GetDWLE( void const * _p ) +static inline uint32_t GetDWLE( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const uint8_t *)_p; return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16) | ((uint32_t)p[1] << 8) | p[0] ); } -static inline uint64_t GetQWLE( void const * _p ) +static inline uint64_t GetQWLE( const void * _p ) { - uint8_t * p = (uint8_t *)_p; + const uint8_t * p = (const 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) @@ -671,14 +752,14 @@ static inline uint64_t GetQWLE( void const * _p ) #define GetQWBE( p ) U64_AT( p ) /* Helper writer functions */ -#define SetWLE( p, v ) _SetWLE( (uint8_t*)p, v) +#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) +#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; @@ -686,20 +767,20 @@ static inline void _SetDWLE( uint8_t *p, uint32_t i_dw ) p[1] = ( i_dw >> 8 )&0xff; p[0] = ( i_dw )&0xff; } -#define SetQWLE( p, v ) _SetQWLE( (uint8_t*)p, v) +#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 ); } -#define SetWBE( p, v ) _SetWBE( (uint8_t*)p, v) +#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) +#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; @@ -707,14 +788,14 @@ static inline void _SetDWBE( uint8_t *p, uint32_t i_dw ) p[2] = ( i_dw >> 8 )&0xff; p[3] = ( i_dw )&0xff; } -#define SetQWBE( p, v ) _SetQWBE( (uint8_t*)p, v) +#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 ); } -#if WORDS_BIGENDIAN +#ifdef WORDS_BIGENDIAN # define hton16(i) ( i ) # define hton32(i) ( i ) # define hton64(i) ( i ) @@ -744,6 +825,9 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define ATTR_ALIGN(align) #endif +/* */ +#define VLC_UNUSED(x) (void)(x) + /* Alignment of critical dynamic data structure * * Not all platforms support memalign so we provide a vlc_memalign wrapper @@ -780,16 +864,16 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define vlc_strdup NULL #endif -#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) +#if !defined(HAVE_VASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS) # define vasprintf vlc_vasprintf VLC_EXPORT( int, vlc_vasprintf, (char **, const char *, va_list ) ); #elif !defined(__PLUGIN__) # define vlc_vasprintf NULL #endif -#if !defined(HAVE_ASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) +#if !defined(HAVE_ASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS) # define asprintf vlc_asprintf - VLC_EXPORT( int, vlc_asprintf, (char **, const char *, ... ) ); + VLC_EXPORT( int, vlc_asprintf, (char **, const char *, ... ) ATTRIBUTE_FORMAT( 2, 3 ) ); #elif !defined(__PLUGIN__) # define vlc_asprintf NULL #endif @@ -807,6 +891,20 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define vlc_strndup NULL #endif +#ifndef HAVE_STRNLEN +# define strnlen vlc_strnlen + VLC_EXPORT( size_t, vlc_strnlen, ( const char *, size_t ) ); +#elif !defined(__PLUGIN__) +# define vlc_strnlen NULL +#endif + +#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 + #ifndef HAVE_ATOF # define atof vlc_atof VLC_EXPORT( double, vlc_atof, ( const char *nptr ) ); @@ -834,6 +932,29 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define vlc_strtoll NULL #endif +#if defined(SYS_BEOS) \ + || (defined (__FreeBSD__) && (__FreeBSD__ < 5)) + 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 + +#ifndef HAVE_SCANDIR +# define scandir vlc_scandir +# define alphasort vlc_alphasort + struct dirent; + 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 ) ); +#elif !defined(__PLUGIN__) +# define vlc_scandir NULL +# define vlc_alphasort NULL +#endif + #ifndef HAVE_GETENV # define getenv vlc_getenv VLC_EXPORT( char *, vlc_getenv, ( const char *name ) ); @@ -898,23 +1019,61 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define opendir vlc_opendir # define readdir vlc_readdir # define closedir vlc_closedir +# define rewinddir vlc_rewindir +# define seekdir vlc_seekdir +# define telldir vlc_telldir VLC_EXPORT( void *, vlc_opendir, ( const char * ) ); VLC_EXPORT( void *, vlc_readdir, ( void * ) ); VLC_EXPORT( int, vlc_closedir, ( void * ) ); + VLC_INTERNAL( void, vlc_rewinddir, ( void * ) ); + VLC_INTERNAL( void, vlc_seekdir, ( void *, long ) ); + VLC_INTERNAL( long, vlc_telldir, ( void * ) ); +#else +# if !defined(__PLUGIN__) +# define vlc_opendir NULL +# define vlc_readdir NULL +# define vlc_closedir NULL +# endif +#endif + +#if defined (WIN32) +# include + VLC_INTERNAL( void *, vlc_wopendir, ( const wchar_t * ) ); + VLC_INTERNAL( struct _wdirent *, vlc_wreaddir, ( void * ) ); + VLC_EXPORT( int, vlc_wclosedir, ( void * ) ); + VLC_INTERNAL( void, vlc_rewinddir, ( void * ) ); + VLC_INTERNAL( void, vlc_seekdir, ( void *, long ) ); + VLC_INTERNAL( long, vlc_telldir, ( void * ) ); +# define opendir Use_utf8_opendir_or_vlc_wopendir_instead! +# define readdir Use_utf8_readdir_or_vlc_wreaddir_instead! +# define closedir vlc_wclosedir +# define _wopendir vlc_wopendir +# define _wreaddir vlc_wreaddir +# define _wclosedir vlc_wclosedir +# define rewinddir vlc_rewinddir +# define seekdir vlc_seekdir +# define telldir vlc_telldir #elif !defined(__PLUGIN__) -# define vlc_opendir NULL -# define vlc_readdir NULL -# define vlc_closedir NULL +# define vlc_wclosedir NULL #endif /* Format type specifiers for 64 bits numbers */ #if defined(__CYGWIN32__) || (!defined(WIN32) && !defined(UNDER_CE)) -# define I64Fd "%lld" -# define I64Fi "%lli" -# define I64Fo "%llo" -# define I64Fu "%llu" -# define I64Fx "%llx" -# define I64FX "%llX" +# 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 #else # define I64Fd "%I64d" # define I64Fi "%I64i" @@ -926,8 +1085,13 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) /* 64 bits integer constant suffix */ #if defined( __MINGW32__ ) || (!defined(WIN32) && !defined(UNDER_CE)) -# define I64C(x) x##LL -# define UI64C(x) x##ULL +# 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 #else # define I64C(x) x##i64 # define UI64C(x) x##ui64 @@ -948,8 +1112,8 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) /* several type definitions */ # if defined( __MINGW32__ ) # if !defined( _OFF_T_ ) -typedef long long _off_t; -typedef _off_t off_t; + typedef long long _off_t; + typedef _off_t off_t; # define _OFF_T_ # else # ifdef off_t @@ -959,17 +1123,15 @@ typedef _off_t off_t; # endif # endif -/* -# if (defined( _MSC_VER ) && (!defined(__WXMSW__))) +# if defined( _MSC_VER ) && !defined( __WXMSW__ ) # if !defined( _OFF_T_DEFINED ) -typedef __int64 off_t; + typedef __int64 off_t; # define _OFF_T_DEFINED # else + /* for wx compatibility typedef long off_t; */ # define off_t __int64 - // for wx compatibility typedef long off_t; # endif # endif -*/ # if defined( __BORLANDC__ ) # undef off_t @@ -995,19 +1157,23 @@ typedef __int64 off_t; # include #endif -VLC_EXPORT( vlc_bool_t, vlc_reduce, ( int *, int *, int64_t, int64_t, int64_t ) ); +VLC_EXPORT( vlc_bool_t, vlc_ureduce, ( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ) ); VLC_EXPORT( char **, vlc_parse_cmdline, ( const char *, int * ) ); /* vlc_wraptext (defined in src/extras/libc.c) */ #define wraptext vlc_wraptext -VLC_EXPORT( char *, vlc_wraptext, ( const char *, int, vlc_bool_t ) ); +VLC_EXPORT( char *, vlc_wraptext, ( const char *, int ) ); /* iconv wrappers (defined in src/extras/libc.c) */ typedef void *vlc_iconv_t; VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) ); -VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, char **, size_t *, char **, size_t * ) ); +VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) ); VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) ); +/* execve wrapper (defined in src/extras/libc.c) */ +VLC_EXPORT( int, __vlc_execve, ( vlc_object_t *p_object, int i_argc, char *const *pp_argv, char *const *pp_env, const char *psz_cwd, const char *p_in, size_t i_in, char **pp_data, size_t *pi_data ) ); +#define vlc_execve(a,b,c,d,e,f,g,h,i) __vlc_execve(VLC_OBJECT(a),b,c,d,e,f,g,h,i) + /***************************************************************************** * CPU capabilities *****************************************************************************/ @@ -1022,11 +1188,14 @@ VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) ); #define CPU_CAPABILITY_SSE2 (1<<7) #define CPU_CAPABILITY_ALTIVEC (1<<16) #define CPU_CAPABILITY_FPU (1<<31) +VLC_EXPORT( unsigned, vlc_CPU, ( void ) ); /***************************************************************************** * I18n stuff *****************************************************************************/ -VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) ); +#ifdef WIN32 + VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) ); +#endif #if defined( ENABLE_NLS ) && \ (defined(MODULE_NAME_IS_gnome)||defined(MODULE_NAME_IS_gnome_main)||\ @@ -1040,29 +1209,58 @@ VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) ); # include # endif # undef _ -# define _(String) vlc_dgettext (PACKAGE_NAME, String) -# define N_(String) ((char*)(String)) +# ifdef WIN32 +# define _(String) vlc_dgettext (PACKAGE_NAME, String) +# else +# define _(String) dgettext(PACKAGE_NAME, String) +# endif +# define N_(String) (String) #else -# define _(String) ((char*)(String)) -# define N_(String) ((char*)(String)) +# define _(String) (String) +# define N_(String) (String) #endif +/***************************************************************************** + * libvlc features + *****************************************************************************/ +VLC_EXPORT( const char *, VLC_Version, ( void ) ); +VLC_EXPORT( const char *, VLC_CompileBy, ( void ) ); +VLC_EXPORT( const char *, VLC_CompileHost, ( void ) ); +VLC_EXPORT( const char *, VLC_CompileDomain, ( void ) ); +VLC_EXPORT( const char *, VLC_Compiler, ( void ) ); +VLC_EXPORT( const char *, VLC_Error, ( int ) ); +VLC_EXPORT( const char *, VLC_Changeset, ( void ) ); + /***************************************************************************** * Additional vlc stuff *****************************************************************************/ -#include "vlc_symbols.h" -#include "os_specific.h" +#include "vlc_os_specific.h" #include "vlc_messages.h" -#include "variables.h" +#include "vlc_variables.h" #include "vlc_objects.h" +#include "vlc_mtime.h" #include "vlc_threads_funcs.h" -#include "mtime.h" -#include "modules.h" +#include "vlc_modules.h" #include "main.h" -#include "configuration.h" +#include "vlc_configuration.h" + +/** The global thread var for msg stack context + * We store this as a static global variable so we don't need a vlc_object_t + * everywhere. + * This key is created in vlc_threads_init and is therefore ready to use at + * the very beginning of the universe */ +extern vlc_threadvar_t msg_context_global_key; + #if defined( __BORLANDC__ ) # undef PACKAGE # define PACKAGE #endif +#if defined( WIN32 ) || defined( UNDER_CE ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +#endif