00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _GOCR_LIST_H
00022 #define _GOCR_LIST_H
00023
00035 struct node {
00036 struct node *next;
00037 struct node *previous;
00038 void *data;
00039 };
00040 typedef struct node Node;
00041
00045 struct list {
00046 Node *header;
00047 Node *tail;
00048 Node **fix;
00049 Node **current;
00050 int n;
00051 int level;
00052 };
00053 typedef struct list List;
00054
00055
00056
00057
00058 void list_init ( List *l );
00059 int list_app ( List *l, void *data );
00060 int list_ins ( List *l, void *data_after, void *data);
00061 int list_ins_order ( List *l, void *data,
00062 int (*say_when) (const void *, const void *) );
00063 Node* list_node_from_data ( List *l, void *data );
00064 int list_del ( List *l, void *data );
00065 void list_free ( List *l );
00066 int list_higher_level ( List *l );
00067 void list_lower_level ( List *l );
00068 void * list_next ( List *l, void *data );
00069 void * list_prev ( List *l, void *data );
00070 void list_sort ( List *l, int (*compare)(const void *, const void *) );
00071
00077 #define list_empty(l) ((l)->header == NULL ? 1 : 0)
00078
00083 #define list_get_header(l) ((l)->header->data)
00084
00089 #define list_get_tail(l) ((l)->tail->data)
00090
00096 #define list_get_current(l) ((l)->current[(l)->level]->data)
00097
00098
00099 #define list_get_cur_prev(l) ((l)->current[(l)->level]->previous == NULL ? \
00100 NULL : (l)->current[(l)->level]->previous->data )
00101 #define list_get_cur_next(l) ((l)->current[(l)->level]->next == NULL ? \
00102 NULL : (l)->current[(l)->level]->next->data )
00103
00108 #define list_total(l) ((l)->n)
00109
00110 #define for_each_data(l) \
00111 if (list_higher_level(l) == 0) { \
00112 for ( ; (l)->current[(l)->level]; (l)->current[(l)->level] = \
00113 (l)->current[(l)->level]->next ) { \
00114 if ( (l)->fix[(l)->level] ) { \
00115 int i; \
00116 for ( i = (l)->level - 1; i >= 0; i-- ) { \
00117 \
00118 \
00119 if ( (l)->fix[i] == (l)->fix[(l)->level] ) break; \
00120 } \
00121 if ( i < 0 ) { \
00122 free((l)->fix[(l)->level]); \
00123 } \
00124 (l)->fix[(l)->level] = NULL; \
00125 }
00126
00127 #define end_for_each(l) \
00128 } \
00129 list_lower_level(l); \
00130 }
00131
00133 #endif