OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [simulator/] [linkedlist.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
/*
2
 * Copyright (c) 2007 The Akuma Project
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a copy
5
 * of this software and associated documentation files (the "Software"), to
6
 * deal in the Software without restriction, including without limitation the
7
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8
 * sell copies of the Software, and to permit persons to whom the Software is
9
 * furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice shall be included in
12
 * all copies or substantial portions of the Software.
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
 * IN THE SOFTWARE.
21
 *
22
 * $Id: linkedlist.c 108 2007-05-13 18:47:48Z eirik $
23
 */
24
 
25
#include <stdio.h>
26
#include <stdlib.h>
27
 
28
#include "linkedlist.h"
29
 
30
llist_t
31
llist_make(void)
32
{
33
        llist_t llist;
34
 
35
        llist = malloc(sizeof *llist);
36
        if (llist == NULL)
37
                return NULL;
38
        llist->head = NULL;
39
        llist->tail = NULL;
40
 
41
        return llist;
42
}
43
 
44
void
45
llist_destroy(llist_t head)
46
{
47
        llist_node_t node, next;
48
 
49
        for (node = head->head; node; node = next) {
50
                next = node->next;
51
                free(node);
52
        }
53
 
54
        free(head);
55
}
56
 
57
enum llist_add_type {
58
        HEAD,
59
        TAIL
60
};
61
 
62
static int
63
llist_add(llist_t head, void *obj, enum llist_add_type type)
64
{
65
        llist_node_t node;
66
 
67
        node = malloc(sizeof *node);
68
        if (node == NULL)
69
                return 0;
70
 
71
        node->next = NULL;
72
        node->obj = obj;
73
 
74
        /* First object added */
75
        if (head->head == NULL) {
76
                head->head = node;
77
                head->tail = node;
78
        } else if (type == TAIL) {
79
                head->tail->next = node;
80
                head->tail = node;
81
        } else if (type == HEAD) {
82
                node->next = head->head;
83
                head->head = node;
84
        }
85
 
86
        return 1;
87
}
88
 
89
int
90
llist_add_pos(llist_t head, void *obj, int pos)
91
{
92
        llist_node_t node, prev, newnode;
93
        int n;
94
 
95
        if (head->head == NULL) {
96
                return llist_add_head(head, obj);
97
        }
98
        newnode = malloc(sizeof *newnode);
99
        if (newnode == NULL)
100
                return 0;
101
        newnode->obj = obj;
102
        newnode->next = NULL;
103
 
104
        node = head->head;
105
        prev = NULL;
106
        for(node = head->head, n = 0; n < pos; node = node->next, n++) {
107
                if (node == NULL) {
108
                        prev->next = newnode;
109
                        head->tail = newnode;
110
                        return 1;
111
                }
112
                prev = node;
113
        }
114
        if (prev == NULL) {
115
                head->head = newnode;
116
                newnode->next = node;
117
        } else {
118
                newnode->next = prev->next;
119
                prev->next = newnode;
120
        }
121
 
122
        return 1;
123
}
124
 
125
int
126
llist_add_tail(llist_t head, void *obj)
127
{
128
        return llist_add(head, obj, TAIL);
129
}
130
 
131
int
132
llist_add_head(llist_t head, void *obj)
133
{
134
        return llist_add(head, obj, HEAD);
135
}
136
 
137
void *
138
llist_pop(llist_t head)
139
{
140
        llist_node_t node;
141
        void *obj;
142
 
143
        if (head->head == NULL)
144
                return NULL;
145
        node = head->head;
146
        if (node->next == NULL) {
147
                head->head = NULL;
148
                head->tail = NULL;
149
        }
150
        else {
151
                head->head = node->next;
152
        }
153
 
154
        obj = llist_getobj(node);
155
        free(node);
156
        return obj;
157
}
158
 
159
/* zero indexed */
160
void *
161
llist_getelem(llist_t head, int num)
162
{
163
        int i;
164
        llist_node_t node;
165
 
166
        i = 0;
167
        LLIST_FOREACH(head, node) {
168
                if (i == num)
169
                        return llist_getobj(node);
170
                i++;
171
        }
172
        return NULL;
173
}
174
 
175
void *
176
llist_getobj(llist_node_t node)
177
{
178
        return node->obj;
179
}
180
 
181
int
182
llist_empty(llist_t head)
183
{
184
        return (head->head == NULL);
185
}
186
 
187
llist_t
188
llist_copy(llist_t old)
189
{
190
        llist_t new;
191
        llist_node_t node;
192
 
193
        new = llist_make();
194
        if (new == NULL)
195
                return NULL;
196
        LLIST_FOREACH(old, node) {
197
                if (!llist_add_tail(new, llist_getobj(node))) {
198
                        llist_destroy(new);
199
                        return NULL;
200
                }
201
        }
202
 
203
        return new;
204
}
205
 
206
int
207
llist_insert_list_head(llist_t head, llist_t add)
208
{
209
        llist_t copy = llist_copy(add);
210
        llist_node_t node;
211
 
212
        if (copy == NULL)
213
                return 0;
214
        if (head->head == NULL) {
215
                head->head = copy->head;
216
                head->tail = copy->tail;
217
        } else {
218
                node = head->head;
219
                head->head = copy->head;
220
                copy->tail->next = node;
221
        }
222
        free(copy);
223
 
224
        return 1;
225
}
226
 
227
int
228
llist_size(llist_t head)
229
{
230
        int n;
231
        llist_node_t node;
232
 
233
        n = 0;
234
        LLIST_FOREACH(head, node)
235
                n++;
236
 
237
        return n;
238
}
239
 
240
void
241
llist_remove_elem(llist_t list, int n)
242
{
243
        llist_node_t cur, prev;
244
        int i;
245
 
246
        if (list->head == NULL)
247
                return;
248
 
249
        prev = NULL;
250
        for(cur = list->head, i = 0; cur; cur = cur->next, i++) {
251
                if (i == n) {
252
                        if (cur == list->head) {
253
                                list->head = cur->next;
254
                        }
255
                        if (cur == list->tail) {
256
                                list->tail = prev;
257
                        }
258
                        prev->next = cur->next;
259
                        free(cur);
260
                        return;
261
                }
262
                i++;
263
                prev = cur;
264
        }
265
}
266
 
267
int
268
llist_insert_list(llist_t list, llist_t newlist, int pos)
269
{
270
        llist_node_t node;
271
        int n;
272
 
273
        n = pos;
274
        LLIST_FOREACH(newlist, node) {
275
                if (!llist_add_pos(list, llist_getobj(node), n++))
276
                        return 0;
277
        }
278
 
279
        return 1;
280
}
281
 
282
#ifdef TEST_LINKEDLIST
283
 
284
int
285
main(void)
286
{
287
        llist_t head;
288
        llist_node_t node;
289
 
290
        if ((head = llist_make()) == NULL) {
291
                fprintf(stderr, "Unable to make linked list\n");
292
                exit(1);
293
        }
294
 
295
        printf("Add1: %d\n", llist_add_tail(head, "eirik"));
296
        printf("Add2: %d\n", llist_add_tail(head, "akuma"));
297
        printf("Add3: %d\n", llist_add_head(head, "jeroen"));
298
 
299
        LLIST_FOREACH(head, node) {
300
                printf("Got: %s\n", llist_getobj(node));
301
        }
302
 
303
        llist_destroy(head);
304
 
305
        return 0;
306
}
307
 
308
#endif /* TEST_LINKEDLIST */
309
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.