#include <stdio.h>
#define BEGIN switch (ctx->state) { \
case 0:
#define YIELD(val) do { \
ctx->state = __LINE__; \
return val; \
case __LINE__: \
; \
} while (0)
#define END }
typedef struct{
int state;
int i;
} Ctx;
int foo(Ctx* ctx)
{
BEGIN;
while (1) {
printf("foo suspending...\n"); YIELD(++ctx->i);
}
END;
return 0;
}
int main()
{
int i=0;
Ctx t0 = {0,1};
while (i = foo(&t0)) {
if (i > 10) {
break; // ideone can't run program indefinitely
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgogICAgCiNkZWZpbmUgQkVHSU4gc3dpdGNoIChjdHgtPnN0YXRlKSB7IFwKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgCiNkZWZpbmUgWUlFTEQodmFsKSBkbyB7IFwKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zdGF0ZSA9IF9fTElORV9fOyAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgX19MSU5FX186ICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQogICAgCiNkZWZpbmUgRU5EIH0KCnR5cGVkZWYgc3RydWN0ewogICAgaW50IHN0YXRlOwkKICAgIGludCBpOwp9ICBDdHg7CgppbnQgZm9vKEN0eCogY3R4KQp7CiAgICBCRUdJTjsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgIAlwcmludGYoImZvbyBzdXNwZW5kaW5nLi4uXG4iKTsKICAgICAgICAJWUlFTEQoKytjdHgtPmkpOwogICAgICAgIAlwcmludGYoImZvbyByZXN1bWVkXG4iKTsKICAgICAgICB9CiAgICBFTkQ7CiAgICByZXR1cm4gMDsKfSAKCmludCBtYWluKCkKewogICAgaW50IGk9MDsKCiAgICBDdHggdDAgPSB7MCwxfTsKICAgIHdoaWxlIChpID0gZm9vKCZ0MCkpIHsKICAgICAgICBwcmludGYoInZhbDogJWRcbiIsIGkpOwogICAgICAgIGlmIChpID4gMTApIHsKICAgICAgICAJcHJpbnRmKCJlbm91Z2hcbiIpOwogICAgICAgIAlicmVhazsgLy8gaWRlb25lIGNhbid0IHJ1biBwcm9ncmFtIGluZGVmaW5pdGVseQogICAgICAgIH0KICAgIH0gCgogICAgcmV0dXJuIDA7Cn0=