Version 0.2.0 from FTP
[asterisk/asterisk.git] / doc / linkedlists.README
1
2 2nd version, implemented as macros.
3
4         include <asterisk/linkedlists.h>
5
6 AST_LIST_ENTRY declares pointers inside the object structure : 
7
8         struct ast_var_t {
9                 char *name;
10                 char *value;
11                 AST_LIST_ENTRY(ast_var_t) listpointers;
12         };
13
14 AST_LIST_HEAD declares a head structure, which is initialized
15 to AST_LIST_HEAD_NULL : 
16
17         AST_LIST_HEAD(head, ast_var_t) head 
18
19 Next, we declare a pointer to this structure : 
20
21         struct headtype *headp = head;
22
23 AST_LIST_INIT initializes the head pointer to a null value
24
25         AST_LIST_INIT(headp);
26
27 AST_LIST_INSERT_HEAD inserts an element to the head of the list : 
28
29         struct ast_var_t *node; 
30
31         node=malloc(sizeof(struct ast_var_t));
32         (...we fill data in struct....)
33         data->name=malloc(100);
34         strcpy(data->name,"lalalalaa");
35         etc etc
36
37         (then we insert the node in the head of the list :)
38
39         AST_LIST_INSERT_HEAD(headp,node,listpointers);
40
41 AST_LIST_INSERT_HEAD_AFTER inserts an element after another : 
42
43         struct ast_var_t *node1;
44         ...
45         AST_LIST_INSERT_AFTER(node,node1,listpointers);
46
47 AST_LIST_REMOVE removes an arbitrary element from the head:
48
49         AST_LIST_REMOVE(headp,node1,ast_var_t,listpointers);
50
51 AST_LIST_REMOVE_HEAD removes the entry at the head of the list: 
52
53         AST_LIST_REMOVE(headp,listpointers);
54
55 AST_LIST_FIRST returns a pointer to the first element of the list;
56
57         struct ast_var_t *firstnode;
58         firstnode=AST_LIST_FIRST(headp);
59
60 AST_LIST_NEXT returns a pointer to the next element : 
61
62         struct ast_var_t *nextnode;
63         nextnode=AST_LIST_NEXT(firstnode,listpointers);
64
65 AST_LIST_TRAVERSE traverses all elements of the list : 
66
67         struct ast_var_t *node;
68
69         AST_LIST_TRAVERSE(headp,node,listpointers) {
70                 printf("%s\n",node->name);
71         }
72
73 AST_LIST_EMPTY evaluates to a true condition if there are no elements on 
74 the list. 
75
76 To completely delete a list : 
77
78         struct ast_var_t *vardata;
79
80         while (!AST_LIST_EMPTY(headp)) {           /* List Deletion. */
81                     vardata = AST_LIST_FIRST(head);
82                     AST_LIST_REMOVE_HEAD(head, listpointers);
83                     free(vardata->name);
84                     free(vardata->value);
85         }
86
87 AST_LIST_LOCK returns true if it can lock the list, AST_LIST_UNLOCK unlocks
88 the list : 
89
90 if (AST_LIST_LOCK(headp)) {
91         ...do all list operations here...
92         AST_LIST_UNLOCK(headp);
93 } else {
94         ast_log(LOG_WARNING,"List locked bla bla bla\n");
95 }