name mode size
.bootstrap 040000
bin 040000
dox 040000
mulle-vararg.xcodeproj 040000
src 040000
templates 040000
tests 040000
.gitignore 100644 1 kb
.travis.yml 100644 1 kb
CMakeDependencies.txt 100644 0 kb
CMakeLists.txt 100644 1 kb
CMakeSourcesAndHeaders.txt 100644 0 kb
LICENSE 100644 2 kb 100644 3 kb 100644 1 kb
<!-- [comment]: <> (DO NOT EDIT THIS FILE. EDIT THE TEMPLATE "templates/") --> # mulle-vararg A variable argument passing scheme written in C (C11). It's an alternative to [stdarg](// or [varargs](//, but not compatible with either. Fork | Build Status | Release Version ----------|---------------|----------------------------------- [Mulle kybernetiK](// | [![Build Status](]( | ![Mulle kybernetiK tag]( [![Build Status](]( [Community]( | [![Build Status](]( | ![Community tag]( [![Build Status](]( #### Advantages * Easy to write in C, does not need compiler ABI internals to construct or read. You don't need [libffi](// or some such. * Cheap forwarding to other functions. #### Disadvantages * Not compatible with `<stdarg.h>` ## How it works **mulle-vararg** assumes that the arguments are not layed out in stack alignment fashion but like in a struct. The C promotion rules are still observed though. > Remember the C argument promotion rules are > > 1. char and short to int/unsigned int > 2. float to double > Let's assume there is a compiler that uses **mulle-vararg** for variable arguments. It collects **all** function parameters and packs them into a struct, then passes this struct to the function. A **printf** function being being called like this: ``` printf( "%d %f %lld\n", (char) 'x', (float) 0.2, 1848LL; ``` would get its arguments embedded in a struct like this ``` struct { char *format; struct { int value1; // standard char -> int promotion double value2; // standard float -> double promotion long long value3; } varargs; } _param; ``` **mulle-vararg** provides the necessary functions to read such a struct. It has no code to create it. ## API * [Vararg](dox/ ## Install On OS X and Linux you can use [homebrew](//, respectively [linuxbrew](// to install the library: ``` brew install mulle-objc/software/mulle-vararg ``` On other platforms you can use **mulle-install** from [mulle-build](// to install the library: ``` mulle-install --prefix /usr/local --branch release ``` Otherwise read: * [How to Build](dox/ ### Platforms and Compilers All platforms and compilers supported by [mulle-c11](// ## Author [Nat!](// for [Mulle kybernetiK](// and [Codeon GmbH](//