#include <perms.h>

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

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

  //     2  %OWNINTEGER LABELNO=0

  static int LABELNO = 0;

  //     3  %CONSTINTEGER MAXLABELS=10
  //     4  %RECORDFORMAT F(%BYTE B,%STRING(255)LAB)

  struct F {
    union {
      struct {
        unsigned char B;
        _imp_string255 LAB;
      };
    };
  };

  //     5  %OWNSTRING(15)%ARRAY LBLNAME(0:MAXLABELS)

  static _imp_string15 LBLNAME[11];

  //     6  %OWNRECORD(F)%ARRAY LBL(0:MAXLABELS)

  static struct F LBL[11];

  //     7
  //     8  %RECORD(F)%MAP LABEL(%STRING(15) L)

  struct F *LABEL(_imp_string15 L)
  {

    //     9  %INTEGER I

    int I;

    //    10   %IF LABELNO>0 %THENSTART

    if (LABELNO <= 0) goto L_0001;

      //    11    %FOR I=1,1,LABELNO %CYCLE

      // %for I = 1, 1, LABELNO %cycle
    {
      int _final = LABELNO;
      if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, LABELNO");
      I = 0;
    L_0002:
      if (I == _final) goto L_0003;
      I += 1;

      //    12     %RESULT==LBL(I) %IF LBLNAME(I)=L

      if (_imp_strcmp((_imp_string *)/*?*/ &LBLNAME[I], (_imp_string *)/*?*/ &L) != 0) goto L_0005;

      return /*?*/ &LBL[I];
    L_0005:;

    //    13    %REPEAT

      goto L_0002;
    }

  L_0003:;

  //    14   %FINISH

  L_0001:;

  //    15  !  INSERT NEW LABEL-NAME.
  //    16   LABELNO=LABELNO+1

    LABELNO = LABELNO + 1;

    //    17   %IF LABELNO>MAXLABELS %THENSTART

    if (LABELNO <= 10) goto L_0006;

      //    18    PRINT STRING(L." MAKES TOO MANY LABELS."); NEWLINE

    _imp_PRINTSTRING(
        *({
          __typeof__(_imp_string255) tmp = *({
            _imp_string255 tmp = _imp_join((_imp_string *)/*?*/ &L,
                                           (_imp_string *)/*?*/ _imp_str_literal_ptr(" MAKES TOO MANY LABELS."));
            (_imp_string255 *)&tmp;
          }) /*q*/;
          (_imp_string255 *)&tmp;
        })
    );
    _imp_NEWLINE();

    //    19    %FOR I=1,1,MAXLABELS %CYCLE

    // %for I = 1, 1, 10 %cycle
    {
      I = 0;
    L_0007:
      if (I == 10) goto L_0008;
      I += 1;

      //    20     PRINT STRING(LBLNAME(I))

      _imp_PRINTSTRING(
          *({
            __typeof__(_imp_string15) tmp = LBLNAME[I] /*q*/;
            (_imp_string255 *)&tmp;
          })
      );

      //    21     NEWLINE

      _imp_NEWLINE();

      //    22    %REPEAT

      goto L_0007;
    }

  L_0008:;

  //    23    %MONITOR

  /*_imp_monitor(__LINE__, __FILE__, PRETTY_FUNCTION);*/

  //    24    %STOP

    _imp_stop(0);

    //    25   %FINISH    ;!  DEALING WITH TOO MANY LABELS.

  L_0006:;

  //    26   LBLNAME(LABELNO)=L

    _imp_strncpy(/*?*/ &LBLNAME[LABELNO], ({
                   __typeof__(_imp_string15) tmp; /*B*/
                   tmp = L;
                   (void *)&tmp;
                 }),
                 /*max:*/ 15);

    //    27   LBL(LABELNO)_LAB=""

    _imp_strncpy(/*?*/ &LBL[LABELNO].LAB, ({
                   __typeof__(_imp_string255) tmp; /*B*/
                   tmp = _imp_str_literal("");
                   (void *)&tmp;
                 }),
                 /*max:*/ 255);

    //    28   %RESULT==LBL(LABELNO)

    return /*?*/ &LBL[LABELNO];

    //    29  %END

  } /* end of LABEL */

  //    30
  //    31
  //    32
  //    33    LABEL("T")_LAB="TESTING USE OF LABEL"

  _imp_strncpy(/*?*/ &LABEL(_imp_str_literal_size(15, "T"))->LAB, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = _imp_str_literal("TESTING USE OF LABEL");
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    34    PRINT STRING(LABEL("T")_LAB); NEWLINE

  _imp_PRINTSTRING(
      *({
        __typeof__(_imp_string255) tmp = LABEL(_imp_str_literal_size(15, "T"))->LAB /*q*/;
        (_imp_string255 *)&tmp;
      })
  );
  _imp_NEWLINE();

  //    35    LABEL("T")_LAB="THIS SHOULD MODIFY ".LABEL("T")_LAB." AS I TRIED TO DO YESTERDAY"

  _imp_strncpy(/*?*/ &LABEL(_imp_str_literal_size(15, "T"))->LAB, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *({
                   _imp_string255 tmp =
                       _imp_join((_imp_string *)/*?*/ &*({
                                   _imp_string255 tmp =
                                       _imp_join((_imp_string *)/*?*/ _imp_str_literal_ptr("THIS SHOULD MODIFY "),
                                                 (_imp_string *)/*?*/ &LABEL(_imp_str_literal_size(15, "T"))->LAB);
                                   (_imp_string255 *)&tmp;
                                 }),
                                 (_imp_string *)/*?*/ _imp_str_literal_ptr(" AS I TRIED TO DO YESTERDAY"));
                   (_imp_string255 *)&tmp;
                 });
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    36    PRINT STRING(LABEL("T")_LAB); NEWLINE

  _imp_PRINTSTRING(
      *({
        __typeof__(_imp_string255) tmp = LABEL(_imp_str_literal_size(15, "T"))->LAB /*q*/;
        (_imp_string255 *)&tmp;
      })
  );
  _imp_NEWLINE();

  //    37  %ENDOFPROGRAM

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