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)) { |
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; |
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 |