X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_common.h;h=84e67cfda475c25bb91468b2ad3402249e8091d1;hb=0b1d6a5e8279e7075691bb3eeaebbec73ed17c6f;hp=c3def784f0283d878b5f80ea7a94f1918321e278;hpb=a078354921bb82a525f0999f2d287f7651f3c108;p=vlc diff --git a/include/vlc_common.h b/include/vlc_common.h index c3def784f0..84e67cfda4 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -21,9 +21,10 @@ * * 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. *****************************************************************************/ + /** * \file * This file is a collection of common definitions and types @@ -202,6 +203,9 @@ typedef struct libvlc_t libvlc_t; typedef struct vlc_t vlc_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; @@ -217,14 +221,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, /** 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 +}; + +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; } + + /***************************************************************************** * Macros and inline functions *****************************************************************************/ @@ -541,6 +609,25 @@ static int64_t GCD( int64_t a, int64_t b ) else return a; } +/* 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; +#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) if( a ) { free( a ); a = NULL; } +#define FREE(a) if( a ) { free( a ); } + /* Dynamic array handling: realloc array, move data, increment position */ #if defined( _MSC_VER ) && _MSC_VER < 1300 && !defined( UNDER_CE ) # define VLCCVP (void**) /* Work-around for broken compiler */ @@ -632,6 +719,45 @@ static int64_t GCD( int64_t a, int64_t b ) } \ } +/* 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 +{ + int i_int; + char *psz_string; + uint64_t i_hash; + void *p_data; +}; + +struct dict_t +{ + dict_entry_t *p_entries; + int i_entries; +}; + +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 * ) ); + /* 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 @@ -790,14 +916,14 @@ 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 *, ... ) ); #elif !defined(__PLUGIN__) @@ -817,6 +943,13 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define vlc_strndup 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 ) ); @@ -844,6 +977,17 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw ) # define vlc_strtoll NULL #endif +#if defined(SYS_BEOS) + 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 @@ -1040,12 +1184,12 @@ 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) */ @@ -1070,7 +1214,9 @@ VLC_EXPORT( int, __vlc_execve, ( vlc_object_t *p_object, int i_argc, char **pp_a /***************************************************************************** * I18n stuff *****************************************************************************/ +#if defined (WIN32) || !defined (HAVE_SHARED_LIBVLC) 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)||\ @@ -1084,11 +1230,15 @@ 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)) +# if defined (WIN32) || !defined (HAVE_SHARED_LIBVLC) +# 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 /***************************************************************************** @@ -1099,13 +1249,17 @@ 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_Changeset, ( void ) ); VLC_EXPORT( const char *, VLC_Error, ( int ) ); /***************************************************************************** * Additional vlc stuff *****************************************************************************/ -#include "vlc_symbols.h" +#ifndef HAVE_SHARED_LIBVLC +VLC_EXPORT( const char *, VLC_Changeset, ( void ) ); +# include "vlc_symbols.h" +#else +# define VLC_Changeset( ) ("exported") +#endif #include "os_specific.h" #include "vlc_messages.h" #include "variables.h"