Introducing Ashn’s Utility Library (autil)

Today I have released the initial version of autil, a collection of data structures and algorithms for rapid application development in C99. The C standard library lacks many of the tools useful for general purpose programming, so in practice a lot of C developers cultivate their own set of tools to supplement libc. The autil library is my personal set of these tools that I have built up over multiple years of C development.

The autil library comes as a single header file in the style of the stb libs popularized by Sean Barrett. The library contains a general purpose exit-on-failure allocator, utility functions for easily reading and writing an entire file, basic error logging functions, a generic resizable array implementation similar-ish to C++’s std::vector, and a generic ordered map implementation similar-ish to C++’s std::map. There is a lot more I want to add to the library, in particular I want to add string-view and managed string types that properly handle embedded NUL bytes. So look forward to future revisions of this library adding those goodies.

Something I really tried to do with this library was keep the API dead simple. Most functions exit on allocation failure. The vec and map container types are only exposed as opaque pointers to heap allocated resources created with *_new and destroyed with *_del, and all properties on those containers must be queried with explicit function calls returning rvalues or un-modifiable lvalues. Functions are documented with short, human-readable comments, and no function is so long that you would feel overwhelmed reading its definition. Basically, I tried to KISS even if it meant sacrificing some performance and flexibility.

In the future I hope to expand on the autil library with additional data structures and algorithms. Additionally I hope to write a blog post on the implementation of the vec and map container types. I think these containers are a lot nicer to work with than their glib counterparts and I used some neat techniques in their implementation that I would like to share in detail.

Anyway that’s all I have for this blog post. Take a look at the library and let me know your thoughts. I very much welcome contributor submissions/suggestions, and I would love to see examples and projects built using the library.