I usually like Suckless stuff and a simple, easily auditable bigint library is sorely needed, but this is hardly an improvement over the current state. libzahl still allocates during operations, for which there is no reason — provide a thin wrapper API if you think providing memory manually is a concern. This is particularly crucial because as soon as you begin to allocate during operations, you must handle allocation failures everywhere: GNU MP does the utterly insane and calls abort while libzahl appears to use a globally saved longjmp instead, sacrificing thread-safety.