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