aboutsummaryrefslogtreecommitdiff
path: root/lib/libXBMS/ccbuffer.c
blob: ae55d7fa706afa6d35259484d1fbff973f69b769 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// Place the code and data below here into the LIBXBMS section.
#ifndef __GNUC__
#pragma code_seg( "LIBXBMS" )
#pragma data_seg( "LIBXBMS_RW" )
#pragma bss_seg( "LIBXBMS_RW" )
#pragma const_seg( "LIBXBMS_RD" )
#pragma comment(linker, "/merge:LIBXBMS_RW=LIBXBMS")
#pragma comment(linker, "/merge:LIBXBMS_RD=LIBXBMS")
#endif
/*   -*- c -*-
 * 
 *  ----------------------------------------------------------------------
 *  Buffer stuff.
 *  ----------------------------------------------------------------------
 *
 *  Copyright (c) 2002-2003 by PuhPuh
 *  
 *  This code is copyrighted property of the author.  It can still
 *  be used for any non-commercial purpose following conditions:
 *  
 *      1) This copyright notice is not removed.
 *      2) Source code follows any distribution of the software
 *         if possible.
 *      3) Copyright notice above is found in the documentation
 *         of the distributed software.
 *  
 *  Any express or implied warranties are disclaimed.  Author is
 *  not liable for any direct or indirect damages caused by the use
 *  of this software.
 *
 *  ----------------------------------------------------------------------
 *
 *  This code has been integrated into XBMC Media Center.  
 *  As such it can me copied, redistributed and modified under
 *  the same conditions as the XBMC itself.
 *
 */


#include "ccincludes.h"
#include "ccbuffer.h"

CcBuffer cc_buffer_allocate(void)
{
  CcBuffer buffer;

  buffer = cc_xcalloc(1, sizeof (*buffer));
  return buffer;
}

void cc_buffer_free(CcBuffer buffer)
{
  cc_buffer_uninit(buffer);
  cc_xfree(buffer);
}

void cc_buffer_init(CcBuffer buffer)
{
  memset(buffer, 0, sizeof (*buffer));
}

void cc_buffer_uninit(CcBuffer buffer)
{
  if (buffer != NULL)
    cc_xfree(buffer->data);
  memset(buffer, 0, sizeof (*buffer));
}

size_t cc_buffer_len(CcBuffer buffer)
{
  return buffer->len;
}

unsigned char *cc_buffer_ptr(CcBuffer buffer)
{
  return buffer->data;
}

void cc_buffer_append(CcBuffer buffer, const unsigned char *data, size_t len)
{
  size_t ol;

  ol = cc_buffer_len(buffer);
  cc_buffer_append_space(buffer, len);
  memcpy(buffer->data + ol, data, len);
}

void cc_buffer_prepend(CcBuffer buffer, const unsigned char *data, size_t len)
{
  size_t ol;

  ol = cc_buffer_len(buffer);
  cc_buffer_append_space(buffer, len);
  memmove(buffer->data + len, buffer->data, ol);
  memcpy(buffer->data, data, len);
}

void cc_buffer_append_space(CcBuffer buffer, size_t len)
{
  if (len > 0)
    {
      if (buffer->data == NULL)
	{
	  buffer->data = cc_xmalloc(len);
	  buffer->len = 0;
	}
      else
	{
	  buffer->data = cc_xrealloc(buffer->data, buffer->len + len);
	}
      buffer->len += len;
    }
}

void cc_buffer_append_string(CcBuffer buffer, const char *string)
{
  if (*string != '\0')
    cc_buffer_append(buffer, (const unsigned char *)string, strlen(string));
}

void cc_buffer_prepend_string(CcBuffer buffer, const char *string)
{
  if (*string != '\0')
    cc_buffer_prepend(buffer, (const unsigned char *)string, strlen(string));
}

void cc_buffer_consume(CcBuffer buffer, size_t len)
{
  if (len > buffer->len)
    {
      cc_fatal("Buffer underflow.");
    }
  else if (len == 0)
    {
      /*NOTHING*/;
    }
  else if (len == buffer->len)
    {
      buffer->len = 0;
    }
  else
    {
      memmove(buffer->data, buffer->data + len, buffer->len - len);
      buffer->len -= len;
    }
}

void cc_buffer_consume_end(CcBuffer buffer, size_t len)
{
  if (len > buffer->len)
    {
      cc_fatal("Buffer underflow.");
    }
  else if (len == 0)
    {
      /*NOTHING*/;
    }
  else if (len == buffer->len)
    {
      buffer->len = 0;
    }
  else
    {
      buffer->len -= len;
    }
}

void cc_buffer_clear(CcBuffer buffer)
{
  buffer->len = 0;
}

void cc_buffer_steal(CcBuffer buffer, unsigned char **data, size_t *len)
{
  buffer->data = cc_xrealloc(buffer->data, buffer->len + 1);
  buffer->data[buffer->len] = '\0';
  *data = buffer->data;
  if (len != NULL)
    *len = buffer->len;
  buffer->data = NULL;
  buffer->len = 0;
}

/* eof (ccbuffer.c) */