views:

144

answers:

2

I need an open-source (preferably MIT-licensed) light-weight growable buffer implemented in plain C (preferably also compileable as C++).

I need API equivalent to following (pseudo-code):

  • void set_allocator(buffer * buf, allocator_Fn fn);
  • void push_bytes(buffer * buf, const char * bytes, size_t len);
  • size_t get_length(buffer * buf);
  • void overwrite_autogrow(buffer * buf, size_t offset, const char * bytes, size_t len);
  • const char * to_string(buffer * buf);

Implementation should be clean and self-contained.

The overwrite_autogrow writes len of bytes to given offset while growing buffer as needed (as push_bytes does).

Ability to set allocator is optional, but preferable to have.

Does somebody know anything close to what I want?

Or, at least, any implementations worth looking at while implementing my own?

A: 

http://library.gnome.org/devel/glib/stable/glib-Arrays.html

not sure if it implements overwrite_autogrow though, as I don't know what you mean by this. You want to manually set a capacity? If so g_array_set_size.

However, the licence may be a problem, but you should be able to use it as LGPL. I don't know if that's comaptible with MIT or not.

Pod
I've updated my question to explain overwrite_autogrow.I'm trying to avoid [L]GPL as much as I can, but I'll take it if I wouldn't find anything better. Thanks!
Alexander Gladysh
+2  A: 

VPOOL (BSD License)

http://www.bsdua.org/libbsdua.html#vpool

Vpool is an auto-resizeable buffer (dynamic array). Using it, you don't need to care about memory allocation, boundary checking, pointer manipulations and etc.

f3lix
Thanks! That is almost what I want (it has some extra features and has no support for custom allocators — but that is fixable).
Alexander Gladysh