#include <stdio.h>
#define CAT_(a, ...) a ## __VA_ARGS__
#define CAT(...) CAT_(__VA_ARGS__)
#define EAT(...)
#define EXPAND(...) __VA_ARGS__
#define IIF(c) CAT(IIF_, c)
#define IIF_1(...) __VA_ARGS__ EAT
#define IIF_0(...) EXPAND
#define COMPL(x) CAT(COMPL_, x)
#define COMPL_1 0
#define COMPL_0 1
#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_(__VA_ARGS__)
#define CHECK_(...) CHECK_N(__VA_ARGS__, 0)
#define PROBE(x) x, 1
#define IS_EMPTY(x) BOOL(CHECK(CAT(IS_EMPTY_, x)()))
#define IS_EMPTY_() PROBE(~)
#define NOT(x) CHECK(CAT(NOT_, x))
#define NOT_0 PROBE(~)
#define BOOL(x) COMPL(NOT(x))
#define IF(c) IIF(BOOL(c))
#define UNLESS(c) IF(c)()
#define EMPTY()
#define DEFER(id) id EMPTY()
#define OBSTRUCT(id) id DEFER(EMPTY)()
#define EVAL(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))
#define EVAL1(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))
#define EVAL2(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))
#define EVAL3(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))
#define EVAL4(...) EVAL5(EVAL5(EVAL5(EVAL5(__VA_ARGS__))))
#define EVAL5(...) __VA_ARGS__
#define FOREACH(macro, x, ...) \
UNLESS(IS_EMPTY(x))( \
macro(x) \
OBSTRUCT(FOREACH_INDIRECT)()(macro, __VA_ARGS__) \
)
#define FOREACH_INDIRECT(...) FOREACH
#define QUOTE(...) QUOTE_(__VA_ARGS__)
#define QUOTE_(...) #__VA_ARGS__
#define ENUM_ARR_ELEM(x) , QUOTE(x)
#define ENUM(tag, first, ...) \
enum tag {first, __VA_ARGS__}; \
char *CAT(tag, _names)[] = {QUOTE(first)EVAL(FOREACH(ENUM_ARR_ELEM, __VA_ARGS__))}; \
static char *CAT(tag, _to_str) (int x) \
{ \
return x > sizeof(CAT(tag, _names)) / sizeof(char*) ? QUOTE(!!!UNKNOWN tag!!!) : CAT(tag, _names)[x]; \
}
ENUM(crap,
shit,
fuck,
dick,
ass,
turd,
fart
)
int main()
{
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIENBVF8oYSwgLi4uKSBhICMjIF9fVkFfQVJHU19fCiNkZWZpbmUgQ0FUKC4uLikgQ0FUXyhfX1ZBX0FSR1NfXykKCiNkZWZpbmUgRUFUKC4uLikKI2RlZmluZSBFWFBBTkQoLi4uKSBfX1ZBX0FSR1NfXwojZGVmaW5lIElJRihjKSBDQVQoSUlGXywgYykKI2RlZmluZSBJSUZfMSguLi4pIF9fVkFfQVJHU19fIEVBVAojZGVmaW5lIElJRl8wKC4uLikgRVhQQU5ECgojZGVmaW5lIENPTVBMKHgpIENBVChDT01QTF8sIHgpCiNkZWZpbmUgQ09NUExfMSAwCiNkZWZpbmUgQ09NUExfMCAxCgojZGVmaW5lIENIRUNLX04oeCwgbiwgLi4uKSBuCiNkZWZpbmUgQ0hFQ0soLi4uKSBDSEVDS18oX19WQV9BUkdTX18pCiNkZWZpbmUgQ0hFQ0tfKC4uLikgQ0hFQ0tfTihfX1ZBX0FSR1NfXywgMCkKI2RlZmluZSBQUk9CRSh4KSB4LCAxCgojZGVmaW5lIElTX0VNUFRZKHgpIEJPT0woQ0hFQ0soQ0FUKElTX0VNUFRZXywgeCkoKSkpCiNkZWZpbmUgSVNfRU1QVFlfKCkgICBQUk9CRSh+KQoKI2RlZmluZSBOT1QoeCkgQ0hFQ0soQ0FUKE5PVF8sIHgpKQojZGVmaW5lIE5PVF8wIFBST0JFKH4pCiNkZWZpbmUgQk9PTCh4KSBDT01QTChOT1QoeCkpCgojZGVmaW5lIElGKGMpIElJRihCT09MKGMpKQojZGVmaW5lIFVOTEVTUyhjKSBJRihjKSgpCgojZGVmaW5lIEVNUFRZKCkKI2RlZmluZSBERUZFUihpZCkgaWQgRU1QVFkoKQojZGVmaW5lIE9CU1RSVUNUKGlkKSBpZCBERUZFUihFTVBUWSkoKQoKI2RlZmluZSAgRVZBTCguLi4pIEVWQUwxKEVWQUwxKEVWQUwxKEVWQUwxKF9fVkFfQVJHU19fKSkpKQojZGVmaW5lIEVWQUwxKC4uLikgRVZBTDIoRVZBTDIoRVZBTDIoRVZBTDIoX19WQV9BUkdTX18pKSkpCiNkZWZpbmUgRVZBTDIoLi4uKSBFVkFMMyhFVkFMMyhFVkFMMyhFVkFMMyhfX1ZBX0FSR1NfXykpKSkKI2RlZmluZSBFVkFMMyguLi4pIEVWQUw0KEVWQUw0KEVWQUw0KEVWQUw0KF9fVkFfQVJHU19fKSkpKQojZGVmaW5lIEVWQUw0KC4uLikgRVZBTDUoRVZBTDUoRVZBTDUoRVZBTDUoX19WQV9BUkdTX18pKSkpCiNkZWZpbmUgRVZBTDUoLi4uKSBfX1ZBX0FSR1NfXwoKI2RlZmluZSBGT1JFQUNIKG1hY3JvLCB4LCAuLi4pIFwKICBVTkxFU1MoSVNfRU1QVFkoeCkpKCBcCiAgICBtYWNybyh4KSBcCiAgICBPQlNUUlVDVChGT1JFQUNIX0lORElSRUNUKSgpKG1hY3JvLCBfX1ZBX0FSR1NfXykgXAogICkKCiNkZWZpbmUgRk9SRUFDSF9JTkRJUkVDVCguLi4pIEZPUkVBQ0gKCiNkZWZpbmUgUVVPVEUoLi4uKSBRVU9URV8oX19WQV9BUkdTX18pCiNkZWZpbmUgUVVPVEVfKC4uLikgI19fVkFfQVJHU19fCgojZGVmaW5lIEVOVU1fQVJSX0VMRU0oeCkgLCBRVU9URSh4KQojZGVmaW5lIEVOVU0odGFnLCBmaXJzdCwgLi4uKSBcCiAgICBlbnVtIHRhZyB7Zmlyc3QsIF9fVkFfQVJHU19ffTsgXAogICAgY2hhciAqQ0FUKHRhZywgX25hbWVzKVtdID0ge1FVT1RFKGZpcnN0KUVWQUwoRk9SRUFDSChFTlVNX0FSUl9FTEVNLCBfX1ZBX0FSR1NfXykpfTsgXAogICAgc3RhdGljIGNoYXIgKkNBVCh0YWcsIF90b19zdHIpIChpbnQgeCkgXAogICAgeyBcCiAgICAgICAgcmV0dXJuIHggPiBzaXplb2YoQ0FUKHRhZywgX25hbWVzKSkgLyBzaXplb2YoY2hhciopID8gUVVPVEUoISEhVU5LTk9XTiB0YWchISEpIDogQ0FUKHRhZywgX25hbWVzKVt4XTsgXAogICAgfQoKRU5VTShjcmFwLAogICAgc2hpdCwKICAgIGZ1Y2ssCiAgICBkaWNrLAogICAgYXNzLAogICAgdHVyZCwKICAgIGZhcnQKKQoKaW50IG1haW4oKQp7CiAgICBwdXRzKGNyYXBfdG9fc3RyKHNoaXQpKTsKICAgIHB1dHMoY3JhcF90b19zdHIoNjY2KSk7CiAgICByZXR1cm4gMDsKfQ==