#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;
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;
}
}
#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 ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCBmb3JtYXQoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCBjb25zdCB2b2lkICoqcykKewogICAgY29uc3QgY2hhciAqcCA9IHN0cmNocihmbXQsICclJyk7CiAgICAKICAgIHdoaWxlIChwKSB7ICAgICAgICAKICAgICAgICBpbnQgbGVuID0gcCAtIGZtdDsKICAgICAgICAKICAgICAgICBmcHJpbnRmKGYsICIlLipzIiwgbGVuLCBmbXQpOwogICAgICAgIHArKzsKICAgICAgICAKICAgICAgICBzd2l0Y2ggKCpwKyspIHsKICAgICAgICBjYXNlICdkJzogaWYgKCpzKSBmcHJpbnRmKGYsICIlZCIsICooY29uc3QgaW50ICopICpzKyspOyBicmVhazsgICAgICAgICAgICAKICAgICAgICBjYXNlICdmJzogaWYgKCpzKSBmcHJpbnRmKGYsICIlZiIsICooY29uc3QgZG91YmxlICopICpzKyspOyBicmVhazsKICAgICAgICBjYXNlICdzJzogaWYgKCpzKSBmcHJpbnRmKGYsICIlcyIsIChjb25zdCBjaGFyICopICpzKyspOyBicmVhazsgICAgICAgICAgICAKICAgICAgICBkZWZhdWx0OiAgZnByaW50ZihmLCAie0lsbGVnYWwgZm10IGNoYXJ9Iik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZtdCA9IHA7CiAgICAgICAgcCA9IHN0cmNocihmbXQsICclJyk7CiAgICB9CgogICAgZnB1dHMoZm10LCBmKTsKICAgIGZwdXRzKCJcbiIsIGYpOwp9CgojZGVmaW5lIE1fSEVBRChhLCAuLi4pIGEKI2RlZmluZSBNX1RBSUwoYSwgLi4uKSBfX1ZBX0FSR1NfXwojZGVmaW5lIGZvcm1hdCguLi4pIGZvcm1hdChzdGRvdXQsIE1fSEVBRChfX1ZBX0FSR1NfXyksIFwKICAgIChjb25zdCB2b2lkICpbXSl7TV9UQUlMKF9fVkFfQVJHU19fLCBOVUxMKX0pCgppbnQgbWFpbih2b2lkKQp7CiAgICBjb25zdCBjaGFyICpmbiA9ICJleGFtcGxlLnR4dCI7CiAgICAKICAgIGRvdWJsZSBwaSA9IDIyLjAgLyA3LjA7CiAgICBpbnQgbiA9IDU2OwogICAgaW50IGNvZGUgPSAtMjk7CiAgICAKICAgIGZvcm1hdCgiJXMsICVzLCAlcywgJXMuIiwgIkFscGhhIiwgIkJyYXZvIiwgIkNoYXJsaWUiLCAiRGVsdGEiKTsKICAgIGZvcm1hdCgiQ291bGRuJ3Qgb3BlbiBcIiVzXCI6IGVycm9yIGNvZGUgJWQuIiwgZm4sICZjb2RlKTsKICAgIGZvcm1hdCgiVG9kYXkncyBudW1iZXIgaXMgJWQuIiwgJm4pOwogICAgZm9ybWF0KCJBbmQgYSBzdXBlciBhcHByb3hpbWF0aW9uIGZvciBwaSBpcyAlZi4iLCAmcGkpOwogICAgZm9ybWF0KCJMb29rIE1hLCBubyBhcmd1bWVudHMhIik7CiAgICAKICAgIHJldHVybiAwOwp9Cg==