Initial revision
[cacao.git] / src / toolbox / list.h
1 /************************** toolbox/list.h *************************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         Verwaltung von doppelt verketteten Listen. 
8
9         Authors: Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
10
11         Last Change: 1996/10/03
12
13 *******************************************************************************/
14
15 typedef struct listnode {           /* Struktur f"ur ein Listenelement */
16         struct listnode *next,*prev;
17         } listnode;
18
19 typedef struct list {               /* Struktur f"ur den Listenkopf */
20         listnode *first,*last;
21         int nodeoffset;
22         } list;
23
24
25 void list_init (list *l, int nodeoffset);
26
27 void list_addlast (list *l, void *element);
28 void list_addfirst (list *l, void *element);
29
30 void list_remove (list *l, void *element);
31  
32 void *list_first (list *l);
33 void *list_last (list *l);
34
35 void *list_next (list *l, void *element);
36 void *list_prev (list *l, void *element);
37
38
39 /*
40 ---------------------- Schnittstellenbeschreibung -----------------------------
41
42 Die Listenverwaltung mit diesem Modul geht so vor sich:
43         
44         - jede Struktur, die in die Liste eingeh"angt werden soll, mu"s 
45           eine Komponente vom Typ 'listnode' haben.
46           
47         - es mu"s ein Struktur vom Typ 'list' bereitgestellt werden.
48         
49         - die Funktion list_init (l, nodeoffset) initialisiert diese Struktur,
50           dabei gibt der nodeoffset den Offset der 'listnode'-Komponente in
51           den Knotenstrukturen an.
52           
53         - Einf"ugen, Aush"angen und Suchen von Elementen der Liste geht mit
54           den "ubrigen Funktionen.
55           
56 Zum besseren Verst"andnis ein kleines Beispiel:
57
58
59         void bsp() {
60                 struct node {
61                         listnode linkage;
62                         int value;
63                         } a,b,c, *el;
64                         
65                 list l;
66                 
67                 a.value = 7;
68                 b.value = 9;
69                 c.value = 11;
70                 
71                 list_init (&l, OFFSET(struct node,linkage) );
72                 list_addlast (&l, a);
73                 list_addlast (&l, b);
74                 list_addlast (&l, c);
75                 
76                 e = list_first (&l);
77                 while (e) {
78                         printf ("Element: %d\n", e->value);
79                         e = list_next (&l,e);
80                         }
81         }
82         
83         
84         Dieses Programm w"urde also folgendes ausgeben:
85                 7
86                 9
87                 11
88
89
90
91 Der Grund, warum beim Initialisieren der Liste der Offset mitangegeben
92 werden mu"s, ist der da"s ein und das selbe Datenelement gleichzeitig
93 in verschiedenen Listen eingeh"angt werden kann (f"ur jede Liste mu"s
94 also eine Komponente vom Typ 'listnode' im Element enthalten sein).
95
96 */
97