X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=junkcode%2Fdongre.avinash%40gmail.com-clibutils%2Fsrc%2Fc_slist.c;fp=junkcode%2Fdongre.avinash%40gmail.com-clibutils%2Fsrc%2Fc_slist.c;h=fc8dfce2b479f3b58a80691863d957bbe467cddb;hp=0000000000000000000000000000000000000000;hb=1c6f12a3c7f65e6130335a43e799dc3aa6a23a18;hpb=7d21fec7d95839ea07c4389232b1f2e4c5fc8251 diff --git a/junkcode/dongre.avinash@gmail.com-clibutils/src/c_slist.c b/junkcode/dongre.avinash@gmail.com-clibutils/src/c_slist.c new file mode 100644 index 00000000..fc8dfce2 --- /dev/null +++ b/junkcode/dongre.avinash@gmail.com-clibutils/src/c_slist.c @@ -0,0 +1,173 @@ +/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** + * This file is part of clib library + * Copyright (C) 2011 Avinash Dongre ( dongre.avinash@gmail.com ) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ + +#include "c_lib.h" + +struct clib_slist* +new_clib_slist(clib_destroy fn_d, clib_compare fn_c){ + struct clib_slist *pSlist = (struct clib_slist*)malloc(sizeof(struct clib_slist)); + pSlist->head = (struct clib_slist_node*)0; + pSlist->destruct_fn = fn_d; + pSlist->compare_fn = fn_c; + pSlist->size = 0; + return pSlist; +} +void +delete_clib_slist( struct clib_slist *pSlist){ + while(pSlist->size != 0) { + remove_clib_slist ( pSlist, 0 ); + } + free ( pSlist ); +} + +clib_error +push_back_clib_slist( struct clib_slist *pSlist, void *elem, size_t elem_size){ + + struct clib_slist_node* current = (struct clib_slist_node*)0; + struct clib_slist_node* new_node = (struct clib_slist_node*)0; + + new_node = (struct clib_slist_node*)malloc(sizeof(struct clib_slist_node)); + + new_node->elem = new_clib_object ( elem, elem_size ); + if ( ! new_node->elem ) + return CLIB_SLIST_INSERT_FAILED; + new_node->next = (struct clib_slist_node*)0; + + if ( pSlist->head == (struct clib_slist_node*)0 ) { + pSlist->head = new_node; + pSlist->size++; + return CLIB_ERROR_SUCCESS; + } + current = pSlist->head; + while ( current->next != (struct clib_slist_node*)0 ) + current = current->next; + current->next = new_node; + pSlist->size++; + + return CLIB_ERROR_SUCCESS; +} +static void +pvt_remove_clib_list ( struct clib_slist *pSlist, struct clib_slist_node* pSlistNode ) { + void *elem; + get_raw_clib_object(pSlistNode->elem, &elem); + if ( pSlist->destruct_fn) { + (pSlist->destruct_fn)(elem); + delete_clib_object ( pSlistNode->elem ); + }else { + free ( elem ); + delete_clib_object ( pSlistNode->elem ); + } + free ( pSlistNode); +} +void +remove_clib_slist( struct clib_slist *pSlist, int pos ) { + int i = 0; + + struct clib_slist_node* current = pSlist->head; + struct clib_slist_node* temp = (struct clib_slist_node*)0; + + if ( pos > pSlist->size ) return; + + if ( pos == 0 ) { + pSlist->head = current->next; + pvt_remove_clib_list(pSlist, current); + pSlist->size--; + return; + } + for ( i = 1; i < pos - 1; i++) + current = current->next; + + temp = current->next; + current->next = current->next->next; + pvt_remove_clib_list ( pSlist, temp ); + + pSlist->size--; +} +clib_error +insert_clib_slist(struct clib_slist *pSlist, int pos, void *elem, size_t elem_size) { + int i = 0; + struct clib_slist_node* current = pSlist->head; + struct clib_slist_node* new_node = (struct clib_slist_node*)0; + + if ( pos == 1 ) { + new_node = (struct clib_slist_node*)malloc(sizeof(struct clib_slist_node)); + new_node->elem = new_clib_object ( elem, elem_size ); + if ( ! new_node->elem ) { + free ( new_node ); + return CLIB_SLIST_INSERT_FAILED; + } + new_node->next = pSlist->head; + pSlist->head = new_node; + pSlist->size++; + return CLIB_ERROR_SUCCESS; + } + + if ( pos >= pSlist->size + 1 ) { + return push_back_clib_slist ( pSlist, elem, elem_size ); + } + + for ( i = 1; i < pos - 1; i++) { + current = current->next; + } + new_node = (struct clib_slist_node*)malloc(sizeof(struct clib_slist_node)); + new_node->elem = new_clib_object ( elem, elem_size ); + if ( ! new_node->elem ) { + free ( new_node ); + return CLIB_SLIST_INSERT_FAILED; + } + + new_node->next = current->next; + current->next = new_node; + pSlist->size++; + + return CLIB_ERROR_SUCCESS; +} +void +for_each_clib_slist (struct clib_slist *pSlist, void (*fn)(void* )) { + void *elem; + struct clib_slist_node* current = pSlist->head; + while ( current != (struct clib_slist_node*)0 ) { + get_raw_clib_object(current->elem, &elem); + (fn)(elem); + free ( elem ); + current = current->next; + } +} +clib_bool +find_clib_slist (struct clib_slist *pSlist, void* find_value, void**out_value) { + struct clib_slist_node* current = pSlist->head; + while ( current != (struct clib_slist_node*)0 ) { + get_raw_clib_object(current->elem, out_value); + if ((pSlist->compare_fn)(find_value,*out_value) != 0){ + break; + } + free ( *out_value ); + current = current->next; + } + if ( current ) { + return clib_true; + } + return clib_false; +} + +