Overview
Portable, stand-alone C libraries and data structures. (C99)
Each folder is stand-alone with a single header/source pair in it. There is no
build for libraries, just copy files you want.
e.g If you want the logger, copy sc_log.h and sc_log.c to your project.
Features
- High performance & minimal memory usage
- Portability between many operating systems and architectures
- Tests with 100% branch coverage and multiple sanitizers
- Drag & drop source code distribution
Test
There is 100% branch-coverage on Linux and CI runs on
OS : Linux, MacOS, FreeBSD and Windows Compilers : GCC, Clang, MSVC Arch : x64, aarch64, armv6(32 bit), armv7(32 bit), ppc64le, s390x(big endian) Sanitizers : valgrind and clang/gcc sanitizers(address, undefined, thread)
List
Library | Description |
---|---|
array | Generic array/vector |
buffer | Buffer for encoding/decoding variables, best fit for protocol/serialization implementations |
condition | Condition wrapper for Posix and Windows |
crc32 | Crc32c, uses crc32c CPU instruction if available |
heap | Min heap which can be used as max heap/priority queue as well |
ini | Ini parser |
linked list | Intrusive linked list |
logger | Logger |
map | A high performance open addressing hashmap |
memory map | Mmap wrapper for Posix and Windows |
mutex | Mutex wrapper for Posix and Windows |
option | Cmdline argument parser. Very basic one |
perf | Benchmark utility to get performance counters info via perf_event_open() |
queue | Generic queue which can be used as dequeue/stack/list as well |
sc | Utility functions |
signal | Signal safe snprintf & Signal handler (handling CTRL+C, printing backtrace on crash etc) |
socket | Pipe / tcp sockets(also unix domain sockets) /Epoll/Kqueue/WSAPoll for Posix and Windows |
string | Length prefixed, null terminated C strings. |
thread | Thread wrapper for Posix and Windows. |
time | Time and sleep functions for Posix and Windows |
timer | Hashed timing wheel implementation with fast poll / cancel ops |
uri | A basic uri parser |
Q&A
-
Is it any better than library X ?
I often use these libraries for high performance server-side applications. Also,
I care about readable and easy to debug code. In summary, these libraries show
my taste(trade-offs) about performance/api-design/readability. You may or may
not like it. -
Why don’t you change API here at X, so it will be easier to use?
Send a pull request please but be sure you don’t introduce an undefined
behavior. It’s possible to provide better APIs, especially to generic libraries,
if you don’t care about undefined behaviors. I try to avoid it. -
What is the most efficient way to use these libraries?
Just like any other code. Add to yo