- 论坛徽章:
- 0
|
typedef struct __curl_buf {
char *_data;
int _size;
int _mem;
int _ref;
}curl_buf;
static inline curl_buf* _curl_buf_init()
{
curl_buf *buf = malloc(sizeof(curl_buf));
buf->_size = 0;
buf->_mem = 128;
buf->_data = malloc(buf->_mem);
buf->_ref = 1;
return buf;
}
static inline void _curl_buf_free(curl_buf *object)
{
free(object->_data);
free(object);
}
static inline curl_buf* _curl_buf_ref(curl_buf *object)
{
++object->_ref;
return object;
}
static inline void _curl_buf_uref(curl_buf *object)
{
if (--object->_ref == 0) {
_curl_buf_free(object);
}
}
static inline curl_buf* _curl_buf_copy(curl_buf *object)
{
curl_buf *t;
t = malloc(sizeof(curl_buf));
t->_size = object->_size;
t->_mem = object->_mem;
t->_ref = 1;
t->_data = malloc(t->_mem);
if (object->_size > 0) {
memcpy(t->_data, object->_data, object->_size);
}
return t;
}
static inline int _curl_buf_isonly(curl_buf *object)
{
return object->_ref == 1;
}
static inline void _curl_buf_data_copy(curl_buf *object, int size, void *buf, int offset)
{
if (object->_mem - 1 < offset + size) {
object->_data = realloc(object->_data, offset + size + 1);
object->_mem = offset + size + 1;
}
memcpy(object->_data + offset, buf, size);
}
static inline curl_buf* cb_alloc_ref(curl_buf *copy)
{
if (copy == NULL)
return _curl_buf_init();
return _curl_buf_ref(copy);
}
static inline void cb_relese(curl_buf *object)
{
_curl_buf_uref(object);
}
static inline void _curl_buf_add_data(curl_buf **object, int size, void *buf)
{
curl_buf *t;
if (!_curl_buf_isonly(*object)) {
t = _curl_buf_copy(*object);
_curl_buf_uref(*object);
*object = t;
} else {
t = *object;
}
_curl_buf_data_copy(t, size, buf, t->_size);
t->_size += size;
t->_data[t->_size] = 0;
}
#define cb_add_data(object, size, buf) \
_curl_buf_add_data(&object, size, buf)
static inline char* cb_get_data(curl_buf *object)
{
return object->_data;
}
static inline int cb_get_size(curl_buf *object)
{
return object->_size;
} |
|