webengine/wmlengine/src/utils/src/nwx_datastruct.c
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/wmlengine/src/utils/src/nwx_datastruct.c	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,230 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+* Description:  Provides interfaces to data structure routines.
+*                These routines support a number of different data structures.
+*        
+*                NW_Ds_Dar - DynamicArray of pointers. Creates an array of pointers
+*                to void *. Elements are inserted and retrieved by index.
+*                The array is fixed size put will automatically grow if
+*                the append function is called and the array needs to grow.
+*
+*/
+
+/*
+**-------------------------------------------------------------------------
+**  Include Files
+**-------------------------------------------------------------------------
+*/
+#include "nwx_defs.h"
+#include "nwx_datastruct.h"
+#include "BrsrStatusCodes.h"
+
+
+/*
+**-------------------------------------------------------------------------
+**  Internal Functions
+**-------------------------------------------------------------------------
+*/
+static TBrowserStatusCode DarGrow(NW_Ds_DynamicArray_t *);
+
+/*
+**-------------------------------------------------------------------------
+**  External Public (Exported) Functions
+**-------------------------------------------------------------------------
+*/
+
+/*lint -save -e64 -e119 Type mismatch, Too many arguments*/
+
+/*************************************************************************
+**          Dynamic Array of Pointers Routines
+**************************************************************************/
+
+/*****************************************************************
+**  Name:   NW_Ds_DarNew_DefaultHeap
+**  Description:  Helper function which creates the array on the
+**                default heap
+**  Parameters:   size - number of elements in the initial
+**                allocation
+**  Return Value: pointer to the dynamic array or NULL if failure
+******************************************************************/
+NW_Ds_DynamicArray_t *NW_Ds_DarNew_DefaultHeap(const NW_Uint16 size)
+{
+  return NW_Ds_DarNew(size, NW_Mem_Malloc_Address, NW_Mem_Free_Address);
+}
+
+/*****************************************************************
+**  Name:   NW_Ds_DarNew
+**  Description:  Creates a dyamic array of pointers. The size of the
+**                array returned is always greater then or equal to one.
+**  Parameters:   size - number of elements in the initial allocation
+**                *fpAlloc -- function pointer to the memory allocation routine
+**                *fpFree --  function pointer to the free allocation routine
+**  Return Value: pointer to the dynamic array or NULL if failure
+******************************************************************/
+NW_Ds_DynamicArray_t *NW_Ds_DarNew(const NW_Uint16 size,
+                                   NW_Ds_Mem_MallocHandler *fpAlloc,
+                                   NW_Ds_Mem_FreeHandler *fpFree)
+{
+  NW_Uint16 i;
+  NW_Ds_DynamicArray_t *array;
+
+  NW_ASSERT(fpAlloc != NULL);
+  NW_ASSERT(fpFree != NULL);
+
+#ifndef FEATURE_MEMORY_PROFILE
+  array = (fpAlloc)(sizeof(NW_Ds_DynamicArray_t));
+#else
+  array = NW_Mem_Malloc(sizeof(NW_Ds_DynamicArray_t));
+#endif
+  if (array != NULL) {
+    array->size = NW_UINT16_CAST(NW_MAX(size, 1));
+    array->numElements = 0;
+#ifndef FEATURE_MEMORY_PROFILE
+    array->elements = (fpAlloc)(array->size * sizeof(void *));
+#else
+    array->elements = NW_Mem_Malloc(array->size * sizeof(void *));
+#endif
+    if (array->elements == NULL) {
+#ifndef FEATURE_MEMORY_PROFILE
+      (fpFree)(array);
+#else
+      NW_Mem_Free(array);
+#endif
+
+      return NULL;
+    }
+    for (i = 0; i < array->size; i++)
+      array->elements[i] = NULL;
+    array->mallocHandler = fpAlloc;
+    array->freeHandler   = fpFree;
+  }
+
+  return array;
+}
+
+/*****************************************************************
+**  Name:   NW_Ds_DarDelete
+**  Description:  Deletes a dyamic array of pointers.
+**  Parameters:   *array - a pointer to the dynamic array
+**  Return Value: void
+******************************************************************/
+void NW_Ds_DarDelete(NW_Ds_DynamicArray_t *array)
+{
+ if ((array != NULL) && (array->elements != NULL) && (array->freeHandler != NULL))
+  {
+#ifndef FEATURE_MEMORY_PROFILE
+  (array->freeHandler)(array->elements);
+  (array->freeHandler)(array);
+#else
+  NW_Mem_Free(array->elements);
+  NW_Mem_Free(array);
+#endif
+  }
+  return;
+}
+
+/*****************************************************************
+**  Name:   NW_Ds_DarAppend
+**  Description:  adds a pointer to an element to the end of the array.
+**                The array will grow as needed.
+**  Parameters:   *array - a pointer to the dynamic array
+**                *element - the data to append
+**  Return Value: KBrsrSuccess if succeeds, else KBrsrOutOfMemory
+******************************************************************/
+TBrowserStatusCode NW_Ds_DarAppend(NW_Ds_DynamicArray_t *array, void *element)
+{
+  NW_ASSERT(array != NULL);
+  NW_ASSERT(array->elements != NULL);
+
+  if (array->numElements >= array->size) {
+    if (DarGrow(array) == KBrsrOutOfMemory)
+      return KBrsrOutOfMemory;
+  }
+  array->elements[array->numElements++] = element;
+
+  return KBrsrSuccess;
+}
+
+/*****************************************************************
+**  Name:   DarGrow
+**  Description:  Grow the array by 1/2 the current size
+**  Parameters:   *array - a pointer to the dynamic array
+**  Return Value: KBrsrSuccess if succeeds, else KBrsrOutOfMemory
+******************************************************************/
+static TBrowserStatusCode DarGrow(NW_Ds_DynamicArray_t *array)
+{
+  NW_Int32 i;
+  NW_Uint16 newsize;
+  void **temp;
+
+  NW_ASSERT(array != NULL);
+  NW_ASSERT(array->elements != NULL);
+
+  newsize = NW_UINT16_CAST(array->size + NW_MAX((array->size/2), 1));
+#ifndef FEATURE_MEMORY_PROFILE
+  temp = (array->mallocHandler)(newsize * sizeof(void *));
+#else
+  temp = NW_Mem_Malloc(newsize * sizeof(void *));
+#endif
+  if (temp == NULL) {
+    return KBrsrOutOfMemory;
+  } else {
+    array->size = newsize;
+    for (i = 0; i < array->numElements; i++)
+      temp[i] = array->elements[i];
+    for (i = array->numElements; i < array->size; i++)
+      temp[i] = NULL;
+#ifndef FEATURE_MEMORY_PROFILE
+    (array->freeHandler)(array->elements);
+#else
+    NW_Mem_Free(array->elements);
+#endif
+    array->elements = temp;
+    return KBrsrSuccess;
+  }
+}
+
+
+/*****************************************************************
+**  Name:   NW_Ds_DarGetElement
+**  Description:  gets the pointer to the specified element
+**  Parameters:   *array - a pointer to the dynamic array
+**                index - the index of the element to get
+**  Return Value: a pointer to the data or NULL if array out of bounds
+******************************************************************/
+void *NW_Ds_DarGetElement(const NW_Ds_DynamicArray_t *array, const NW_Uint32 index)
+{
+  NW_ASSERT(array != NULL);
+  NW_ASSERT(array->elements != NULL);
+  NW_ASSERT(index < array->numElements);
+
+  if (index < array->numElements)
+    return array->elements[index];
+  else
+    return NULL;
+}
+/*****************************************************************
+**  Name:   NW_Ds_DarGetCount
+**  Description:  gets the number of elements in the array
+**  Parameters:   *array - a pointer to the dynamic array
+**  Return Value: the actual number of elements stored in the array
+******************************************************************/
+NW_Uint16 NW_Ds_DarGetCount(const NW_Ds_DynamicArray_t *array)
+{
+  if(array != NULL)
+    return array->numElements;
+  return 0;
+}
+
+/*lint -restore*/