#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %constinteger THREE = 3, FOUR = 4
//     2  %begin

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

  //     3    %switch there(-20:FOUR*FOUR-1)

  int THERE_index;
  int THERE_line;
  char *THERE_file;
  static const void *THERE[36] = {
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_M12,     &&case_THERE_missing,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_3,       &&case_THERE_4,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_missing,
      &&case_THERE_missing, &&case_THERE_missing, &&case_THERE_12,      &&case_THERE_missing, &&case_THERE_missing,
      &&case_THERE_missing};

  //     4    %integer i

  int I;

  //     5    i = three

  I = 3;

  //     6    i = four

  I = 4;

  //     7    i = three*four

  I = 3 * 4;

  //     8    ->there(three*four)

  THERE_line = __LINE__;
  THERE_file = __FILE__;
  THERE_index = 3 * 4;
  goto case_THERE_dispatch;

  //     9
  //    10  there(three):

case_THERE_3:;

//    11  there(four):

case_THERE_4:;

//    12  there(three*four):

case_THERE_12:;

//    13  there(-three*four):

case_THERE_M12:;

//    14    newline

  _imp_NEWLINE();

  //    15  %endofprogram

  _imp_stop(0);
  return 0;

case_THERE_dispatch:
  if (THERE_index < -20 || THERE_index > 15)
    _imp_signalf(6, 3, THERE_index, "->THERE(%d) out of bounds at %s line %d", THERE_index, THERE_file, THERE_line);
  goto *THERE[THERE_index - -20];

case_THERE_missing:
  _imp_signalf(8, 2, THERE_index, "switch jump to undefined label THERE(%d): at %s line %d", THERE_index, THERE_file,
               THERE_line);
end_0:;
}