#include #include void bar(void(*callback)(int)) { callback(getc(stdin)); } int foobar() { __label__ fin_error, fin_multiplex; void *finishp = &&fin_ok; int value = 0; void foo(int ch) { if ( ch < 0 ) goto fin_error; if ( ch == '\n' ) goto fin_multiplex; if ( ch < '0' || ch > '9' ) finishp = &&fin_error; value = value * 10 + ch - '0'; } while (1) bar(foo); fin_multiplex: goto *finishp; fin_error: return -1; fin_ok: return value; } int main() { int tmp = foobar(); printf("%d = 0x%X\n", tmp, tmp); return 0; }