list.h
Go to the documentation of this file.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
Generated on Thu Jul 29 16:43:27 2004 for GOCR API by
1.3.7