#include <stdio.h>
#include <stdlib.h>

/*Definintion des Automaten */
#define N_ZUST 6  /* Anzahl Zustaende */
#define N_INP 2   /* Anzahl Eingangswerte */

typedef enum States
  {
  NIL  = -1,
  S    =  0,
  A    =  1,
  B    =  2,
  C    =  3,
  D    =  4,
  E    =  5
  } states_t;

states_t TransitionTable[N_ZUST][N_INP] =
  {
  /*  State   0  1  */
     /* S */  {S, A},    /* fuehrende Nullen erlauben */
     /* A */  {C, B},
     /* B */  {B, A},    /* Endzustand */
     /* C */  {D, C},
     /* D */  {C, E},
     /* E */  {E, A}     /* Endzustand */
  };

/* einige total sinnlose Aktionen */
void action_A(void) { printf("Action A\n"); }
void action_B(void) { printf("Action B\n"); }
void action_C(void) { printf("Action C\n"); }
void action_D(void) { printf("Action D\n"); }
void action_E(void) { printf("Action E\n"); }
void action_S(void) { printf("Action S\n"); }

/* Array von Funktionspointern */
void (* ActionTable [N_ZUST])(void) =
  {
  action_S, action_A, action_B,
  action_C, action_D, action_E
  };

#define IST_TEILBAR(s) ((s == B) || (s == E))

/* Statemachine bearbeitet Input-String */

states_t statemachine(char *input)
  {
  states_t state = S;
  int in;

  ActionTable[state] ();
  while(*input != '\0')
    {
    in = *input - '0';
    if ((in == 0) || (in == 1))
      {
      /* Zustandswechsel */
      state = TransitionTable[state][in];
      /* Aktion fuer neuen Zustand ausloesen */
      ActionTable[state] ();
      }
    else
       return(NIL);
    input++;
    }
  return(state);
  }

int main(int argc, char *argv[])
  {
  states_t EndState;
   
  argv++;
  while(argc > 1)
    {
    printf("Eingabewert: %s\n", *argv);
    EndState = statemachine(*argv);
    if (IST_TEILBAR(EndState))
       printf( "ist durch 3 teilbar\n" );
    else
       printf("ist nicht teilbar\n");
    argv++; argc--;
    }
  return 0;
  }

