#include <perms.h>

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

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

  //     2
  //     3    %begin

  { /*%begin*/

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

    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};

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

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

    goto end_1000;

  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];

  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];
  end_1000:;
  }

  //    17
  //    18  %endofprogram

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