/* -*- mode: c -*-
* $Id: except.gcc,v 1.1 2001/01/07 04:31:15 doug Exp $
* http://www.bagley.org/~doug/shootout/
*/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int HI = 0, LO = 0;
static jmp_buf Hi_exception;
static jmp_buf Lo_exception;
void blowup (int n) {
if (n & 1) {
longjmp(Lo_exception, 1);
} else {
longjmp(Hi_exception, 1);
}
}
void lo_function (volatile int n) {
if (setjmp(Lo_exception) != 0) {
LO++;
} else {
blowup(n);
}
}
void hi_function (volatile int n) {
if (setjmp(Hi_exception) != 0) {
HI++;
} else {
lo_function(n);
}
}
void some_function (int n) {
hi_function(n);
}
int
main(int argc, char *argv[]) {
int volatile N = ((argc == 2) ? atoi(argv[1]) : 1);
while (N) {
some_function(N--);
}
printf("Exceptions: HI=%d / LO=%d\n", HI, LO);
return(0);
}