diff -r 000000000000 -r 951a5db380a0 videoeditorengine/h263decoder/src/dlist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/h263decoder/src/dlist.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,384 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - Initial contribution +* +* Contributors: +* Ixonos Plc +* +* Description: +* Doubly linked list module. +* +*/ + + +/* + * dlist.c + * + * + * + * Project: + * Mobile Videophone Demonstrator + * H.263 Video Decoder + * + * Contains: + * This module contains generic list handling functions for doubly linked + * lists, i.e. one can use the same set of functions regardless of the type + * of list items. + * The list item type has a constraint that it must begin with the skeleton + * of a list item (see the definition of DLST_ITEM_SKELETON in dlist.h). + * + * The prefix ddlst is used in common names defined in this module. + * + * + * + */ + + +#include "dlist.h" + + +#ifndef NULL + #define NULL 0 +#endif + + +/* + * dlstClose + * + * + * Parameters: + * list a pointer to a list + * + * Function: + * This function deinitializes the given list. Notice that no dynamic + * allocation for the list is done. This function must be called when + * the list is no longer used. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstClose(dlst_t *list) +{ + list->head = list->tail = list->curr = NULL; + list->numItems = 0; + + return 0; +} + + +/* + * dlstRemove + * + * + * Parameters: + * list a pointer to a list + * item used to return a pointer to the removed + * list item + * + * Function: + * This function removes an item from the list. Notice that no copying of + * contents of the given item is done, i.e. only the pointer to the item + * is used. + * + * If there are no items left in the list, NULL will be returned in + * the item parameter. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstRemove(dlst_t *list, void **item) +{ + if (list->curr) { + dlstListItem_t + *curr = list->curr, + *prev = (dlstListItem_t *) (list->curr->prev), + *next = (dlstListItem_t *) (list->curr->next); + + *item = (void *) curr; + + if (prev) + prev->next = curr->next; + else + list->head = (dlstListItem_t *) curr->next; + + if (next) + next->prev = curr->prev; + + curr->next = NULL; + curr->prev = NULL; + + if (curr == list->tail) { + list->tail = prev; + list->curr = prev; + } + else + list->curr = next; + + list->numItems--; + } + + else + *item = NULL; + + return 0; +} + + +/* + * dlstOpen + * + * + * Parameters: + * list a pointer to a list + * + * Function: + * This function initializes the given list. Notice that no dynamic + * allocation for the list is done. This function must be called before + * the list is used. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstOpen(dlst_t *list) +{ + list->head = list->tail = list->curr = NULL; + list->numItems = 0; + + return 0; +} + + +/* + * dlstHead + * + * + * Parameters: + * list a pointer to a dlst list + * item used to return a pointer to the head item + * of the list + * + * Function: + * This function sets the current access point to the head of the list and + * returns a pointer to the head item. Notice that no copying of + * contents of the given item is done, i.e. only the pointer to the item + * is used. + * + * If there are no items left in the list, NULL will be returned in + * the item parameter. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstHead(dlst_t *list, void **item) +{ + if (list->head) + *item = (void *) list->head; + + else + *item = NULL; + + list->curr = list->head; + + return 0; +} + + +/* + * dlstTail + * + * + * Parameters: + * list a pointer to a dlst list + * + * Function: + * This function sets the current access point to the tail of the list + * enabling the item addition to the end of the list. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstTail(dlst_t *list, void **item) +{ + + if (list->tail) + *item = (void *) list->tail; + + else + *item = NULL; + + list->curr = list->tail; + + return 0; +} + + +/* + * dlstNext + * + * + * Parameters: + * list a pointer to a dlst list + * item used to return a pointer to the next item + * of the list + * + * Function: + * This function sets the current access point to the next item of the list + * and returns a pointer to the item. Notice that no copying of + * contents of the given item is done, i.e. only the pointer to the item + * is used. + * + * If there are no items left in the list, NULL will be returned in + * the item parameter and the current access point shall be left as it is. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstNext(dlst_t *list, void **item) +{ + if (list->curr && list->curr->next) { + list->curr = (dlstListItem_t *) (list->curr->next); + *item = (void *) list->curr; + } + + else + *item = NULL; + + return 0; +} + + +int dlstPrev(dlst_t *list, void **item) +{ + if (list->curr && list->curr->prev) { + list->curr = (dlstListItem_t *) (list->curr->prev); + *item = (void *) list->curr; + } + + else + *item = NULL; + + return 0; +} + + +int dlstCurr(dlst_t *list, void **item) +{ + *item = (void *) list->curr; + + return 0; +} + + +int dlstNextExists(dlst_t *list) +{ + return (list->curr && list->curr->next) ? 1 : 0; +} + +/* + * dlstAdd + * + * + * Parameters: + * list a pointer to a dlst list + * item an item to add to the list + * + * Function: + * This function adds an item into the list. Notice that no copying of + * contents of the given item is done, i.e. only the pointer to the item + * is used. + * + * Returns: + * >= 0 if the function was successful + * < 0 indicating an error + * + */ + +int dlstAddBeforeCurr(dlst_t *list, void *item) +{ + dlstListItem_t + *curr, *prev, *listItem = (dlstListItem_t *) item; + + if (list->curr) { + curr = (dlstListItem_t *) list->curr, + prev = (dlstListItem_t *) list->curr->prev; + + if (prev) + prev->next = item; + else + list->head = (dlstListItem_t *) item; + listItem->prev = prev; + + curr->prev = item; + listItem->next = curr; + + list->curr = (dlstListItem_t *) item; + } + + else { + list->head = list->tail = list->curr = (dlstListItem_t *) item; + listItem->next = NULL; + listItem->prev = NULL; + } + + list->numItems++; + + return 0; +} + +int dlstAddAfterCurr(dlst_t *list, void *item) +{ + dlstListItem_t + *curr, *next, *listItem = (dlstListItem_t *) item; + + if (list->curr) { + curr = list->curr, + next = (dlstListItem_t *) (list->curr->next); + + curr->next = item; + listItem->prev = curr; + + if (next) + next->prev = item; + else + list->tail = (dlstListItem_t *) item; + listItem->next = next; + + list->curr = (dlstListItem_t *) item; + } + + else { + list->head = list->tail = list->curr = (dlstListItem_t *) item; + listItem->next = NULL; + listItem->prev = NULL; + } + + list->numItems++; + + return 0; +} +// End of File