This file defines functions, structures and macros for handling arrays in vlc. More...
Go to the source code of this file.
Data Structures | |
| struct | vlc_array_t |
| struct | vlc_dictionary_entry_t |
| struct | vlc_dictionary_t |
Defines | |
| #define | VLCCVP |
| Simple dynamic array handling. | |
| #define | INSERT_ELEM(p_ar, i_oldsize, i_pos, elem) |
| #define | REMOVE_ELEM(p_ar, i_size, i_pos) |
| #define | TAB_INIT(count, tab) |
| #define | TAB_CLEAN(count, tab) |
| #define | TAB_APPEND_CAST(cast, count, tab, p) |
| #define | TAB_APPEND(count, tab, p) TAB_APPEND_CAST( , count, tab, p ) |
| #define | TAB_FIND(count, tab, p, index) |
| #define | TAB_REMOVE(count, tab, p) |
| #define | TAB_INSERT_CAST(cast, count, tab, p, index) |
| #define | TAB_INSERT(count, tab, p, index) TAB_INSERT_CAST( , count, tab, p, index ) |
| #define | BSEARCH(entries, count, elem, zetype, key, answer) |
| Binary search in a sorted array. | |
| #define | _ARRAY_ALLOC(array, newsize) |
| #define | _ARRAY_GROW1(array) |
| #define | ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
| #define | DECL_ARRAY(type) |
| #define | TYPEDEF_ARRAY(type, name) typedef DECL_ARRAY(type) name; |
| #define | ARRAY_INIT(array) |
| #define | ARRAY_RESET(array) |
| #define | ARRAY_APPEND(array, elem) |
| #define | ARRAY_INSERT(array, elem, pos) |
| #define | _ARRAY_SHRINK(array) |
| #define | ARRAY_REMOVE(array, pos) |
| #define | ARRAY_VAL(array, pos) array.p_elems[pos] |
| #define | ARRAY_BSEARCH(array, elem, zetype, key, answer) BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) |
| #define | FOREACH_ARRAY(item, array) |
| #define | FOREACH_END() } } |
Typedefs | |
| typedef struct vlc_array_t | vlc_array_t |
| typedef struct vlc_dictionary_entry_t | vlc_dictionary_entry_t |
| typedef struct vlc_dictionary_t | vlc_dictionary_t |
Functions | |
| static void * | realloc_down (void *ptr, size_t size) |
| static void | vlc_array_init (vlc_array_t *p_array) |
| static void | vlc_array_clear (vlc_array_t *p_array) |
| static vlc_array_t * | vlc_array_new (void) |
| static void | vlc_array_destroy (vlc_array_t *p_array) |
| static int | vlc_array_count (vlc_array_t *p_array) |
| static void * | vlc_array_item_at_index (vlc_array_t *p_array, int i_index) |
| static int | vlc_array_index_of_item (vlc_array_t *p_array, void *item) |
| static void | vlc_array_insert (vlc_array_t *p_array, void *p_elem, int i_index) |
| static void | vlc_array_append (vlc_array_t *p_array, void *p_elem) |
| static void | vlc_array_remove (vlc_array_t *p_array, int i_index) |
| static uint64_t | DictHash (const char *psz_string, int hashsize) |
| static void | vlc_dictionary_init (vlc_dictionary_t *p_dict, int i_size) |
| static void | vlc_dictionary_clear (vlc_dictionary_t *p_dict, void(*pf_free)(void *p_data, void *p_obj), void *p_obj) |
| static void * | vlc_dictionary_value_for_key (const vlc_dictionary_t *p_dict, const char *psz_key) |
| static int | vlc_dictionary_keys_count (const vlc_dictionary_t *p_dict) |
| static char ** | vlc_dictionary_all_keys (const vlc_dictionary_t *p_dict) |
| static void | __vlc_dictionary_insert (vlc_dictionary_t *p_dict, const char *psz_key, void *p_value, bool rebuild) |
| static void | vlc_dictionary_insert (vlc_dictionary_t *p_dict, const char *psz_key, void *p_value) |
| static void | vlc_dictionary_remove_value_for_key (const vlc_dictionary_t *p_dict, const char *psz_key, void(*pf_free)(void *p_data, void *p_obj), void *p_obj) |
Variables | |
| static void *const | kVLCDictionaryNotFound = NULL |
This file defines functions, structures and macros for handling arrays in vlc.
| #define _ARRAY_ALLOC | ( | array, | ||
| newsize | ||||
| ) |
{ \
(array).i_alloc = newsize; \
(array).p_elems = VLCCVP realloc( (array).p_elems, (array).i_alloc * \
sizeof(*(array).p_elems) ); \
if( !(array).p_elems ) abort(); \
}
| #define _ARRAY_GROW1 | ( | array | ) |
{ \
if( (array).i_alloc < 10 ) \
_ARRAY_ALLOC(array, 10 ) \
else if( (array).i_alloc == (array).i_size ) \
_ARRAY_ALLOC(array, (int)(array.i_alloc * 1.5) ) \
}
| #define _ARRAY_SHRINK | ( | array | ) |
{ \
if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \
_ARRAY_ALLOC(array, (array).i_size + 5); \
} \
}
| #define ARRAY_APPEND | ( | array, | ||
| elem | ||||
| ) |
do { \ _ARRAY_GROW1(array); \ (array).p_elems[(array).i_size] = elem; \ (array).i_size++; \ } while(0)
Referenced by AddItem(), FindArt(), playlist_ItemRelease(), playlist_NodeCreate(), ResetCurrentlyPlaying(), vlc_event_attach(), vlc_event_manager_register_event_type(), and vout_control_Push().
| #define ARRAY_BSEARCH | ( | array, | ||
| elem, | ||||
| zetype, | ||||
| key, | ||||
| answer | ||||
| ) | BSEARCH( (array).p_elems, (array).i_size, elem, zetype, key, answer) |
Referenced by ChangeToNode(), playlist_ItemGetById(), and playlist_NodeDelete().
| #define ARRAY_INIT | ( | array | ) |
do { \ (array).i_alloc = 0; \ (array).i_size = 0; \ (array).p_elems = NULL; \ } while(0)
Referenced by playlist_Create(), playlist_fetcher_New(), vlc_event_manager_init(), vlc_event_manager_register_event_type(), and vout_control_Init().
| #define ARRAY_INSERT | ( | array, | ||
| elem, | ||||
| pos | ||||
| ) |
do { \ _ARRAY_GROW1(array); \ if( (array).i_size - pos ) { \ memmove( (array).p_elems + pos + 1, (array).p_elems + pos, \ ((array).i_size-pos) * sizeof(*(array).p_elems) ); \ } \ (array).p_elems[pos] = elem; \ (array).i_size++; \ } while(0)
| #define ARRAY_REMOVE | ( | array, | ||
| pos | ||||
| ) |
do { \ if( (array).i_size - (pos) - 1 ) \ { \ memmove( (array).p_elems + pos, (array).p_elems + pos + 1, \ ( (array).i_size - pos - 1 ) *sizeof(*(array).p_elems) ); \ } \ (array).i_size--; \ _ARRAY_SHRINK(array); \ } while(0)
Referenced by ChangeToNode(), playlist_NodeDelete(), vlc_event_detach(), and vout_control_Pop().
| #define ARRAY_RESET | ( | array | ) |
do { \ (array).i_alloc = 0; \ (array).i_size = 0; \ free( (array).p_elems ); (array).p_elems = NULL; \ } while(0)
Referenced by playlist_Destroy(), ResetCurrentlyPlaying(), vlc_event_manager_fini(), and vout_control_Clean().
| #define ARRAY_SIZE | ( | x | ) | (sizeof(x) / sizeof((x)[0])) |
| #define ARRAY_VAL | ( | array, | ||
| pos | ||||
| ) | array.p_elems[pos] |
| #define BSEARCH | ( | entries, | ||
| count, | ||||
| elem, | ||||
| zetype, | ||||
| key, | ||||
| answer | ||||
| ) |
do { \ 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; \ }\ } \ } while(0)
Binary search in a sorted array.
The key must be comparable by < and >
| entries | array of entries | |
| count | number of entries | |
| elem | key to check within an entry (like .id, or ->i_id) | |
| zetype | type of the key | |
| key | value of the key | |
| answer | index of answer within the array. -1 if not found |
| #define DECL_ARRAY | ( | type | ) |
struct { \ int i_alloc; \ int i_size; \ type *p_elems; \ }
| #define FOREACH_ARRAY | ( | item, | ||
| array | ||||
| ) |
{ \
int fe_idx; \
for( fe_idx = 0 ; fe_idx < (array).i_size ; fe_idx++ ) \
{ \
item = (array).p_elems[fe_idx];
Referenced by FindArt(), group_contains_listener(), playlist_Destroy(), vlc_event_attach(), vlc_event_detach(), vlc_event_manager_fini(), and vlc_event_send().
| #define FOREACH_END | ( | ) | } } |
| #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( !(p_ar) ) abort(); \ 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 )
Referenced by info_category_ReplaceInfo(), info_category_VaAddInfo(), InitPrograms(), input_item_AddOption(), input_item_MergeInfos(), input_item_node_AppendNode(), input_item_ReplaceInfos(), InputItemVaAddInfo(), playlist_fetcher_Push(), playlist_NodeInsert(), playlist_preparser_Push(), playlist_TreeMove(), playlist_TreeMoveMany(), stats_Update(), var_AddCallback(), var_Change(), and var_Create().
| #define REMOVE_ELEM | ( | p_ar, | ||
| i_size, | ||||
| i_pos | ||||
| ) |
do \ { \ if( (i_size) - (i_pos) - 1 ) \ { \ memmove( (p_ar) + (i_pos), \ (p_ar) + (i_pos) + 1, \ ((i_size) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ } \ if( i_size > 1 ) \ (p_ar) = realloc_down( p_ar, ((i_size) - 1) * sizeof( *(p_ar) ) );\ else \ { \ free( p_ar ); \ (p_ar) = NULL; \ } \ (i_size)--; \ } \ while( 0 )
Referenced by info_category_DeleteInfo(), input_item_DelInfo(), input_item_node_Delete(), playlist_fetcher_Delete(), playlist_NodeRemoveItem(), playlist_preparser_Delete(), playlist_ServicesDiscoveryRemove(), playlist_TreeMove(), playlist_TreeMoveMany(), stats_CounterClean(), stats_Update(), Thread(), var_Change(), and var_DelCallback().
Referenced by Add(), Control(), EsOutAdd(), EsOutProgramAdd(), httpd_ClientRecv(), httpd_HostCreate(), httpd_HostThread(), httpd_MsgAdd(), httpd_UrlNewPrivate(), input_item_SetEpg(), input_item_UpdateTracksInfo(), input_vaControl(), InputGetExtraFilesPattern(), InputSourceInit(), LanguageSplit(), LoadSlaves(), LoadSubtitles(), Manage(), playlist_ServicesDiscoveryAdd(), RequestVout(), sout_MuxAddStream(), stream_AccessNew(), SubtitleAdd(), vlc_epg_AddEvent(), vlm_ControlMediaAdd(), vlm_ControlMediaGets(), vlm_ControlMediaInstanceGets(), vlm_ControlMediaInstanceStart(), and vout_NewSplitter().
| #define TAB_APPEND_CAST | ( | cast, | ||
| count, | ||||
| tab, | ||||
| p | ||||
| ) |
do { \ if( (count) > 0 ) \ (tab) = cast realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \ else \ (tab) = cast malloc( sizeof( void ** ) ); \ if( !(tab) ) abort(); \ (tab)[count] = (p); \ (count)++; \ } while(0)
Referenced by vlm_media_Copy().
| #define TAB_CLEAN | ( | count, | ||
| tab | ||||
| ) |
do { \ free( tab ); \ (count)= 0; \ (tab)= NULL; \ } while(0)
Referenced by Destroy(), End(), EsOutTerminate(), InitPrograms(), input_item_Clean(), input_item_MergeInfos(), InputSourceClean(), InputSourceInit(), SplitterClose(), vlc_epg_Clean(), vlm_Delete(), vlm_media_Clean(), and vlm_OnMediaUpdate().
| #define TAB_FIND | ( | count, | ||
| tab, | ||||
| p, | ||||
| index | ||||
| ) |
do { \ (index) = -1; \ for( int i = 0; i < (count); i++ ) \ if( (tab)[i] == (p) ) \ { \ (index) = i; \ break; \ } \ } while(0)
Referenced by sout_MuxDeleteStream().
| #define TAB_INIT | ( | count, | ||
| tab | ||||
| ) |
do { \ (count) = 0; \ (tab) = NULL; \ } while(0)
Referenced by Create(), InitPrograms(), input_EsOutNew(), input_EsOutTimeshiftNew(), input_item_NewWithType(), InputGetExtraFiles(), InputGetExtraFilesPattern(), InputSourceInit(), playlist_Create(), stream_AccessNew(), vlc_epg_Init(), vlm_ControlMediaAdd(), vlm_ControlMediaGets(), vlm_ControlMediaInstanceGets(), vlm_media_Init(), vlm_New(), vlm_OnMediaUpdate(), and vout_NewSplitter().
Referenced by vlc_epg_Merge().
| #define TAB_INSERT_CAST | ( | cast, | ||
| count, | ||||
| tab, | ||||
| p, | ||||
| index | ||||
| ) |
do { \ if( (count) > 0 ) \ (tab) = cast realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \ else \ (tab) = cast malloc( sizeof( void ** ) ); \ if( !(tab) ) abort(); \ if( (count) - (index) > 0 ) \ memmove( (void**)(tab) + (index) + 1, \ (void**)(tab) + (index), \ ((count) - (index)) * sizeof(*(tab)) );\ (tab)[(index)] = (p); \ (count)++; \ } while(0)
Referenced by vlc_array_insert().
| #define TAB_REMOVE | ( | count, | ||
| tab, | ||||
| p | ||||
| ) |
do { \ 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; \ } \ } \ } while(0)
Referenced by Del(), EsOutDel(), EsOutProgramDel(), httpd_HostDelete(), httpd_HostThread(), httpd_UrlDelete(), input_vaControl(), Manage(), RequestVout(), sout_MuxAddStream(), sout_MuxDeleteStream(), vlc_epg_Merge(), vlm_ControlMediaDel(), and vlm_MediaInstanceDelete().
| #define VLCCVP |
Simple dynamic array handling.
Array is realloced at each insert/removal
| typedef struct vlc_array_t vlc_array_t |
| typedef struct vlc_dictionary_entry_t vlc_dictionary_entry_t |
| typedef struct vlc_dictionary_t vlc_dictionary_t |
| static void __vlc_dictionary_insert | ( | vlc_dictionary_t * | p_dict, | |
| const char * | psz_key, | |||
| void * | p_value, | |||
| bool | rebuild | |||
| ) | [inline, static] |
| static uint64_t DictHash | ( | const char * | psz_string, | |
| int | hashsize | |||
| ) | [inline, static] |
Referenced by __vlc_dictionary_insert(), vlc_dictionary_remove_value_for_key(), and vlc_dictionary_value_for_key().
| static void* realloc_down | ( | void * | ptr, | |
| size_t | size | |||
| ) | [inline, static] |
| static void vlc_array_append | ( | vlc_array_t * | p_array, | |
| void * | p_elem | |||
| ) | [inline, static] |
References vlc_array_t::i_count, and vlc_array_insert().
Referenced by ml_DeleteSimple(), sout_StreamChainNew(), and ThreadChangeFilters().
| static void vlc_array_clear | ( | vlc_array_t * | p_array | ) | [inline, static] |
References vlc_array_t::pp_elems.
Referenced by sout_StreamChainNew(), ThreadChangeFilters(), and vlc_array_destroy().
| static int vlc_array_count | ( | vlc_array_t * | p_array | ) | [inline, static] |
References vlc_array_t::i_count.
Referenced by __ml_GetValue(), ml_DestroyResultArray(), sout_StreamChainNew(), and ThreadChangeFilters().
| static void vlc_array_destroy | ( | vlc_array_t * | p_array | ) | [inline, static] |
References vlc_array_clear().
Referenced by __ml_GetValue(), and ml_DeleteSimple().
| static int vlc_array_index_of_item | ( | vlc_array_t * | p_array, | |
| void * | item | |||
| ) | [inline, static] |
References vlc_array_t::i_count, and vlc_array_t::pp_elems.
| static void vlc_array_init | ( | vlc_array_t * | p_array | ) | [inline, static] |
Referenced by sout_StreamChainNew(), ThreadChangeFilters(), and vlc_array_new().
| static void vlc_array_insert | ( | vlc_array_t * | p_array, | |
| void * | p_elem, | |||
| int | i_index | |||
| ) | [inline, static] |
References vlc_array_t::i_count, vlc_array_t::pp_elems, and TAB_INSERT_CAST.
Referenced by vlc_array_append().
| static void* vlc_array_item_at_index | ( | vlc_array_t * | p_array, | |
| int | i_index | |||
| ) | [inline, static] |
References vlc_array_t::pp_elems.
Referenced by __ml_GetValue(), ml_DestroyResultArray(), sout_StreamChainNew(), and ThreadChangeFilters().
| static vlc_array_t* vlc_array_new | ( | void | ) | [inline, static] |
References vlc_array_init().
Referenced by __ml_GetValue(), and ml_DeleteSimple().
| static void vlc_array_remove | ( | vlc_array_t * | p_array, | |
| int | i_index | |||
| ) | [inline, static] |
References vlc_array_t::i_count, and vlc_array_t::pp_elems.
| static char** vlc_dictionary_all_keys | ( | const vlc_dictionary_t * | p_dict | ) | [inline, static] |
| static void vlc_dictionary_clear | ( | vlc_dictionary_t * | p_dict, | |
| void(*)(void *p_data, void *p_obj) | pf_free, | |||
| void * | p_obj | |||
| ) | [inline, static] |
References vlc_dictionary_t::i_size, vlc_dictionary_t::p_entries, vlc_dictionary_entry_t::p_next, vlc_dictionary_entry_t::p_value, and vlc_dictionary_entry_t::psz_key.
Referenced by __vlc_dictionary_insert(), main(), and vlc_meta_Delete().
| static void vlc_dictionary_init | ( | vlc_dictionary_t * | p_dict, | |
| int | i_size | |||
| ) | [inline, static] |
References vlc_dictionary_t::i_size, and vlc_dictionary_t::p_entries.
Referenced by __vlc_dictionary_insert(), main(), and vlc_meta_New().
| static void vlc_dictionary_insert | ( | vlc_dictionary_t * | p_dict, | |
| const char * | psz_key, | |||
| void * | p_value | |||
| ) | [inline, static] |
References __vlc_dictionary_insert().
Referenced by main(), vlc_meta_AddExtra(), and vlc_meta_Merge().
| static int vlc_dictionary_keys_count | ( | const vlc_dictionary_t * | p_dict | ) | [inline, static] |
References count, vlc_dictionary_t::i_size, vlc_dictionary_t::p_entries, and vlc_dictionary_entry_t::p_next.
Referenced by main(), vlc_dictionary_all_keys(), and vlc_meta_GetExtraCount().
| static void vlc_dictionary_remove_value_for_key | ( | const vlc_dictionary_t * | p_dict, | |
| const char * | psz_key, | |||
| void(*)(void *p_data, void *p_obj) | pf_free, | |||
| void * | p_obj | |||
| ) | [inline, static] |
References DictHash(), vlc_dictionary_t::i_size, vlc_dictionary_t::p_entries, vlc_dictionary_entry_t::p_next, vlc_dictionary_entry_t::p_value, and vlc_dictionary_entry_t::psz_key.
Referenced by main(), vlc_meta_AddExtra(), and vlc_meta_Merge().
| static void* vlc_dictionary_value_for_key | ( | const vlc_dictionary_t * | p_dict, | |
| const char * | psz_key | |||
| ) | [inline, static] |
References DictHash(), vlc_dictionary_t::i_size, kVLCDictionaryNotFound, vlc_dictionary_t::p_entries, vlc_dictionary_entry_t::p_next, vlc_dictionary_entry_t::p_value, and vlc_dictionary_entry_t::psz_key.
Referenced by test_dictionary_validity(), vlc_meta_AddExtra(), vlc_meta_GetExtra(), and vlc_meta_Merge().
void* const kVLCDictionaryNotFound = NULL [static] |
Referenced by vlc_dictionary_value_for_key(), and vlc_meta_AddExtra().
1.7.1