61 |
61 |
62 void cxBufferDestroy(CxBuffer *buffer) { |
62 void cxBufferDestroy(CxBuffer *buffer) { |
63 if ((buffer->flags & CX_BUFFER_FREE_CONTENTS) == CX_BUFFER_FREE_CONTENTS) { |
63 if ((buffer->flags & CX_BUFFER_FREE_CONTENTS) == CX_BUFFER_FREE_CONTENTS) { |
64 cxFree(buffer->allocator, buffer->bytes); |
64 cxFree(buffer->allocator, buffer->bytes); |
65 } |
65 } |
66 } |
|
67 |
|
68 CxBuffer *cxBufferExtract( |
|
69 CxBuffer *src, |
|
70 size_t start, |
|
71 size_t length, |
|
72 int flags |
|
73 ) { |
|
74 if (src->size == 0 || length == 0 || |
|
75 ((size_t) -1) - start < length || start + length > src->capacity) { |
|
76 return NULL; |
|
77 } |
|
78 |
|
79 CxBuffer *dst = (CxBuffer *) malloc(sizeof(cx_buffer_s)); |
|
80 if (dst) { |
|
81 dst->bytes = malloc(length); |
|
82 if (!dst->bytes) { |
|
83 free(dst); |
|
84 return NULL; |
|
85 } |
|
86 dst->capacity = length; |
|
87 dst->size = length; |
|
88 dst->flags = flags | CX_BUFFER_FREE_CONTENTS; |
|
89 dst->pos = 0; |
|
90 memcpy(dst->bytes, src->bytes + start, length); |
|
91 } |
|
92 return dst; |
|
93 } |
66 } |
94 |
67 |
95 int cxBufferSeek( |
68 int cxBufferSeek( |
96 CxBuffer *buffer, |
69 CxBuffer *buffer, |
97 off_t offset, |
70 off_t offset, |