Introduction
The dyncall library encapsulates architecture-, OS- and compiler-specific
function call semantics in a virtual "bind argument parameters from left to
right and then call" interface allowing programmers to call C functions in a
completely dynamic manner. In other words, instead of calling a function
directly, the dyncall library provides a mechanism to push the function
parameters manually and to issue the call afterwards.
This means, that a program can determine at runtime what function to call,
and what parameters to pass to it. The library is written in C and assembly
and provides a very simple C interface to program against.
The library comes in very handy to power flexible message systems, dynamic
function call dispatch mechanisms, closure implementations, to bridge
different programming languages, or to simply wrap a "vararg"
function.
When it comes to language bindings, the dyncall library provides a clean
and portable C interface to dynamically issue calls to foreign code using
small call kernels written in assembly. Instead of providing code for every
bridged function call, which unnecessarily results in code bloat, only a
couple of instructions are used to invoke every possible call.
Example
Let's say, we want to make a call to the function:
Using the dyncall library, this function would be called as follows:
DCCallVM* vm = dcNewCallVM(4096);
dcMode(vm, DC_CALL_C_DEFAULT);
dcReset(vm);
dcArgDouble(vm, 4.2373);
r = dcCallDouble(vm, (DCpointer)&sqrt);
dcFree(vm);
If you already have a DCCallVM object (e.g. for followup calls), this simply boils down to:
dcArgDouble(vm, 5.2); // Push/bind argument(s).
r = dcCallDouble(vm, (DCpointer)&sqrt); // Call.
Note that, by exposing this functionality to a dynamic scripting environment, the latter can gain system programming status to a certain degree. It is easy to see the power one can get by calling a C function directly from within a scripting language. Demonstrative bindings and examples for several different scripting languages are provided with the library.
Rough overview of platforms and features
The dyncall library runs on many different platforms and operating systems (including Windows, Linux, OpenBSD, FreeBSD, MacOS X, DragonFlyBSD, NetBSD, Plan9, iOS, Haiku, Nintendo DS, Playstation Portable, Solaris, Minix, Raspberry Pi, etc.) and processors (x86, x64, arm (arm and thumb mode), mips, mips64, ppc32, sparc, sparc64, etc.).
Most of the platforms' C-calling conventions are supported - including
"vararg" functions, as well es C++-"thiscalls" (on some
platforms), syscalls (on some platforms), and the multitude of calling
conventions on Windows ("fastcall", "stdcall", etc.).
Most of C99's types are supported for setting up a call, however, structure
and union support is still missing (we are working on it, though).
Additionally, dyncall comes with dyncallback, a library for callback support (missing on some platforms), and dynload, to facilitate portable dynamic library symbol loading and access (only for platforms with dynamic library support).
For details, refer to the dyncall manual/documentation.
For information about how we test and build a majority of the supported platforms, check out dynOS.
Donations
The library's development doesn't depend on funds, but obviously benefits from donations - if you feel like giving, please donate using bitcoin address 17wqW3DZiS3rr9CSzY21NaaP5DSdcBSys1 or the flattr-button in the top-right corner. Thanks!



