Шаблон функции, реализующей автомат

// Заменить ?_i_? на номер автомата.
void A_i_( int e )
{
  int y_old = y_i_ ;
  
  // Протоколирование запуска автомата.
  #ifdef A_i__BEGIN_LOGGING
    log_begin( ?A_i_?, y_old, e ) ;
  #endif

  switch( y_i_ )
  {
    case 0:
    // Вызвать вложенные автоматы.
    // Проверить условия на дугах и петлях, 
    // выполнить переход и действия на дуге или петле.
    break ;
    ...
    case n:
    // Вызвать вложенные автоматы.
    // Проверить условия на дугах и петлях, 
    // выполнить переход и действия на дуге или петле.
    break ;

    default:
      #ifdef A_i__ERRORS_LOGGING
        log_write( LOG_GRAPH_ERROR, 
    ?Ошибка в автомате A_i_: неизвестный номер состояния!?,
                   0 ) ;
      #endif
  } ;
  
  // Если состояние не изменилось,
  // завершить выполнение функции.
  if( y_old == y_i_ ) goto A_i__end ;  
  
  // Протоколирование перехода в автомате.
  #ifdef A_i__TRANS_LOGGING
    log_trans( ?A_i_?, y_old ) ;
  #endif
 
  switch( y_i_ )
  {
    case 0:
    // Активизировать вложенные в новое состояние автоматы.
    // Выполнить действия в новом состоянии.
    break ;
    ...
    case n:
    // Активизировать вложенные в новое состояние автоматы.
    // Выполнить действия в новом состоянии.
    break ;
  } ;
  
  // Протоколирование завершения работы автомата
  A_i__end: ;
  #ifdef A_i__END_LOGGING
    log_end( ?A_i_?, y_i_, e ) ;
  #endif
} ;
419