#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void format(FILE *f, const char *fmt, const void **s)
{
    const char *p = strchr(fmt, '%');
    
    while (p) {        
        int len = p - fmt;
        
        fprintf(f, "%.*s", len, fmt);
        p++;
        
        switch (*p++) {
        case 'd': if (*s) fprintf(f, "%d", *(const int *) *s++); break;            
        case 'f': if (*s) fprintf(f, "%f", *(const double *) *s++); break;
        case 's': if (*s) fprintf(f, "%s", (const char *) *s++); break;            
        default:  fprintf(f, "{Illegal fmt char}");
        }
        
        fmt = p;
        p = strchr(fmt, '%');
    }

    fputs(fmt, f);
    fputs("\n", f);
}

#define M_HEAD(a, ...) a
#define M_TAIL(a, ...) __VA_ARGS__
#define format(...) format(stdout, M_HEAD(__VA_ARGS__), \
    (const void *[]){M_TAIL(__VA_ARGS__, NULL)})

int main(void)
{
    const char *fn = "example.txt";
    
    double pi = 22.0 / 7.0;
    int n = 56;
    int code = -29;
    
    format("%s, %s, %s, %s.", "Alpha", "Bravo", "Charlie", "Delta");
    format("Couldn't open \"%s\": error code %d.", fn, &code);
    format("Today's number is %d.", &n);
    format("And a super approximation for pi is %f.", &pi);
    format("Look Ma, no arguments!");
    
    return 0;
}
