#include <stdio.h> 
 
#ifndef ASYNC_H 
#define ASYNC_H 
 
#define async(...) int *_state_ = &(__VA_ARGS__); switch (*_state_) while (1) if (1) {*_state_ = 1; case 1: return 1;} else default: 
#define await(...) if (!(*_state_ = __LINE__)); else case __LINE__: switch (0) while (1) if (!(__VA_ARGS__)) return 0; else if (1) break; else default: 
#define yield if (0) case __LINE__:; else switch (0) while (1) if (1) {*_state_ = __LINE__; return 0;} else default: 
#define leave switch (0) while (1) if (1) {*_state_ = 1; return 1;} else default: 
#define until(...) while (!(__VA_ARGS__)) 
 
#endif 
 
typedef  union  { 
	struct  { 
		int  n; 
		int  i; 
		int  state; 
	} ; 
	int  result; 
}  write_async_task; 
 
int  write_async( write_async_task * t)  { 
	async ( t-> state)  { 
		printf ( "write %d: start\n " ,  t
-> n
) ;  		await ( t-> i >=  t-> n)  { 
			printf ( "write %d: %d\n " ,  t
-> n
,  t
-> i
) ;  			++ t-> i; 
		} 
		printf ( "write %d: end\n " ,  t
-> n
) ;  		leave t-> result =  t-> i; 
	} 
} 
 
typedef  struct  { 
	int  jid; 
	int  n; 
	int  state; 
	write_async_task write_task; 
}  job_task; 
 
int  job( job_task * t)  { 
	async ( t-> state)  { 
		printf ( "job %d: before write\n " ,  t
-> jid
) ;  		t-> write_task =  ( write_async_task) { .n  =  t-> n} ; 
		await ( write_async( & t-> write_task) ) ; 
		printf ( "job %d: written %d bytes\n " ,  t
-> jid
,  t
-> write_task.
result ) ;  	} 
} 
 
int  main( void )  { 
	job_task j1 =  { .jid  =  1 ,  .n  =  3 } ; 
	job_task j2 =  { .jid  =  2 ,  .n  =  7 } ; 
	until ( 
		job( & j1)  & 
		job( & j2) 
	) ; 
	job_task jobs[ ]  =  { 
		{ .jid  =  3 ,  .n  =  7 } , 
		{ .jid  =  4 ,  .n  =  9 } , 
		{ .jid  =  5 ,  .n  =  4 } , 
		{ .jid  =  6 ,  .n  =  5 } 
	} ; 
	int  jobs_n =  sizeof ( jobs)  /  sizeof ( jobs[ 0 ] ) ; 
	while  ( jobs_n >  0 )  { 
		for  ( int  i =  0 ;  i <  jobs_n;  ++ i)  { 
			if  ( job( & jobs[ i] ) )  { 
				jobs[ i-- ]  =  jobs[ -- jobs_n] ; 
			} 
		} 
	} 
} 
 
 
				I2luY2x1ZGUgPHN0ZGlvLmg+CgojaWZuZGVmIEFTWU5DX0gKI2RlZmluZSBBU1lOQ19ICgojZGVmaW5lIGFzeW5jKC4uLikgaW50ICpfc3RhdGVfID0gJihfX1ZBX0FSR1NfXyk7IHN3aXRjaCAoKl9zdGF0ZV8pIHdoaWxlICgxKSBpZiAoMSkgeypfc3RhdGVfID0gMTsgY2FzZSAxOiByZXR1cm4gMTt9IGVsc2UgZGVmYXVsdDoKI2RlZmluZSBhd2FpdCguLi4pIGlmICghKCpfc3RhdGVfID0gX19MSU5FX18pKTsgZWxzZSBjYXNlIF9fTElORV9fOiBzd2l0Y2ggKDApIHdoaWxlICgxKSBpZiAoIShfX1ZBX0FSR1NfXykpIHJldHVybiAwOyBlbHNlIGlmICgxKSBicmVhazsgZWxzZSBkZWZhdWx0OgojZGVmaW5lIHlpZWxkIGlmICgwKSBjYXNlIF9fTElORV9fOjsgZWxzZSBzd2l0Y2ggKDApIHdoaWxlICgxKSBpZiAoMSkgeypfc3RhdGVfID0gX19MSU5FX187IHJldHVybiAwO30gZWxzZSBkZWZhdWx0OgojZGVmaW5lIGxlYXZlIHN3aXRjaCAoMCkgd2hpbGUgKDEpIGlmICgxKSB7Kl9zdGF0ZV8gPSAxOyByZXR1cm4gMTt9IGVsc2UgZGVmYXVsdDoKI2RlZmluZSB1bnRpbCguLi4pIHdoaWxlICghKF9fVkFfQVJHU19fKSkKCiNlbmRpZgoKdHlwZWRlZiB1bmlvbiB7CglzdHJ1Y3QgewoJCWludCBuOwoJCWludCBpOwoJCWludCBzdGF0ZTsKCX07CglpbnQgcmVzdWx0Owp9IHdyaXRlX2FzeW5jX3Rhc2s7CgppbnQgd3JpdGVfYXN5bmMod3JpdGVfYXN5bmNfdGFzayAqdCkgewoJYXN5bmMgKHQtPnN0YXRlKSB7CgkJcHJpbnRmKCJ3cml0ZSAlZDogc3RhcnRcbiIsIHQtPm4pOwoJCWF3YWl0ICh0LT5pID49IHQtPm4pIHsKCQkJcHJpbnRmKCJ3cml0ZSAlZDogJWRcbiIsIHQtPm4sIHQtPmkpOwoJCQkrK3QtPmk7CgkJfQoJCXByaW50Zigid3JpdGUgJWQ6IGVuZFxuIiwgdC0+bik7CgkJbGVhdmUgdC0+cmVzdWx0ID0gdC0+aTsKCX0KfQoKdHlwZWRlZiBzdHJ1Y3QgewoJaW50IGppZDsKCWludCBuOwoJaW50IHN0YXRlOwoJd3JpdGVfYXN5bmNfdGFzayB3cml0ZV90YXNrOwp9IGpvYl90YXNrOwoKaW50IGpvYihqb2JfdGFzayAqdCkgewoJYXN5bmMgKHQtPnN0YXRlKSB7CgkJcHJpbnRmKCJqb2IgJWQ6IGJlZm9yZSB3cml0ZVxuIiwgdC0+amlkKTsKCQl0LT53cml0ZV90YXNrID0gKHdyaXRlX2FzeW5jX3Rhc2spey5uID0gdC0+bn07CgkJYXdhaXQgKHdyaXRlX2FzeW5jKCZ0LT53cml0ZV90YXNrKSk7CgkJcHJpbnRmKCJqb2IgJWQ6IHdyaXR0ZW4gJWQgYnl0ZXNcbiIsIHQtPmppZCwgdC0+d3JpdGVfdGFzay5yZXN1bHQpOwoJfQp9CgppbnQgbWFpbih2b2lkKSB7CglwdXRzKCJwcm9ncmFtIHN0YXJ0Iik7Cglqb2JfdGFzayBqMSA9IHsuamlkID0gMSwgLm4gPSAzfTsKCWpvYl90YXNrIGoyID0gey5qaWQgPSAyLCAubiA9IDd9OwoJdW50aWwgKAoJCWpvYigmajEpICYKCQlqb2IoJmoyKQoJKTsKCWpvYl90YXNrIGpvYnNbXSA9IHsKCQl7LmppZCA9IDMsIC5uID0gN30sCgkJey5qaWQgPSA0LCAubiA9IDl9LAoJCXsuamlkID0gNSwgLm4gPSA0fSwKCQl7LmppZCA9IDYsIC5uID0gNX0KCX07CglpbnQgam9ic19uID0gc2l6ZW9mKGpvYnMpIC8gc2l6ZW9mKGpvYnNbMF0pOwoJd2hpbGUgKGpvYnNfbiA+IDApIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnNfbjsgKytpKSB7CgkJCWlmIChqb2IoJmpvYnNbaV0pKSB7CgkJCQlqb2JzW2ktLV0gPSBqb2JzWy0tam9ic19uXTsKCQkJfQoJCX0KCX0KCXB1dHMoInByb2dyYW0gZW5kIik7Cn0K