struct s { long long size; int type }; a; fn1 () { for (;;) { struct s b; int c = fn2 (a, &b); if (c == 0) break; if (b.type) { fn3 ()? fn4 (b.type, b.size) : 0; return; } fn3 ()? fn4 (b.type >> b.size) : 0; if (b.size > c) fn5 (a, b.size - c); } }