05d292b2 (kx 2023-03-24 03:51:10 +0300 1)
05d292b2 (kx 2023-03-24 03:51:10 +0300 2) #ifndef __DLIST_H_
05d292b2 (kx 2023-03-24 03:51:10 +0300 3) #define __DLIST_H_
05d292b2 (kx 2023-03-24 03:51:10 +0300 4)
05d292b2 (kx 2023-03-24 03:51:10 +0300 5) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 6) extern "C" {
05d292b2 (kx 2023-03-24 03:51:10 +0300 7) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 8)
05d292b2 (kx 2023-03-24 03:51:10 +0300 9)
05d292b2 (kx 2023-03-24 03:51:10 +0300 10) typedef void (*dlist_errfunc)( const char *fmt, ... );
05d292b2 (kx 2023-03-24 03:51:10 +0300 11)
05d292b2 (kx 2023-03-24 03:51:10 +0300 12) extern void dlist_error( const char *fmt, ... ) __attribute__((format (printf,1,2)));
05d292b2 (kx 2023-03-24 03:51:10 +0300 13) extern dlist_errfunc dlist_fatal; /* Default Fatal Error Function == dlist_error() */
05d292b2 (kx 2023-03-24 03:51:10 +0300 14)
05d292b2 (kx 2023-03-24 03:51:10 +0300 15) struct dlist {
05d292b2 (kx 2023-03-24 03:51:10 +0300 16) struct dlist *prev;
05d292b2 (kx 2023-03-24 03:51:10 +0300 17) struct dlist *next;
05d292b2 (kx 2023-03-24 03:51:10 +0300 18)
05d292b2 (kx 2023-03-24 03:51:10 +0300 19) void *data;
05d292b2 (kx 2023-03-24 03:51:10 +0300 20) };
05d292b2 (kx 2023-03-24 03:51:10 +0300 21)
05d292b2 (kx 2023-03-24 03:51:10 +0300 22) typedef void (*DLFUNC) ( void *data, void *user_data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 23) typedef int (*DLCMPF) ( const void *a, const void *b );
05d292b2 (kx 2023-03-24 03:51:10 +0300 24) typedef int (*DLCMPDF) ( const void *a, const void *b, void *user_data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 25)
05d292b2 (kx 2023-03-24 03:51:10 +0300 26) #define dlist_prev( list ) ( (list)->prev )
05d292b2 (kx 2023-03-24 03:51:10 +0300 27) #define dlist_next( list ) ( (list)->next )
05d292b2 (kx 2023-03-24 03:51:10 +0300 28)
05d292b2 (kx 2023-03-24 03:51:10 +0300 29) extern struct dlist *__dlist_alloc( void );
05d292b2 (kx 2023-03-24 03:51:10 +0300 30) extern struct dlist *dlist_first( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 31) extern struct dlist *dlist_last( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 32) extern int dlist_length( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 33) extern struct dlist *dlist_nth( struct dlist *list, int n );
05d292b2 (kx 2023-03-24 03:51:10 +0300 34) extern void *dlist_nth_data( struct dlist *list, int n );
05d292b2 (kx 2023-03-24 03:51:10 +0300 35) extern int dlist_position( struct dlist *list, struct dlist *link );
05d292b2 (kx 2023-03-24 03:51:10 +0300 36) extern int dlist_index( struct dlist *list, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 37) extern struct dlist *dlist_find( struct dlist *list, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 38) extern struct dlist *dlist_find_data( struct dlist *list, DLCMPF func, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 39)
05d292b2 (kx 2023-03-24 03:51:10 +0300 40) extern struct dlist *dlist_append( struct dlist *list, void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 41) extern struct dlist *dlist_prepend( struct dlist *list, void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 42) extern struct dlist *dlist_insert( struct dlist *list, void *data, int position );
05d292b2 (kx 2023-03-24 03:51:10 +0300 43) extern struct dlist *dlist_insert_sorted( struct dlist *list, DLCMPF cmp_func, void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 44) extern struct dlist *dlist_insert_sorted_with_data( struct dlist *list, DLCMPDF cmp_func, void *data, void *user_data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 45) extern struct dlist *dlist_concat( struct dlist *list1, struct dlist *list2 );
05d292b2 (kx 2023-03-24 03:51:10 +0300 46) extern struct dlist *dlist_insert_list( struct dlist *list1, struct dlist *list2, int position );
05d292b2 (kx 2023-03-24 03:51:10 +0300 47)
05d292b2 (kx 2023-03-24 03:51:10 +0300 48) extern struct dlist *__dlist_remove_link( struct dlist *list, struct dlist *link );
05d292b2 (kx 2023-03-24 03:51:10 +0300 49) extern struct dlist *dlist_remove( struct dlist *list, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 50) extern struct dlist *dlist_remove_all( struct dlist *list, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 51) extern struct dlist *dlist_remove_data( struct dlist *list, DLCMPF cmp_func, DLFUNC free_func, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 52) extern struct dlist *dlist_remove_data_all( struct dlist *list, DLCMPF cmp_func, DLFUNC free_func, const void *data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 53)
05d292b2 (kx 2023-03-24 03:51:10 +0300 54) extern struct dlist *dlist_copy( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 55) extern struct dlist *dlist_reverse( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 56)
05d292b2 (kx 2023-03-24 03:51:10 +0300 57) extern struct dlist *dlist_sort( struct dlist *list, DLCMPF cmp_func );
05d292b2 (kx 2023-03-24 03:51:10 +0300 58) extern struct dlist *dlist_sort_with_data( struct dlist *list, DLCMPDF cmp_func, void *user_data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 59)
05d292b2 (kx 2023-03-24 03:51:10 +0300 60) extern void dlist_foreach( struct dlist *list, DLFUNC func, void *user_data );
05d292b2 (kx 2023-03-24 03:51:10 +0300 61)
05d292b2 (kx 2023-03-24 03:51:10 +0300 62)
05d292b2 (kx 2023-03-24 03:51:10 +0300 63) extern void __dlist_free( struct dlist *list );
05d292b2 (kx 2023-03-24 03:51:10 +0300 64) extern void dlist_free( struct dlist *list, DLFUNC free_func );
05d292b2 (kx 2023-03-24 03:51:10 +0300 65)
05d292b2 (kx 2023-03-24 03:51:10 +0300 66)
05d292b2 (kx 2023-03-24 03:51:10 +0300 67) #ifdef __cplusplus
05d292b2 (kx 2023-03-24 03:51:10 +0300 68) } /* ... extern "C" */
05d292b2 (kx 2023-03-24 03:51:10 +0300 69) #endif
05d292b2 (kx 2023-03-24 03:51:10 +0300 70)
05d292b2 (kx 2023-03-24 03:51:10 +0300 71) #endif /* __DLIST_H_ */