xml/cxmllibrary/src/tinytree/src/EBuffer.c
branchRCL_3
changeset 33 604ca70b6235
parent 32 889504eac4fb
child 40 80a0ad972c63
--- a/xml/cxmllibrary/src/tinytree/src/EBuffer.c	Tue Aug 31 17:02:56 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,355 +0,0 @@
-/*
-* Copyright (c) 2000 - 2001 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: 
-*
-*/
-
-#include "cxml_internal.h"
-#include <xml/cxml/nw_tinytree_ebuffer.h>
-
-/* ------------------------------------------------------------------------- *
-   private methods
- * ------------------------------------------------------------------------- */
-
-/* Get the index corresponding to the first element in a segment.
- * This can be added to an offset within the segment to get the
- * index of any element
- */
- 
-static
-CXML_Vector_Metric_t
-NW_TinyTree_EBuffer_GetFirstIndex(NW_TinyTree_EBuffer_t* ebuffer,
-																	CXML_Vector_Metric_t segNum)
-{
-  CXML_Vector_Metric_t currentSegment;
-  NW_TinyTree_Segment_t* segment;
-  CXML_Vector_Metric_t firstIndex = 0;
-
-  NW_ASSERT(segNum < ebuffer->numSegments);
-
-  for (currentSegment = 0; currentSegment < segNum; currentSegment++){
-    segment = &(ebuffer->segmentList[currentSegment]);
-    firstIndex = (CXML_Vector_Metric_t)(firstIndex + segment->segmentSize);
-  }
-
-  return firstIndex;
-}
-
-/* Find a free block of a given size. This duplicates a bit of code from
- * GetFirstIndex in order to avoid repeated iteration over the buffer list.
- */
-
-static
-NW_Uint8*
-NW_TinyTree_EBuffer_FindFreeBlock(NW_TinyTree_EBuffer_t* ebuffer,
-																	CXML_Vector_Metric_t size,
-																	CXML_Vector_Metric_t *index)      /* OUT */
-{
-  CXML_Vector_Metric_t currentSegment;
-  NW_TinyTree_Segment_t* segment;
-  CXML_Vector_Metric_t firstIndex = 0;
-  NW_Uint8* storage;
-
-  *index = CXML_Vector_AtEnd;
-
-  for (currentSegment = 0; currentSegment < ebuffer->numSegments; currentSegment++){
-    segment = &(ebuffer->segmentList[currentSegment]);
-
-    if((segment->segmentSize - segment->freeOffset) >= size){
-      *index = (CXML_Vector_Metric_t)(firstIndex + segment->freeOffset);
-      storage = segment->storage + segment->freeOffset;
-      segment->freeOffset = (CXML_Vector_Metric_t)(segment->freeOffset + size);
-      return storage;
-    }
-    firstIndex = (CXML_Vector_Metric_t)(firstIndex + segment->segmentSize);
-  }
-  return 0;
-}
-
-static
-NW_Status_t
-NW_TinyTree_EBuffer_GrowSegmentList(NW_TinyTree_EBuffer_t* ebuffer){
-
-  CXML_Vector_Metric_t newSegmentListSize;
-  NW_TinyTree_Segment_t* newSegmentList;
-
- 
-  /* Since any new allocation is a continuous block contained in a
-   * single segment, we grow the segment list by a constant amount 
-  */
-
-  newSegmentListSize = 
-    (NW_Uint8)(ebuffer->segmentListSize + CXML_SEGMENT_LIST_INCREMENT);
-
-  /* if(newSegmentListSize == 0) then it means that there is overflow in the 
-   * newSegmentListSize so return with error here.
-   */
-
-  if(newSegmentListSize == 0)
-  {
-   return NW_STAT_OUT_OF_MEMORY;
-  }
-
-
-  newSegmentList =
-    (NW_TinyTree_Segment_t*) NW_Mem_Malloc (newSegmentListSize * sizeof (*newSegmentList));
-
-  if (newSegmentList == NULL) {
-    return NW_STAT_OUT_OF_MEMORY;
-  }
- 
-  /* Copy the old segment list */
-
-  (void) NW_Mem_memcpy (newSegmentList, ebuffer->segmentList,
-                        ebuffer->numSegments * sizeof (*newSegmentList));
-  
-  /* Free the old segment list and install the new */
-
-  NW_Mem_Free (ebuffer->segmentList);
-  ebuffer->segmentList = newSegmentList;
-  ebuffer->segmentListSize = newSegmentListSize;
-  return NW_STAT_SUCCESS;
-}
-
-
-/* 
- * Allocate a new segment that holds a block of a given size.
- */
-
-static
-NW_Uint8*
-NW_TinyTree_EBuffer_AllocSegment(NW_TinyTree_EBuffer_t* ebuffer,
-                                  CXML_Vector_Metric_t size,
-                                  CXML_Vector_Metric_t *index)      /* OUT */
-{
-  NW_TinyTree_Segment_t* segment;
-
-  *index = CXML_Vector_AtEnd;
-  
-  /* Make sure the segment list is big enough to hold the new segment */
-
-  if(ebuffer->numSegments == ebuffer->segmentListSize){
-    NW_TinyTree_EBuffer_GrowSegmentList(ebuffer);
-  }
-
-  /* The new segment is the first unused segment in the list */
-  segment = &(ebuffer->segmentList[ebuffer->numSegments]);
-
-  /* Increment the segment count */
-  ebuffer->numSegments = (CXML_Vector_Metric_t)(ebuffer->numSegments + 1);
-
-  /* Allocate segment storage with enough contiguous blocks to hold the requested size */
-
-  segment->segmentSize = 
-    (CXML_Vector_Metric_t)(((size - 1) / ebuffer->blockSize + 1) * ebuffer->blockSize);
-  
-  segment->storage = (NW_Uint8*)(NW_Mem_Malloc(segment->segmentSize));
-  
-  if(segment->storage == 0){
-    segment->segmentSize = 0;
-    return 0;
-  }
-
-  /* Free offset goes at end of allocated block */
-  segment->freeOffset = size;
-
-  /* Get the first index of the newly allocated segment */
-  *index = NW_TinyTree_EBuffer_GetFirstIndex(ebuffer, (CXML_Vector_Metric_t)(ebuffer->numSegments - 1));
-
-  return segment->storage;
-}
-
-
-
-/* ------------------------------------------------------------------------- *
-   virtual methods
- * ------------------------------------------------------------------------- */
-
-/* ------------------------------------------------------------------------- */
-NW_TinyTree_EBuffer_t*
-NW_TinyTree_EBuffer_Construct (NW_Uint8* initialBuffer,
-															 CXML_Vector_Metric_t initBuffSize,
-															 CXML_Vector_Metric_t blockSize,
-															 NW_Bool freeBuff)
-{
-	NW_TinyTree_EBuffer_t* thisObj = (NW_TinyTree_EBuffer_t*)
-		NW_Mem_Malloc(sizeof(NW_TinyTree_EBuffer_t));
-
-	if(thisObj)
-	{
-		/* initialize the object */
-	 thisObj->blockSize = blockSize;
-	 thisObj->ownFirstBlock = freeBuff;
-	 thisObj->segmentListSize = CXML_SEGMENT_LIST_INCREMENT;
-	 NW_ASSERT(thisObj->segmentListSize > 0);
-	 thisObj->segmentList = (NW_TinyTree_Segment_t*)
-	 NW_Mem_Malloc (thisObj->segmentListSize * sizeof (*thisObj->segmentList));
-	 if (thisObj->segmentList == NULL) 
-	 {
-		NW_Mem_Free(thisObj);
-        return NULL;
-	 }
-	 if (initialBuffer != NULL)
-   {
-     NW_ASSERT(initBuffSize != 0);
-     thisObj->segmentList[0].storage = initialBuffer;
-     thisObj->segmentList[0].segmentSize = initBuffSize;
-     thisObj->segmentList[0].freeOffset = initBuffSize;
-     thisObj->numSegments = 1;
-   }
-	 else 
-   {
-		/* If there's no first block, then we ignore the free flag passed in 
-		 * since we will be allocating the first block and thus must free it
-		*/
-		thisObj->ownFirstBlock = NW_TRUE;  
-		thisObj->numSegments = 0;
-   }
-	}
-  return thisObj;
-}
-
-/* ------------------------------------------------------------------------- */
-void
-NW_TinyTree_EBuffer_Destruct (NW_TinyTree_EBuffer_t* thisObj)
-{
-  CXML_Vector_Metric_t index;
-
-  /* release our resources */
-  for (index = 0; index < thisObj->numSegments; index++) {
-    if((index == 0) && (thisObj->ownFirstBlock == NW_FALSE)){
-      continue;
-    }
-    NW_Mem_Free (thisObj->segmentList[index].storage);
-  }
-  NW_Mem_Free (thisObj->segmentList);
-  NW_Mem_Free (thisObj);
-}
-
-
-/* ------------------------------------------------------------------------- *
-   final methods
- * ------------------------------------------------------------------------- */
-
-
-/* Get an unused block of a given size. Returns the address of the
- * block. Also returns an index (via the index OUT parameter) that can
- * be used for later lookups of the block.  
-*/
- 
-NW_Uint8*
-NW_TinyTree_EBuffer_GetWritableBlock(NW_TinyTree_EBuffer_t* ebuffer,
-                                     CXML_Vector_Metric_t size,
-                                     CXML_Vector_Metric_t *index)      /* OUT */
-{
-  NW_Uint8* storage;
-
-  NW_ASSERT(ebuffer != NULL);
-  
-  /* First try to get an existing free block that's big enough */
-
-  storage = NW_TinyTree_EBuffer_FindFreeBlock(ebuffer, size, index);
-  if(storage != 0){
-    return storage;
-  }
-
-  /* Otherwise, allocate a new segment that holds a block of the right size */
-
-  return NW_TinyTree_EBuffer_AllocSegment(ebuffer, size, index); 
-}
-
-
-/* Get a segment address and an offset corresponding to a given
- * index. Also returns the segment size.
- */
-
-NW_Status_t
-NW_TinyTree_EBuffer_GetSegmentAndOffset(NW_TinyTree_EBuffer_t* ebuffer,
-                                        CXML_Vector_Metric_t index,
-                                        NW_Uint8            ** segmentAddr, /* OUT */
-                                        CXML_Vector_Metric_t* segSize,  /* OUT */
-                                        CXML_Vector_Metric_t* offset){  /* OUT */
-
-  CXML_Vector_Metric_t currentSegment;
-  NW_TinyTree_Segment_t* segment;
-  CXML_Vector_Metric_t firstIndex = 0;
-  
-  NW_ASSERT(ebuffer != NULL);
-  NW_ASSERT(segmentAddr != NULL);
-  NW_ASSERT(segSize != NULL);
-  NW_ASSERT(offset != NULL);
-
-  for (currentSegment = 0; currentSegment < ebuffer->numSegments; currentSegment++){
-    segment = &(ebuffer->segmentList[currentSegment]);
-    if(index < (firstIndex + segment->segmentSize)){
-      *segmentAddr  = segment->storage;
-      *segSize = segment->segmentSize;
-      *offset = (CXML_Vector_Metric_t)(index - firstIndex);
-      return NW_STAT_SUCCESS;
-    }
-    firstIndex = (CXML_Vector_Metric_t)(firstIndex + segment->segmentSize);
-  }
-
-  return NW_STAT_FAILURE;
-}
-
-/* Get an index from a segment and offset */
-
-NW_Status_t
-NW_TinyTree_EBuffer_GetIndex(NW_TinyTree_EBuffer_t* ebuffer,
-                             NW_Uint8*  segmentAddr,         
-                             CXML_Vector_Metric_t offset,
-                             CXML_Vector_Metric_t* index) /* OUT */
-
-{
-
-  CXML_Vector_Metric_t currentSegment;
-  NW_TinyTree_Segment_t* segment;
-  CXML_Vector_Metric_t firstIndex = 0;
-  
-  NW_ASSERT(ebuffer != NULL);
-
-  for (currentSegment = 0; currentSegment < ebuffer->numSegments; currentSegment++){
-    segment = &(ebuffer->segmentList[currentSegment]);
-    if(segmentAddr == segment->storage){
-      *index = (CXML_Vector_Metric_t)(firstIndex + offset);
-      return NW_STAT_SUCCESS;
-    }
-    firstIndex = (CXML_Vector_Metric_t)(firstIndex + segment->segmentSize);
-  }
-
-  return NW_STAT_FAILURE;
-}
-
-
-/* Get the address corresponding to a given index */
-
-NW_Uint8*
-NW_TinyTree_EBuffer_AddressAt(NW_TinyTree_EBuffer_t* ebuffer,
-                              CXML_Vector_Metric_t index){
-
-  NW_Uint8* segmentAddr;
-  CXML_Vector_Metric_t segSize;
-  CXML_Vector_Metric_t offset;
-  NW_Status_t status;
-
-  NW_ASSERT(ebuffer != NULL);
-
-  status = NW_TinyTree_EBuffer_GetSegmentAndOffset(ebuffer, index, &segmentAddr, &segSize, &offset);
-  if(status == NW_STAT_SUCCESS){
-    return segmentAddr + offset;
-  }
-  return 0;
-
-}