xml/cxmllibrary/src/utils/src/nwx_buffer.c
author hgs
Wed, 23 Jun 2010 20:27:15 +0530
changeset 24 74f0b3eb154c
permissions -rw-r--r--
201024
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 1999 - 2001 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
/*****************************************************************
hgs
parents:
diff changeset
    20
**    File name:  NW_Buffer.c
hgs
parents:
diff changeset
    21
**    Part of: Buffer
hgs
parents:
diff changeset
    22
**    Version: 3/16/99      Initial version
hgs
parents:
diff changeset
    23
**    Description:  Provides the interface to a managerd buffer of bytes.
hgs
parents:
diff changeset
    24
**                  The buffer contains an allocated size and an in use 
hgs
parents:
diff changeset
    25
**                  size (length)  and also a pointer to a data array.
hgs
parents:
diff changeset
    26
******************************************************************/
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*
hgs
parents:
diff changeset
    29
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
**  Include Files
hgs
parents:
diff changeset
    31
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
*/
hgs
parents:
diff changeset
    33
#include "nwx_buffer.h"
hgs
parents:
diff changeset
    34
#include "nwx_mem.h"
hgs
parents:
diff changeset
    35
#include "nwx_assert.h"
hgs
parents:
diff changeset
    36
#include "nw_string_utils.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
/*
hgs
parents:
diff changeset
    39
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
**  Constants
hgs
parents:
diff changeset
    41
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
*/
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/*
hgs
parents:
diff changeset
    45
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
**  Internal Types
hgs
parents:
diff changeset
    47
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
*/
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/*
hgs
parents:
diff changeset
    51
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    52
**  Macros
hgs
parents:
diff changeset
    53
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
*/
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/*
hgs
parents:
diff changeset
    57
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
**  Internal Prototypes
hgs
parents:
diff changeset
    59
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
*/
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
/*
hgs
parents:
diff changeset
    63
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
**  File Scoped Static Variables
hgs
parents:
diff changeset
    65
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
*/
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*
hgs
parents:
diff changeset
    69
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
**  Global Variable Definitions
hgs
parents:
diff changeset
    71
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
*/
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
/*
hgs
parents:
diff changeset
    75
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
**  Internal Functions
hgs
parents:
diff changeset
    77
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
*/
hgs
parents:
diff changeset
    79
static NW_Status_t Resize_Data(NW_Buffer_t *buffer, const NW_Uint32 len)
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
  void *temp;
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
  if (buffer->allocatedLength < len) {
hgs
parents:
diff changeset
    84
    temp = NW_Mem_Malloc(len);
hgs
parents:
diff changeset
    85
    if (temp == NULL)
hgs
parents:
diff changeset
    86
      return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
    87
    NW_Mem_Free(buffer->data);
hgs
parents:
diff changeset
    88
    buffer->length = 0;
hgs
parents:
diff changeset
    89
    buffer->allocatedLength = len;
hgs
parents:
diff changeset
    90
    buffer->data = temp;
hgs
parents:
diff changeset
    91
  }
hgs
parents:
diff changeset
    92
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
    93
}
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
/*
hgs
parents:
diff changeset
    97
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
    98
**  External Public (Exported) Functions
hgs
parents:
diff changeset
    99
**-------------------------------------------------------------------------
hgs
parents:
diff changeset
   100
*/
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
/*****************************************************************
hgs
parents:
diff changeset
   103
**  Name:  NW_Buffer_New
hgs
parents:
diff changeset
   104
**  Description:  creates a new buffer
hgs
parents:
diff changeset
   105
**  Parameters:   size  - size to allocate
hgs
parents:
diff changeset
   106
**  Return Value: pointer to the new buffer
hgs
parents:
diff changeset
   107
******************************************************************/
hgs
parents:
diff changeset
   108
NW_Buffer_t *NW_Buffer_New(const NW_Uint32 size)    
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
  NW_Buffer_t *buffer;
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
  buffer = NW_Mem_Malloc(sizeof(NW_Buffer_t));
hgs
parents:
diff changeset
   113
  if (buffer != NULL) {
hgs
parents:
diff changeset
   114
    buffer->length = 0;
hgs
parents:
diff changeset
   115
    buffer->allocatedLength = size;
hgs
parents:
diff changeset
   116
    buffer->data = NULL;
hgs
parents:
diff changeset
   117
    if (size > 0) {
hgs
parents:
diff changeset
   118
      buffer->data = NW_Mem_Malloc(size);
hgs
parents:
diff changeset
   119
      if (buffer->data == NULL) {
hgs
parents:
diff changeset
   120
        NW_Mem_Free(buffer);
hgs
parents:
diff changeset
   121
        return NULL;
hgs
parents:
diff changeset
   122
      }
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
  }
hgs
parents:
diff changeset
   125
  return buffer;
hgs
parents:
diff changeset
   126
}
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
/*****************************************************************
hgs
parents:
diff changeset
   129
**  Name:  NW_Buffer_Free
hgs
parents:
diff changeset
   130
**  Description:  frees the space allocated for a buffer
hgs
parents:
diff changeset
   131
**  Parameters:   *buffer - the buffer to free
hgs
parents:
diff changeset
   132
**  Return Value: void 
hgs
parents:
diff changeset
   133
******************************************************************/
hgs
parents:
diff changeset
   134
EXPORT_C void NW_Buffer_Free(NW_Buffer_t *buffer)    
hgs
parents:
diff changeset
   135
{
hgs
parents:
diff changeset
   136
  if (buffer != NULL) {
hgs
parents:
diff changeset
   137
    if (buffer->data != NULL) {
hgs
parents:
diff changeset
   138
      NW_Mem_Free(buffer->data);
hgs
parents:
diff changeset
   139
      buffer->data = NULL;
hgs
parents:
diff changeset
   140
    }
hgs
parents:
diff changeset
   141
    NW_Mem_Free(buffer);
hgs
parents:
diff changeset
   142
  }
hgs
parents:
diff changeset
   143
  return;
hgs
parents:
diff changeset
   144
}
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
/*****************************************************************
hgs
parents:
diff changeset
   147
**  Name:  NW_Buffer_FreeNotData
hgs
parents:
diff changeset
   148
**  Description:  free the space allocated for a buffer. 
hgs
parents:
diff changeset
   149
**  Parameters:   *buffer - the buffer to free
hgs
parents:
diff changeset
   150
**  Return Value: void 
hgs
parents:
diff changeset
   151
**  Notes:  This does not free the data
hgs
parents:
diff changeset
   152
******************************************************************/
hgs
parents:
diff changeset
   153
EXPORT_C void NW_Buffer_FreeNotData(NW_Buffer_t *buffer)
hgs
parents:
diff changeset
   154
{
hgs
parents:
diff changeset
   155
  if (buffer != NULL) {
hgs
parents:
diff changeset
   156
    buffer->data = NULL;
hgs
parents:
diff changeset
   157
    NW_Mem_Free(buffer);
hgs
parents:
diff changeset
   158
  }
hgs
parents:
diff changeset
   159
  return;
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*****************************************************************
hgs
parents:
diff changeset
   163
**  Name:  NW_Buffer_CopyStr
hgs
parents:
diff changeset
   164
**  Description:  Copy NULL terminated string into buffer and adjust 
hgs
parents:
diff changeset
   165
**                length.  If necessary, reallocate space.
hgs
parents:
diff changeset
   166
**  Parameters:   *buffer - the buffer to copy to
hgs
parents:
diff changeset
   167
**                *str - the string to copy from
hgs
parents:
diff changeset
   168
**  Return Value: NW_STAT_SUCCESS if succeeds, else NW_STAT_OUT_OF_MEMORY 
hgs
parents:
diff changeset
   169
******************************************************************/
hgs
parents:
diff changeset
   170
NW_Status_t NW_Buffer_CopyStr(NW_Buffer_t *buffer, const NW_Ucs2 *str)
hgs
parents:
diff changeset
   171
{
hgs
parents:
diff changeset
   172
  NW_Uint16 len;
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
  NW_ASSERT(buffer != NULL);
hgs
parents:
diff changeset
   175
  NW_ASSERT(str != NULL);
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
  len = (NW_Uint16)NW_Str_Strsize(str);
hgs
parents:
diff changeset
   178
  if (Resize_Data(buffer, len) == NW_STAT_OUT_OF_MEMORY)
hgs
parents:
diff changeset
   179
    return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
   180
  NW_Mem_memcpy(buffer->data, str, len);
hgs
parents:
diff changeset
   181
  buffer->length = len;
hgs
parents:
diff changeset
   182
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   183
}
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
/*****************************************************************
hgs
parents:
diff changeset
   186
**  Name:  NW_Buffer_CopyBuffers
hgs
parents:
diff changeset
   187
**  Description:  Copy NW_Buffer into buffer (NW_Buffer) 
hgs
parents:
diff changeset
   188
**                and adjust length. If necessary, reallocate space.
hgs
parents:
diff changeset
   189
**  Parameters:   *to - the buffer to copy to
hgs
parents:
diff changeset
   190
**                *from - the buffer to copy from
hgs
parents:
diff changeset
   191
**  Return Value: NW_STAT_SUCCESS if succeeds, else NW_STAT_OUT_OF_MEMORY 
hgs
parents:
diff changeset
   192
******************************************************************/
hgs
parents:
diff changeset
   193
NW_Status_t NW_Buffer_CopyBuffers(NW_Buffer_t *to, const NW_Buffer_t *from)
hgs
parents:
diff changeset
   194
{
hgs
parents:
diff changeset
   195
  NW_ASSERT(to != NULL);
hgs
parents:
diff changeset
   196
  NW_ASSERT(from != NULL);
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
  if (Resize_Data(to, from->length) == NW_STAT_OUT_OF_MEMORY)
hgs
parents:
diff changeset
   199
    return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
   200
  NW_Mem_memcpy(to->data, from->data, from->length);
hgs
parents:
diff changeset
   201
  to->length = from->length;
hgs
parents:
diff changeset
   202
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   203
}
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
/*****************************************************************
hgs
parents:
diff changeset
   206
**  Name:  NW_Buffer_SetData
hgs
parents:
diff changeset
   207
**  Description:  Set NULL terminated ascii string into buffer and  
hgs
parents:
diff changeset
   208
**                adjust length.
hgs
parents:
diff changeset
   209
**  Parameters:   *buffer - the buffer to copy to
hgs
parents:
diff changeset
   210
**                *str - the string to set into buffer
hgs
parents:
diff changeset
   211
**  Return Value: void 
hgs
parents:
diff changeset
   212
******************************************************************/
hgs
parents:
diff changeset
   213
void NW_Buffer_SetData(NW_Buffer_t *buffer, char *str)
hgs
parents:
diff changeset
   214
{
hgs
parents:
diff changeset
   215
  NW_Uint32 len;
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
  NW_ASSERT(buffer != NULL);
hgs
parents:
diff changeset
   218
  NW_ASSERT(str != NULL);
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
  if(buffer->data != NULL) {
hgs
parents:
diff changeset
   221
    NW_Mem_Free(buffer->data);
hgs
parents:
diff changeset
   222
  } 
hgs
parents:
diff changeset
   223
  len = (NW_Asc_strlen(str) + 1) * sizeof(char);
hgs
parents:
diff changeset
   224
  buffer->length = len;
hgs
parents:
diff changeset
   225
  buffer->allocatedLength = len;
hgs
parents:
diff changeset
   226
  buffer->data = (NW_Byte *)str;
hgs
parents:
diff changeset
   227
  return;
hgs
parents:
diff changeset
   228
}