You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.2 KiB
61 lines
1.2 KiB
void *create_linked_list(void *value){
|
|
void *output;
|
|
|
|
output = kmalloc(POINTER_SIZE*3);
|
|
((void **) output)[0] = value;
|
|
((void **) output)[1] = (void *) 0;
|
|
((void **) output)[2] = (void *) 0;
|
|
|
|
return output;
|
|
}
|
|
|
|
void free_linked_list(void *list, void (*free_value)(void *)){
|
|
void *next_list;
|
|
|
|
while((int) list){
|
|
free_value(((void **) list)[0]);
|
|
next_list = ((void **) list)[1];
|
|
kfree(list);
|
|
list = next_list;
|
|
}
|
|
}
|
|
|
|
void *get_list_value(void *list){
|
|
return ((void **) list)[0];
|
|
}
|
|
|
|
void *next_list(void *list){
|
|
return ((void **) list)[1];
|
|
}
|
|
|
|
void *previous_list(void *list){
|
|
return ((void **) list)[2];
|
|
}
|
|
|
|
void add_value(void *list, void *value){
|
|
void *new_list;
|
|
void *temp;
|
|
|
|
new_list = create_linked_list(value);
|
|
temp = ((void **) list)[1];
|
|
((void **) list)[1] = new_list;
|
|
((void **) new_list)[1] = temp;
|
|
((void **) new_list)[2] = list;
|
|
if((int) temp)
|
|
((void **) temp)[2] = new_list;
|
|
}
|
|
|
|
void remove_value(void *list, void (*free_value)(void *)){
|
|
void *next;
|
|
void *prev;
|
|
|
|
free_value(((void **) list)[0]);
|
|
next = ((void **) list)[1];
|
|
prev = ((void **) list)[2];
|
|
kfree(list);
|
|
if((int) next)
|
|
((void **) next)[2] = prev;
|
|
if((int) prev)
|
|
((void **) prev)[1] = next;
|
|
}
|