src/buffer.c

changeset 890
54565fd74e74
parent 761
61d5197d612b
equal deleted inserted replaced
889:f549fd9fbd8f 890:54565fd74e74
34 34
35 int cxBufferInit( 35 int cxBufferInit(
36 CxBuffer *buffer, 36 CxBuffer *buffer,
37 void *space, 37 void *space,
38 size_t capacity, 38 size_t capacity,
39 CxAllocator const *allocator, 39 const CxAllocator *allocator,
40 int flags 40 int flags
41 ) { 41 ) {
42 if (allocator == NULL) allocator = cxDefaultAllocator; 42 if (allocator == NULL) allocator = cxDefaultAllocator;
43 buffer->allocator = allocator; 43 buffer->allocator = allocator;
44 buffer->flags = flags; 44 buffer->flags = flags;
71 } 71 }
72 72
73 CxBuffer *cxBufferCreate( 73 CxBuffer *cxBufferCreate(
74 void *space, 74 void *space,
75 size_t capacity, 75 size_t capacity,
76 CxAllocator const *allocator, 76 const CxAllocator *allocator,
77 int flags 77 int flags
78 ) { 78 ) {
79 CxBuffer *buf = cxMalloc(allocator, sizeof(CxBuffer)); 79 CxBuffer *buf = cxMalloc(allocator, sizeof(CxBuffer));
80 if (buf == NULL) return NULL; 80 if (buf == NULL) return NULL;
81 if (0 == cxBufferInit(buf, space, capacity, allocator, flags)) { 81 if (0 == cxBufferInit(buf, space, capacity, allocator, flags)) {
138 void cxBufferReset(CxBuffer *buffer) { 138 void cxBufferReset(CxBuffer *buffer) {
139 buffer->size = 0; 139 buffer->size = 0;
140 buffer->pos = 0; 140 buffer->pos = 0;
141 } 141 }
142 142
143 int cxBufferEof(CxBuffer const *buffer) { 143 int cxBufferEof(const CxBuffer *buffer) {
144 return buffer->pos >= buffer->size; 144 return buffer->pos >= buffer->size;
145 } 145 }
146 146
147 int cxBufferMinimumCapacity( 147 int cxBufferMinimumCapacity(
148 CxBuffer *buffer, 148 CxBuffer *buffer,
170 * @param nitems the number of items 170 * @param nitems the number of items
171 * @return the number of items flushed 171 * @return the number of items flushed
172 */ 172 */
173 static size_t cx_buffer_write_flush_helper( 173 static size_t cx_buffer_write_flush_helper(
174 CxBuffer *buffer, 174 CxBuffer *buffer,
175 unsigned char const *space, 175 const unsigned char *space,
176 size_t size, 176 size_t size,
177 size_t nitems 177 size_t nitems
178 ) { 178 ) {
179 size_t pos = 0; 179 size_t pos = 0;
180 size_t remaining = nitems; 180 size_t remaining = nitems;
195 } 195 }
196 return nitems - remaining; 196 return nitems - remaining;
197 } 197 }
198 198
199 size_t cxBufferWrite( 199 size_t cxBufferWrite(
200 void const *ptr, 200 const void *ptr,
201 size_t size, 201 size_t size,
202 size_t nitems, 202 size_t nitems,
203 CxBuffer *buffer 203 CxBuffer *buffer
204 ) { 204 ) {
205 // optimize for easy case 205 // optimize for easy case
271 // in case we could not flush everything, keep the rest 271 // in case we could not flush everything, keep the rest
272 } 272 }
273 items_keep = nitems - items_flush; 273 items_keep = nitems - items_flush;
274 if (items_keep > 0) { 274 if (items_keep > 0) {
275 // try again with the remaining stuff 275 // try again with the remaining stuff
276 unsigned char const *new_ptr = ptr; 276 const unsigned char *new_ptr = ptr;
277 new_ptr += items_flush * size; 277 new_ptr += items_flush * size;
278 // report the directly flushed items as written plus the remaining stuff 278 // report the directly flushed items as written plus the remaining stuff
279 return items_flush + cxBufferWrite(new_ptr, size, items_keep, buffer); 279 return items_flush + cxBufferWrite(new_ptr, size, items_keep, buffer);
280 } else { 280 } else {
281 // all items have been flushed - report them as written 281 // all items have been flushed - report them as written

mercurial