/* ---------------------------------------------------------------- */ /* PROGRAM local-2.c: */ /* This program uses setjmp()/longjmp() to demonstrate an */ /* interesting way of doing "goto". */ /* ---------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <setjmp.h> #define MAX_COUNT 20 void main(int argc, char *argv[]) { jmp_buf Return; /* return point in "main" */ jmp_buf Counting; /* local subroutine entry pt*/ int MaxCount; /* maximum count */ int even, odd, count; /* counters */ int number; if (argc != 2) { printf("Use %s max-#-of-random-numbers\n", argv[0]); printf("The maximum is set to %d\n", MAX_COUNT); MaxCount = MAX_COUNT; } else MaxCount = atoi(argv[1]); printf("Even-Odd Random Number Counting:\n"); switch (setjmp(Return)) { /* return point in "main" */ case 0: goto LOOP; /* initial setup done */ case 1: longjmp(Counting, 1); /* call "Counting" */ case 2: printf("There are %d even and %d odd random numbers\n", even, odd); /* report result */ } exit(0); LOOP: /* initialization point */ even = odd = count = 0; srand((unsigned int) time(NULL)); if (setjmp(Counting) == 0) /* set up entry point */ longjmp(Return, 1); /* then return to "main" */ else { /* called again! */ number = rand(); /* generate and count */ printf(" Random number = %d ", number); if ((number % 2) == 0) { printf("(even)\n"); even++; } else { printf("(odd)\n"); odd++; } if (even + odd != MaxCount) /* full count? */ longjmp(Return, 1); /* no, return to "main" */ else longjmp(Return, 2); /* yes, return to reporting */ } }