#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %record %format %spec stackfm
//     2  %record %format boundfm(%integer lower, %integer upper, %integer mult)

struct BOUNDFM {
  union {
    struct {
      int LOWER;
      int UPPER;
      int MULT;
    };
  };
};

//     3  %record %format afm(%integer dimension, %integer totalsize, %integer zerodisplacement, %integer dv, %integer localframe, %integer base, %record (boundfm) %array bound(1 : 7))

struct AFM {
  union {
    struct {
      int DIMENSION;
      int TOTALSIZE;
      int ZERODISPLACEMENT;
      int DV;
      int LOCALFRAME;
      int BASE;
      struct BOUNDFM BOUND[7];
    };
  };
};

//     4  %constant %record (afm) %name atype == 0

const struct AFM *ATYPE = 0;

//     5  %record %format varfm(%integer flags, %byte %integer base, %byte %integer prim, %byte %integer type, %byte %integer form, (%long %real rvar %or %integer disp, (%integer extra %or %record (afm) %name adata)), (%integer format %or %integer scale), %integer area)

struct VARFM {
  union {
    struct {
      int FLAGS;
      unsigned char BASE;
      unsigned char PRIM;
      unsigned char TYPE;
      unsigned char FORM;
      union {
        struct {
          double RVAR;
        };
        struct {
          int DISP;
          union {
            struct {
              int EXTRA;
            };
            struct {
              struct AFM *ADATA;
            };
          };
        };
      };

      union {
        struct {
          int FORMAT;
        };
        struct {
          int SCALE;
        };
      };

      int AREA;
    };
  };
};

//     6  %record %format olfm(%integer oper, %record (stackfm) %name link)

struct OLFM {
  union {
    struct {
      int OPER;
      struct STACKFM *LINK;
    };
  };
};

//     7  %record %format xfm(%integer xsize, %record (stackfm) %name index)

struct XFM {
  union {
    struct {
      int XSIZE;
      struct STACKFM *INDEX;
    };
  };
};

//     8  %record %format datafm(%record (varfm) v, %integer varno, %record (varfm) %name fv, (%integer bias %or %byte %integer reg, %byte %integer label), %record (stackfm) %name params, %record (stackfm) %name record, (%integer oper, %record (stackfm) %name link %or %record (olfm) oplink), (%integer xsize, %record (stackfm) %name index %or %record (xfm) x))

struct DATAFM {
  union {
    struct {
      struct VARFM V;
      int VARNO;
      struct VARFM *FV;
      union {
        struct {
          int BIAS;
        };
        struct {
          unsigned char REG;
          unsigned char LABEL;
        };
      };

      struct STACKFM *PARAMS;
      struct STACKFM *RECORD;
      union {
        struct {
          int OPER;
          struct STACKFM *LINK;
        };
        struct {
          struct OLFM OPLINK;
        };
      };

      union {
        struct {
          int XSIZE;
          struct STACKFM *INDEX;
        };
        struct {
          struct XFM X;
        };
      };
    };
  };
};

//     9  %record %format memberfm(%integer const, %integer items, %record (stackfm) %name a, %record (stackfm) %name b, %record (memberfm) %name link)

struct MEMBERFM {
  union {
    struct {
      int CONST;
      int ITEMS;
      struct STACKFM *A;
      struct STACKFM *B;
      struct MEMBERFM *LINK;
    };
  };
};

//    10  %constant %record (memberfm) %name memberfmtype == 0

const struct MEMBERFM *MEMBERFMTYPE = 0;

//    11  %record %format stackfm(%record (varfm) v %or %record (datafm) data %or %integer flags, %byte %integer base, %byte %integer prim, %byte %integer type, %byte %integer form, (%long %real rval %or %integer rhigh, %integer rlow %or (%integer disp, (%integer extra %or %record (afm) %name adata)), (%integer format %or %integer scale), %integer area, %integer varno, (%record (varfm) %name fv %or %record (memberfm) %name members), (%integer bias %or %byte %integer reg, %byte %integer label), %record (stackfm) %name params, %record (stackfm) %name record, (%integer oper, %record (stackfm) %name link %or %record (olfm) oplink), (%integer xsize, %record (stackfm) %name index %or %record (xfm) x)), %record (stackfm) %name using, %record (stackfm) %name stack)

struct STACKFM {
  union {
    struct {
      struct VARFM V;
    };
    struct {
      struct DATAFM DATA;
    };
    struct {
      int FLAGS;
      unsigned char BASE;
      unsigned char PRIM;
      unsigned char TYPE;
      unsigned char FORM;
      union {
        struct {
          double RVAL;
        };
        struct {
          int RHIGH;
          int RLOW;
        };
        struct {
          union {
            struct {
              int DISP;
              union {
                struct {
                  int EXTRA;
                };
                struct {
                  struct AFM *ADATA;
                };
              };
            };
          };

          union {
            struct {
              int FORMAT;
            };
            struct {
              int SCALE;
            };
          };

          int AREA;
          int VARNO;
          union {
            struct {
              struct VARFM *FV;
            };
            struct {
              struct MEMBERFM *MEMBERS;
            };
          };

          union {
            struct {
              int BIAS;
            };
            struct {
              unsigned char REG;
              unsigned char LABEL;
            };
          };

          struct STACKFM *PARAMS;
          struct STACKFM *RECORD;
          union {
            struct {
              int OPER;
              struct STACKFM *LINK;
            };
            struct {
              struct OLFM OPLINK;
            };
          };

          union {
            struct {
              int XSIZE;
              struct STACKFM *INDEX;
            };
            struct {
              struct XFM X;
            };
          };
        };
      };

      struct STACKFM *USING;
      struct STACKFM *STACK;
    };
  };
};

//    12  %constant %record (stackfm) %name stackfmtype == 0

const struct STACKFM *STACKFMTYPE = 0;

//    13  %record %format withfm(%integer key, %record (datafm) data, %record (withfm) %name link)

struct WITHFM {
  union {
    struct {
      int KEY;
      struct DATAFM DATA;
      struct WITHFM *LINK;
    };
  };
};

//    14  %constant %record (withfm) %name withfmtype == 0

const struct WITHFM *WITHFMTYPE = 0;

//    15  %record %format workfm(%integer size, %integer displacement, %integer validity)

struct WORKFM {
  union {
    struct {
      int SIZE;
      int DISPLACEMENT;
      int VALIDITY;
    };
  };
};

//    16  %end %of %file