videoeditorengine/h263decoder/src/dlist.cpp
changeset 0 951a5db380a0
--- /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