#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t x, y;
} struct_t;
inline char * struct_to_string(char * str, struct_t s) {
return str
+ sprintf(str
, "{x: %u, y: %u}", s.
x, s.
y); }
inline char * int_to_string(char * str, int i) {
return str
+ sprintf(str
, "%i", i
); }
inline char * string_to_string(char * str, char * s) {
return memcpy(str
, s
, len
) + len
; }
#define to(type, x) ({__auto_type ret = x; *(type *)((void *) &ret);})
#define to_string(str, x) _Generic((x),\
int : int_to_string(str, to(int, x)),\
char * : string_to_string(str, to(char *, x)),\
struct_t : struct_to_string(str, to(struct_t, x))\
)
#define FIRST(a, ...) a
#define SECOND(a, b, ...) b
#define EMPTY()
#define EVAL(...) EVAL32(__VA_ARGS__)
#define EVAL32(...) EVAL16(EVAL16(__VA_ARGS__))
#define EVAL16(...) EVAL8(EVAL8(__VA_ARGS__))
#define EVAL8(...) EVAL4(EVAL4(__VA_ARGS__))
#define EVAL4(...) EVAL2(EVAL2(__VA_ARGS__))
#define EVAL2(...) EVAL1(EVAL1(__VA_ARGS__))
#define EVAL1(...) __VA_ARGS__
#define DEFER1(m) m EMPTY()
#define DEFER2(m) m EMPTY EMPTY()()
#define DEFER3(m) m EMPTY EMPTY EMPTY()()()
#define DEFER4(m) m EMPTY EMPTY EMPTY EMPTY()()()()
#define IS_PROBE(...) SECOND(__VA_ARGS__, 0)
#define PROBE() ~, 1
#define CAT(a,b) a ## b
#define NOT(x) IS_PROBE(CAT(_NOT_, x))
#define _NOT_0 PROBE()
#define BOOL(x) NOT(NOT(x))
#define IF_ELSE(condition) _IF_ELSE(BOOL(condition))
#define _IF_ELSE(condition) CAT(_IF_, condition)
#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE
#define _IF_0(...) _IF_0_ELSE
#define _IF_1_ELSE(...)
#define _IF_0_ELSE(...) __VA_ARGS__
#define HAS_ARGS(...) BOOL(FIRST(_END_OF_ARGUMENTS_ __VA_ARGS__)())
#define _END_OF_ARGUMENTS_() 0
#define MAP(m, first, ...) \
m(first) \
IF_ELSE(HAS_ARGS(__VA_ARGS__))( \
DEFER2(_MAP)()(m, __VA_ARGS__) \
)( \
/* Do nothing, just terminate */ \
)
#define _MAP() MAP
#define op(x) str = to_string(str, x);
#define fprintf_proturbo(file, ...) ({\
char * str = malloc(1000500), * s = str;\
EVAL(MAP(op, __VA_ARGS__));\
*str = 0;\
int i = fprintf(file, "%s", s);\
free(s);\
i;\
})
int main(void) {
struct_t st = {10, 23};
fprintf_proturbo(stderr, 234235, " ", 523523, "\n", st, " ", 423523, "\n");
}
I2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkaW50Lmg+Cgp0eXBlZGVmIHN0cnVjdCB7CiAgdWludDMyX3QgeCwgeTsKfSBzdHJ1Y3RfdDsKCmlubGluZSBjaGFyICogc3RydWN0X3RvX3N0cmluZyhjaGFyICogc3RyLCBzdHJ1Y3RfdCBzKSB7CiAgcmV0dXJuIHN0ciArIHNwcmludGYoc3RyLCAie3g6ICV1LCB5OiAldX0iLCBzLngsIHMueSk7Cn0KCmlubGluZSBjaGFyICogaW50X3RvX3N0cmluZyhjaGFyICogc3RyLCBpbnQgaSkgewogIHJldHVybiBzdHIgKyBzcHJpbnRmKHN0ciwgIiVpIiwgaSk7Cn0KCmlubGluZSBjaGFyICogc3RyaW5nX3RvX3N0cmluZyhjaGFyICogc3RyLCBjaGFyICogcykgewogIHVpbnQ2NF90IGxlbiA9IHN0cmxlbihzKTsKICByZXR1cm4gbWVtY3B5KHN0ciwgcywgbGVuKSArIGxlbjsKfQoKI2RlZmluZSB0byh0eXBlLCB4KSAoe19fYXV0b190eXBlIHJldCA9IHg7ICoodHlwZSAqKSgodm9pZCAqKSAmcmV0KTt9KQoKI2RlZmluZSB0b19zdHJpbmcoc3RyLCB4KSBfR2VuZXJpYygoeCksXAogIGludCA6IGludF90b19zdHJpbmcoc3RyLCB0byhpbnQsIHgpKSxcCiAgY2hhciAqIDogc3RyaW5nX3RvX3N0cmluZyhzdHIsIHRvKGNoYXIgKiwgeCkpLFwKICBzdHJ1Y3RfdCA6IHN0cnVjdF90b19zdHJpbmcoc3RyLCB0byhzdHJ1Y3RfdCwgeCkpXAopCgojZGVmaW5lIEZJUlNUKGEsIC4uLikgYQojZGVmaW5lIFNFQ09ORChhLCBiLCAuLi4pIGIKCiNkZWZpbmUgRU1QVFkoKQoKI2RlZmluZSBFVkFMKC4uLikgRVZBTDMyKF9fVkFfQVJHU19fKQojZGVmaW5lIEVWQUwzMiguLi4pIEVWQUwxNihFVkFMMTYoX19WQV9BUkdTX18pKQojZGVmaW5lIEVWQUwxNiguLi4pIEVWQUw4KEVWQUw4KF9fVkFfQVJHU19fKSkKI2RlZmluZSBFVkFMOCguLi4pIEVWQUw0KEVWQUw0KF9fVkFfQVJHU19fKSkKI2RlZmluZSBFVkFMNCguLi4pIEVWQUwyKEVWQUwyKF9fVkFfQVJHU19fKSkKI2RlZmluZSBFVkFMMiguLi4pIEVWQUwxKEVWQUwxKF9fVkFfQVJHU19fKSkKI2RlZmluZSBFVkFMMSguLi4pIF9fVkFfQVJHU19fCgojZGVmaW5lIERFRkVSMShtKSBtIEVNUFRZKCkKI2RlZmluZSBERUZFUjIobSkgbSBFTVBUWSBFTVBUWSgpKCkKI2RlZmluZSBERUZFUjMobSkgbSBFTVBUWSBFTVBUWSBFTVBUWSgpKCkoKQojZGVmaW5lIERFRkVSNChtKSBtIEVNUFRZIEVNUFRZIEVNUFRZIEVNUFRZKCkoKSgpKCkKCiNkZWZpbmUgSVNfUFJPQkUoLi4uKSBTRUNPTkQoX19WQV9BUkdTX18sIDApCiNkZWZpbmUgUFJPQkUoKSB+LCAxCgojZGVmaW5lIENBVChhLGIpIGEgIyMgYgoKI2RlZmluZSBOT1QoeCkgSVNfUFJPQkUoQ0FUKF9OT1RfLCB4KSkKI2RlZmluZSBfTk9UXzAgUFJPQkUoKQoKI2RlZmluZSBCT09MKHgpIE5PVChOT1QoeCkpCgojZGVmaW5lIElGX0VMU0UoY29uZGl0aW9uKSBfSUZfRUxTRShCT09MKGNvbmRpdGlvbikpCiNkZWZpbmUgX0lGX0VMU0UoY29uZGl0aW9uKSBDQVQoX0lGXywgY29uZGl0aW9uKQoKI2RlZmluZSBfSUZfMSguLi4pIF9fVkFfQVJHU19fIF9JRl8xX0VMU0UKI2RlZmluZSBfSUZfMCguLi4pICAgICAgICAgICAgIF9JRl8wX0VMU0UKCiNkZWZpbmUgX0lGXzFfRUxTRSguLi4pCiNkZWZpbmUgX0lGXzBfRUxTRSguLi4pIF9fVkFfQVJHU19fCgojZGVmaW5lIEhBU19BUkdTKC4uLikgQk9PTChGSVJTVChfRU5EX09GX0FSR1VNRU5UU18gX19WQV9BUkdTX18pKCkpCiNkZWZpbmUgX0VORF9PRl9BUkdVTUVOVFNfKCkgMAoKI2RlZmluZSBNQVAobSwgZmlyc3QsIC4uLikgICAgICAgICAgIFwKICBtKGZpcnN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBJRl9FTFNFKEhBU19BUkdTKF9fVkFfQVJHU19fKSkoICAgIFwKICAgIERFRkVSMihfTUFQKSgpKG0sIF9fVkFfQVJHU19fKSAgIFwKICApKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIC8qIERvIG5vdGhpbmcsIGp1c3QgdGVybWluYXRlICovIFwKICApCiNkZWZpbmUgX01BUCgpIE1BUAoKI2RlZmluZSBvcCh4KSBzdHIgPSB0b19zdHJpbmcoc3RyLCB4KTsKCiNkZWZpbmUgZnByaW50Zl9wcm90dXJibyhmaWxlLCAuLi4pICh7XAogIGNoYXIgKiBzdHIgPSBtYWxsb2MoMTAwMDUwMCksICogcyA9IHN0cjtcCiAgRVZBTChNQVAob3AsIF9fVkFfQVJHU19fKSk7XAogICpzdHIgPSAwO1wKICBpbnQgaSA9IGZwcmludGYoZmlsZSwgIiVzIiwgcyk7XAogIGZyZWUocyk7XAogIGk7XAp9KQoKCmludCBtYWluKHZvaWQpIHsKICBzdHJ1Y3RfdCBzdCA9IHsxMCwgMjN9OwogIGZwcmludGZfcHJvdHVyYm8oc3RkZXJyLCAyMzQyMzUsICIgIiwgNTIzNTIzLCAiXG4iLCBzdCwgIiAiLCA0MjM1MjMsICJcbiIpOwp9