xref: /haiku/src/add-ons/kernel/file_systems/websearchfs/lists2.c (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  * Copyright 2004-2008, François Revol, <revol@free.fr>.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #include <KernelExport.h>
7 #include <OS.h>
8 #include "lists2.h"
9 
10 #include <stdio.h>
11 
12 void *sll_find(long nextoff, void *head, sll_compare_func func, void *id)
13 {
14 	void *p = head;
15 	int count = 5000;
16 	if (head == NULL)
17 		return NULL;
18 	while (p) {
19 		if (func(p, id) == 0)
20 			return p;
21 		p = sll_next(nextoff, p);
22 		if (!count--) {
23 			fprintf(stderr, "sll_find: WARNING: 5000 nodes to search ??? looks more of a loop.\n");
24 			return NULL;
25 		}
26 	}
27 	return NULL;
28 }
29 
30 status_t sll_insert_head(long nextoff, void **head, void *item)
31 {
32 	void *next = NULL;
33 	if (head == NULL || item == NULL)
34 		return EINVAL;
35 	if (*head)
36 		next = *head;
37 	*(void **)(((char *)item)+nextoff) = next;
38 	*head = item;
39 	return B_OK;
40 }
41 
42 status_t sll_insert_tail(long nextoff, void **head, void *item)
43 {
44 	void *p;
45 	if (head == NULL || item == NULL)
46 		return EINVAL;
47 
48 	if (*(void **)(((char *)item)+nextoff)) {
49 		fprintf(stderr, "sll_insert_tail: WARNING: %p->next NOT NULL\n", item);
50 		*(void **)(((char *)item)+nextoff) = NULL;
51 	}
52 
53 	p = *head;
54 	if (!p) {
55 		*head = item;
56 		return B_OK;
57 	}
58 	while (sll_next(nextoff, p))
59 		p = sll_next(nextoff, p);
60 	*(void **)(((char *)p)+nextoff) = item;
61 	return B_OK;
62 }
63 
64 void *sll_dequeue_tail(long nextoff, void **head)
65 {
66 	void **prev = NULL;
67 	void *curr = NULL;
68 	if (head == NULL || *head == NULL)
69 		return NULL;
70 	prev = head;
71 	curr = *head;
72 	while (sll_next(nextoff, curr)) {
73 		prev = (void **)(((char *)curr)+nextoff);
74 		curr = sll_next(nextoff, curr);
75 	}
76 	*prev = NULL;
77 	return curr;
78 }
79 
80 status_t sll_remove(long nextoff, void **head, void *item)
81 {
82 	void **prev = NULL;
83 	void *curr = NULL;
84 	if (head == NULL || *head == NULL || item == NULL)
85 		return EINVAL;
86 	prev = head;
87 	curr = *head;
88 	while (prev && curr) {
89 		if (curr == item) {
90 			*prev = sll_next(nextoff, curr);
91 			*(void **)(((char *)item)+nextoff) = NULL;
92 			return B_OK;
93 		}
94 		prev = (void **)(((char *)curr)+nextoff);
95 		curr = sll_next(nextoff, curr);
96 	}
97 	return ENOENT;
98 }
99 
100 void *sll_next(long nextoff, void *item)
101 {
102 	void *next;
103 	if (!item)
104 		return NULL;
105 	next = *(void **)(((char *)item)+nextoff);
106 	return next;
107 }
108