#include <perms.h>

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

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

  //     2    %switch toplevel(0:1)

  int TOPLEVEL_index;
  int TOPLEVEL_line;
  char *TOPLEVEL_file;
  static const void *TOPLEVEL[2] = {&&case_TOPLEVEL_0, &&case_TOPLEVEL_missing};

  //     3    toplevel(0):

case_TOPLEVEL_0:;

//     4    %begin

  { /*%begin*/

    //     5
    //     6      %routine another

    void ANOTHER(void) {
      //     7        %switch in a routine(-3:7)

      int INAROUTINE_index;
      int INAROUTINE_line;
      char *INAROUTINE_file;
      static const void *INAROUTINE[11] = {
          &&case_INAROUTINE_missing, &&case_INAROUTINE_missing, &&case_INAROUTINE_missing, &&case_INAROUTINE_missing,
          &&case_INAROUTINE_missing, &&case_INAROUTINE_missing, &&case_INAROUTINE_missing, &&case_INAROUTINE_missing,
          &&case_INAROUTINE_missing, &&case_INAROUTINE_missing, &&case_INAROUTINE_missing};

      //     8
      //     9        ->in a routine (-1)

      INAROUTINE_line = __LINE__;
      INAROUTINE_file = __FILE__;
      INAROUTINE_index = -1;
      goto case_INAROUTINE_dispatch;

      //    10
      //    11        in a routine(5):

    case_INAROUTINE_5:;

    //    12      %end

      return;

    case_INAROUTINE_dispatch:
      if (INAROUTINE_index < -3 || INAROUTINE_index > 7)
        _imp_signalf(6, 3, INAROUTINE_index, "->INAROUTINE(%d) out of bounds at %s line %d", INAROUTINE_index,
                     INAROUTINE_file, INAROUTINE_line);
      goto *INAROUTINE[INAROUTINE_index - -3];

    case_INAROUTINE_missing:
      _imp_signalf(8, 2, INAROUTINE_index, "switch jump to undefined label INAROUTINE(%d): at %s line %d",
                   INAROUTINE_index, INAROUTINE_file, INAROUTINE_line);
    } /* end of ANOTHER */

    //    13
    //    14      %switch sw(0:9)

    int SW_index;
    int SW_line;
    char *SW_file;
    static const void *SW[10] = {&&case_SW_missing, &&case_SW_missing, &&case_SW_missing, &&case_SW_missing,
                                 &&case_SW_4,       &&case_SW_missing, &&case_SW_missing, &&case_SW_missing,
                                 &&case_SW_missing, &&case_SW_missing};

    //    15
    //    16      ->sw(34)

    SW_line = __LINE__;
    SW_file = __FILE__;
    SW_index = 34;
    goto case_SW_dispatch;

    //    17
    //    18    sw(4):

  case_SW_4:;

  //    19      %stop

    _imp_stop(0);

    //    20    %end


  case_SW_dispatch:
    if (SW_index < 0 || SW_index > 9)
      _imp_signalf(6, 3, SW_index, "->SW(%d) out of bounds at %s line %d", SW_index, SW_file, SW_line);
    goto *SW[SW_index - 0];

  case_SW_missing:
    _imp_signalf(8, 2, SW_index, "switch jump to undefined label SW(%d): at %s line %d", SW_index, SW_file, SW_line);
  end_1000:;
  }

  // ?ANOTHER unused
  //    21
  //    22  %endofprogram

  _imp_stop(0);
  return 0;

case_TOPLEVEL_dispatch:
  if (TOPLEVEL_index < 0 || TOPLEVEL_index > 1)
    _imp_signalf(6, 3, TOPLEVEL_index, "->TOPLEVEL(%d) out of bounds at %s line %d", TOPLEVEL_index, TOPLEVEL_file,
                 TOPLEVEL_line);
  goto *TOPLEVEL[TOPLEVEL_index - 0];

case_TOPLEVEL_missing:
  _imp_signalf(8, 2, TOPLEVEL_index, "switch jump to undefined label TOPLEVEL(%d): at %s line %d", TOPLEVEL_index,
               TOPLEVEL_file, TOPLEVEL_line);
end_0:;
}