/* ---------------------------------------------------------------- */
/* 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 */
     }
}