diff options
author | Andi Gutmans <andi@php.net> | 2000-02-19 10:10:46 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2000-02-19 10:10:46 +0000 |
commit | 0cda28f77bcea25a35b2d55ee1bb52c5fdb34f2a (patch) | |
tree | 11e6fbfcc15fe72ed98e6736d84b47ac9250fcc0 /ext/mysql/libmysql/list.c | |
parent | fe9abd3219b097e0c0f2c9106751d35b2bede2d6 (diff) | |
download | php-git-0cda28f77bcea25a35b2d55ee1bb52c5fdb34f2a.tar.gz |
- Add libmysql to the tree
Diffstat (limited to 'ext/mysql/libmysql/list.c')
-rw-r--r-- | ext/mysql/libmysql/list.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/ext/mysql/libmysql/list.c b/ext/mysql/libmysql/list.c new file mode 100644 index 0000000000..f39ac7e3e3 --- /dev/null +++ b/ext/mysql/libmysql/list.c @@ -0,0 +1,100 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* + Code for handling dubble-linked lists in C +*/ + +#include "mysys_priv.h" +#include <my_list.h> + + + + /* Add a element to start of list */ + +LIST *list_add(LIST *root, LIST *element) +{ + if (root) + { + if (root->prev) /* If add in mid of list */ + root->prev->next= element; + element->prev=root->prev; + root->prev=element; + } + else + element->prev=0; + element->next=root; + return element; /* New root */ +} + + +LIST *list_delete(LIST *root, LIST *element) +{ + if (element->prev) + element->prev->next=element->next; + else + root=element->next; + if (element->next) + element->next->prev=element->prev; + return root; +} + + +void list_free(LIST *root, pbool free_data) +{ + LIST *next; + while (root) + { + next=root->next; + if (free_data) + my_free((gptr) root->data,MYF(0)); + my_free((gptr) root,MYF(0)); + root=next; + } +} + + +LIST *list_cons(void *data, LIST *list) +{ + LIST *new=(LIST*) my_malloc(sizeof(LIST),MYF(MY_FAE)); + if (!new) + return 0; + new->data=data; + return list_add(list,new); +} + + +LIST *list_reverse(LIST *root) +{ + LIST *last; + + last=root; + while (root) + { + last=root; + root=root->next; + last->next=last->prev; + last->prev=root; + } + return last; +} + +uint list_length(LIST *list) +{ + uint count; + for (count=0 ; list ; list=list->next, count++) ; + return count; +} + + +int list_walk(LIST *list, list_walk_action action, gptr argument) +{ + int error=0; + while (list) + { + if ((error = (*action)(list->data,argument))) + return error; + list=rest(list); + } + return 0; +} |