/*
dbuf.c - Dynamic buffer implementation
- version 1.1.1, April 11th, 2003
+ version 1.2.0, January 6th, 2007
- Copyright (c) 2002-2003 Borut Razem
+ Copyright (c) 2002-2007 Borut Razem
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
/*
* Assure that the buffer is large enough to hold
- * size bytes; enlarge it if necessary.
+ * current length + size bytes; enlarge it if necessary.
+ *
+ * Intended for internal use.
*/
-static int dbuf_expand(struct dbuf_s *dbuf, size_t size)
+int _dbuf_expand(struct dbuf_s *dbuf, size_t size)
{
assert(dbuf->alloc != 0);
assert(dbuf->buf != NULL);
if (dbuf->len + size > dbuf->alloc) {
/* new_allocated_size = current_allocated_size * 2^n */
/* can this be optimized? */
- while (dbuf->len + size >= dbuf->alloc)
+ do {
dbuf->alloc += dbuf->alloc;
+ }
+ while (dbuf->len + size > dbuf->alloc);
if ((dbuf->buf = realloc(dbuf->buf, dbuf->alloc)) == NULL)
return 0;
* Set the buffer size. Buffer size can be only decreased.
*/
-int dbuf_set_size(struct dbuf_s *dbuf, size_t size)
+int dbuf_set_length(struct dbuf_s *dbuf, size_t len)
{
assert(dbuf != NULL);
assert(dbuf->alloc != 0);
- assert(size < dbuf->len);
+ assert(len <= dbuf->len);
- if (size <= dbuf->len) {
- dbuf->len = size;
+ if (len <= dbuf->len) {
+ dbuf->len = len;
return 1;
}
* Append the buf to the end of the buffer.
*/
-int dbuf_append(struct dbuf_s *dbuf, const void *buf, size_t size)
+int dbuf_append(struct dbuf_s *dbuf, const void *buf, size_t len)
{
assert(dbuf != NULL);
assert(dbuf->alloc != 0);
assert(dbuf->buf != NULL);
- if (dbuf_expand(dbuf, size) != 0) {
- memcpy(&(((char *)dbuf->buf)[dbuf->len]), buf, size);
- dbuf->len += size;
+ if (_dbuf_expand(dbuf, len) != 0) {
+ memcpy(&(((char *)dbuf->buf)[dbuf->len]), buf, len);
+ dbuf->len += len;
return 1;
}
assert(dbuf->alloc != 0);
assert(dbuf->buf != NULL);
- /* only if not already null terminated */
- if (((char *)dbuf->buf)[dbuf->len] != '\0') {
- dbuf_expand(dbuf, 1);
+ if (_dbuf_expand(dbuf, 1) != 0) {
((char *)dbuf->buf)[dbuf->len] = '\0';
+ return dbuf->buf;
}
- return dbuf->buf;
+ return NULL;
}
/*
- * Get the buffer size.
+ * Get the buffer length.
*/
-size_t dbuf_get_size(struct dbuf_s *dbuf)
+size_t dbuf_get_length(struct dbuf_s *dbuf)
{
assert(dbuf != NULL);
assert(dbuf->alloc != 0);
dbuf_destroy(dbuf);
free(dbuf);
}
+
+
+/*
+ * Free detached buffer.
+ *
+ * See dbuf_detach()
+ */
+
+void dbuf_free(const void *buf)
+{
+ free((void *)buf);
+}