#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2    %routine top

  void TOP(void) {
    //     3      %routine nested

    void NESTED(void) {
      //     4        %switch left,middle,right(1:3)

      int LEFT_index;
      int LEFT_line;
      char *LEFT_file;
      static const void *LEFT[3] = {&&case_LEFT_1, &&case_LEFT_default, &&case_LEFT_default};

      int MIDDLE_index;
      int MIDDLE_line;
      char *MIDDLE_file;
      static const void *MIDDLE[3] = {&&case_MIDDLE_1, &&case_MIDDLE_2, &&case_MIDDLE_missing};

      int RIGHT_index;
      int RIGHT_line;
      char *RIGHT_file;
      static const void *RIGHT[3] = {&&case_RIGHT_1, &&case_RIGHT_2, &&case_RIGHT_3};

      //     5
      //     6        ->middle(3)

      MIDDLE_line = __LINE__;
      MIDDLE_file = __FILE__;
      MIDDLE_index = 3;
      goto case_MIDDLE_dispatch;

      //     7
      //     8        left(1):

    case_LEFT_1:;

    //     9        middle(1):

    case_MIDDLE_1:;

    //    10        middle(2):

    case_MIDDLE_2:;

    //    11        right(1):

    case_RIGHT_1:;

    //    12        right(2):

    case_RIGHT_2:;

    //    13        right(3):

    case_RIGHT_3:;

    //    14        left(*):

    case_LEFT_default:;

    //    15
    //    16      %end

      return;

    case_LEFT_dispatch:
      if (LEFT_index < 1 || LEFT_index > 3)
        _imp_signalf(6, 3, LEFT_index, "->LEFT(%d) out of bounds at %s line %d", LEFT_index, LEFT_file, LEFT_line);
      goto *LEFT[LEFT_index - 1];

    case_MIDDLE_dispatch:
      if (MIDDLE_index < 1 || MIDDLE_index > 3)
        _imp_signalf(6, 3, MIDDLE_index, "->MIDDLE(%d) out of bounds at %s line %d", MIDDLE_index, MIDDLE_file,
                     MIDDLE_line);
      goto *MIDDLE[MIDDLE_index - 1];

    case_MIDDLE_missing:
      _imp_signalf(8, 2, MIDDLE_index, "switch jump to undefined label MIDDLE(%d): at %s line %d", MIDDLE_index,
                   MIDDLE_file, MIDDLE_line);

    case_RIGHT_dispatch:
      if (RIGHT_index < 1 || RIGHT_index > 3)
        _imp_signalf(6, 3, RIGHT_index, "->RIGHT(%d) out of bounds at %s line %d", RIGHT_index, RIGHT_file, RIGHT_line);
      goto *RIGHT[RIGHT_index - 1];
    } /* end of NESTED */

    //    17    %end

    return;
  } /* end of TOP */

  // ?NESTED unused
  //    18
  //    19  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}