* Collection of useful common types and macros definitions
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
- * $Id: vlc_common.h,v 1.32 2002/10/25 09:21:09 sam Exp $
+ * $Id: vlc_common.h,v 1.33 2002/10/29 13:22:47 sam Exp $
*
* Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr>
# define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) )
#endif
+/* Dynamic array handling: realloc array, move data, increment position */
+#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) \
+ do \
+ { \
+ if( i_oldsize ) \
+ { \
+ (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) ); \
+ } \
+ else \
+ { \
+ (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) ); \
+ } \
+ 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 \
+ { \
+ 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 )
+
+
/* 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
* input_dec.c: Functions for the management of decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.48 2002/10/27 16:58:12 gbazin Exp $
+ * $Id: input_dec.c,v 1.49 2002/10/29 13:22:48 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
}
/* Select a new ES */
- p_input->stream.i_selected_es_number++;
- p_input->stream.pp_selected_es = realloc(
- p_input->stream.pp_selected_es,
- p_input->stream.i_selected_es_number
- * sizeof(es_descriptor_t *) );
- if( p_input->stream.pp_selected_es == NULL )
- {
- msg_Err( p_input, "out of memory" );
- vlc_object_destroy( p_fifo );
- return NULL;
- }
-
- p_input->stream.pp_selected_es[p_input->stream.i_selected_es_number - 1]
- = p_es;
+ INSERT_ELEM( p_input->stream.pp_selected_es,
+ p_input->stream.i_selected_es_number,
+ p_input->stream.i_selected_es_number,
+ p_es );
/* Initialize the p_fifo structure */
vlc_mutex_init( p_input, &p_fifo->data_lock );
* input_programs.c: es_descriptor_t, pgrm_descriptor_t management
*****************************************************************************
* Copyright (C) 1999-2002 VideoLAN
- * $Id: input_programs.c,v 1.94 2002/07/31 20:56:52 sam Exp $
+ * $Id: input_programs.c,v 1.95 2002/10/29 13:22:48 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
u16 i_pgrm_id, size_t i_data_len )
{
/* Where to add the pgrm */
- int i_pgrm_index = p_input->stream.i_pgrm_number;
+ pgrm_descriptor_t * p_pgrm = malloc( sizeof(pgrm_descriptor_t) );
- /* Add an entry to the list of program associated with the stream */
- p_input->stream.i_pgrm_number++;
- p_input->stream.pp_programs = realloc( p_input->stream.pp_programs,
- p_input->stream.i_pgrm_number
- * sizeof(pgrm_descriptor_t *) );
- if( p_input->stream.pp_programs == NULL )
+ if( p_pgrm == NULL )
{
msg_Err( p_input, "out of memory" );
- return( NULL );
+ return NULL;
}
- /* Allocate the structure to store this description */
- p_input->stream.pp_programs[i_pgrm_index] =
- malloc( sizeof(pgrm_descriptor_t) );
- if( p_input->stream.pp_programs[i_pgrm_index] == NULL )
- {
- msg_Err( p_input, "out of memory" );
- return( NULL );
- }
-
/* Init this entry */
- p_input->stream.pp_programs[i_pgrm_index]->i_number = i_pgrm_id;
- p_input->stream.pp_programs[i_pgrm_index]->b_is_ok = 0;
- p_input->stream.pp_programs[i_pgrm_index]->i_version = 0;
+ p_pgrm->i_number = i_pgrm_id;
+ p_pgrm->b_is_ok = 0;
+ p_pgrm->i_version = 0;
- p_input->stream.pp_programs[i_pgrm_index]->i_es_number = 0;
- p_input->stream.pp_programs[i_pgrm_index]->pp_es = NULL;
+ p_pgrm->i_es_number = 0;
+ p_pgrm->pp_es = NULL;
- input_ClockInit( p_input->stream.pp_programs[i_pgrm_index] );
+ input_ClockInit( p_pgrm );
- p_input->stream.pp_programs[i_pgrm_index]->i_synchro_state
- = SYNCHRO_START;
+ p_pgrm->i_synchro_state = SYNCHRO_START;
if( i_data_len )
{
- p_input->stream.pp_programs[i_pgrm_index]->p_demux_data =
- malloc( i_data_len );
- if( p_input->stream.pp_programs[i_pgrm_index]->p_demux_data == NULL )
+ p_pgrm->p_demux_data = malloc( i_data_len );
+ if( p_pgrm->p_demux_data == NULL )
{
msg_Err( p_input, "out of memory" );
- return( NULL );
+ return NULL;
}
- memset( p_input->stream.pp_programs[i_pgrm_index]->p_demux_data, 0,
- i_data_len );
+ memset( p_pgrm->p_demux_data, 0, i_data_len );
}
else
{
- p_input->stream.pp_programs[i_pgrm_index]->p_demux_data = NULL;
+ p_pgrm->p_demux_data = NULL;
}
- return p_input->stream.pp_programs[i_pgrm_index];
+ /* Add an entry to the list of program associated with the stream */
+ INSERT_ELEM( p_input->stream.pp_programs,
+ p_input->stream.i_pgrm_number,
+ p_input->stream.i_pgrm_number,
+ p_pgrm );
+
+ return p_pgrm;
}
/*****************************************************************************
}
/* Remove this program from the stream's list of programs */
- p_input->stream.i_pgrm_number--;
-
- p_input->stream.pp_programs[i_pgrm_index] =
- p_input->stream.pp_programs[p_input->stream.i_pgrm_number];
- if( p_input->stream.i_pgrm_number )
- {
- p_input->stream.pp_programs = realloc( p_input->stream.pp_programs,
- p_input->stream.i_pgrm_number
- * sizeof(pgrm_descriptor_t *) );
- if( p_input->stream.pp_programs == NULL )
- {
- msg_Err( p_input, "cannot realloc memory" );
- }
- }
- else
- {
- free( p_input->stream.pp_programs );
- p_input->stream.pp_programs = NULL;
- }
+ REMOVE_ELEM( p_input->stream.pp_programs,
+ p_input->stream.i_pgrm_number,
+ i_pgrm_index );
/* Free the description of this program */
free( p_pgrm );
input_area_t * input_AddArea( input_thread_t * p_input )
{
/* Where to add the pgrm */
- int i_area_index = p_input->stream.i_area_nb;
+ input_area_t * p_area = malloc( sizeof(input_area_t) );
- /* Add an entry to the list of program associated with the stream */
- p_input->stream.i_area_nb++;
- p_input->stream.pp_areas = realloc( p_input->stream.pp_areas,
- p_input->stream.i_area_nb
- * sizeof(input_area_t *) );
- if( p_input->stream.pp_areas == NULL )
+ if( p_area == NULL )
{
msg_Err( p_input, "out of memory" );
- return( NULL );
+ return NULL;
}
- /* Allocate the structure to store this description */
- p_input->stream.pp_areas[i_area_index] =
- malloc( sizeof(input_area_t) );
- if( p_input->stream.pp_areas[i_area_index] == NULL )
- {
- msg_Err( p_input, "out of memory" );
- return( NULL );
- }
-
/* Init this entry */
- p_input->stream.pp_areas[i_area_index]->i_id = 0;
- p_input->stream.pp_areas[i_area_index]->i_start = 0;
- p_input->stream.pp_areas[i_area_index]->i_size = 0;
- p_input->stream.pp_areas[i_area_index]->i_tell = 0;
- p_input->stream.pp_areas[i_area_index]->i_seek = NO_SEEK;
- p_input->stream.pp_areas[i_area_index]->i_part_nb = 1;
- p_input->stream.pp_areas[i_area_index]->i_part= 0;
-
- return p_input->stream.pp_areas[i_area_index];
+ p_area->i_id = 0;
+ p_area->i_start = 0;
+ p_area->i_size = 0;
+ p_area->i_tell = 0;
+ p_area->i_seek = NO_SEEK;
+ p_area->i_part_nb = 1;
+ p_area->i_part= 0;
+
+ /* Add an entry to the list of program associated with the stream */
+ INSERT_ELEM( p_input->stream.pp_areas,
+ p_input->stream.i_area_nb,
+ p_input->stream.i_area_nb,
+ p_area );
+
+ return p_area;
}
/*****************************************************************************
}
/* Remove this area from the stream's list of areas */
- p_input->stream.i_area_nb--;
-
- p_input->stream.pp_areas[i_area_index] =
- p_input->stream.pp_areas[p_input->stream.i_area_nb];
- if( p_input->stream.i_area_nb )
- {
- p_input->stream.pp_areas = realloc( p_input->stream.pp_areas,
- p_input->stream.i_area_nb
- * sizeof(input_area_t *) );
-
- if( p_input->stream.pp_areas == NULL )
- {
- msg_Err( p_input, "cannot realloc memory" );
- }
- }
- else
- {
- free( p_input->stream.pp_areas );
- p_input->stream.pp_areas = NULL;
- }
+ REMOVE_ELEM( p_input->stream.pp_areas,
+ p_input->stream.i_area_nb,
+ i_area_index );
/* Free the description of this area */
free( p_area );
msg_Err( p_input, "out of memory" );
return( NULL);
}
- p_input->stream.i_es_number++;
- p_input->stream.pp_es = realloc( p_input->stream.pp_es,
- p_input->stream.i_es_number
- * sizeof(es_descriptor_t *) );
- if( p_input->stream.pp_es == NULL )
- {
- msg_Err( p_input, "out of memory" );
- return( NULL );
- }
- p_input->stream.pp_es[p_input->stream.i_es_number - 1] = p_es;
+ INSERT_ELEM( p_input->stream.pp_es,
+ p_input->stream.i_es_number,
+ p_input->stream.i_es_number,
+ p_es );
/* Init its values */
p_es->i_id = i_es_id;
/* Add this ES to the program definition if one is given */
if( p_pgrm )
{
- p_pgrm->i_es_number++;
- p_pgrm->pp_es = realloc( p_pgrm->pp_es,
- p_pgrm->i_es_number
- * sizeof(es_descriptor_t *) );
- if( p_pgrm->pp_es == NULL )
- {
- msg_Err( p_input, "out of memory" );
- return( NULL );
- }
-
- p_pgrm->pp_es[p_pgrm->i_es_number - 1] = p_es;
+ INSERT_ELEM( p_pgrm->pp_es,
+ p_pgrm->i_es_number,
+ p_pgrm->i_es_number,
+ p_es );
p_es->p_pgrm = p_pgrm;
}
else
{
if( p_pgrm->pp_es[i_index] == p_es )
{
- p_pgrm->i_es_number--;
- p_pgrm->pp_es[i_index] = p_pgrm->pp_es[p_pgrm->i_es_number];
- if( p_pgrm->i_es_number )
- {
- p_pgrm->pp_es = realloc( p_pgrm->pp_es,
- p_pgrm->i_es_number
- * sizeof(es_descriptor_t *));
- if( p_pgrm->pp_es == NULL )
- {
- msg_Err( p_input, "cannot realloc memory" );
- }
- }
- else
- {
- free( p_pgrm->pp_es );
- p_pgrm->pp_es = NULL;
- }
+ REMOVE_ELEM( p_pgrm->pp_es,
+ p_pgrm->i_es_number,
+ i_index );
break;
}
}
}
/* Remove this ES from the stream's list of ES */
- p_input->stream.i_es_number--;
- p_input->stream.pp_es[i_es_index] =
- p_input->stream.pp_es[p_input->stream.i_es_number];
- if( p_input->stream.i_es_number )
- {
- p_input->stream.pp_es = realloc( p_input->stream.pp_es,
- p_input->stream.i_es_number
- * sizeof(es_descriptor_t *));
- if( p_input->stream.pp_es == NULL )
- {
- msg_Err( p_input, "cannot realloc memory" );
- }
- }
- else
- {
- free( p_input->stream.pp_es );
- p_input->stream.pp_es = NULL;
- }
-
+ REMOVE_ELEM( p_input->stream.pp_es,
+ p_input->stream.i_es_number,
+ i_es_index );
+
/* Free the ES */
free( p_es );
}
if( ( p_es->p_decoder_fifo == NULL ) &&
( p_input->stream.i_selected_es_number > 0 ) )
{
- p_input->stream.i_selected_es_number--;
-
- while( ( i_index < p_input->stream.i_selected_es_number ) &&
+ while( ( i_index < p_input->stream.i_selected_es_number - 1 ) &&
( p_input->stream.pp_selected_es[i_index] != p_es ) )
{
i_index++;
}
- p_input->stream.pp_selected_es[i_index] =
- p_input->stream.pp_selected_es[p_input->stream.i_selected_es_number];
+ /* XXX: no need to memmove, we have unordered data */
+ REMOVE_ELEM( p_input->stream.pp_selected_es,
+ p_input->stream.i_selected_es_number,
+ i_index );
- if( p_input->stream.i_selected_es_number )
+ if( p_input->stream.i_selected_es_number == 0 )
{
- p_input->stream.pp_selected_es = realloc(
- p_input->stream.pp_selected_es,
- p_input->stream.i_selected_es_number
- * sizeof(es_descriptor_t *) );
- if( p_input->stream.pp_selected_es == NULL )
- {
- msg_Err( p_input, "cannot realloc memory" );
- return( -1 );
- }
- }
- else
- {
- free( p_input->stream.pp_selected_es );
- p_input->stream.pp_selected_es = NULL;
msg_Dbg( p_input, "no more selected ES" );
- return( 1 );
+ return 1;
}
}
- return( 0 );
+ return 0;
}
* modules, especially intf modules. See config.h for output configuration.
*****************************************************************************
* Copyright (C) 1998-2002 VideoLAN
- * $Id: messages.c,v 1.17 2002/10/28 16:26:44 sam Exp $
+ * $Id: messages.c,v 1.18 2002/10/29 13:22:48 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
vlc_mutex_lock( &p_bank->lock );
/* Add subscription to the list */
- p_bank->i_sub++;
- p_bank->pp_sub = realloc( p_bank->pp_sub,
- p_bank->i_sub * sizeof( msg_subscription_t* ) );
-
- p_bank->pp_sub[ p_bank->i_sub - 1 ] = p_sub;
+ INSERT_ELEM( p_bank->pp_sub, p_bank->i_sub, p_bank->i_sub, p_sub );
p_sub->i_start = p_bank->i_start;
p_sub->pi_stop = &p_bank->i_stop;
}
/* Remove this subscription */
- for( ; i_index < (p_bank->i_sub - 1); i_index++ )
- {
- p_bank->pp_sub[ i_index ] = p_bank->pp_sub[ i_index+1 ];
- }
-
- p_bank->i_sub--;
- if( p_bank->i_sub )
- {
- p_bank->pp_sub = realloc( p_bank->pp_sub, p_bank->i_sub
- * sizeof( msg_subscription_t* ) );
- }
- else
- {
- free( p_bank->pp_sub );
- p_bank->pp_sub = NULL;
- }
-
+ REMOVE_ELEM( p_bank->pp_sub, p_bank->i_sub, i_index );
vlc_mutex_unlock( &p_bank->lock );
}
* objects.c: vlc_object_t handling
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: objects.c,v 1.26 2002/10/17 13:15:31 sam Exp $
+ * $Id: objects.c,v 1.27 2002/10/29 13:22:48 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
/* Wooohaa! If *this* fails, we're in serious trouble! Anyway it's
* useless to try and recover anything if pp_objects gets smashed. */
- p_new->p_libvlc->i_objects++;
- p_new->p_libvlc->pp_objects =
- realloc( p_new->p_libvlc->pp_objects,
- p_new->p_libvlc->i_objects * sizeof(vlc_object_t *) );
- p_new->p_libvlc->pp_objects[ p_new->p_libvlc->i_objects - 1 ] = p_new;
+ INSERT_ELEM( p_new->p_libvlc->pp_objects,
+ p_new->p_libvlc->i_objects,
+ p_new->p_libvlc->i_objects,
+ p_new );
vlc_mutex_unlock( &structure_lock );
}
/* We are the root object ... no need to lock. */
free( p_this->p_libvlc->pp_objects );
p_this->p_libvlc->pp_objects = NULL;
+ p_this->p_libvlc->i_objects--;
vlc_mutex_destroy( &structure_lock );
}
* useless to try and recover anything if pp_objects gets smashed. */
i_index = FindIndex( p_this, p_this->p_libvlc->pp_objects,
p_this->p_libvlc->i_objects );
- memmove( p_this->p_libvlc->pp_objects + i_index,
- p_this->p_libvlc->pp_objects + i_index + 1,
- (p_this->p_libvlc->i_objects - i_index - 1)
- * sizeof( vlc_object_t *) );
-
- p_this->p_libvlc->pp_objects =
- realloc( p_this->p_libvlc->pp_objects,
- (p_this->p_libvlc->i_objects - 1) * sizeof(vlc_object_t *) );
+ REMOVE_ELEM( p_this->p_libvlc->pp_objects,
+ p_this->p_libvlc->i_objects, i_index );
vlc_mutex_unlock( &structure_lock );
}
- p_this->p_libvlc->i_objects--;
-
vlc_mutex_destroy( &p_this->object_lock );
vlc_cond_destroy( &p_this->object_wait );
p_this->p_parent = p_parent;
/* Attach the child to its parent */
- p_parent->i_children++;
- p_parent->pp_children = (vlc_object_t **)realloc( p_parent->pp_children,
- p_parent->i_children * sizeof(vlc_object_t *) );
- p_parent->pp_children[p_parent->i_children - 1] = p_this;
+ INSERT_ELEM( p_parent->pp_children, p_parent->i_children,
+ p_parent->i_children, p_this );
/* Climb up the tree to see whether we are connected with the root */
if( p_parent->b_attached )
* variables.c: routines for object variables handling
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: variables.c,v 1.10 2002/10/28 20:57:02 sam Exp $
+ * $Id: variables.c,v 1.11 2002/10/29 13:22:48 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
/*****************************************************************************
* Local comparison functions, returns 0 if v == w, < 0 if v < w, > 0 if v > w
*****************************************************************************/
-static int CmpBool( vlc_value_t v, vlc_value_t w ) { return v.b_bool != w.b_bool; }
+static int CmpBool( vlc_value_t v, vlc_value_t w ) { return v.b_bool ? w.b_bool ? 0 : 1 : w.b_bool ? -1 : 0; }
static int CmpInt( vlc_value_t v, vlc_value_t w ) { return v.i_int == w.i_int ? 0 : v.i_int > w.i_int ? 1 : -1; }
static int CmpString( vlc_value_t v, vlc_value_t w ) { return strcmp( v.psz_string, w.psz_string ); }
static int CmpFloat( vlc_value_t v, vlc_value_t w ) { return v.f_float == w.f_float ? 0 : v.f_float > w.f_float ? 1 : -1; }
*****************************************************************************/
int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
{
- int i_var;
+ int i_var, i;
variable_t *p_var;
vlc_mutex_lock( &p_this->var_lock );
break;
}
+ /* Free choice list if needed */
+ if( p_var->pp_choices )
+ {
+ for( i = 0 ; i < p_var->i_choices ; i++ )
+ {
+ p_var->pf_free( &p_var->pp_choices[i] );
+ }
+ free( p_var->pp_choices );
+ }
+
/* Free callbacks if needed */
if( p_var->p_entries )
{
p_var->i_default++;
}
- if( p_var->i_choices )
- {
- p_var->pp_choices = realloc( p_var->pp_choices,
- (p_var->i_choices + 1)
- * sizeof(vlc_value_t) );
- }
- else
- {
- p_var->pp_choices = malloc( (p_var->i_choices + 1)
- * sizeof(vlc_value_t) );
- }
-
- memmove( p_var->pp_choices + i + 1,
- p_var->pp_choices + i,
- (p_var->i_choices - i) * sizeof(vlc_value_t) );
-
- p_var->i_choices++;
- p_var->pp_choices[i] = *p_val;
+ INSERT_ELEM( p_var->pp_choices, p_var->i_choices, i, *p_val );
p_var->pf_dup( &p_var->pp_choices[i] );
+
CheckValue( p_var, &p_var->val );
break;
case VLC_VAR_DELCHOICE:
}
p_var->pf_free( &p_var->pp_choices[i] );
+ REMOVE_ELEM( p_var->pp_choices, p_var->i_choices, i );
- memmove( p_var->pp_choices + i,
- p_var->pp_choices + i + 1,
- (p_var->i_choices - i - 1) * sizeof(vlc_value_t) );
-
- p_var->i_choices--;
- if( p_var->i_choices )
- {
- p_var->pp_choices = realloc( p_var->pp_choices,
- p_var->i_choices
- * sizeof(vlc_value_t) );
- }
- else
- {
- free( p_var->pp_choices );
- }
CheckValue( p_var, &p_var->val );
break;
case VLC_VAR_SETDEFAULT:
int __var_AddCallback( vlc_object_t *p_this, const char *psz_name,
vlc_callback_t pf_callback, void *p_data )
{
- int i_entry, i_var;
+ int i_var;
variable_t *p_var;
+ callback_entry_t entry;
+ entry.pf_callback = pf_callback;
+ entry.p_data = p_data;
+
vlc_mutex_lock( &p_this->var_lock );
i_var = GetUnused( p_this, psz_name );
}
p_var = &p_this->p_vars[i_var];
- i_entry = p_var->i_entries++;
- if( i_entry )
- {
- p_var->p_entries = realloc( p_var->p_entries,
- sizeof( callback_entry_t ) * p_var->i_entries );
- }
- else
- {
- p_var->p_entries = malloc( sizeof( callback_entry_t ) );
- }
+ INSERT_ELEM( p_var->p_entries,
+ p_var->i_entries,
+ p_var->i_entries,
+ entry );
- p_var->p_entries[ i_entry ].pf_callback = pf_callback;
- p_var->p_entries[ i_entry ].p_data = p_data;
-
vlc_mutex_unlock( &p_this->var_lock );
return VLC_SUCCESS;
return VLC_EGENERIC;
}
- p_var->i_entries--;
-
- memmove( p_var->p_entries + i_entry,
- p_var->p_entries + i_entry + 1,
- sizeof( callback_entry_t ) * ( p_var->i_entries - i_entry ) );
-
- if( p_var->i_entries )
- {
- p_var->p_entries = realloc( p_var->p_entries,
- sizeof( callback_entry_t ) * ( p_var->i_entries ) );
- }
- else
- {
- free( p_var->p_entries );
- p_var->p_entries = NULL;
- }
+ REMOVE_ELEM( p_var->p_entries, p_var->i_entries, i_entry );
vlc_mutex_unlock( &p_this->var_lock );
* playlist.c : Playlist management functions
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: playlist.c,v 1.14 2002/09/29 18:19:53 sam Exp $
+ * $Id: playlist.c,v 1.15 2002/10/29 13:22:48 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
{
int i_index;
- p_playlist->i_size++;
- p_playlist->pp_items = realloc( p_playlist->pp_items,
- p_playlist->i_size * sizeof(void*) );
- if( p_playlist->pp_items == NULL )
- {
- msg_Err( p_playlist, "out of memory" );
- free( p_item->psz_name );
- free( p_item );
- vlc_mutex_unlock( &p_playlist->object_lock );
- return -1;
- }
-
/* Additional boundary checks */
if( i_mode & PLAYLIST_APPEND )
{
{
i_pos = 0;
}
- else if( i_pos > p_playlist->i_size - 1 )
+ else if( i_pos > p_playlist->i_size )
{
- i_pos = p_playlist->i_size - 1;
+ i_pos = p_playlist->i_size;
}
- /* Now we know exactly where it goes. Just renumber the playlist */
- for( i_index = p_playlist->i_size - 1; i_index > i_pos ; i_index-- )
- {
- p_playlist->pp_items[i_index] = p_playlist->pp_items[i_index - 1];
- }
+ INSERT_ELEM( p_playlist->pp_items,
+ p_playlist->i_size,
+ i_pos,
+ p_item );
if( p_playlist->i_index >= i_pos )
{
{
/* i_mode == PLAYLIST_REPLACE and 0 <= i_pos < p_playlist->i_size */
free( p_playlist->pp_items[i_pos]->psz_name );
- free( p_playlist->pp_items[i_pos] );
/* XXX: what if the item is still in use? */
+ free( p_playlist->pp_items[i_pos] );
+ p_playlist->pp_items[i_pos] = p_item;
}
- p_playlist->pp_items[i_pos] = p_item;
-
if( i_mode & PLAYLIST_GO )
{
p_playlist->i_index = i_pos;
p_playlist->pp_items[i_pos]->psz_name );
free( p_playlist->pp_items[i_pos]->psz_name );
- free( p_playlist->pp_items[i_pos] );
/* XXX: what if the item is still in use? */
+ free( p_playlist->pp_items[i_pos] );
if( i_pos < p_playlist->i_index )
{
}
/* Renumber the playlist */
- for( i_index = i_pos + 1; i_index < p_playlist->i_size; i_index++ )
- {
- p_playlist->pp_items[i_index - 1] = p_playlist->pp_items[i_index];
- }
-
- p_playlist->i_size--;
- if( p_playlist->i_size )
- {
- p_playlist->pp_items = realloc( p_playlist->pp_items,
- p_playlist->i_size * sizeof(void*) );
- }
- else
- {
- free( p_playlist->pp_items );
- p_playlist->pp_items = NULL;
- }
+ REMOVE_ELEM( p_playlist->pp_items,
+ p_playlist->i_size,
+ i_pos );
}
vlc_mutex_unlock( &p_playlist->object_lock );